diff options
author | Jake Petroules <jake.petroules@qt.io> | 2016-09-15 18:22:50 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2016-09-15 18:22:50 +0000 |
commit | eecc5fc52c919d6607e610d858c2749977a1ef75 (patch) | |
tree | dc8c5f6621d6fbaa76bd28c1c127905444ccf50e /src/corelib | |
parent | 6b3845320a9242481842243f2c019aa11ce396df (diff) | |
parent | 40a1f69e8663fb79560c26cfad5ead45b1b3ee5f (diff) |
Merge "Merge remote-tracking branch 'origin/5.8' into dev" into refs/staging/dev
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/configure.json | 611 | ||||
-rw-r--r-- | src/corelib/corelib.pro | 3 | ||||
-rw-r--r-- | src/corelib/global/qcompilerdetection.h | 4 | ||||
-rw-r--r-- | src/corelib/global/qglobal.h | 9 | ||||
-rw-r--r-- | src/corelib/global/qglobal_p.h | 1 | ||||
-rw-r--r-- | src/corelib/global/qlibraryinfo.cpp | 8 | ||||
-rw-r--r-- | src/corelib/io/qtextstream.cpp | 1 | ||||
-rw-r--r-- | src/corelib/tools/qbytearray.cpp | 7 | ||||
-rw-r--r-- | src/corelib/tools/qlocale_win.cpp | 44 | ||||
-rw-r--r-- | src/corelib/tools/tools.pri | 2 |
10 files changed, 639 insertions, 51 deletions
diff --git a/src/corelib/configure.json b/src/corelib/configure.json new file mode 100644 index 0000000000..b0c78f5122 --- /dev/null +++ b/src/corelib/configure.json @@ -0,0 +1,611 @@ +{ + "module": "core", + "testDir": "../../config.tests", + + "commandline": { + "options": { + "doubleconversion": { "type": "enum", "values": [ "no", "qt", "system" ] }, + "eventfd": "boolean", + "glib": "boolean", + "iconv": { "type": "enum", "values": [ "no", "yes", "posix", "sun", "gnu" ] }, + "icu": "boolean", + "inotify": "boolean", + "journald": "boolean", + "pcre": { "type": "enum", "values": [ "qt", "system" ] }, + "posix-ipc": { "type": "boolean", "name": "ipc_posix" }, + "pps": { "type": "boolean", "name": "qqnx_pps" }, + "slog2": "boolean", + "syslog": "boolean" + } + }, + + "libraries": { + "doubleconversion": { + "label": "DoubleConversion", + "test": "unix/doubleconversion", + "sources": [ + "-ldouble-conversion" + ] + }, + "glib": { + "label": "GLib", + "test": "unix/glib", + "sources": [ + { "type": "pkgConfig", "args": "glib-2.0 gthread-2.0" } + ] + }, + "gnu_iconv": { + "label": "GNU libiconv", + "export": "iconv", + "test": "unix/gnu-libiconv", + "sources": [ + "-liconv" + ] + }, + "icu": { + "label": "ICU", + "export": "", + "test": "unix/icu", + "sources": [ + { + "builds": { + "debug": "-lsicuind -lsicuucd -lsicudtd", + "release": "-lsicuin -lsicuuc -lsicudt" + }, + "condition": "config.win32 && !features.shared" + }, + { "libs": "-licuin -licuuc -licudt", "condition": "config.win32 && features.shared" }, + { "libs": "-licui18n -licuuc -licudata", "condition": "!config.win32" } + ] + }, + "journald": { + "label": "journald", + "test": "unix/journald", + "export": "", + "sources": [ + { "type": "pkgConfig", "args": "libsystemd" }, + { "type": "pkgConfig", "args": "libsystemd-journal" } + ] + }, + "libatomic": { + "label": "64 bit atomics in libatomic", + "test": "common/atomic64", + "sources": [ + "-latomic" + ] + }, + "libdl": { + "label": "dlopen() in libdl", + "export": "", + "test": "unix/dlopen", + "sources": [ + "-ldl" + ] + }, + "pcre": { + "label": "PCRE", + "test": "unix/pcre", + "sources": [ + "-lpcre16" + ] + }, + "pps": { + "label": "PPS", + "test": "unix/pps", + "sources": [ + "-lpps" + ] + }, + "slog2": { + "label": "slog2", + "test": "unix/slog2", + "export": "", + "sources": [ + "-lslog2" + ] + } + }, + + "tests": { + "atomic64": { + "label": "64 bit atomics", + "type": "compile", + "test": "common/atomic64" + }, + "atomicfptr": { + "label": "working std::atomic for function pointers", + "type": "compile", + "test": "common/atomicfptr" + }, + "clock-gettime": { + "label": "clock_gettime()", + "type": "compile", + "test": "unix/clock-gettime" + }, + "clock-monotonic": { + "label": "POSIX monotonic clock", + "type": "compile", + "test": "unix/clock-monotonic" + }, + "cloexec": { + "label": "O_CLOEXEC", + "type": "compile", + "test": "unix/cloexec" + }, + "dlopen": { + "label": "dlopen() in libc", + "type": "compile", + "test": "unix/dlopen" + }, + "eventfd": { + "label": "eventfd", + "type": "compile", + "test": "unix/eventfd" + }, + "posix-iconv": { + "label": "POSIX iconv", + "type": "compile", + "test": "unix/iconv" + }, + "sun-iconv": { + "label": "SUN libiconv", + "type": "compile", + "test": "unix/sun-libiconv" + }, + "inotify": { + "label": "inotify", + "type": "compile", + "test": "unix/inotify" + }, + "ipc_sysv": { + "label": "SysV IPC", + "type": "compile", + "test": "unix/ipc_sysv" + }, + "ipc_posix": { + "label": "POSIX IPC", + "type": "compile", + "test": "unix/ipc_posix" + }, + "journald": { + "label": "journald", + "type": "compile", + "test": "unix/journald" + }, + "ppoll": { + "label": "ppoll()", + "type": "compile", + "test": "unix/ppoll" + }, + "pollts": { + "label": "pollts()", + "type": "compile", + "test": "unix/pollts" + }, + "poll": { + "label": "poll()", + "type": "compile", + "test": "unix/poll" + }, + "syslog": { + "label": "syslog", + "type": "compile", + "test": "unix/syslog" + }, + "xlocalescanprint": { + "label": "xlocale.h (or equivalents)", + "type": "compile", + "test": "common/xlocalescanprint" + } + }, + + "features": { + "clock-gettime": { + "label": "clock_gettime()", + "condition": "tests.clock-gettime", + "output": [ "privateFeature" ] + }, + "clock-monotonic": { + "label": "POSIX monotonic clock", + "condition": "features.clock-gettime && tests.clock-monotonic", + "output": [ "feature" ] + }, + "dlopen": { + "label": "dlopen()", + "condition": "tests.dlopen || libs.libdl", + "output": [ { "type": "define", "negative": true, "name": "QT_NO_DYNAMIC_LIBRARY" } ] + }, + "libdl": { + "label": "dlopen() in libdl", + "condition": "!tests.dlopen && libs.libdl", + "output": [ { "type": "privateConfig", "negative": true } ] + }, + "doubleconversion": { + "label": "DoubleConversion", + "output": [ "privateFeature", "feature" ] + }, + "system-doubleconversion": { + "label": " Using system DoubleConversion", + "enable": "input.doubleconversion == 'system'", + "disable": "input.doubleconversion == 'qt'", + "condition": "features.doubleconversion && libs.doubleconversion", + "output": [ "privateFeature" ] + }, + "eventfd": { + "label": "eventfd", + "condition": "tests.eventfd", + "output": [ "feature" ] + }, + "glib": { + "label": "GLib", + "autoDetect": "!config.win32", + "condition": "libs.glib", + "output": [ "privateFeature", "feature" ] + }, + "iconv": { + "label": "iconv", + "purpose": "Provides internationalization on Unix.", + "section": "Internationalization", + "condition": "features.posix-libiconv || features.sun-libiconv || features.gnu-libiconv", + "output": [ "privateFeature", "feature" ] + }, + "posix-libiconv": { + "label": "POSIX iconv", + "enable": "input.iconv == 'posix'", + "disable": "input.iconv == 'sun' || input.iconv == 'gnu' || input.iconv == 'no'", + "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && tests.posix-iconv" + }, + "sun-libiconv": { + "label": "SUN iconv", + "enable": "input.iconv == 'sun'", + "disable": "input.iconv == 'posix' || input.iconv == 'gnu' || input.iconv == 'no'", + "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && !features.posix-libiconv && tests.sun-iconv", + "output": [ "privateFeature", "publicQtConfig" ] + }, + "gnu-libiconv": { + "label": "GNU iconv", + "enable": "input.iconv == 'gnu'", + "disable": "input.iconv == 'posix' || input.iconv == 'sun' || input.iconv == 'no'", + "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && !features.posix-libiconv && !features.sun-libiconv && libs.gnu_iconv", + "output": [ "privateFeature" ] + }, + "icu": { + "label": "ICU", + "autoDetect": "!config.win32", + "condition": "libs.icu", + "output": [ "privateFeature" ] + }, + "inotify": { + "label": "inotify", + "condition": "tests.inotify", + "output": [ "privateFeature", "feature" ] + }, + "ipc_posix": { + "label": "Using POSIX IPC", + "autoDetect": "!config.win32", + "condition": "!tests.ipc_sysv && tests.ipc_posix", + "output": [ { "type": "define", "name": "QT_POSIX_IPC" } ] + }, + "journald": { + "label": "journald", + "autoDetect": false, + "condition": "libs.journald", + "output": [ "privateConfig" ] + }, + "std-atomic64": { + "label": "64 bit atomic operations", + "condition": "tests.atomic64 || libs.libatomic", + "output": [ { "type": "define", "negative": true, "name": "QT_NO_STD_ATOMIC64" } ] + }, + "libatomic": { + "label": "64 bit atomic operations in libatomic", + "condition": "!tests.atomic64 && libs.libatomic", + "output": [ "privateFeature" ] + }, + "mimetype": { + "label": "Mimetype handling", + "purpose": "Provides MIME type handling.", + "section": "Utilities", + "output": [ "publicFeature", "feature" ] + }, + "system-pcre": { + "label": "Using system PCRE", + "disable": "input.pcre == 'qt'", + "enable": "input.pcre == 'system'", + "condition": "libs.pcre", + "output": [ + "privateFeature", + { "type": "privateConfig", "negative": true, "name": "pcre" } + ] + }, + "poll_ppoll": { + "label": "Native ppoll()", + "emitIf": "!config.win32", + "condition": "tests.ppoll", + "output": [ "privateFeature" ] + }, + "poll_pollts": { + "label": "Native pollts()", + "emitIf": "!config.win32", + "condition": "!features.poll_ppoll && tests.pollts", + "output": [ "privateFeature" ] + }, + "poll_poll": { + "label": "Native poll()", + "emitIf": "!config.win32", + "condition": "!features.poll_ppoll && !features.poll_pollts && tests.poll", + "output": [ "privateFeature" ] + }, + "poll_select": { + "label": "Emulated poll()", + "emitIf": "!config.win32", + "condition": "!features.poll_ppoll && !features.poll_pollts && !features.poll_poll", + "output": [ + "privateFeature", + { "type": "define", "name": "QT_NO_NATIVE_POLL" } + ] + }, + "qqnx_pps": { + "label": "PPS", + "emitIf": "config.qnx", + "condition": "libs.pps", + "output": [ "privateConfig" ] + }, + "qeventtransition": { + "label": "QEventTransition class", + "output": [ "publicFeature" ] + }, + "sharedmemory": { + "label": "Enable QSharedMemory", + "condition": "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix", + "output": [ { "type": "define", "negative": true, "name": "QT_NO_SHAREDMEMORY" } ] + }, + "slog2": { + "label": "slog2", + "condition": "libs.slog2", + "emitIf": "config.qnx", + "output": [ "privateConfig" ] + }, + "syslog": { + "label": "syslog", + "autoDetect": false, + "condition": "tests.syslog", + "output": [ "privateConfig" ] + }, + "systemsemaphore": { + "label": "Enable QSystemSemaphore", + "condition": "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix", + "output": [ { "type": "define", "negative": true, "name": "QT_NO_SYSTEMSEMAPHORE" } ] + }, + "threadsafe-cloexec": { + "label": "Threadsafe pipe creation", + "condition": "tests.cloexec", + "output": [ + "publicQtConfig", + { "type": "define", "name": "QT_THREADSAFE_CLOEXEC", "value": 1 } + ] + }, + "properties": { + "label": "Properties", + "purpose": "Supports scripting Qt-based applications.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "regularexpression": { + "label": "QRegularExpression", + "purpose": "Provides an API to Perl-compatible regular expressions.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "sharedmemory": { + "label": "QSharedMemory", + "purpose": "Provides access to a shared memory segment.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "systemsemaphore": { + "label": "QSystemSemaphore", + "purpose": "Provides a general counting system semaphore.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "xmlstream": { + "label": "XML Streaming APIs", + "purpose": "Provides a simple streaming API for XML.", + "section": "Kernel", + "output": [ "publicFeature", "feature" ] + }, + "xmlstreamreader": { + "label": "QXmlStreamReader", + "purpose": "Provides a well-formed XML parser with a simple streaming API.", + "section": "Kernel", + "condition": "features.xmlstream", + "output": [ "publicFeature", "feature" ] + }, + "xmlstreamwriter": { + "label": "QXmlStreamWriter", + "purpose": "Provides a XML writer with a simple streaming API.", + "section": "Kernel", + "condition": "features.xmlstream", + "output": [ "publicFeature", "feature" ] + }, + "textdate": { + "label": "Text Date", + "purpose": "Supports month and day names in dates.", + "section": "Data structures", + "output": [ "publicFeature", "feature" ] + }, + "datestring": { + "label": "QDate/QTime/QDateTime", + "purpose": "Provides convertion between dates and strings.", + "section": "Data structures", + "condition": "features.textdate", + "output": [ "publicFeature", "feature" ] + }, + "process": { + "label": "QProcess", + "purpose": "Supports external process invocation.", + "section": "File I/O", + "output": [ "publicFeature", "feature" ] + }, + "temporaryfile": { + "label": "QTemporaryFile", + "purpose": "Provides an I/O device that operates on temporary files.", + "section": "File I/O", + "output": [ "publicFeature", "feature" ] + }, + "library": { + "label": "QLibrary", + "purpose": "Provides a wrapper for dynamically loaded libraries.", + "section": "File I/O", + "output": [ "publicFeature", "feature" ] + }, + "settings": { + "label": "QSettings", + "purpose": "Provides persistent application settings.", + "section": "File I/O", + "output": [ "publicFeature", "feature" ] + }, + "filesystemwatcher": { + "label": "QFileSystemWatcher", + "purpose": "Provides an interface for monitoring files and directories for modifications.", + "section": "File I/O", + "output": [ "publicFeature", "feature" ] + }, + "filesystemiterator": { + "label": "QFileSystemIterator", + "purpose": "Provides fast file system iteration.", + "section": "File I/O", + "output": [ "publicFeature", "feature" ] + }, + "itemmodel": { + "label": "Qt Item Model", + "purpose": "Provides the item model for item views", + "section": "ItemViews", + "output": [ "publicFeature", "feature" ] + }, + "proxymodel": { + "label": "QAbstractProxyModel", + "purpose": "Supports processing of data passed between another model and a view.", + "section": "ItemViews", + "condition": "features.itemmodel", + "output": [ "publicFeature", "feature" ] + }, + "sortfilterproxymodel": { + "label": "QSortFilterProxyModel", + "purpose": "Supports sorting and filtering of data passed between another model and a view.", + "section": "ItemViews", + "condition": "features.proxymodel", + "output": [ "publicFeature", "feature" ] + }, + "identityproxymodel": { + "label": "QIdentityProxyModel", + "purpose": "Supports proxying a source model unmodified.", + "section": "ItemViews", + "condition": "features.proxymodel", + "output": [ "publicFeature", "feature" ] + }, + "stringlistmodel": { + "label": "QStringListModel", + "purpose": "Provides a model that supplies strings to views.", + "section": "ItemViews", + "condition": "features.itemmodel", + "output": [ "publicFeature", "feature" ] + }, + "translation": { + "label": "Translation", + "purpose": "Supports translations using QObject::tr().", + "section": "Internationalization", + "output": [ "publicFeature", "feature" ] + }, + "textcodec": { + "label": "QTextCodec", + "purpose": "Supports conversions between text encodings.", + "section": "Internationalization", + "output": [ "publicFeature", "feature" ] + }, + "codecs": { + "label": "Codecs", + "purpose": "Supports non-unicode text conversions.", + "section": "Internationalization", + "condition": "features.textcodec", + "output": [ "publicFeature", "feature" ] + }, + "big_codecs": { + "label": "Big Codecs", + "purpose": "Supports big codecs, e.g. CJK.", + "section": "Internationalization", + "condition": "features.textcodec", + "output": [ "publicFeature", "feature" ] + }, + "animation": { + "label": "Animation", + "purpose": "Provides a framework for animations.", + "section": "Utilities", + "condition": "features.properties", + "output": [ "publicFeature", "feature" ] + }, + "statemachine": { + "label": "State machine", + "purpose": "Provides hierarchical finite state machines.", + "section": "Utilities", + "condition": "features.properties", + "output": [ "publicFeature", "feature" ] + }, + "gestures": { + "label": "Gesture", + "purpose": "Provides a framework for gestures.", + "section": "Utilities", + "output": [ "publicFeature", "feature" ] + } + }, + + "report": [ + { + "type": "note", + "condition": "features.journald || features.syslog || (config.qnx && features.slog2)", + "message": "journald, syslog or slog2 integration is enabled. +If your users intend to develop applications against this build, +ensure that the IDEs they use either set QT_LOGGING_TO_CONSOLE to 1 +or are able to read the logged output from journald, syslog or slog2." + }, + { + "type": "error", + "condition": "input.doubleconversion == 'no' && !tests.xlocalescanprint", + "message": "Your C library does not provide sscanf_l or snprintf_l. +You need to use libdouble-conversion for double/string conversion." + }, + { + "type": "error", + "condition": "!tests.atomicfptr", + "message": "detected a std::atomic implementation that fails for function pointers. +Please apply the patch corresponding to your Standard Library vendor, found in + qtbase/config.tests/common/atomicfptr" + } + ], + + "summary": [ + { + "section": "Qt Core", + "entries": [ + "doubleconversion", + "system-doubleconversion", + "glib", + "iconv", + "icu", + { + "section": "Logging backends", + "entries": [ + "journald", "syslog", "slog2" + ] + }, + { + "type": "feature", + "args": "qqnx_pps", + "condition": "config.qnx" + }, + "system-pcre" + ] + } + ] +} diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 1db814180b..616a9641a1 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -31,8 +31,6 @@ ANDROID_PERMISSIONS = \ # OpenBSD 6.0 will include environ in libc. freebsd|openbsd: QMAKE_LFLAGS_NOUNDEF = -load(qfeatures) - include(animation/animation.pri) include(arch/arch.pri) include(global/global.pri) @@ -100,6 +98,7 @@ cmake_umbrella_config_version_file.output = $$DESTDIR/cmake/Qt5/Qt5ConfigVersion load(cmake_functions) +##### This requires fixing, so that the feature system works with cmake as well CMAKE_DISABLED_FEATURES = $$join(QT_DISABLED_FEATURES, "$$escape_expand(\\n) ") CMAKE_HOST_DATA_DIR = $$cmakeRelativePath($$[QT_HOST_DATA/src], $$[QT_INSTALL_PREFIX]) diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index 085e3063b4..a48548bc90 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -942,7 +942,8 @@ # endif /* VC 11 */ # if _MSC_VER >= 1800 /* C++11 features in VC12 = VC2013 */ -# define Q_COMPILER_DEFAULT_MEMBERS +/* Implemented, but can't be used on move special members */ +/* # define Q_COMPILER_DEFAULT_MEMBERS */ # define Q_COMPILER_DELETE_MEMBERS # define Q_COMPILER_DELEGATING_CONSTRUCTORS # define Q_COMPILER_EXPLICIT_CONVERSIONS @@ -960,6 +961,7 @@ # endif /* VC 12 SP 2 RC */ # if _MSC_VER >= 1900 /* C++11 features in VC14 = VC2015 */ +# define Q_COMPILER_DEFAULT_MEMBERS # define Q_COMPILER_ALIGNAS # define Q_COMPILER_ALIGNOF // Partial support, insufficient for Qt diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index e6d65b0f99..f11ec127e0 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -58,7 +58,7 @@ #ifndef QT_BOOTSTRAPPED #include <QtCore/qconfig.h> -#include <QtCore/qfeatures.h> +#include <QtCore/qtcore-config.h> #endif // The QT_SUPPORTS macro is deprecated. Don't use it in new code. @@ -943,10 +943,11 @@ template <typename T> class QForeachContainer { QForeachContainer &operator=(const QForeachContainer &) Q_DECL_EQ_DELETE; public: - inline QForeachContainer(const T& t) : c(t), i(c.begin()), e(c.end()), control(1) { } + QForeachContainer(const T &t) : c(t) {} + QForeachContainer(T &&t) : c(std::move(t)) {} const T c; - typename T::const_iterator i, e; - int control; + typename T::const_iterator i = c.begin(), e = c.end(); + int control = 1; }; // Explanation of the control word: diff --git a/src/corelib/global/qglobal_p.h b/src/corelib/global/qglobal_p.h index e75d87b384..c329357f46 100644 --- a/src/corelib/global/qglobal_p.h +++ b/src/corelib/global/qglobal_p.h @@ -50,6 +50,7 @@ #ifndef QT_BOOTSTRAPPED #include <QtCore/private/qconfig_p.h> +#include <QtCore/private/qtcore-config_p.h> #endif #define QT_LIBRARY_VERSION(lib) QT_LIBRARY_VERSION_##lib diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp index 4303f74709..1a7d64780f 100644 --- a/src/corelib/global/qlibraryinfo.cpp +++ b/src/corelib/global/qlibraryinfo.cpp @@ -616,10 +616,10 @@ QStringList QLibraryInfo::platformPluginArguments(const QString &platformName) #if !defined(QT_BUILD_QMAKE) && !defined(QT_NO_SETTINGS) QScopedPointer<const QSettings> settings(QLibraryInfoPrivate::findConfiguration()); if (!settings.isNull()) { - QString key = QLatin1String(platformsSection); - key += QLatin1Char('/'); - key += platformName; - key += QLatin1String("Arguments"); + const QString key = QLatin1String(platformsSection) + + QLatin1Char('/') + + platformName + + QLatin1String("Arguments"); return settings->value(key).toStringList(); } #endif // !QT_BUILD_QMAKE && !QT_NO_SETTINGS diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp index 80df3a12e1..9b565bff9d 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -2651,6 +2651,7 @@ QTextStream &QTextStream::operator<<(const char *string) { Q_D(QTextStream); CHECK_VALID_STREAM(*this); + // ### Qt6: consider changing to UTF-8 d->putString(QLatin1String(string)); return *this; } diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp index 71bbd80980..7d9c5dc325 100644 --- a/src/corelib/tools/qbytearray.cpp +++ b/src/corelib/tools/qbytearray.cpp @@ -303,13 +303,14 @@ char *qstrncpy(char *dst, const char *src, uint len) { if (!src || !dst) return 0; + if (len > 0) { #if defined(_MSC_VER) && _MSC_VER >= 1400 - strncpy_s(dst, len, src, len-1); + strncpy_s(dst, len, src, len - 1); #else - strncpy(dst, src, len); + strncpy(dst, src, len); #endif - if (len > 0) dst[len-1] = '\0'; + } return dst; } diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp index 42ac888e47..b5f97b5fe8 100644 --- a/src/corelib/tools/qlocale_win.cpp +++ b/src/corelib/tools/qlocale_win.cpp @@ -57,7 +57,7 @@ #include <wrl.h> #include <windows.foundation.h> #include <windows.foundation.collections.h> -#include <windows.globalization.h> +#include <windows.system.userprofile.h> #endif // Q_OS_WINRT QT_BEGIN_NAMESPACE @@ -70,6 +70,7 @@ static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT); using namespace Microsoft::WRL; using namespace Microsoft::WRL::Wrappers; using namespace ABI::Windows::Foundation; +using namespace ABI::Windows::System::UserProfile; static QByteArray getWinLocaleName(LPWSTR id = LOCALE_NAME_USER_DEFAULT); static const char *winLangCodeToIsoName(int code); @@ -624,16 +625,17 @@ QVariant QSystemLocalePrivate::uiLanguages() return result; #else // !Q_OS_WINRT QStringList result; - ComPtr<ABI::Windows::Globalization::IApplicationLanguagesStatics> appLanguagesStatics; - if (FAILED(GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Globalization_ApplicationLanguages).Get(), &appLanguagesStatics))) { + + ComPtr<IGlobalizationPreferencesStatics> preferences; + HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_System_UserProfile_GlobalizationPreferences).Get(), &preferences); + if (FAILED(hr)) { qWarning("Could not obtain ApplicationLanguagesStatic"); return QStringList(); } ComPtr<ABI::Windows::Foundation::Collections::IVectorView<HSTRING> > languageList; - // Languages is a ranked list of "long names" (e.g. en-US) of preferred languages, which matches - // languages from the manifest with languages from the user's system. - HRESULT hr = appLanguagesStatics->get_Languages(&languageList); + // Languages is a ranked list of "long names" (e.g. en-US) of preferred languages + hr = preferences->get_Languages(&languageList); Q_ASSERT_SUCCEEDED(hr); unsigned int size; hr = languageList->get_Size(&size); @@ -648,36 +650,6 @@ QVariant QSystemLocalePrivate::uiLanguages() result << QString::fromWCharArray(rawString, length); } - // ManifestLanguages covers all languages given in the manifest and uses short names (like "en"). - hr = appLanguagesStatics->get_ManifestLanguages(&languageList); - Q_ASSERT_SUCCEEDED(hr); - hr = languageList->get_Size(&size); - Q_ASSERT_SUCCEEDED(hr); - for (unsigned int i = 0; i < size; ++i) { - HString language; - hr = languageList->GetAt(i, language.GetAddressOf()); - Q_ASSERT_SUCCEEDED(hr); - UINT32 length; - PCWSTR rawString = language.GetRawBuffer(&length); - const QString qLanguage = QString::fromWCharArray(rawString, length); - bool found = false; - // Since ApplicationLanguages:::Languages uses long names, we compare the "pre-dash" part of - // the language and filter it out, if it is already covered by a more specialized form. - for (const QString &lang : qAsConst(result)) { - int dashIndex = lang.indexOf('-'); - // There will not be any long name after the first short name was found, so we can stop. - if (dashIndex == -1) - break; - - if (lang.leftRef(dashIndex) == qLanguage) { - found = true; - break; - } - } - if (!found) - result << qLanguage; - } - return result; #endif // Q_OS_WINRT } diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 7ebd9cf710..e3d89651e4 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -168,7 +168,7 @@ qtConfig(icu) { SOURCES += tools/qcollator_posix.cpp } -!contains(QT_DISABLED_FEATURES, regularexpression) { +qtConfig(regularexpression) { include($$PWD/../../3rdparty/pcre_dependency.pri) HEADERS += tools/qregularexpression.h |