1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QSETTINGS_H
41 #define QSETTINGS_H
42 
43 #include <QtCore/qobject.h>
44 #include <QtCore/qvariant.h>
45 #include <QtCore/qstring.h>
46 #include <QtCore/qscopedpointer.h>
47 
48 QT_REQUIRE_CONFIG(settings);
49 
50 #include <ctype.h>
51 
52 QT_BEGIN_NAMESPACE
53 
54 #ifdef Status // we seem to pick up a macro Status --> int somewhere
55 #undef Status
56 #endif
57 
58 class QIODevice;
59 class QSettingsPrivate;
60 
61 #ifndef QT_NO_QOBJECT
62 class Q_CORE_EXPORT QSettings : public QObject
63 #else
64 class Q_CORE_EXPORT QSettings
65 #endif
66 {
67 #ifndef QT_NO_QOBJECT
68     Q_OBJECT
69 #else
70     QScopedPointer<QSettingsPrivate> d_ptr;
71 #endif
72     Q_DECLARE_PRIVATE(QSettings)
73 
74 public:
75     enum Status {
76         NoError = 0,
77         AccessError,
78         FormatError
79     };
80 #ifndef QT_NO_QOBJECT
81     Q_ENUM(Status)
82 #endif
83 
84     enum Format {
85         NativeFormat,
86         IniFormat,
87 
88 #if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
89         Registry32Format,
90         Registry64Format,
91 #endif
92 
93         InvalidFormat = 16,
94         CustomFormat1,
95         CustomFormat2,
96         CustomFormat3,
97         CustomFormat4,
98         CustomFormat5,
99         CustomFormat6,
100         CustomFormat7,
101         CustomFormat8,
102         CustomFormat9,
103         CustomFormat10,
104         CustomFormat11,
105         CustomFormat12,
106         CustomFormat13,
107         CustomFormat14,
108         CustomFormat15,
109         CustomFormat16
110     };
111 #ifndef QT_NO_QOBJECT
112     Q_ENUM(Format)
113 #endif
114 
115     enum Scope {
116         UserScope,
117         SystemScope
118     };
119 #ifndef QT_NO_QOBJECT
120     Q_ENUM(Scope)
121 #endif
122 
123 #ifndef QT_NO_QOBJECT
124     explicit QSettings(const QString &organization,
125                        const QString &application = QString(), QObject *parent = nullptr);
126     QSettings(Scope scope, const QString &organization,
127               const QString &application = QString(), QObject *parent = nullptr);
128     QSettings(Format format, Scope scope, const QString &organization,
129               const QString &application = QString(), QObject *parent = nullptr);
130     QSettings(const QString &fileName, Format format, QObject *parent = nullptr);
131     explicit QSettings(QObject *parent = nullptr);
132     explicit QSettings(Scope scope, QObject *parent = nullptr);
133 #else
134     explicit QSettings(const QString &organization,
135                        const QString &application = QString());
136     QSettings(Scope scope, const QString &organization,
137               const QString &application = QString());
138     QSettings(Format format, Scope scope, const QString &organization,
139               const QString &application = QString());
140     QSettings(const QString &fileName, Format format);
141 #  ifndef QT_BUILD_QMAKE
142     explicit QSettings(Scope scope = UserScope);
143 #  endif
144 #endif
145     ~QSettings();
146 
147     void clear();
148     void sync();
149     Status status() const;
150     bool isAtomicSyncRequired() const;
151     void setAtomicSyncRequired(bool enable);
152 
153     void beginGroup(const QString &prefix);
154     void endGroup();
155     QString group() const;
156 
157     int beginReadArray(const QString &prefix);
158     void beginWriteArray(const QString &prefix, int size = -1);
159     void endArray();
160     void setArrayIndex(int i);
161 
162     QStringList allKeys() const;
163     QStringList childKeys() const;
164     QStringList childGroups() const;
165     bool isWritable() const;
166 
167     void setValue(const QString &key, const QVariant &value);
168     QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
169 
170     void remove(const QString &key);
171     bool contains(const QString &key) const;
172 
173     void setFallbacksEnabled(bool b);
174     bool fallbacksEnabled() const;
175 
176     QString fileName() const;
177     Format format() const;
178     Scope scope() const;
179     QString organizationName() const;
180     QString applicationName() const;
181 
182 #if QT_CONFIG(textcodec)
183     void setIniCodec(QTextCodec *codec);
184     void setIniCodec(const char *codecName);
185     QTextCodec *iniCodec() const;
186 #endif
187 
188     static void setDefaultFormat(Format format);
189     static Format defaultFormat();
190 #if QT_DEPRECATED_SINCE(5, 13)
191     QT_DEPRECATED_X("Use QSettings::setPath() instead")
192     static void setSystemIniPath(const QString &dir);
193     QT_DEPRECATED_X("Use QSettings::setPath() instead")
194     static void setUserIniPath(const QString &dir);
195 #endif
196     static void setPath(Format format, Scope scope, const QString &path);
197 
198     typedef QMap<QString, QVariant> SettingsMap;
199     typedef bool (*ReadFunc)(QIODevice &device, SettingsMap &map);
200     typedef bool (*WriteFunc)(QIODevice &device, const SettingsMap &map);
201 
202     static Format registerFormat(const QString &extension, ReadFunc readFunc, WriteFunc writeFunc,
203                                  Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive);
204 
205 protected:
206 #ifndef QT_NO_QOBJECT
207     bool event(QEvent *event) override;
208 #endif
209 
210 private:
211     Q_DISABLE_COPY(QSettings)
212 };
213 
214 QT_END_NAMESPACE
215 
216 #endif // QSETTINGS_H
217