summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qsettings_mac.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/io/qsettings_mac.cpp')
-rw-r--r--src/corelib/io/qsettings_mac.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/corelib/io/qsettings_mac.cpp b/src/corelib/io/qsettings_mac.cpp
index d73cc4d298..4282fcbe2c 100644
--- a/src/corelib/io/qsettings_mac.cpp
+++ b/src/corelib/io/qsettings_mac.cpp
@@ -214,7 +214,14 @@ static QCFType<CFPropertyListRef> macValue(const QVariant &value)
case QVariant::String:
string_case:
default:
- result = QCFString::toCFStringRef(QSettingsPrivate::variantToString(value));
+ QString string = QSettingsPrivate::variantToString(value);
+ if (string.contains(QChar::Null)) {
+ QByteArray ba = string.toUtf8();
+ result = CFDataCreate(kCFAllocatorDefault, reinterpret_cast<const UInt8 *>(ba.data()),
+ CFIndex(ba.size()));
+ } else {
+ result = QCFString::toCFStringRef(string);
+ }
}
return result;
}
@@ -267,8 +274,17 @@ static QVariant qtValue(CFPropertyListRef cfvalue)
return (bool)CFBooleanGetValue(static_cast<CFBooleanRef>(cfvalue));
} else if (typeId == CFDataGetTypeID()) {
CFDataRef cfdata = static_cast<CFDataRef>(cfvalue);
- return QByteArray(reinterpret_cast<const char *>(CFDataGetBytePtr(cfdata)),
+ QByteArray byteArray = QByteArray(reinterpret_cast<const char *>(CFDataGetBytePtr(cfdata)),
CFDataGetLength(cfdata));
+
+ // Fast-path for QByteArray, so that we don't have to go
+ // though the expensive and lossy conversion via UTF-8.
+ if (!byteArray.startsWith('@'))
+ return byteArray;
+
+ const QString str = QString::fromUtf8(byteArray.constData(), byteArray.size());
+ return QSettingsPrivate::stringToVariant(str);
+
} else if (typeId == CFDictionaryGetTypeID()) {
CFDictionaryRef cfdict = static_cast<CFDictionaryRef>(cfvalue);
CFTypeID arrayTypeId = CFArrayGetTypeID();