QSettings: Remove calls to deprecated API on macOS

CFURLCreateDataAndPropertiesFromResource and
CFURLWriteDataAndPropertiestoResource have been
deprecated since 10.9. We replace them with simple
QFile access.

Code cleaning and included.

Change-Id: I19c7ceac41c8c511962f1128bd8e210e3adb434c
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
This commit is contained in:
Gabriel de Dietrich 2016-06-29 16:20:31 -07:00 committed by Jake Petroules
parent 4c1c68b2ba
commit bc1b45ff9f
6 changed files with 58 additions and 74 deletions

6
configure vendored
View File

@ -1746,11 +1746,13 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
EXTRA_OBJS="$EXTRA_OBJS \ EXTRA_OBJS="$EXTRA_OBJS \
qsettings_mac.o \ qsettings_mac.o \
qcore_mac.o \ qcore_mac.o \
qcore_mac_objc.o" qcore_mac_objc.o \
qcore_foundation.o"
EXTRA_SRCS="$EXTRA_SRCS \ EXTRA_SRCS="$EXTRA_SRCS \
\"\$(SOURCE_PATH)/src/corelib/io/qsettings_mac.cpp\" \ \"\$(SOURCE_PATH)/src/corelib/io/qsettings_mac.cpp\" \
\"\$(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp\" \ \"\$(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp\" \
\"\$(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm\"" \"\$(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm\" \
\"\$(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm\""
fi fi
echo >>"$mkfile" echo >>"$mkfile"

View File

