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:
parent
4c1c68b2ba
commit
bc1b45ff9f
6
configure
vendored
6
configure
vendored
@ -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"
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user