qsettings.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/corelib/io/qsettings.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10-
11-
12-
13-
14-
15-
16-
17struct QConfFileCustomFormat-
18{-
19 QString extension;-
20 QSettings::ReadFunc readFunc;-
21 QSettings::WriteFunc writeFunc;-
22 Qt::CaseSensitivity caseSensitivity;-
23};-
24template<> class QTypeInfo<QConfFileCustomFormat > { public: enum { isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isRelocatable = !isStatic || ((Q_MOVABLE_TYPE) & Q_RELOCATABLE_TYPE), isLarge = (sizeof(QConfFileCustomFormat)>sizeof(void*)), isPointer = false, isIntegral = QtPrivate::is_integral< QConfFileCustomFormat >::value, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0), sizeOf = sizeof(QConfFileCustomFormat) }; static inline const char *name() { return "QConfFileCustomFormat"; } };-
25-
26typedef QHash<QString, QConfFile *> ConfFileHash;-
27typedef QCache<QString, QConfFile> ConfFileCache;-
28typedef QHash<int, QString> PathHash;-
29typedef QVector<QConfFileCustomFormat> CustomFormatVector;-
30-
31namespace { namespace Q_QGS_usedHashFunc { typedef ConfFileHash Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized) guard.store(QtGlobalStatic::Destroyed); } }; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ())) : value () { guard.store(QtGlobalStatic::Initialized); } } holder; return &holder.value; } } } static QGlobalStatic<ConfFileHash, Q_QGS_usedHashFunc::innerFunction, Q_QGS_usedHashFunc::guard> usedHashFunc;-
32namespace { namespace Q_QGS_unusedCacheFunc { typedef ConfFileCache Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized) guard.store(QtGlobalStatic::Destroyed); } }; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ())) : value () { guard.store(QtGlobalStatic::Initialized); } } holder; return &holder.value; } } } static QGlobalStatic<ConfFileCache, Q_QGS_unusedCacheFunc::innerFunction, Q_QGS_unusedCacheFunc::guard> unusedCacheFunc;-
33namespace { namespace Q_QGS_pathHashFunc { typedef PathHash Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized) guard.store(QtGlobalStatic::Destroyed); } }; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ())) : value () { guard.store(QtGlobalStatic::Initialized); } } holder; return &holder.value; } } } static QGlobalStatic<PathHash, Q_QGS_pathHashFunc::innerFunction, Q_QGS_pathHashFunc::guard> pathHashFunc;-
34namespace { namespace Q_QGS_customFormatVectorFunc { typedef CustomFormatVector Type; QBasicAtomicInt guard = { QtGlobalStatic::Uninitialized }; __attribute__((visibility("hidden"))) inline Type *innerFunction() { struct HolderBase { ~HolderBase() noexcept { if (guard.load() == QtGlobalStatic::Initialized) guard.store(QtGlobalStatic::Destroyed); } }; static struct Holder : public HolderBase { Type value; Holder() noexcept(noexcept(Type ())) : value () { guard.store(QtGlobalStatic::Initialized); } } holder; return &holder.value; } } } static QGlobalStatic<CustomFormatVector, Q_QGS_customFormatVectorFunc::innerFunction, Q_QGS_customFormatVectorFunc::guard> customFormatVectorFunc;-
35-
36static QBasicMutex settingsGlobalMutex;-
37-
38static QSettings::Format globalDefaultFormat = QSettings::NativeFormat;-
39-
40QConfFile::QConfFile(const QString &fileName, bool _userPerms)-
41 : name(fileName), size(0), ref(1), userPerms(_userPerms)-
42{-
43 usedHashFunc()->insert(name, this);-
44}-
45-
46QConfFile::~QConfFile()-
47{-
48 if (usedHashFunc())-
49 usedHashFunc()->remove(name);-
50}-
51-
52ParsedSettingsMap QConfFile::mergedKeyMap() const-
53{-
54 ParsedSettingsMap result = originalKeys;-
55 ParsedSettingsMap::const_iterator i;-
56-
57 for (i = removedKeys.begin(); i != removedKeys.end(); ++i)-
58 result.remove(i.key());-
59 for (i = addedKeys.begin(); i != addedKeys.end(); ++i)-
60 result.insert(i.key(), i.value());-
61 return result;-
62}-
63-
64bool QConfFile::isWritable() const-
65{-
66 QFileInfo fileInfo(name);-
67-
68-
69 if (fileInfo.exists()) {-
70-
71 QFile file(name);-
72 return file.open(QFile::ReadWrite);-
73-
74 } else {-
75-
76 QDir dir(fileInfo.absolutePath());-
77 if (!dir.exists()) {-
78 if (!dir.mkpath(dir.absolutePath()))-
79 return false;-
80 }-
81-
82-
83 QTemporaryFile file(name);-
84 return file.open();-
85 }-
86-
87}-
88-
89QConfFile *QConfFile::fromName(const QString &fileName, bool _userPerms)-
90{-
91 QString absPath = QFileInfo(fileName).absoluteFilePath();-
92-
93 ConfFileHash *usedHash = usedHashFunc();-
94 ConfFileCache *unusedCache = unusedCacheFunc();-
95-
96 QConfFile *confFile = 0;-
97 QMutexLocker locker(&settingsGlobalMutex);-
98-
99 if (!(confFile = usedHash->value(absPath))) {-
100 if ((confFile = unusedCache->take(absPath)))-
101 usedHash->insert(absPath, confFile);-
102 }-
103 if (confFile) {-
104 confFile->ref.ref();-
105 return confFile;-
106 }-
107 return new QConfFile(absPath, _userPerms);-
108}-
109-
110void QConfFile::clearCache()-
111{-
112 QMutexLocker locker(&settingsGlobalMutex);-
113 unusedCacheFunc()->clear();-
114}-
115-
116-
117-
118-
119QSettingsPrivate::QSettingsPrivate(QSettings::Format format)-
120 : format(format), scope(QSettings::UserScope ), iniCodec(0), spec(0), fallbacks(true),-
121 pendingChanges(false), status(QSettings::NoError)-
122{-
123}-
124-
125QSettingsPrivate::QSettingsPrivate(QSettings::Format format, QSettings::Scope scope,-
126 const QString &organization, const QString &application)-
127 : format(format), scope(scope), organizationName(organization), applicationName(application),-
128 iniCodec(0), spec(0), fallbacks(true), pendingChanges(false), status(QSettings::NoError)-
129{-
130}-
131-
132QSettingsPrivate::~QSettingsPrivate()-
133{-
134}-
135-
136QString QSettingsPrivate::actualKey(const QString &key) const-
137{-
138 QString n = normalizedKey(key);-
139 ((!(!n.isEmpty())) ? qt_assert_x("QSettings", "empty key",__FILE__,245251) : qt_noop());-
140 n.prepend(groupPrefix);return
executed 48963 times by 30 tests: return groupPrefix + n;
Executed by:
  • tst_QAbstractItemView
  • tst_QAccessibility
  • tst_QCalendarWidget
  • tst_QColorDialog
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QDateTimeEdit
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileIconProvider
  • tst_QFileSystemModel
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QIcon
  • tst_QLabel
  • tst_QLineEdit
  • tst_QMessageBox
  • tst_QPlainTextEdit
  • tst_QPrinter
  • tst_QSettings
  • tst_QSidebar
  • tst_QStyle
  • tst_QStyleSheetStyle
  • tst_QSystemTrayIcon
  • tst_QTextEdit
  • ...
groupPrefix + n;
executed 48963 times by 30 tests: return groupPrefix + n;
Executed by:
  • tst_QAbstractItemView
  • tst_QAccessibility
  • tst_QCalendarWidget
  • tst_QColorDialog
  • tst_QCommandLinkButton
  • tst_QCompleter
  • tst_QDateTimeEdit
  • tst_QErrorMessage
  • tst_QFileDialog2
  • tst_QFileIconProvider
  • tst_QFileSystemModel
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QIcon
  • tst_QLabel
  • tst_QLineEdit
  • tst_QMessageBox
  • tst_QPlainTextEdit
  • tst_QPrinter
  • tst_QSettings
  • tst_QSidebar
  • tst_QStyle
  • tst_QStyleSheetStyle
  • tst_QSystemTrayIcon
  • tst_QTextEdit
  • ...
48963
141}-
142QString QSettingsPrivate::normalizedKey(const QString &key)-
143{-
144 QString result = key;-
145-
146 int i = 0;-
147 while (i < result.size()) {-
148 while (result.at(i) == QLatin1Char('/')) {-
149 result.remove(i, 1);-
150 if (i == result.size())-
151 goto after_loop;-
152 }-
153 while (result.at(i) != QLatin1Char('/')) {-
154 ++i;-
155 if (i == result.size())-
156 return result;-
157 }-
158 ++i;-
159 }-
160-
161after_loop:-
162 if (!result.isEmpty())-
163 result.truncate(i - 1);-
164 return result;-
165}-
166-
167-
168-
169-
170QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format, QSettings::Scope scope,-
171 const QString &organization, const QString &application)-
172{-
173 return new QConfFileSettingsPrivate(format, scope, organization, application);-
174}-
175-
176-
177-
178QSettingsPrivate *QSettingsPrivate::create(const QString &fileName, QSettings::Format format)-
179{-
180 return new QConfFileSettingsPrivate(fileName, format);-
181}-
182-
183-
184void QSettingsPrivate::processChild(QStringRef key, ChildSpec spec, QStringList &result)-
185{-
186 if (spec != AllKeys) {-
187 int slashPos = key.indexOf(QLatin1Char('/'));-
188 if (slashPos == -1) {-
189 if (spec != ChildKeys)-
190 return;-
191 } else {-
192 if (spec != ChildGroups)-
193 return;-
194 key.truncate(slashPos);-
195 }-
196 }-
197 result.append(key.toString());-
198}-
199-
200void QSettingsPrivate::beginGroupOrArray(const QSettingsGroup &group)-
201{-
202 groupStack.push(group);-
203 if (!const QString name = group.name().();-
204 if (!name.
!name.isEmpty()Description
TRUEevaluated 1343 times by 6 tests
Evaluated by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
  • tst_selftests - unknown status
FALSEevaluated 43 times by 1 test
Evaluated by:
  • tst_QSettings
!name.isEmpty()Description
TRUEevaluated 1343 times by 6 tests
Evaluated by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
  • tst_selftests - unknown status
FALSEevaluated 43 times by 1 test
Evaluated by:
  • tst_QSettings
isEmpty()
!name.isEmpty()Description
TRUEevaluated 1343 times by 6 tests
Evaluated by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
  • tst_selftests - unknown status
FALSEevaluated 43 times by 1 test
Evaluated by:
  • tst_QSettings
)
43-1343
205 {groupPrefix += group.name ();
executed 1343 times by 6 tests: groupPrefix += name + QLatin1Char('/');
Executed by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
  • tst_selftests - unknown status
1343
groupPrefix +=
executed 1343 times by 6 tests: groupPrefix += name + QLatin1Char('/');
Executed by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
  • tst_selftests - unknown status
executed 1343 times by 6 tests: groupPrefix += name + QLatin1Char('/');
Executed by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
  • tst_selftests - unknown status
+ QLatin1Char('/');
executed 1343 times by 6 tests: groupPrefix += name + QLatin1Char('/');
Executed by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
  • tst_selftests - unknown status
}}
executed 1386 times by 6 tests: end of block
Executed by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
  • tst_selftests - unknown status
207-
208-
209-
210-
211-
212-
213void QSettingsPrivate::setStatus(QSettings::Status status) const-
214{-
215 if (status == QSettings::NoError || this->status == QSettings::NoError)-
216 this->status = status;-
217}-
218-
219void QSettingsPrivate::update()-
220{-
221 flush();-
222 pendingChanges = false;-
223}-
224-
225void QSettingsPrivate::requestUpdate()-
226{-
227 if (!pendingChanges) {-
228 pendingChanges = true;-
229-
230 QSettings * const q = q_func();-
231 QCoreApplication::postEvent(q, new QEvent(QEvent::UpdateRequest));-
232-
233-
234-
235 }-
236}-
237-
238QStringList QSettingsPrivate::variantListToStringList(const QVariantList &l)-
239{-
240 QStringList result;-
241 result.reserve(l.count());-
242 QVariantList::const_iterator it = l.constBegin();-
243 for (; it != l.constEnd(); ++it)-
244 result.append(variantToString(*it));-
245 return result;-
246}-
247-
248QVariant QSettingsPrivate::stringListToVariantList(const QStringList &l)-
249{-
250 QStringList outStringList = l;-
251 for (int i = 0; i < outStringList.count(); ++i) {-
252 const QString &str = outStringList.at(i);-
253-
254 if (str.startsWith(QLatin1Char('@'))) {-
255 if (str.length() >= 2 && str.at(1) == QLatin1Char('@')) {-
256 outStringList[i].remove(0, 1);-
257 } else {-
258 QVariantList variantList;-
259 const int stringCount = l.count();-
260 variantList.reserve(stringCount);-
261 for (int j = 0; j < stringCount; ++j)-
262 variantList.append(stringToVariant(l.at(j)));-
263 return variantList;-
264 }-
265 }-
266 }-
267 return outStringList;-
268}-
269-
270QString QSettingsPrivate::variantToString(const QVariant &v)-
271{-
272 QString result;-
273-
274 switch (v.type()) {-
275 case
never executed: case QVariant::Invalid:
QVariant::Invalid:
never executed: case QVariant::Invalid:
0
276 result = QLatin1String("@Invalid()");-
277 break;
never executed: break;
0
278-
279 case
executed 253 times by 6 tests: case QVariant::ByteArray:
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
QVariant::ByteArray:
executed 253 times by 6 tests: case QVariant::ByteArray:
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
{
253
280 QByteArray a = v.toByteArray();-
281 result = QLatin1String("@ByteArray(");-
result += QString::fromLatin1)
282 + QLatin1String(a.constData(), a.size());-
result +=())
283 + QLatin1Char(')');-
284 break;
executed 253 times by 6 tests: break;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
253
285 }-
286-
287 case
executed 1867 times by 6 tests: case QVariant::String:
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
QVariant::String:
executed 1867 times by 6 tests: case QVariant::String:
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
1867
288 case
never executed: case QVariant::LongLong:
QVariant::LongLong:
never executed: case QVariant::LongLong:
0
289 case
never executed: case QVariant::ULongLong:
QVariant::ULongLong:
never executed: case QVariant::ULongLong:
0
290 case
executed 631 times by 5 tests: case QVariant::Int:
Executed by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
QVariant::Int:
executed 631 times by 5 tests: case QVariant::Int:
Executed by:
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
631
291 case
executed 96 times by 2 tests: case QVariant::UInt:
Executed by:
  • tst_QColorDialog
  • tst_languageChange
QVariant::UInt:
executed 96 times by 2 tests: case QVariant::UInt:
Executed by:
  • tst_QColorDialog
  • tst_languageChange
96
292 case
executed 4 times by 1 test: case QVariant::Bool:
Executed by:
  • tst_QSettings
QVariant::Bool:
executed 4 times by 1 test: case QVariant::Bool:
Executed by:
  • tst_QSettings
4
293 case
never executed: case QVariant::Double:
QVariant::Double:
never executed: case QVariant::Double:
0
294 case
executed 2 times by 1 test: case QVariant::KeySequence:
Executed by:
  • tst_QSettings
QVariant::KeySequence:
executed 2 times by 1 test: case QVariant::KeySequence:
Executed by:
  • tst_QSettings
{
2
295 result = v.toString();-
296 if (result.contains(QChar::Null)
result.contains(QChar::Null)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 2598 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
)
2-2598
297 result = QLatin1String("@String(") + result + QLatin1Char(')');
executed 2 times by 1 test: result = QLatin1String("@String(") + result + QLatin1Char(')');
Executed by:
  • tst_QSettings
2
298 else if (result.startsWith(QLatin1Char('@'))
result.startsW...tin1Char('@'))Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 2591 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
)
7-2591
299 result.prepend(QLatin1Char('@'));
executed 7 times by 1 test: result.prepend(QLatin1Char('@'));
Executed by:
  • tst_QSettings
7
300 break;
executed 2600 times by 6 tests: break;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
2600
301 }-
302-
303 case
executed 43 times by 1 test: case QVariant::Rect:
Executed by:
  • tst_QSettings
