diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2013-02-21 01:53:39 (GMT) |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-05 20:02:58 (GMT) |
commit | aee13de2457b2c4f35aed0cd01935dc951d08698 (patch) | |
tree | f6f4c35a30fe4e39281eeed145487bf4ce3b5ae4 | |
parent | 3c5f501ffcc31b885d8b4f8162cac85c6fe62734 (diff) | |
download | Qt-aee13de2457b2c4f35aed0cd01935dc951d08698.zip Qt-aee13de2457b2c4f35aed0cd01935dc951d08698.tar.gz Qt-aee13de2457b2c4f35aed0cd01935dc951d08698.tar.bz2 |
Don't assume that all CFPropertyListRef are CFArrayRefs
We might need more robust code in the future. But at least for this case
it looks like a CFStringRef is also a possibility.
Task-number: QTBUG-29776
Change-Id: Iaf50835122fcbb7e6e9c7fbf65e31e6143b2bc54
(cherry-picked from qtbase commit 1b08e0307dfebe561fbb0819a2d6b53edd8e8e93)
Reviewed-by: Jake Petroules <jake.petroules@petroules.com>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r-- | src/corelib/kernel/qcore_mac_p.h | 1 | ||||
-rw-r--r-- | src/corelib/tools/qlocale_mac.mm | 22 |
2 files changed, 16 insertions, 7 deletions
diff --git a/src/corelib/kernel/qcore_mac_p.h b/src/corelib/kernel/qcore_mac_p.h index cc18dfc..9759f96 100644 --- a/src/corelib/kernel/qcore_mac_p.h +++ b/src/corelib/kernel/qcore_mac_p.h @@ -125,6 +125,7 @@ public: return *this; } inline T *operator&() { return &type; } + template <typename X> X as() const { return reinterpret_cast<X>(type); } static QCFType constructFromGet(const T &t) { CFRetain(t); diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm index 90d79fc..b2a3094 100644 --- a/src/corelib/tools/qlocale_mac.mm +++ b/src/corelib/tools/qlocale_mac.mm @@ -436,18 +436,26 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const case CurrencyToString: return macFormatCurrency(in.value<QSystemLocale::CurrencyToStringArgument>()); case UILanguages: { - QCFType<CFArrayRef> languages = (CFArrayRef)CFPreferencesCopyValue( + QCFType<CFPropertyListRef> languages = (CFArrayRef)CFPreferencesCopyValue( CFSTR("AppleLanguages"), kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - const int cnt = languages == NULL ? 0 : CFArrayGetCount(languages); QStringList result; - result.reserve(cnt); - for (int i = 0; i < cnt; ++i) { - const QString lang = QCFString::toQString( - static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages, i))); - result.append(lang); + CFTypeID typeId = CFGetTypeID(languages); + if (typeId == CFArrayGetTypeID()) { + const int cnt = CFArrayGetCount(languages.as<CFArrayRef>()); + result.reserve(cnt); + for (int i = 0; i < cnt; ++i) { + const QString lang = QCFString::toQString( + static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages.as<CFArrayRef>(), i))); + result.append(lang); + } + } else if (typeId == CFStringGetTypeID()) { + result = QStringList(QCFString::toQString(languages.as<CFStringRef>())); + } else { + qWarning("QLocale::uiLanguages(): CFPreferencesCopyValue returned unhandled type \"%s\"; please report to http://bugreports.qt-project.org", + qPrintable(QCFString::toQString(CFCopyTypeIDDescription(typeId)))); } return QVariant(result); } |