@ -75,6 +75,7 @@ DEPEND_SRC = \
$(SOURCE_PATH)/src/corelib/tools/qlinkedlist.cpp \ $(SOURCE_PATH)/src/corelib/tools/qlinkedlist.cpp \
$(SOURCE_PATH)/src/corelib/tools/qhash.cpp $(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp \ $(SOURCE_PATH)/src/corelib/tools/qhash.cpp $(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp \
$(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm \ $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm \
$(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm \
$(SOURCE_PATH)/src/corelib/io/qtemporaryfile.cpp $(SOURCE_PATH)/src/corelib/kernel/qmetatype.cpp \ $(SOURCE_PATH)/src/corelib/io/qtemporaryfile.cpp $(SOURCE_PATH)/src/corelib/kernel/qmetatype.cpp \
$(SOURCE_PATH)/src/corelib/io/qsettings.cpp $(SOURCE_PATH)/src/corelib/kernel/qvariant.cpp \ $(SOURCE_PATH)/src/corelib/io/qsettings.cpp $(SOURCE_PATH)/src/corelib/kernel/qvariant.cpp \
$(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp $(SOURCE_PATH)/src/corelib/tools/qcryptographichash.cpp \ $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp $(SOURCE_PATH)/src/corelib/tools/qcryptographichash.cpp \
@ -274,6 +275,9 @@ qcore_mac.o: $(SOURCE_PATH)/src/corelib/kernel/qcore_mac.cpp
qcore_mac_objc.o: $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm qcore_mac_objc.o: $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qcore_mac_objc.mm
qcore_foundation.o: $(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qcore_foundation.mm
qutfcodec.o: $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp qutfcodec.o: $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp

View File

@ -1355,7 +1355,6 @@ void QConfFileSettingsPrivate::syncConfFile(int confFileNo)
{ {
QConfFile *confFile = confFiles[confFileNo].data(); QConfFile *confFile = confFiles[confFileNo].data();
bool readOnly = confFile->addedKeys.isEmpty() && confFile->removedKeys.isEmpty(); bool readOnly = confFile->addedKeys.isEmpty() && confFile->removedKeys.isEmpty();
bool ok;
/* /*
We can often optimize the read-only case, if the file on disk We can often optimize the read-only case, if the file on disk
@ -1415,31 +1414,26 @@ void QConfFileSettingsPrivate::syncConfFile(int confFileNo)
because they don't exist) are treated as empty files. because they don't exist) are treated as empty files.
*/ */
if (file.isReadable() && fileInfo.size() != 0) { if (file.isReadable() && fileInfo.size() != 0) {
bool ok = false;
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
if (format == QSettings::NativeFormat) { if (format == QSettings::NativeFormat) {
ok = readPlistFile(confFile->name, &confFile->originalKeys); QByteArray data = file.readAll();
ok = readPlistFile(data, &confFile->originalKeys);
} else } else
#endif #endif
{ if (format <= QSettings::IniFormat) {
if (format <= QSettings::IniFormat) { QByteArray data = file.readAll();
QByteArray data = file.readAll(); ok = readIniFile(data, &confFile->unparsedIniSections);
ok = readIniFile(data, &confFile->unparsedIniSections); } else if (readFunc) {
} else { QSettings::SettingsMap tempNewKeys;
if (readFunc) { ok = readFunc(file, tempNewKeys);
QSettings::SettingsMap tempNewKeys;
ok = readFunc(file, tempNewKeys);
if (ok) { if (ok) {
QSettings::SettingsMap::const_iterator i = tempNewKeys.constBegin(); QSettings::SettingsMap::const_iterator i = tempNewKeys.constBegin();
while (i != tempNewKeys.constEnd()) { while (i != tempNewKeys.constEnd()) {
confFile->originalKeys.insert(QSettingsKey(i.key(), confFile->originalKeys.insert(QSettingsKey(i.key(), caseSensitivity),
caseSensitivity), i.value());
i.value()); ++i;
++i;
}
}
} else {
ok = false;
} }
} }
} }
@ -1457,45 +1451,43 @@ void QConfFileSettingsPrivate::syncConfFile(int confFileNo)
so everything is under control. so everything is under control.
*/ */
if (!readOnly) { if (!readOnly) {
bool ok = false;
ensureAllSectionsParsed(confFile); ensureAllSectionsParsed(confFile);
ParsedSettingsMap mergedKeys = confFile->mergedKeyMap(); ParsedSettingsMap mergedKeys = confFile->mergedKeyMap();
#ifndef QT_BOOTSTRAPPED
QSaveFile sf(confFile->name);
#else
QFile sf(confFile->name);
#endif
if (!sf.open(QIODevice::WriteOnly)) {
setStatus(QSettings::AccessError);
return;
}
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
if (format == QSettings::NativeFormat) { if (format == QSettings::NativeFormat) {
ok = writePlistFile(confFile->name, mergedKeys); ok = writePlistFile(sf, mergedKeys);
} else } else
#endif #endif
{ if (format <= QSettings::IniFormat) {
#ifndef QT_BOOTSTRAPPED ok = writeIniFile(sf, mergedKeys);
QSaveFile sf(confFile->name); } else if (writeFunc) {
#else QSettings::SettingsMap tempOriginalKeys;
QFile sf(confFile->name);
#endif
if (!sf.open(QIODevice::WriteOnly)) {
setStatus(QSettings::AccessError);
ok = false;
} else if (format <= QSettings::IniFormat) {
ok = writeIniFile(sf, mergedKeys);
} else {
if (writeFunc) {
QSettings::SettingsMap tempOriginalKeys;
ParsedSettingsMap::const_iterator i = mergedKeys.constBegin(); ParsedSettingsMap::const_iterator i = mergedKeys.constBegin();
while (i != mergedKeys.constEnd()) { while (i != mergedKeys.constEnd()) {
tempOriginalKeys.insert(i.key(), i.value()); tempOriginalKeys.insert(i.key(), i.value());
++i; ++i;
}
ok = writeFunc(sf, tempOriginalKeys);
} else {
ok = false;
}
} }
#ifndef QT_BOOTSTRAPPED ok = writeFunc(sf, tempOriginalKeys);
if (ok)
ok = sf.commit();
#endif
} }
#ifndef QT_BOOTSTRAPPED
if (ok)
ok = sf.commit();
#endif
if (ok) { if (ok) {
confFile->unparsedIniSections.clear(); confFile->unparsedIniSections.clear();
confFile->originalKeys = mergedKeys; confFile->originalKeys = mergedKeys;

View File

@ -613,24 +613,11 @@ QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format,
} }
} }
static QCFType<CFURLRef> urlFromFileName(const QString &fileName) bool QConfFileSettingsPrivate::readPlistFile(const QByteArray &data, ParsedSettingsMap *map) const
{ {
return CFURLCreateWithFileSystemPath(kCFAllocatorDefault, QCFString(fileName), QCFType<CFDataRef> cfData = data.toRawCFData();
kCFURLPOSIXPathStyle, false);
}
bool QConfFileSettingsPrivate::readPlistFile(const QString &fileName, ParsedSettingsMap *map) const
{
QCFType<CFDataRef> resource;
SInt32 code;
if (!CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault, urlFromFileName(fileName),
&resource, 0, 0, &code))
return false;
QCFString errorStr;
QCFType<CFPropertyListRef> propertyList = QCFType<CFPropertyListRef> propertyList =
CFPropertyListCreateFromXMLData(kCFAllocatorDefault, resource, kCFPropertyListImmutable, CFPropertyListCreateWithData(kCFAllocatorDefault, cfData, kCFPropertyListImmutable, Q_NULLPTR, Q_NULLPTR);
&errorStr);
if (!propertyList) if (!propertyList)
return true; return true;
@ -651,8 +638,7 @@ bool QConfFileSettingsPrivate::readPlistFile(const QString &fileName, ParsedSett
return true; return true;
} }
bool QConfFileSettingsPrivate::writePlistFile(const QString &fileName, bool QConfFileSettingsPrivate::writePlistFile(QIODevice &file, const ParsedSettingsMap &map) const
const ParsedSettingsMap &map) const
{ {
QVarLengthArray<QCFType<CFStringRef> > cfkeys(map.size()); QVarLengthArray<QCFType<CFStringRef> > cfkeys(map.size());
QVarLengthArray<QCFType<CFPropertyListRef> > cfvalues(map.size()); QVarLengthArray<QCFType<CFPropertyListRef> > cfvalues(map.size());
@ -675,8 +661,7 @@ bool QConfFileSettingsPrivate::writePlistFile(const QString &fileName,
QCFType<CFDataRef> xmlData = CFPropertyListCreateData( QCFType<CFDataRef> xmlData = CFPropertyListCreateData(
kCFAllocatorDefault, propertyList, kCFPropertyListXMLFormat_v1_0, 0, 0); kCFAllocatorDefault, propertyList, kCFPropertyListXMLFormat_v1_0, 0, 0);
SInt32 code; return file.write(QByteArray::fromRawCFData(xmlData)) == CFDataGetLength(xmlData);
return CFURLWriteDataAndPropertiesToResource(urlFromFileName(fileName), xmlData, 0, &code);
} }
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -296,8 +296,8 @@ private:
void syncConfFile(int confFileNo); void syncConfFile(int confFileNo);
bool writeIniFile(QIODevice &device, const ParsedSettingsMap &map); bool writeIniFile(QIODevice &device, const ParsedSettingsMap &map);
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
bool readPlistFile(const QString &fileName, ParsedSettingsMap *map) const; bool readPlistFile(const QByteArray &data, ParsedSettingsMap *map) const;
bool writePlistFile(const QString &fileName, const ParsedSettingsMap &map) const; bool writePlistFile(QIODevice &file, const ParsedSettingsMap &map) const;
#endif #endif
void ensureAllSectionsParsed(QConfFile *confFile) const; void ensureAllSectionsParsed(QConfFile *confFile) const;
void ensureSectionParsed(QConfFile *confFile, const QSettingsKey &key) const; void ensureSectionParsed(QConfFile *confFile, const QSettingsKey &key) const;

View File

@ -119,7 +119,8 @@ mac {
../../corelib/kernel/qcoreapplication_mac.cpp \ ../../corelib/kernel/qcoreapplication_mac.cpp \
../../corelib/kernel/qcore_mac.cpp ../../corelib/kernel/qcore_mac.cpp
OBJECTIVE_SOURCES += \ OBJECTIVE_SOURCES += \
../../corelib/kernel/qcore_mac_objc.mm ../../corelib/kernel/qcore_mac_objc.mm \
../../corelib/kernel/qcore_foundation.mm
LIBS += -framework Foundation LIBS += -framework Foundation
osx: LIBS_PRIVATE += -framework CoreServices osx: LIBS_PRIVATE += -framework CoreServices