QVariant::Rect:
executed 43 times by 1 test: case QVariant::Rect:
Executed by:
  • tst_QSettings
{
43
304 QRect r = qvariant_cast<QRect>(v);-
305 result += QLatin1String= QString::asprintf("@Rect(%d %d %d %d)");-
result += QString::number(, r.x());
result += QLatin1Char(' ');
result += QString::number((), r.y());
result += QLatin1Char(' ');
result += QString::number((), r.width());
result += QLatin1Char(' ');
result += QString::number((), r.height());
306 result += QLatin1Char(')');break;
executed 43 times by 1 test: break;
Executed by:
  • tst_QSettings
43
307 }-
308 case
executed 41 times by 1 test: case QVariant::Size:
Executed by:
  • tst_QSettings
QVariant::Size:
executed 41 times by 1 test: case QVariant::Size:
Executed by:
  • tst_QSettings
{
41
309 QSize s = qvariant_cast<QSize>(v);-
310 result += QLatin1String= QString::asprintf("@Size(%d %d)");-
result += QString::number(, s.width());
result += QLatin1Char(' ');
result += QString::number((), s.height());
311 result += QLatin1Char(')');break;
executed 41 times by 1 test: break;
Executed by:
  • tst_QSettings
41
312 }-
313 case
executed 39 times by 1 test: case QVariant::Point:
Executed by:
  • tst_QSettings
QVariant::Point:
executed 39 times by 1 test: case QVariant::Point:
Executed by:
  • tst_QSettings
{
39
314 QPoint p = qvariant_cast<QPoint>(v);-
315 result += QLatin1String= QString::asprintf("@Point(%d %d)");-
result += QString::number(, p.x());
result += QLatin1Char(' ');
result += QString::number((), p.y());
316 result += QLatin1Char(')');break;
executed 39 times by 1 test: break;
Executed by:
  • tst_QSettings
39
317 }-
318-
319-
320 default
executed 176 times by 1 test: default:
Executed by:
  • tst_QSettings
:
executed 176 times by 1 test: default:
Executed by:
  • tst_QSettings
{
176
321-
322 QDataStream::Version version;-
323 const char *typeSpec;-
324 if (v.type() == QVariant::DateTime
v.type() == QVariant::DateTimeDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 172 times by 1 test
Evaluated by:
  • tst_QSettings
) {
4-172
325 version = QDataStream::Qt_5_6;-
326 typeSpec = "@DateTime(";-
327 }
executed 4 times by 1 test: end of block
Executed by:
  • tst_QSettings
else {
4
328 version = QDataStream::Qt_4_0;-
329 typeSpec = "@Variant(";-
330 }
executed 172 times by 1 test: end of block
Executed by:
  • tst_QSettings
172
331 QByteArray a;-
332 {-
333 QDataStream s(&a, QIODevice::WriteOnly);-
334 s.setVersion(version);-
335 s << v;-
336 }-
337-
338 result = QLatin1String(typeSpec);-
result += QString::fromLatin1)
339 + QLatin1String(a.constData(), a.size());-
result +=())
340 + QLatin1Char(')');-
341-
342-
343-
344 break;
executed 176 times by 1 test: break;
Executed by:
  • tst_QSettings
