1 | /* Read KConfig() entries - for use in shell scripts. |
2 | |
3 | SPDX-FileCopyrightText: 2001 Red Hat, Inc. |
4 | SPDX-FileContributor: Programmed by Bernhard Rosenkraenzer <bero@redhat.com> |
5 | |
6 | SPDX-License-Identifier: GPL-2.0-or-later |
7 | */ |
8 | |
9 | /* |
10 | * If --type is specified as bool, the return value is 0 if the value |
11 | * is set, 1 if it isn't set. There is no output. |
12 | * |
13 | * If --type is specified as num, the return value matches the value |
14 | * of the key. There is no output. |
15 | * |
16 | * If --type is not set, the value of the key is simply printed to stdout. |
17 | * |
18 | * Usage examples: |
19 | * if kreadconfig6 --group KDE --key macStyle --type bool; then |
20 | * echo "We're using Mac-Style menus." |
21 | * else |
22 | * echo "We're using normal menus." |
23 | * fi |
24 | * |
25 | * TRASH=`kreadconfig6 --group Paths --key Trash` |
26 | * if test -n "$TRASH"; then |
27 | * mv someFile "$TRASH" |
28 | * else |
29 | * rm someFile |
30 | * fi |
31 | */ |
32 | |
33 | #include <KConfig> |
34 | #include <KConfigGroup> |
35 | #include <KSharedConfig> |
36 | #include <QCommandLineParser> |
37 | #include <stdio.h> |
38 | |
39 | int main(int argc, char **argv) |
40 | { |
41 | QCoreApplication app(argc, argv); |
42 | |
43 | QCommandLineParser parser; |
44 | parser.addHelpOption(); |
45 | parser.addOption( |
46 | commandLineOption: QCommandLineOption(QStringLiteral("file" ), QCoreApplication::translate(context: "main" , key: "Use <file> instead of global config" ), QStringLiteral("file" ))); |
47 | parser.addOption( |
48 | commandLineOption: QCommandLineOption(QStringLiteral("group" ), |
49 | QCoreApplication::translate(context: "main" , key: "Group to look in. Use \"<default>\" for the root group, or use repeatedly for nested groups." ), |
50 | QStringLiteral("group" ), |
51 | QStringLiteral("KDE" ))); |
52 | parser.addOption(commandLineOption: QCommandLineOption(QStringLiteral("key" ), QCoreApplication::translate(context: "main" , key: "Key to look for" ), QStringLiteral("key" ))); |
53 | parser.addOption(commandLineOption: QCommandLineOption(QStringLiteral("default" ), QCoreApplication::translate(context: "main" , key: "Default value" ), QStringLiteral("value" ))); |
54 | parser.addOption(commandLineOption: QCommandLineOption(QStringLiteral("type" ), QCoreApplication::translate(context: "main" , key: "Type of variable" ), QStringLiteral("type" ))); |
55 | |
56 | parser.process(app); |
57 | |
58 | const QStringList groups = parser.values(QStringLiteral("group" )); |
59 | QString key = parser.value(QStringLiteral("key" )); |
60 | QString file = parser.value(QStringLiteral("file" )); |
61 | QString dflt = parser.value(QStringLiteral("default" )); |
62 | QString type = parser.value(QStringLiteral("type" )).toLower(); |
63 | |
64 | if (key.isNull() || !parser.positionalArguments().isEmpty()) { |
65 | parser.showHelp(exitCode: 1); |
66 | } |
67 | |
68 | KSharedConfig::openConfig(); |
69 | |
70 | KConfig *konfig; |
71 | bool configMustDeleted = false; |
72 | if (file.isEmpty()) { |
73 | konfig = KSharedConfig::openConfig().data(); |
74 | } else { |
75 | konfig = new KConfig(file, KConfig::NoGlobals); |
76 | configMustDeleted = true; |
77 | } |
78 | KConfigGroup cfgGroup = konfig->group(group: QString()); |
79 | for (const QString &grp : groups) { |
80 | if (grp.isEmpty()) { |
81 | fprintf(stderr, |
82 | format: "%s: %s\n" , |
83 | qPrintable(QCoreApplication::applicationName()), |
84 | qPrintable(QCoreApplication::translate("main" , "Group name cannot be empty, use \"<default>\" for the root group" ))); |
85 | if (configMustDeleted) { |
86 | delete konfig; |
87 | } |
88 | return 2; |
89 | } |
90 | cfgGroup = cfgGroup.group(group: grp); |
91 | } |
92 | |
93 | if (type == QLatin1String{"bool" }) { |
94 | dflt = dflt.toLower(); |
95 | bool def = (dflt == QLatin1String{"true" } || dflt == QLatin1String{"on" } || dflt == QLatin1String{"yes" } || dflt == QLatin1String{"1" }); |
96 | bool retValue = !cfgGroup.readEntry(key, aDefault: def); |
97 | if (configMustDeleted) { |
98 | delete konfig; |
99 | } |
100 | return retValue; |
101 | } else if (type == QLatin1String{"num" } || type == QLatin1String{"int" }) { |
102 | int retValue = cfgGroup.readEntry(key, aDefault: dflt.toInt()); |
103 | if (configMustDeleted) { |
104 | delete konfig; |
105 | } |
106 | return retValue; |
107 | } else if (type == QLatin1String{"path" }) { |
108 | fprintf(stdout, format: "%s\n" , cfgGroup.readPathEntry(pKey: key, aDefault: dflt).toLocal8Bit().data()); |
109 | if (configMustDeleted) { |
110 | delete konfig; |
111 | } |
112 | return 0; |
113 | } else { |
114 | /* Assume it's a string... */ |
115 | fprintf(stdout, format: "%s\n" , cfgGroup.readEntry(key, aDefault: dflt).toLocal8Bit().data()); |
116 | if (configMustDeleted) { |
117 | delete konfig; |
118 | } |
119 | return 0; |
120 | } |
121 | } |
122 | |