176
345 }-
346 }-
347-
348 return
executed 3152 times by 6 tests: return result;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
result;
executed 3152 times by 6 tests: return result;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
3152
349}-
350-
351-
352QVariant QSettingsPrivate::stringToVariant(const QString &s)-
353{-
354 if (s.startsWith(QLatin1Char('@'))) {-
355 if (s.endsWith(QLatin1Char(')'))) {-
356 if (s.startsWith(QLatin1String("@ByteArray("))) {-
357 return QVariant(s.midRef(11, s.size() - 12).toLatin1());-
358 } else if (s.startsWith(QLatin1String("@String("))) {-
359 return QVariant(s.midRef(8, s.size() - 9).toString());-
360 } else if (s.startsWith(QLatin1String("@Variant("))-
361 || s.startsWith(QLatin1String("@DateTime("))) {-
362-
363 QDataStream::Version version;-
364 int offset;-
365 if (s.at(1) == QLatin1Char('D')) {-
366 version = QDataStream::Qt_5_6;-
367 offset = 10;-
368 } else {-
369 version = QDataStream::Qt_4_0;-
370 offset = 9;-
371 }-
372 QByteArray a = s.midRef(offset).toLatin1();-
373 QDataStream stream(&a, QIODevice::ReadOnly);-
374 stream.setVersion(version);-
375 QVariant result;-
376 stream >> result;-
377 return result;-
378-
379-
380-
381-
382 } else if (s.startsWith(QLatin1String("@Rect("))) {-
383 QStringList args = QSettingsPrivate::splitArgs(s, 5);-
384 if (args.size() == 4)-
385 return QVariant(QRect(args[0].toInt(), args[1].toInt(), args[2].toInt(), args[3].toInt()));-
386 } else if (s.startsWith(QLatin1String("@Size("))) {-
387 QStringList args = QSettingsPrivate::splitArgs(s, 5);-
388 if (args.size() == 2)-
389 return QVariant(QSize(args[0].toInt(), args[1].toInt()));-
390 } else if (s.startsWith(QLatin1String("@Point("))) {-
391 QStringList args = QSettingsPrivate::splitArgs(s, 6);-
392 if (args.size() == 2)-
393 return QVariant(QPoint(args[0].toInt(), args[1].toInt()));-
394-
395 } else if (s == QLatin1String("@Invalid()")) {-
396 return QVariant();-
397 }-
398-
399 }-
400 if (s.startsWith(QLatin1String("@@")))-
401 return QVariant(s.mid(1));-
402 }-
403-
404 return QVariant(s);-
405}-
406-
407static const char hexDigits[] = "0123456789ABCDEF";-
408-
409void QSettingsPrivate::iniEscapedKey(const QString &key, QByteArray &result)-
410{-
411 result.reserve(result.length() + key.length() * 3 / 2);-
412 for (int i = 0; i < key.size(); ++i) {-
413 uint ch = key.at(i).unicode();-
414-
415 if (ch == '/') {-
416 result += '\\';-
417 } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')-
418 || ch == '_' || ch == '-' || ch == '.') {-
419 result += (char)ch;-
420 } else if (ch <= 0xFF) {-
421 result += '%';-
422 result += hexDigits[ch / 16];-
423 result += hexDigits[ch % 16];-
424 } else {-
425 result += "%U";-
426 QByteArray hexCode;-
427 for (int i = 0; i < 4; ++i) {-
428 hexCode.prepend(hexDigits[ch % 16]);-
429 ch >>= 4;-
430 }-
431 result += hexCode;-
432 }-
433 }-
434}-
435-
436bool QSettingsPrivate::iniUnescapedKey(const QByteArray &key, int from, int to, QString &result)-
437{-
438 bool lowercaseOnly = true;-
439 int i = from;-
440 result.reserve(result.length() + (to - from));-
441 while (i < to) {-
442 int ch = (uchar)key.at(i);-
443-
444 if (ch == '\\') {-
445 result += QLatin1Char('/');-
446 ++i;-
447 continue;-
448 }-
449-
450 if (ch != '%' || i == to - 1) {-
451 if (uint(ch - 'A') <= 'Z' - 'A')-
452 lowercaseOnly = false;-
453 result += QLatin1Char(ch);-
454 ++i;-
455 continue;-
456 }-
457-
458 int numDigits = 2;-
459 int firstDigitPos = i + 1;-
460-
461 ch = key.at(i + 1);-
462 if (ch == 'U') {-
463 ++firstDigitPos;-
464 numDigits = 4;-
465 }-
466-
467 if (firstDigitPos + numDigits > to) {-
468 result += QLatin1Char('%');-
469-
470 ++i;-
471 continue;-
472 }-
473-
474 bool ok;-
475 ch = key.mid(firstDigitPos, numDigits).toInt(&ok, 16);-
476 if (!ok) {-
477 result += QLatin1Char('%');-
478-
479 ++i;-
480 continue;-
481 }-
482-
483 QChar qch(ch);-
484 if (qch.isUpper())-
485 lowercaseOnly = false;-
486 result += qch;-
487 i = firstDigitPos + numDigits;-
488 }-
489 return lowercaseOnly;-
490}-
491-
492void QSettingsPrivate::iniEscapedString(const QString &str, QByteArray &result, QTextCodec *codec)-
493{-
494 bool needsQuotes = false;-
495 bool escapeNextIfDigit = false;-
496 bool useCodec = codec
codecDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 3175 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
&& !str.startsWith(QLatin1String("@ByteArray("))
!str.startsWit...@ByteArray("))Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 1 time by 1 test
Evaluated by:
  • tst_QSettings
1-3175
497 && !str.startsWith(QLatin1String("@Variant("))
!str.startsWit...("@Variant("))Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEnever evaluated
;
0-2
498-
499 int i;-
500 int startPos = result.size();-
501-
502 result.reserve(startPos + str.size() * 3 / 2);-
503 const QChar *unicode = str.unicode();-
504 for (i = 0; i < str.size()
i < str.size()Description
TRUEevaluated 89650 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 3178 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
; ++i) {
3178-89650
505 uint ch = unicode[i].unicode();-
506 if (ch == ';'
ch == ';'Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 89647 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
|| ch == ','
ch == ','Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 89642 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
|| ch == '='
ch == '='Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 89639 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
)
3-89647
507 needsQuotes = true;
executed 11 times by 1 test: needsQuotes = true;
Executed by:
  • tst_QSettings
11
508-
509 if (escapeNextIfDigit
escapeNextIfDigitDescription
TRUEevaluated 37254 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 52396 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
37254-52396
510 && ((ch >= '0'
ch >= '0'Description
TRUEevaluated 5496 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 31758 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
&& ch <= '9'
ch <= '9'Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 5480 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
)
16-31758
511 || (ch >= 'a'
ch >= 'a'Description
TRUEevaluated 4895 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 32343 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
&& ch <= 'f'
ch <= 'f'Description
TRUEevaluated 824 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 4071 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
)
824-32343
512 || (ch >= 'A'
ch >= 'A'Description
TRUEevaluated 4655 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 31759 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
&& ch <= 'F'
ch <= 'F'Description
TRUEevaluated 527 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 4128 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
))) {
527-31759
513 result += "\\x" ;-
result +=+ QByteArray::number(ch, 16);
514 continue;
executed 1367 times by 6 tests: continue;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
1367
515 }-
516-
517 escapeNextIfDigit = false;-
518-
519 switch (ch) {-
520 case
executed 28726 times by 6 tests: case '\0':
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
'\0':
executed 28726 times by 6 tests: case '\0':
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
28726
521 result += "\\0";-
522 escapeNextIfDigit = true;-
523 break;
executed 28726 times by 6 tests: break;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
28726
524 case
executed 3 times by 1 test: case '\a':
Executed by:
  • tst_QSettings
'\a':
executed 3 times by 1 test: case '\a':
Executed by:
  • tst_QSettings
3
525 result += "\\a";-
526 break;
executed 3 times by 1 test: break;
Executed by:
  • tst_QSettings
3
527 case
executed 125 times by 1 test: case '\b':
Executed by:
  • tst_QSettings
'\b':
executed 125 times by 1 test: case '\b':
Executed by:
  • tst_QSettings
125
528 result += "\\b";-
529 break;
executed 125 times by 1 test: break;
Executed by:
  • tst_QSettings
125
530 case
executed 4 times by 1 test: case '\f':
Executed by:
  • tst_QSettings
'\f':
executed 4 times by 1 test: case '\f':
Executed by:
  • tst_QSettings
4
531 result += "\\f";-
532 break;
executed 4 times by 1 test: break;
Executed by:
  • tst_QSettings
4
533 case
executed 229 times by 1 test: case '\n':
Executed by:
  • tst_QSettings
'\n':
executed 229 times by 1 test: case '\n':
Executed by:
  • tst_QSettings
229
534 result += "\\n";-
535 break;
executed 229 times by 1 test: break;
Executed by:
  • tst_QSettings
229
536 case
executed 4 times by 1 test: case '\r':
Executed by:
  • tst_QSettings
'\r':
executed 4 times by 1 test: case '\r':
Executed by:
  • tst_QSettings
4
537 result += "\\r";-
538 break;
executed 4 times by 1 test: break;
Executed by:
  • tst_QSettings
4
539 case
executed 28 times by 1 test: case '\t':
Executed by:
  • tst_QSettings
'\t':
executed 28 times by 1 test: case '\t':
Executed by:
  • tst_QSettings
28
540 result += "\\t";-
541 break;
executed 28 times by 1 test: break;
Executed by:
  • tst_QSettings
28
542 case
executed 8 times by 1 test: case '\v':
Executed by:
  • tst_QSettings
'\v':
executed 8 times by 1 test: case '\v':
Executed by:
  • tst_QSettings
8
543 result += "\\v";-
544 break;
executed 8 times by 1 test: break;
Executed by:
  • tst_QSettings
8
545 case
executed 3 times by 1 test: case '"':
Executed by:
  • tst_QSettings
'"':
executed 3 times by 1 test: case '"':
Executed by:
  • tst_QSettings
3
546 case
executed 4 times by 1 test: case '\\':
Executed by:
  • tst_QSettings
'\\':
executed 4 times by 1 test: case '\\':
Executed by:
  • tst_QSettings
4
547 result += '\\';-
548 result += (char)ch;-
549 break;
executed 7 times by 1 test: break;
Executed by:
  • tst_QSettings
7
550 default
executed 59149 times by 6 tests: default:
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
:
executed 59149 times by 6 tests: default:
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
59149
551 if (ch <= 0x1F
ch <= 0x1FDescription
TRUEevaluated 3671 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 55478 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
|| (ch >= 0x7F
ch >= 0x7FDescription
TRUEevaluated 3498 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 51980 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
&& !useCodec
!useCodecDescription
TRUEevaluated 3494 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 4 times by 1 test
Evaluated by:
  • tst_QSettings
)) {
4-55478
552 result += "\\x";-
result +=+ QByteArray::number(ch, 16);
553 escapeNextIfDigit = true;-
554-
555 }
executed 7165 times by 6 tests: end of block
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
else if (useCodec
useCodecDescription
TRUEevaluated 26 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 51958 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
) {
26-51958
556-
557 result += codec->fromUnicode(&unicode[i], 1);-
558-
559 }
executed 26 times by 1 test: end of block
Executed by:
  • tst_QSettings
else {
26
560 result += (char)ch;-
561 }
executed 51958 times by 6 tests: end of block
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
51958
562 }-
563 }-
564-
565 if (needsQuotes
needsQuotesDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 3170 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
8-3170
566 || (startPos < result.size()
startPos < result.size()Description
TRUEevaluated 3134 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
FALSEevaluated 36 times by 4 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QSettings
  • tst_languageChange
&& (result.at(startPos) == ' '
result.at(startPos) == ' 'Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 3131 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
3-3134
567 || result.at(result.size() - 1) == ' '
result.at(resu...() - 1) == ' 'Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 3128 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
))) {
3-3128
568 result.insert(startPos, '"');-
569 result += '"';-
570 }
executed 14 times by 1 test: end of block
Executed by:
  • tst_QSettings
14
571}
executed 3178 times by 6 tests: end of block
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
3178
572-
573inline static void iniChopTrailingSpaces(QString &str, int limit)-
574{-
575 int n = str.size() - 1;-
576 QChar ch;-
577 while (n >= limit && ((ch = str.at(n)) == QLatin1Char(' ') || ch == QLatin1Char('\t')))-
578 str.truncate(n--);-
579}-
580-
581void QSettingsPrivate::iniEscapedStringList(const QStringList &strs, QByteArray &result, QTextCodec *codec)-
582{-
583 if (strs.isEmpty()) {-
584 result += "@Invalid()";-
585 } else {-
586 for (int i = 0; i < strs.size(); ++i) {-
587 if (i != 0)-
588 result += ", ";-
589 iniEscapedString(strs.at(i), result, codec);-
590 }-
591 }-
592}-
593-
594bool QSettingsPrivate::iniUnescapedStringList(const QByteArray &str, int from, int to,-
595 QString &stringResult, QStringList &stringListResult,-
596 QTextCodec *codec)-
597{-
598 static const char escapeCodes[][2] =-
599 {-
600 { 'a', '\a' },-
601 { 'b', '\b' },-
602 { 'f', '\f' },-
603 { 'n', '\n' },-
604 { 'r', '\r' },-
605 { 't', '\t' },-
606 { 'v', '\v' },-
607 { '"', '"' },-
608 { '?', '?' },-
609 { '\'', '\'' },-
610 { '\\', '\\' }-
611 };-
612 static const int numEscapeCodes = sizeof(escapeCodes) / sizeof(escapeCodes[0]);-
613-
614 bool isStringList = false;-
615 bool inQuotedString = false;-
616 bool currentValueIsQuoted = false;-
617 int escapeVal = 0;-
618 int i = from;-
619 char ch;-
620-
621StSkipSpaces:-
622 while (i < to && ((ch = str.at(i)) == ' ' || ch == '\t'))-
623 ++i;-
624-
625-
626StNormal:-
627 int chopLimit = stringResult.length();-
628 while (i < to) {-
629 switch (str.at(i)) {-
630 case '\\':-
631 ++i;-
632 if (i >= to)-
633 goto end;-
634-
635 ch = str.at(i++);-
636 for (int j = 0; j < numEscapeCodes; ++j) {-
637 if (ch == escapeCodes[j][0]) {-
638 stringResult += QLatin1Char(escapeCodes[j][1]);-
639 goto StNormal;-
640 }-
641 }-
642-
643 if (ch == 'x') {-
644 escapeVal = 0;-
645-
646 if (i >= to)-
647 goto end;-
648-
649 ch = str.at(i);-
650 if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f'))-
651 goto StHexEscape;-
652 } else if (ch >= '0' && ch <= '7') {-
653 escapeVal = ch - '0';-
654 goto StOctEscape;-
655 } else if (ch == '\n' || ch == '\r') {-
656 if (i < to) {-
657 char ch2 = str.at(i);-
658-
659 if ((ch2 == '\n' || ch2 == '\r') && ch2 != ch)-
660 ++i;-
661 }-
662 } else {-
663-
664 }-
665 chopLimit = stringResult.length();-
666 break;-
667 case '"':-
668 ++i;-
669 currentValueIsQuoted = true;-
670 inQuotedString = !inQuotedString;-
671 if (!inQuotedString)-
672 goto StSkipSpaces;-
673 break;-
674 case ',':-
675 if (!inQuotedString) {-
676 if (!currentValueIsQuoted)-
677 iniChopTrailingSpaces(stringResult, chopLimit);-
678 if (!isStringList) {-
679 isStringList = true;-
680 stringListResult.clear();-
681 stringResult.squeeze();-
682 }-
683 stringListResult.append(stringResult);-
684 stringResult.clear();-
685 currentValueIsQuoted = false;-
686 ++i;-
687 goto StSkipSpaces;-
688 }-
689-
690 default: {-
691 int j = i + 1;-
692 while (j < to) {-
693 ch = str.at(j);-
694 if (ch == '\\' || ch == '"' || ch == ',')-
695 break;-
696 ++j;-
697 }-
698-
699-
700-
701-
702 if (codec) {-
703 stringResult += codec->toUnicode(str.constData() + i, j - i);-
704 } else-
705-
706 {-
707 int n = stringResult.size();-
708 stringResult.resize(n + (j - i));-
709 QChar *resultData = stringResult.data() + n;-
710 for (int k = i; k < j; ++k)-
711 *resultData++ = QLatin1Char(str.at(k));-
712 }-
713 i = j;-
714 }-
715 }-
716 }-
717 if (!currentValueIsQuoted)-
718 iniChopTrailingSpaces(stringResult, chopLimit);-
719 goto end;-
720-
721StHexEscape:-
722 if (i >= to) {-
723 stringResult += QChar(escapeVal);-
724 goto end;-
725 }-
726-
727 ch = str.at(i);-
728 if (ch >= 'a')-
729 ch -= 'a' - 'A';-
730 if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F')) {-
731 escapeVal <<= 4;-
732 escapeVal += strchr(hexDigits, ch) - hexDigits;-
733 ++i;-
734 goto StHexEscape;-
735 } else {-
736 stringResult += QChar(escapeVal);-
737 goto StNormal;-
738 }-
739-
740StOctEscape:-
741 if (i >= to) {-
742 stringResult += QChar(escapeVal);-
743 goto end;-
744 }-
745-
746 ch = str.at(i);-
747 if (ch >= '0' && ch <= '7') {-
748 escapeVal <<= 3;-
749 escapeVal += ch - '0';-
750 ++i;-
751 goto StOctEscape;-
752 } else {-
753 stringResult += QChar(escapeVal);-
754 goto StNormal;-
755 }-
756-
757end:-
758 if (isStringList)-
759 stringListResult.append(stringResult);-
760 return isStringList;-
761}-
762-
763QStringList QSettingsPrivate::splitArgs(const QString &s, int idx)-
764{-
765 int l = s.length();-
766 ((!(l > 0)) ? qt_assert("l > 0",__FILE__,912898) : qt_noop());-
767 ((!(s.at(idx) == QLatin1Char('('))) ? qt_assert("s.at(idx) == QLatin1Char('(')",__FILE__,913899) : qt_noop());-
768 ((!(s.at(l - 1) == QLatin1Char(')'))) ? qt_assert("s.at(l - 1) == QLatin1Char(')')",__FILE__,914900) : qt_noop());-
769-
770 QStringList result;-
771 QString item;-
772-
773 for (++idx; idx < l; ++idx) {-
774 QChar c = s.at(idx);-
775 if (c == QLatin1Char(')')) {-
776 ((!(idx == l - 1)) ? qt_assert("idx == l - 1",__FILE__,922908) : qt_noop());-
777 result.append(item);-
778 } else if (c == QLatin1Char(' ')) {-
779 result.append(item);-
780 item.clear();-
781 } else {-
782 item.append(c);-
783 }-
784 }-
785-
786 return result;-
787}-
788-
789-
790-
791-
792void QConfFileSettingsPrivate::initFormat()-
793{-
794 extension = (format == QSettings::NativeFormat) ? QLatin1String(".conf") : QLatin1String(".ini");-
795 readFunc = 0;-
796 writeFunc = 0;-
797-
798-
799-
800 caseSensitivity = IniCaseSensitivity;-
801-
802-
803 if (format > QSettings::IniFormat) {-
804 QMutexLocker locker(&settingsGlobalMutex);-
805 const CustomFormatVector *customFormatVector = customFormatVectorFunc();-
806-
807 int i = (int)format - (int)QSettings::CustomFormat1;-
808 if (i >= 0 && i < customFormatVector->size()) {-
809 QConfFileCustomFormat info = customFormatVector->at(i);-
810 extension = info.extension;-
811 readFunc = info.readFunc;-
812 writeFunc = info.writeFunc;-
813 caseSensitivity = info.caseSensitivity;-
814 }-
815 }-
816}-
817-
818void QConfFileSettingsPrivate::initAccess()-
819{-
820 if (confFiles[spec]) {-
821 if (format > QSettings::IniFormat) {-
822 if (!readFunc)-
823 setStatus(QSettings::AccessError);-
824 }-
825 }-
826-
827 sync();-
828}-
829static inline int pathHashKey(QSettings::Format format, QSettings::Scope scope)-
830{-
831 return int((uint(format) << 1) | uint(scope == QSettings::SystemScope));-
832}-
833-
834-
835static QString make_user_path()-
836{-
837 static constexpr QChar sep = QLatin1Char('/');-
838 return
executed 7 times by 7 tests: return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + sep;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + sep;
executed 7 times by 7 tests: return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + sep;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
7
839-
840}-
841-
842-
843static void initDefaultPaths(QMutexLocker *locker)-
844{-
845 PathHash *pathHash = pathHashFunc();-
QString systemPath;
846-
847 locker->unlock();-
848-
849-
850-
851-
852-
853-
854 QString systemPath = QLibraryInfo::location(QLibraryInfo::SettingsPath);-
systemPath) +=+ QLatin1Char('/');
855-
856 locker->relock();-
857 if (pathHash->isEmpty()
pathHash->isEmpty()Description
TRUEevaluated 7 times by 7 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
FALSEnever evaluated
) {
0-7
858 const QString userPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);-
userPath += QLatin1Char('/');
make_user_path();
859 pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::UserScope), userPath);-
860 pathHash->insert(pathHashKey(QSettings::IniFormat, QSettings::SystemScope), systemPath);-
861-
862 pathHash->insert(pathHashKey(QSettings::NativeFormat, QSettings::UserScope), userPath);-
863 pathHash->insert(pathHashKey(QSettings::NativeFormat, QSettings::SystemScope), systemPath);-
864-
865-
866 }
executed 7 times by 7 tests: end of block
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
7
867}
executed 7 times by 7 tests: end of block
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
7
868-
869static QString getPath(QSettings::Format format, QSettings::Scope scope)-
870{-
871 ((!((int)QSettings::NativeFormat == 0)) ? qt_assert("(int)QSettings::NativeFormat == 0",__FILE__,11151099) : qt_noop());-
872 ((!((int)QSettings::IniFormat == 1)) ? qt_assert("(int)QSettings::IniFormat == 1",__FILE__,11161100) : qt_noop());-
873-
874 QMutexLocker locker(&settingsGlobalMutex);-
875 PathHash *pathHash = pathHashFunc();-
876 if (pathHash->isEmpty())-
877 initDefaultPaths(&locker);-
878-
879 QString result = pathHash->value(pathHashKey(format, scope));-
880 if (!result.isEmpty())-
881 return result;-
882-
883-
884 return pathHash->value(pathHashKey(QSettings::IniFormat, scope));-
885}-
886-
887QConfFileSettingsPrivate::QConfFileSettingsPrivate(QSettings::Format format,-
888 QSettings::Scope scope,-
889 const QString &organization,-
890 const QString &application)-
891 : QSettingsPrivate(format, scope, organization, application),-
892 nextPosition(0x40000000)-
893{-
894 int i;-
895 initFormat();-
896-
897 QString org = organization;-
898 if (org.isEmpty()
org.isEmpty()Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • tst_QSettings
FALSEevaluated 1420 times by 7 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
) {
8-1420
899 setStatus(QSettings::AccessError);-
900 org = QLatin1String("Unknown Organization");-
901 }
executed 8 times by 1 test: end of block
Executed by:
  • tst_QSettings
8
executed 8 times by 1 test: end of block
Executed by:
  • tst_QSettings
902-
903 QString appFile = org + QDir::separator() + application + extension;-
904 QString orgFile = org + extension;-
905-
906 if (scope == QSettings::UserScope
scope == QSettings::UserScopeDescription
TRUEevaluated 1321 times by 7 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
FALSEevaluated 107 times by 1 test
Evaluated by:
  • tst_QSettings
) {
107-1321
907 QString userPath = getPath(format, QSettings::UserScope);-
908 if (!application.isEmpty()
!application.isEmpty()Description
TRUEevaluated 256 times by 2 tests
Evaluated by:
  • tst_QSettings
  • tst_QTextFormat
FALSEevaluated 1065 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
)
256-1065
909 confFiles[F_User | F_Application].reset(QConfFile::fromName(userPath + appFile, true));
executed 256 times by 2 tests: confFiles[F_User | F_Application].reset(QConfFile::fromName(userPath + appFile, true));
Executed by:
  • tst_QSettings
  • tst_QTextFormat
256
910 confFiles[F_User | F_Organization].reset(QConfFile::fromName(userPath + orgFile, true));-
911 }
executed 1321 times by 7 tests: end of block
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
1321
912-
913 QString systemPath = getPath(format, QSettings::SystemScope);-
914 if (!application.isEmpty()
!application.isEmpty()Description
TRUEevaluated 298 times by 2 tests
Evaluated by:
  • tst_QSettings
  • tst_QTextFormat
FALSEevaluated 1130 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
)
298-1130
915 confFiles[F_System | F_Application].reset(QConfFile::fromName(systemPath + appFile, false));
executed 298 times by 2 tests: confFiles[F_System | F_Application].reset(QConfFile::fromName(systemPath + appFile, false));
Executed by:
  • tst_QSettings
  • tst_QTextFormat
298
916 confFiles[F_System | F_Organization].reset(QConfFile::fromName(systemPath + orgFile, false));-
917-
918 for (i = 0; i < NumConfFiles
i < NumConfFilesDescription
TRUEevaluated 2772 times by 7 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
FALSEnever evaluated
; ++i) {
0-2772
919 if (confFiles[i]
confFiles[i]Description
TRUEevaluated 1428 times by 7 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
FALSEevaluated 1344 times by 6 tests
Evaluated by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
) {
1344-1428
920 spec = i;-
921 break;
executed 1428 times by 7 tests: break;
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
1428
922 }-
923 }
executed 1344 times by 6 tests: end of block
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_languageChange
1344
924-
925 initAccess();-
926}
executed 1428 times by 7 tests: end of block
Executed by:
  • tst_QColorDialog
  • tst_QFileDialog2
  • tst_QFiledialog
  • tst_QGraphicsProxyWidget
  • tst_QSettings
  • tst_QTextFormat
  • tst_languageChange
1428
927-
928QConfFileSettingsPrivate::QConfFileSettingsPrivate(const QString &fileName,-
929 QSettings::Format format)-
930 : QSettingsPrivate(format),-
931 nextPosition(0x40000000)-
932{-
933 initFormat();-
934-
935 confFiles[0].reset(QConfFile::fromName(fileName, true));-
936-
937 initAccess();-
938}-
939-
940QConfFileSettingsPrivate::~QConfFileSettingsPrivate()-
941{-
942 QMutexLocker locker(&settingsGlobalMutex);-
943 ConfFileHash *usedHash = usedHashFunc();-
944 ConfFileCache *unusedCache = unusedCacheFunc();-
945-
946 for (int i = 0; i < NumConfFiles; ++i) {-
947 if (confFiles[i] && !confFiles[i]->ref.deref()) {-
948 if (confFiles[i]->size == 0) {-
949 delete confFiles[i].take();-
950 } else {-
951 if (usedHash)-
952 usedHash->remove(confFiles[i]->name);-
953 if (unusedCache) {-
954 try {-
955-
956 unusedCache->insert(confFiles[i]->name, confFiles[i].data(),-
957 10 + (confFiles[i]->originalKeys.size() / 4));-
958 confFiles[i].take();-
959 } catch (...) {-
960-
961 delete confFiles[i].take();-
962 }-
963 } else {-
964-
965 delete confFiles[i].take();-
966 }-
967 }-
968 }-
969-
970 confFiles[i].take();-
971 }-
972}-
973-
974void QConfFileSettingsPrivate::remove(const QString &key)-
975{-
976 QConfFile *confFile = confFiles[spec].data();-
977 if (!confFile)-
978 return;-
979-
980 QSettingsKey theKey(key, caseSensitivity);-
981 QSettingsKey prefix(key + QLatin1Char('/'), caseSensitivity);-
982 QMutexLocker locker(&confFile->mutex);-
983-
984 ensureSectionParsed(confFile, theKey);-
985 ensureSectionParsed(confFile, prefix);-
986-
987 ParsedSettingsMap::iterator i = confFile->addedKeys.lowerBound(prefix);-
988 while (i != confFile->addedKeys.end() && i.key().startsWith(prefix))-
989 i = confFile->addedKeys.erase(i);-
990 confFile->addedKeys.remove(theKey);-
991-
992 ParsedSettingsMap::const_iterator j = const_cast<const ParsedSettingsMap *>(&confFile->originalKeys)->lowerBound(prefix);-
993 while (j != confFile->originalKeys.constEnd() && j.key().startsWith(prefix)) {-
994 confFile->removedKeys.insert(j.key(), QVariant());-
995 ++j;-
996 }-
997 if (confFile->originalKeys.contains(theKey))-
998 confFile->removedKeys.insert(theKey, QVariant());-
999}-
1000-
1001void QConfFileSettingsPrivate::set(const QString &key, const QVariant &value)-
1002{-
1003 QConfFile *confFile = confFiles[spec].data();-
1004 if (!confFile)-
1005 return;-
1006-
1007 QSettingsKey theKey(key, caseSensitivity, nextPosition++);-
1008 QMutexLocker locker(&confFile->mutex);-
1009 confFile->removedKeys.remove(theKey);-
1010 confFile->addedKeys.insert(theKey, value);-
1011}-
1012-
1013bool QConfFileSettingsPrivate::get(const QString &key, QVariant *value) const-
1014{-
1015 QSettingsKey theKey(key, caseSensitivity);-
1016 ParsedSettingsMap::const_iterator j;-
1017 bool found = false;-
1018-
1019 for (int i = 0; i < NumConfFiles; ++i) {-
1020 if (QConfFile *confFile = confFiles[i].data()) {-
1021 QMutexLocker locker(&confFile->mutex);-
1022-
1023 if (!confFile->addedKeys.isEmpty()) {-
1024 j = confFile->addedKeys.constFind(theKey);-
1025 found = (j != confFile->addedKeys.constEnd());-
1026 }-
1027 if (!found) {-
1028 ensureSectionParsed(confFile, theKey);-
1029 j = confFile->originalKeys.constFind(theKey);-
1030 found = (j != confFile->originalKeys.constEnd()-
1031 && !confFile->removedKeys.contains(theKey));-
1032 }-
1033-
1034 if (found && value)-
1035 *value = *j;-
1036-
1037 if (found)-
1038 return true;-
1039 if (!fallbacks)-
1040 break;-
1041 }-
1042 }-
1043 return false;-
1044}-
1045-
1046QStringList QConfFileSettingsPrivate::children(const QString &prefix, ChildSpec spec) const-
1047{-
1048 QStringList result;-
1049 ParsedSettingsMap::const_iterator j;-
1050-
1051 QSettingsKey thePrefix(prefix, caseSensitivity);-
1052 int startPos = prefix.size();-
1053-
1054 for (int i = 0; i < NumConfFiles; ++i) {-
1055 if (QConfFile *confFile = confFiles[i].data()) {-
1056 QMutexLocker locker(&confFile->mutex);-
1057-
1058 if (thePrefix.isEmpty()) {-
1059 ensureAllSectionsParsed(confFile);-
1060 } else {-
1061 ensureSectionParsed(confFile, thePrefix);-
1062 }-
1063-
1064 j = const_cast<const ParsedSettingsMap *>(-
1065 &confFile->originalKeys)->lowerBound( thePrefix);-
1066 while (j != confFile->originalKeys.constEnd() && j.key().startsWith(thePrefix)) {-
1067 if (!confFile->removedKeys.contains(j.key()))-
1068 processChild(j.key().originalCaseKey().midRef(startPos), spec, result);-
1069 ++j;-
1070 }-
1071-
1072 j = const_cast<const ParsedSettingsMap *>(-
1073 &confFile->addedKeys)->lowerBound(thePrefix);-
1074 while (j != confFile->addedKeys.constEnd() && j.key().startsWith(thePrefix)) {-
1075 processChild(j.key().originalCaseKey().midRef(startPos), spec, result);-
1076 ++j;-
1077 }-
1078-
1079 if (!fallbacks)-
1080 break;-
1081 }-
1082 }-
1083 std::sort(result.begin(), result.end());-
1084 result.erase(std::unique(result.begin(), result.end()),-
1085 result.end());-
1086 return result;-
1087}-
1088-
1089void QConfFileSettingsPrivate::clear()-
1090{-
1091 QConfFile *confFile = confFiles[spec].data();-
1092 if (!confFile)-
1093 return;-
1094-
1095 QMutexLocker locker(&confFile->mutex);-
1096 ensureAllSectionsParsed(confFile);-
1097 confFile->addedKeys.clear();-
1098 confFile->removedKeys = confFile->originalKeys;-
1099}-
1100-
1101void QConfFileSettingsPrivate::sync()-
1102{-
1103-
1104-
1105-
1106 for (int i = 0; i < NumConfFiles; ++i) {-
1107 QConfFile *confFile = confFiles[i].data();-
1108 if (confFile) {-
1109 QMutexLocker locker(&confFile->mutex);-
1110 syncConfFile(i);-
1111 }-
1112 }-
1113}-
1114-
1115void QConfFileSettingsPrivate::flush()-
1116{-
1117 sync();-
1118}-
1119-
1120QString QConfFileSettingsPrivate::fileName() const-
1121{-
1122 QConfFile *confFile = confFiles[spec].data();-
1123 if (!confFile)-
1124 return QString();-
1125 return confFile->name;-
1126}-
1127-
1128bool QConfFileSettingsPrivate::isWritable() const-
1129{-
1130 if (format > QSettings::IniFormat && !writeFunc)-
1131 return false;-
1132-
1133 QConfFile *confFile = confFiles[spec].data();-
1134 if (!confFile)-
1135 return false;-
1136-
1137 return confFile->isWritable();-
1138}-
1139-
1140void QConfFileSettingsPrivate::syncConfFile(int confFileNo)-
1141{-
1142 QConfFile *confFile = confFiles[confFileNo].data();-
1143 bool readOnly = confFile->addedKeys.isEmpty() && confFile->removedKeys.isEmpty();-
1144 bool ok;-
1145-
1146-
1147-
1148-
1149-
1150 if (readOnly && confFile->size > 0) {-
1151 QFileInfo fileInfo(confFile->name);-
1152 if (confFile->size == fileInfo.size() && confFile->timeStamp == fileInfo.lastModified())-
1153 return;-
1154 }-
1155 QLockFile lockFile(confFile->name + QLatin1String(".lock"));-
1156-
1157 if (!readOnly) {-
1158 if (!confFile->isWritable()-
1159-
1160 || !lockFile.lock()-
1161-
1162 ) {-
1163 setStatus(QSettings::AccessError);-
1164 return;-
1165 }-
1166 }-
1167-
1168-
1169-
1170-
1171-
1172 QFileInfo fileInfo(confFile->name);-
1173 bool mustReadFile = true;-
1174 bool createFile = !fileInfo.exists();-
1175-
1176 if (!readOnly)-
1177 mustReadFile = (confFile->size != fileInfo.size()-
1178 || (confFile->size != 0 && confFile->timeStamp != fileInfo.lastModified()));-
1179-
1180 if (mustReadFile) {-
1181 confFile->unparsedIniSections.clear();-
1182 confFile->originalKeys.clear();-
1183-
1184 QFile file(confFile->name);-
1185 if (!createFile && !file.open(QFile::ReadOnly)) {-
1186 setStatus(QSettings::AccessError);-
1187 return;-
1188 }-
1189-
1190-
1191-
1192-
1193-
1194 if (file.isReadable() && fileInfo.size() != 0) {-
1195-
1196-
1197-
1198-
1199-
1200 {-
1201 if (format <= QSettings::IniFormat) {-
1202 QByteArray data = file.readAll();-
1203 ok = readIniFile(data, &confFile->unparsedIniSections);-
1204 } else {-
1205 if (readFunc) {-
1206 QSettings::SettingsMap tempNewKeys;-
1207 ok = readFunc(file, tempNewKeys);-
1208-
1209 if (ok) {-
1210 QSettings::SettingsMap::const_iterator i = tempNewKeys.constBegin();-
1211 while (i != tempNewKeys.constEnd()) {-
1212 confFile->originalKeys.insert(QSettingsKey(i.key(),-
1213 caseSensitivity),-
1214 i.value());-
1215 ++i;-
1216 }-
1217 }-
1218 } else {-
1219 ok = false;-
1220 }-
1221 }-
1222 }-
1223-
1224 if (!ok)-
1225 setStatus(QSettings::FormatError);-
1226 }-
1227-
1228 confFile->size = fileInfo.size();-
1229 confFile->timeStamp = fileInfo.lastModified();-
1230 }-
1231-
1232-
1233-
1234-
1235-
1236 if (!readOnly) {-
1237 ensureAllSectionsParsed(confFile);-
1238 ParsedSettingsMap mergedKeys = confFile->mergedKeyMap();-
1239-
1240-
1241-
1242-
1243-
1244-
1245 {-
1246-
1247 QSaveFile sf(confFile->name);-
1248-
1249-
1250-
1251 if (!sf.open(QIODevice::WriteOnly)) {-
1252 setStatus(QSettings::AccessError);-
1253 ok = false;-
1254 } else if (format <= QSettings::IniFormat) {-
1255 ok = writeIniFile(sf, mergedKeys);-
1256 } else {-
1257 if (writeFunc) {-
1258 QSettings::SettingsMap tempOriginalKeys;-
1259-
1260 ParsedSettingsMap::const_iterator i = mergedKeys.constBegin();-
1261 while (i != mergedKeys.constEnd()) {-
1262 tempOriginalKeys.insert(i.key(), i.value());-
1263 ++i;-
1264 }-
1265 ok = writeFunc(sf, tempOriginalKeys);-
1266 } else {-
1267 ok = false;-
1268 }-
1269 }-
1270-
1271 if (ok)-
1272 ok = sf.commit();-
1273-
1274 }-
1275-
1276 if (ok) {-
1277 confFile->unparsedIniSections.clear();-
1278 confFile->originalKeys = mergedKeys;-
1279 confFile->addedKeys.clear();-
1280 confFile->removedKeys.clear();-
1281-
1282 QFileInfo fileInfo(confFile->name);-
1283 confFile->size = fileInfo.size();-
1284 confFile->timeStamp = fileInfo.lastModified();-
1285-
1286-
1287 if (createFile) {-
1288 QFile::Permissions perms = fileInfo.permissions() | QFile::ReadOwner | QFile::WriteOwner;-
1289 if (!confFile->userPerms)-
1290 perms |= QFile::ReadGroup | QFile::ReadOther;-
1291 QFile(confFile->name).setPermissions(perms);-
1292 }-
1293 } else {-
1294 setStatus(QSettings::AccessError);-
1295 }-
1296 }-
1297}-
1298-
1299enum { Space = 0x1, Special = 0x2 };-
1300-
1301static const char charTraits[256] =-
1302{-
1303-
1304-
1305-
1306 0, 0, 0, 0, 0, 0, 0, 0, 0, Space, Space | Special, 0, 0, Space | Special, 0, 0,-
1307 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1308 Space, 0, Special, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1309 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Special, 0, Special, 0, 0,-
1310 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1311 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Special, 0, 0, 0,-
1312 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1313 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1314-
1315 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1316 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1317 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1318 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1319 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1320 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1321 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-
1322 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0-
1323};-
1324-
1325bool QConfFileSettingsPrivate::readIniLine(const QByteArray &data, int &dataPos,-
1326 int &lineStart, int &lineLen, int &equalsPos)-
1327{-
1328 int dataLen = data.length();-
1329 bool inQuotes = false;-
1330-
1331 equalsPos = -1;-
1332-
1333 lineStart = dataPos;-
1334 while (lineStart < dataLen && (charTraits[uint(uchar(data.at(lineStart)))] & Space))-
1335 ++lineStart;-
1336-
1337 int i = lineStart;-
1338 while (i < dataLen) {-
1339 while (!(charTraits[uint(uchar(data.at(i)))] & Special)) {-
1340 if (++i == dataLen)-
1341 goto break_out_of_outer_loop;-
1342 }-
1343-
1344 char ch = data.at(i++);-
1345 if (ch == '=') {-
1346 if (!inQuotes && equalsPos == -1)-
1347 equalsPos = i - 1;-
1348 } else if (ch == '\n' || ch == '\r') {-
1349 if (i == lineStart + 1) {-
1350 ++lineStart;-
1351 } else if (!inQuotes) {-
1352 --i;-
1353 goto break_out_of_outer_loop;-
1354 }-
1355 } else if (ch == '\\') {-
1356 if (i < dataLen) {-
1357 char ch = data.at(i++);-
1358 if (i < dataLen) {-
1359 char ch2 = data.at(i);-
1360-
1361 if ((ch == '\n' && ch2 == '\r') || (ch == '\r' && ch2 == '\n'))-
1362 ++i;-
1363 }-
1364 }-
1365 } else if (ch == '"') {-
1366 inQuotes = !inQuotes;-
1367 } else {-
1368 ((!(ch == ';')) ? qt_assert("ch == ';'",__FILE__,16291605) : qt_noop());-
1369-
1370 if (i == lineStart + 1) {-
1371 char ch;-
1372 while (i < dataLen && (((ch = data.at(i)) != '\n') && ch != '\r'))-
1373 ++i;-
1374 lineStart = i;-
1375 } else if (!inQuotes) {-
1376 --i;-
1377 goto break_out_of_outer_loop;-
1378 }-
1379 }-
1380 }-
1381-
1382break_out_of_outer_loop:-
1383 dataPos = i;-
1384 lineLen = i - lineStart;-
1385 return lineLen > 0;-
1386}-
1387-
1388-
1389-
1390-
1391-
1392-
1393bool QConfFileSettingsPrivate::readIniFile(const QByteArray &data,-
1394 UnparsedSettingsMap *unparsedIniSections)-
1395{-
1396 QString currentSection;-
1397 int currentSectionStart = 0;-
1398 int dataPos = 0;-
1399 int lineStart;-
1400 int lineLen;-
1401 int equalsPos;-
1402 int position = 0;-
1403 int sectionPosition = 0;-
1404 bool ok = true;-
1405-
1406-
1407-
1408 const uchar *dd = (const uchar *)data.constData();-
1409 if (data.size() >= 3 && dd[0] == 0xef && dd[1] == 0xbb && dd[2] == 0xbf) {-
1410 iniCodec = QTextCodec::codecForName("UTF-8");-
1411 dataPos = 3;-
1412 }-
1413-
1414-
1415 while (readIniLine(data, dataPos, lineStart, lineLen, equalsPos)) {-
1416 char ch = data.at(lineStart);-
1417 if (ch == '[') {-
1418 { QByteArray &sectionData = (*unparsedIniSections)[QSettingsKey(currentSection, IniCaseSensitivity, sectionPosition)]; if (!sectionData.isEmpty()) sectionData.append('\n'); sectionData += data.mid(currentSectionStart, lineStart - currentSectionStart); sectionPosition = ++position; };-
1419-
1420-
1421 QByteArray iniSection;-
1422 int idx = data.indexOf(']', lineStart);-
1423 if (idx == -1 || idx >= lineStart + lineLen) {-
1424 ok = false;-
1425 iniSection = data.mid(lineStart + 1, lineLen - 1);-
1426 } else {-
1427 iniSection = data.mid(lineStart + 1, idx - lineStart - 1);-
1428 }-
1429-
1430 iniSection = iniSection.trimmed();-
1431-
1432 if (qstricmp(iniSection.constData(), "general") == 0) {-
1433 currentSection.clear();-
1434 } else {-
1435 if (qstricmp(iniSection.constData(), "%general") == 0) {-
1436 currentSection = QLatin1String(iniSection.constData() + 1);-
1437 } else {-
1438 currentSection.clear();-
1439 iniUnescapedKey(iniSection, 0, iniSection.size(), currentSection);-
1440 }-
1441 currentSection += QLatin1Char('/');-
1442 }-
1443 currentSectionStart = dataPos;-
1444 }-
1445 ++position;-
1446 }-
1447-
1448 ((!(lineStart == data.length())) ? qt_assert("lineStart == data.length()",__FILE__,17201696) : qt_noop());-
1449 { QByteArray &sectionData = (*unparsedIniSections)[QSettingsKey(currentSection, IniCaseSensitivity, sectionPosition)]; if (!sectionData.isEmpty()) sectionData.append('\n'); sectionData += data.mid(currentSectionStart, lineStart - currentSectionStart); sectionPosition = ++position; };-
1450-
1451 return ok;-
1452-
1453-
1454}-
1455-
1456bool QConfFileSettingsPrivate::readIniSection(const QSettingsKey &section, const QByteArray &data,-
1457 ParsedSettingsMap *settingsMap, QTextCodec *codec)-
1458{-
1459 QStringList strListValue;-
1460 bool sectionIsLowercase = (section == section.originalCaseKey());-
1461 int equalsPos;-
1462-
1463 bool ok = true;-
1464 int dataPos = 0;-
1465 int lineStart;-
1466 int lineLen;-
1467 int position = section.originalKeyPosition();-
1468-
1469 while (readIniLine(data, dataPos, lineStart, lineLen, equalsPos)) {-
1470 char ch = data.at(lineStart);-
1471 ((!(ch != '[')) ? qt_assert("ch != '['",__FILE__,17431719) : qt_noop());-
1472-
1473 if (equalsPos == -1) {-
1474 if (ch != ';')-
1475 ok = false;-
1476 continue;-
1477 }-
1478-
1479 int keyEnd = equalsPos;-
1480 while (keyEnd > lineStart && ((ch = data.at(keyEnd - 1)) == ' ' || ch == '\t'))-
1481 --keyEnd;-
1482 int valueStart = equalsPos + 1;-
1483-
1484 QString key = section.originalCaseKey();-
1485 bool keyIsLowercase = (iniUnescapedKey(data, lineStart, keyEnd, key) && sectionIsLowercase);-
1486-
1487 QString strValue;-
1488 strValue.reserve(lineLen - (valueStart - lineStart));-
1489 bool isStringList = iniUnescapedStringList(data, valueStart, lineStart + lineLen,-
1490 strValue, strListValue, codec);-
1491 QVariant variant;-
1492 if (isStringList) {-
1493 variant = stringListToVariantList(strListValue);-
1494 } else {-
1495 variant = stringToVariant(strValue);-
1496 }-
1497-
1498-
1499-
1500-
1501-
1502-
1503 settingsMap->insert(QSettingsKey(key, keyIsLowercase ? Qt::CaseSensitive-
1504 : IniCaseSensitivity,-
1505 position),-
1506 variant);-
1507 ++position;-
1508 }-
1509-
1510 return ok;-
1511}-
1512-
1513class QSettingsIniKey : public QString-
1514{-
1515public:-
1516 inline QSettingsIniKey() : position(-1) {}-
1517 inline QSettingsIniKey(const QString &str, int pos = -1) : QString(str), position(pos) {}-
1518-
1519 int position;-
1520};-
1521template<> class QTypeInfo<QSettingsIniKey > { public: enum { isComplex = (((Q_MOVABLE_TYPE) & Q_PRIMITIVE_TYPE) == 0), isStatic = (((Q_MOVABLE_TYPE) & (Q_MOVABLE_TYPE | Q_PRIMITIVE_TYPE)) == 0), isRelocatable = !isStatic || ((Q_MOVABLE_TYPE) & Q_RELOCATABLE_TYPE), isLarge = (sizeof(QSettingsIniKey)>sizeof(void*)), isPointer = false, isIntegral = QtPrivate::is_integral< QSettingsIniKey >::value, isDummy = (((Q_MOVABLE_TYPE) & Q_DUMMY_TYPE) != 0), sizeOf = sizeof(QSettingsIniKey) }; static inline const char *name() { return "QSettingsIniKey"; } };-
1522-
1523static bool operator<(const QSettingsIniKey &k1, const QSettingsIniKey &k2)-
1524{-
1525 if (k1.position != k2.position)-
1526 return k1.position < k2.position;-
1527 return static_cast<const QString &>(k1) < static_cast<const QString &>(k2);-
1528}-
1529-
1530typedef QMap<QSettingsIniKey, QVariant> IniKeyMap;-
1531-
1532struct QSettingsIniSection-
1533{-
1534 int position;-
1535 IniKeyMap keyMap;-
1536-
1537 inline QSettingsIniSection() : position(-1) {}-
1538};-
1539-
1540typedef QMap<QString, QSettingsIniSection> IniMap;-
1541-
1542-
1543-
1544-
1545-
1546bool QConfFileSettingsPrivate::writeIniFile(QIODevice &device, const ParsedSettingsMap &map)-
1547{-
1548 IniMap iniMap;-
1549 IniMap::const_iterator i;-
1550-
1551-
1552-
1553-
1554 const char eol = '\n';-
1555-
1556-
1557 for (ParsedSettingsMap::const_iterator j = map.constBegin(); j != map.constEnd(); ++j) {-
1558 QString section;-
1559 QSettingsIniKey key(j.key().originalCaseKey(), j.key().originalKeyPosition());-
1560 int slashPos;-
1561-
1562 if ((slashPos = key.indexOf(QLatin1Char('/'))) != -1) {-
1563 section = key.left(slashPos);-
1564 key.remove(0, slashPos + 1);-
1565 }-
1566-
1567 QSettingsIniSection &iniSection = iniMap[section];-
1568-
1569-
1570 if (uint(key.position) < uint(iniSection.position))-
1571 iniSection.position = key.position;-
1572 iniSection.keyMap[key] = j.value();-
1573 }-
1574-
1575 const int sectionCount = iniMap.size();-
1576 QVector<QSettingsIniKey> sections;-
1577 sections.reserve(sectionCount);-
1578 for (i = iniMap.constBegin(); i != iniMap.constEnd(); ++i)-
1579 sections.append(QSettingsIniKey(i.key(), i.value().position));-
1580 std::sort(sections.begin(), sections.end());-
1581-
1582 bool writeError = false;-
1583 for (int j = 0; !writeError && j < sectionCount; ++j) {-
1584 i = iniMap.constFind(sections.at(j));-
1585 ((!(i != iniMap.constEnd())) ? qt_assert("i != iniMap.constEnd()",__FILE__,18571833) : qt_noop());-
1586-
1587 QByteArray realSection;-
1588-
1589 iniEscapedKey(i.key(), realSection);-
1590-
1591 if (realSection.isEmpty()) {-
1592 realSection = "[General]";-
1593 } else if (qstricmp(realSection.constData(), "general") == 0) {-
1594 realSection = "[%General]";-
1595 } else {-
1596 realSection.prepend('[');-
1597 realSection.append(']');-
1598 }-
1599-
1600 if (j != 0)-
1601 realSection.prepend(eol);-
1602 realSection += eol;-
1603-
1604 device.write(realSection);-
1605-
1606 const IniKeyMap &ents = i.value().keyMap;-
1607 for (IniKeyMap::const_iterator j = ents.constBegin(); j != ents.constEnd(); ++j) {-
1608 QByteArray block;-
1609 iniEscapedKey(j.key(), block);-
1610 block += '=';-
1611-
1612 const QVariant &value = j.value();-
1613-
1614-
1615-
1616-
1617-
1618-
1619 if (value.type() == QVariant::StringList-
1620 || (value.type() == QVariant::List && value.toList().size() != 1)) {-
1621 iniEscapedStringList(variantListToStringList(value.toList()), block, iniCodec);-
1622 } else {-
1623 iniEscapedString(variantToString(value), block, iniCodec);-
1624 }-
1625 block += eol;-
1626 if (device.write(block) == -1) {-
1627 writeError = true;-
1628 break;-
1629 }-
1630 }-
1631 }-
1632 return !writeError;-
1633}-
1634-
1635void QConfFileSettingsPrivate::ensureAllSectionsParsed(QConfFile *confFile) const-
1636{-
1637 UnparsedSettingsMap::const_iterator i = confFile->unparsedIniSections.constBegin();-
1638 const UnparsedSettingsMap::const_iterator end = confFile->unparsedIniSections.constEnd();-
1639-
1640 for (; i != end; ++i) {-
1641 if (!QConfFileSettingsPrivate::readIniSection(i.key(), i.value(), &confFile->originalKeys, iniCodec))-
1642 setStatus(QSettings::FormatError);-
1643 }-
1644 confFile->unparsedIniSections.clear();-
1645}-
1646-
1647void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,-
1648 const QSettingsKey &key) const-
1649{-
1650 if (confFile->unparsedIniSections.isEmpty())-
1651 return;-
1652-
1653 UnparsedSettingsMap::iterator i;-
1654-
1655 int indexOfSlash = key.indexOf(QLatin1Char('/'));-
1656 if (indexOfSlash != -1) {-
1657 i = confFile->unparsedIniSections.upperBound(key);-
1658 if (i == confFile->unparsedIniSections.begin())-
1659 return;-
1660 --i;-
1661 if (i.key().isEmpty() || !key.startsWith(i.key()))-
1662 return;-
1663 } else {-
1664 i = confFile->unparsedIniSections.begin();-
1665 if (i == confFile->unparsedIniSections.end() || !i.key().isEmpty())-
1666 return;-
1667 }-
1668-
1669 if (!QConfFileSettingsPrivate::readIniSection(i.key(), i.value(), &confFile->originalKeys, iniCodec))-
1670 setStatus(QSettings::FormatError);-
1671 confFile->unparsedIniSections.erase(i);-
1672}-
1673QSettings::QSettings(const QString &organization, const QString &application, QObject *parent)-
1674 : QObject(*QSettingsPrivate::create(NativeFormat, UserScope, organization, application),-
1675 parent)-
1676{-
1677}-
1678QSettings::QSettings(Scope scope, const QString &organization, const QString &application,-
1679 QObject *parent)-
1680 : QObject(*QSettingsPrivate::create(NativeFormat, scope, organization, application), parent)-
1681{-
1682}-
1683QSettings::QSettings(Format format, Scope scope, const QString &organization,-
1684 const QString &application, QObject *parent)-
1685 : QObject(*QSettingsPrivate::create(format, scope, organization, application), parent)-
1686{-
1687}-
1688QSettings::QSettings(const QString &fileName, Format format, QObject *parent)-
1689 : QObject(*QSettingsPrivate::create(fileName, format), parent)-
1690{-
1691}-
1692QSettings::QSettings(QObject *parent)-
1693 : QObject(*QSettingsPrivate::create(globalDefaultFormat, UserScope,-
1694-
1695-
1696-
1697-
1698-
1699 QCoreApplication::organizationName().isEmpty()-
1700 ? QCoreApplication::organizationDomain()-
1701 : QCoreApplication::organizationName()-
1702-
1703 , QCoreApplication::applicationName()),-
1704 parent)-
1705{-
1706}-
1707QSettings::~QSettings()-
1708{-
1709 QSettingsPrivate * const d = d_func();-
1710 if (d->pendingChanges) {-
1711 try {-
1712 d->flush();-
1713 } catch (...) {-
1714 ;-
1715 }-
1716 }-
1717}-
1718void QSettings::clear()-
1719{-
1720 QSettingsPrivate * const d = d_func();-
1721 d->clear();-
1722 d->requestUpdate();-
1723}-
1724void QSettings::sync()-
1725{-
1726 QSettingsPrivate * const d = d_func();-
1727 d->sync();-
1728}-
1729QString QSettings::fileName() const-
1730{-
1731 const QSettingsPrivate * const d = d_func();-
1732 return d->fileName();-
1733}-
1734QSettings::Format QSettings::format() const-
1735{-
1736 const QSettingsPrivate * const d = d_func();-
1737 return d->format;-
1738}-
1739QSettings::Scope QSettings::scope() const-
1740{-
1741 const QSettingsPrivate * const d = d_func();-
1742 return d->scope;-
1743}-
1744QString QSettings::organizationName() const-
1745{-
1746 const QSettingsPrivate * const d = d_func();-
1747 return d->organizationName;-
1748}-
1749QString QSettings::applicationName() const-
1750{-
1751 const QSettingsPrivate * const d = d_func();-
1752 return d->applicationName;-
1753}-
1754void QSettings::setIniCodec(QTextCodec *codec)-
1755{-
1756 QSettingsPrivate * const d = d_func();-
1757 d->iniCodec = codec;-
1758}-
1759void QSettings::setIniCodec(const char *codecName)-
1760{-
1761 QSettingsPrivate * const d = d_func();-
1762 if (QTextCodec *codec = QTextCodec::codecForName(codecName))-
1763 d->iniCodec = codec;-
1764}-
1765QTextCodec *QSettings::iniCodec() const-
1766{-
1767 const QSettingsPrivate * const d = d_func();-
1768 return d->iniCodec;-
1769}-
1770QSettings::Status QSettings::status() const-
1771{-
1772 const QSettingsPrivate * const d = d_func();-
1773 return d->status;-
1774}-
1775void QSettings::beginGroup(const QString &prefix)-
1776{-
1777 QSettingsPrivate * const d = d_func();-
1778 d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix)));-
1779}-
1780void QSettings::endGroup()-
1781{-
1782 QSettingsPrivate * const d = d_func();-
1783 if (d->groupStack.isEmpty()) {-
1784 QMessageLogger(__FILE__, 29382911, __PRETTY_FUNCTION__).warning("QSettings::endGroup: No matching beginGroup()");-
1785 return;-
1786 }-
1787-
1788 QSettingsGroup group = d->groupStack.pop();-
1789 int len = group.toString().size();-
1790 if (len > 0)-
1791 d->groupPrefix.truncate(d->groupPrefix.size() - (len + 1));-
1792-
1793 if (group.isArray())-
1794 QMessageLogger(__FILE__, 29482921, __PRETTY_FUNCTION__).warning("QSettings::endGroup: Expected endArray() instead");-
1795}-
1796-
1797-
1798-
1799-
1800-
1801-
1802QString QSettings::group() const-
1803{-
1804 const QSettingsPrivate * const d = d_func();-
1805 return d->groupPrefix.left(d->groupPrefix.size() - 1);-
1806}-
1807int QSettings::beginReadArray(const QString &prefix)-
1808{-
1809 QSettingsPrivate * const d = d_func();-
1810 d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix), false));-
1811 return value(QLatin1String("size")).toInt();-
1812}-
1813void QSettings::beginWriteArray(const QString &prefix, int size)-
1814{-
1815 QSettingsPrivate * const d = d_func();-
1816 d->beginGroupOrArray(QSettingsGroup(d->normalizedKey(prefix), size < 0));-
1817-
1818 if (size < 0)-
1819 remove(QLatin1String("size"));-
1820 else-
1821 setValue(QLatin1String("size"), size);-
1822}-
1823-
1824-
1825-
1826-
1827-
1828-
1829-
1830void QSettings::endArray()-
1831{-
1832 QSettingsPrivate * const d = d_func();-
1833 if (d->groupStack.isEmpty()) {-
1834 QMessageLogger(__FILE__, 30313004, __PRETTY_FUNCTION__).warning("QSettings::endArray: No matching beginArray()");-
1835 return;-
1836 }-
1837-
1838 QSettingsGroup group = d->groupStack.top();-
1839 int len = group.toString().size();-
1840 d->groupStack.pop();-
1841 if (len > 0)-
1842 d->groupPrefix.truncate(d->groupPrefix.size() - (len + 1));-
1843-
1844 if (group.arraySizeGuess() != -1)-
1845 setValue(group.name() + QLatin1String("/size"), group.arraySizeGuess());-
1846-
1847 if (!group.isArray())-
1848 QMessageLogger(__FILE__, 30453018, __PRETTY_FUNCTION__).warning("QSettings::endArray: Expected endGroup() instead");-
1849}-
1850void QSettings::setArrayIndex(int i)-
1851{-
1852 QSettingsPrivate * const d = d_func();-
1853 if (d->groupStack.isEmpty() || !d->groupStack.top().isArray()) {-
1854 QMessageLogger(__FILE__, 30603033, __PRETTY_FUNCTION__).warning("QSettings::setArrayIndex: Missing beginArray()");-
1855 return;-
1856 }-
1857-
1858 QSettingsGroup &top = d->groupStack.top();-
1859 int len = top.toString().size();-
1860 top.setArrayIndex(qMax(i, 0));-
1861 d->groupPrefix.replace(d->groupPrefix.size() - len - 1, len, top.toString());-
1862}-
1863QStringList QSettings::allKeys() const-
1864{-
1865 const QSettingsPrivate * const d = d_func();-
1866 return d->children(d->groupPrefix, QSettingsPrivate::AllKeys);-
1867}-
1868QStringList QSettings::childKeys() const-
1869{-
1870 const QSettingsPrivate * const d = d_func();-
1871 return d->children(d->groupPrefix, QSettingsPrivate::ChildKeys);-
1872}-
1873QStringList QSettings::childGroups() const-
1874{-
1875 const QSettingsPrivate * const d = d_func();-
1876 return d->children(d->groupPrefix, QSettingsPrivate::ChildGroups);-
1877}-
1878bool QSettings::isWritable() const-
1879{-
1880 const QSettingsPrivate * const d = d_func();-
1881 return d->isWritable();-
1882}-
1883void QSettings::setValue(const QString &key, const QVariant &value)-
1884{-
1885 QSettingsPrivate * const d = d_func();-
1886 if (key.isEmpty()) {-
1887 QMessageLogger(__FILE__, 31773150, __PRETTY_FUNCTION__).warning("QSettings::setValue: Empty key passed");-
1888 return;-
1889 }-
1890 QString k = d->actualKey(key);-
1891 d->set(k, value);-
1892 d->requestUpdate();-
1893}-
1894void QSettings::remove(const QString &key)-
1895{-
1896 QSettingsPrivate * const d = d_func();-
1897-
1898-
1899-
1900-
1901 QString theKey = d->normalizedKey(key);-
1902 if (theKey.isEmpty())-
1903 theKey = group();-
1904 else-
1905 theKey.prepend(d->groupPrefix);-
1906-
1907 if (theKey.isEmpty()) {-
1908 d->clear();-
1909 } else {-
1910 d->remove(theKey);-
1911 }-
1912 d->requestUpdate();-
1913}-
1914bool QSettings::contains(const QString &key) const-
1915{-
1916 const QSettingsPrivate * const d = d_func();-
1917 QString k = d->actualKey(key);-
1918 return d->get(k, 0);-
1919}-
1920void QSettings::setFallbacksEnabled(bool b)-
1921{-
1922 QSettingsPrivate * const d = d_func();-
1923 d->fallbacks = !!b;-
1924}-
1925bool QSettings::fallbacksEnabled() const-
1926{-
1927 const QSettingsPrivate * const d = d_func();-
1928 return d->fallbacks;-
1929}-
1930-
1931-
1932-
1933-
1934-
1935bool QSettings::event(QEvent *event)-
1936{-
1937 QSettingsPrivate * const d = d_func();-
1938 if (event->type() == QEvent::UpdateRequest) {-
1939 d->update();-
1940 return true;-
1941 }-
1942 return QObject::event(event);-
1943}-
1944QVariant QSettings::value(const QString &key, const QVariant &defaultValue) const-
1945{-
1946 const QSettingsPrivate * const d = d_func();-
1947 if (key.isEmpty()) {-
1948 QMessageLogger(__FILE__, 33133286, __PRETTY_FUNCTION__).warning("QSettings::value: Empty key passed");-
1949 return QVariant();-
1950 }-
1951 QVariant result = defaultValue;-
1952 QString k = d->actualKey(key);-
1953 d->get(k, &result);-
1954 return result;-
1955}-
1956void QSettings::setDefaultFormat(Format format)-
1957{-
1958 globalDefaultFormat = format;-
1959}-
1960QSettings::Format QSettings::defaultFormat()-
1961{-
1962 return globalDefaultFormat;-
1963}-
1964void QSettings::setSystemIniPath(const QString &dir)-
1965{-
1966 setPath(IniFormat, SystemScope, dir);-
1967-
1968 setPath(NativeFormat, SystemScope, dir);-
1969-
1970}-
1971-
1972-
1973-
1974-
1975-
1976-
1977-
1978void QSettings::setUserIniPath(const QString &dir)-
1979{-
1980 setPath(IniFormat, UserScope, dir);-
1981-
1982 setPath(NativeFormat, UserScope, dir);-
1983-
1984}-
1985void QSettings::setPath(Format format, Scope scope, const QString &path)-
1986{-
1987 QMutexLocker locker(&settingsGlobalMutex);-
1988 PathHash *pathHash = pathHashFunc();-
1989 if (pathHash->isEmpty())-
1990 initDefaultPaths(&locker);-
1991 pathHash->insert(pathHashKey(format, scope), path + QDir::separator());-
1992}-
1993QSettings::Format QSettings::registerFormat(const QString &extension, ReadFunc readFunc,-
1994 WriteFunc writeFunc,-
1995 Qt::CaseSensitivity caseSensitivity)-
1996{-
1997-
1998 ((!(caseSensitivity == Qt::CaseSensitive)) ? qt_assert("caseSensitivity == Qt::CaseSensitive",__FILE__,35023475) : qt_noop());-
1999-
2000-
2001 QMutexLocker locker(&settingsGlobalMutex);-
2002 CustomFormatVector *customFormatVector = customFormatVectorFunc();-
2003 int index = customFormatVector->size();-
2004 if (index == 16
index == 16Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • tst_QSettings
)
0-3
2005 return
never executed: return QSettings::InvalidFormat;
QSettings::InvalidFormat;
never executed: return QSettings::InvalidFormat;
0
2006-
2007 QConfFileCustomFormat info;-
2008 info.extension = QLatin1Char('.');-
info.extension +=) + extension;
2009 info.readFunc = readFunc;-
2010 info.writeFunc = writeFunc;-
2011 info.caseSensitivity = caseSensitivity;-
2012 customFormatVector->append(info);-
2013-
2014 return
executed 3 times by 1 test: return QSettings::Format((int)QSettings::CustomFormat1 + index);
Executed by:
  • tst_QSettings
QSettings::Format((int)QSettings::CustomFormat1 + index);
executed 3 times by 1 test: return QSettings::Format((int)QSettings::CustomFormat1 + index);
Executed by:
  • tst_QSettings
3
2015}-
2016-
2017-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9