summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@qt.io>2017-07-19 09:47:29 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2017-07-19 09:47:29 +0200
commit407302fb1b823fbe0ae09c031862f87b252489e6 (patch)
treef192faf40b9009ee6a884ed4b7d0b3942b6810ac
parent0f30dcaea8129092142fe87d2d14209c75363f66 (diff)
parentad3b41a06d9ba7219c79b5548c5b11698787288d (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts: src/corelib/io/qwindowspipewriter.cpp src/widgets/styles/qcommonstyle.cpp Change-Id: I0d33efdc4dc256e234abc490a18ccda72cd1d9e6
-rw-r--r--examples/embedded/embedded.pro2
-rw-r--r--examples/network/multistreamserver/multistreamserver.pro6
-rw-r--r--examples/opengl/opengl.pro14
-rw-r--r--examples/qtconcurrent/qtconcurrent.pro4
-rw-r--r--examples/sql/books/books.pro8
-rw-r--r--examples/sql/sql.pro12
-rw-r--r--examples/widgets/dialogs/configdialog/configdialog.pro2
-rw-r--r--examples/widgets/dialogs/dialogs.pro10
-rw-r--r--examples/widgets/dialogs/standarddialogs/standarddialogs.pro2
-rw-r--r--examples/widgets/dialogs/tabdialog/tabdialog.pro2
-rw-r--r--examples/xml/dombookmarks/dombookmarks.pro7
-rw-r--r--examples/xml/htmlinfo/htmlinfo.pro6
-rw-r--r--examples/xml/saxbookmarks/saxbookmarks.pro6
-rw-r--r--mkspecs/features/silent.prf9
-rw-r--r--qmake/doc/src/qmake-manual.qdoc37
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp2
-rw-r--r--src/corelib/global/qglobal.cpp92
-rw-r--r--src/corelib/global/qsystemdetection.h18
-rw-r--r--src/corelib/io/qabstractfileengine.cpp11
-rw-r--r--src/corelib/io/qabstractfileengine_p.h1
-rw-r--r--src/corelib/io/qfile.cpp4
-rw-r--r--src/corelib/io/qfilesystemengine_p.h2
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp14
-rw-r--r--src/corelib/io/qfilesystemengine_win.cpp22
-rw-r--r--src/corelib/io/qfsfileengine.cpp22
-rw-r--r--src/corelib/io/qfsfileengine_p.h1
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp8
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp22
-rw-r--r--src/corelib/io/qloggingcategory.cpp15
-rw-r--r--src/corelib/io/qresource.cpp3
-rw-r--r--src/corelib/io/qwindowspipereader.cpp22
-rw-r--r--src/corelib/io/qwindowspipereader_p.h2
-rw-r--r--src/corelib/io/qwindowspipewriter.cpp22
-rw-r--r--src/corelib/io/qwindowspipewriter_p.h2
-rw-r--r--src/corelib/kernel/qsystemerror.cpp32
-rw-r--r--src/corelib/kernel/qsystemerror_p.h14
-rw-r--r--src/corelib/plugin/qlibrary.cpp3
-rw-r--r--src/corelib/tools/qhash.h6
-rw-r--r--src/corelib/tools/qmap.h6
-rw-r--r--src/network/ssl/qasn1element.cpp34
-rw-r--r--src/platformsupport/themes/genericunix/qgenericunixthemes.cpp49
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.mm1
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.mm6
-rw-r--r--src/plugins/platforms/windows/openglblacklists/default.json12
-rw-r--r--src/plugins/styles/mac/qmacstyle_mac.mm6
-rw-r--r--src/plugins/styles/mac/qmacstyle_mac_p_p.h2
-rw-r--r--src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h2
-rw-r--r--src/testlib/qtestblacklist.cpp10
-rw-r--r--src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp2
-rw-r--r--src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp7
-rw-r--r--src/widgets/accessible/complexwidgets.cpp1
-rw-r--r--src/widgets/accessible/itemviews.cpp21
-rw-r--r--src/widgets/accessible/itemviews_p.h6
-rw-r--r--src/widgets/accessible/qaccessiblewidgetfactory.cpp6
-rw-r--r--src/widgets/itemviews/itemviews.pri11
-rw-r--r--src/widgets/itemviews/qabstractitemview.cpp1
-rw-r--r--src/widgets/itemviews/qtreeview.cpp3
-rw-r--r--src/widgets/itemviews/qtreeview.h7
-rw-r--r--src/widgets/itemviews/qtreeview_p.h4
-rw-r--r--src/widgets/styles/qcommonstyle.cpp5
-rw-r--r--src/widgets/styles/qfusionstyle.cpp1
-rw-r--r--src/widgets/styles/qpixmapstyle.cpp1
-rw-r--r--src/widgets/util/qcompleter_p.h2
-rw-r--r--src/widgets/widgets/qcombobox.cpp6
-rw-r--r--src/widgets/widgets/qdialogbuttonbox.cpp4
-rw-r--r--tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp27
-rw-r--r--tests/auto/tools/qmakelib/evaltest.cpp4
67 files changed, 418 insertions, 296 deletions
diff --git a/examples/embedded/embedded.pro b/examples/embedded/embedded.pro
index 90ee504adf..e772eb88aa 100644
--- a/examples/embedded/embedded.pro
+++ b/examples/embedded/embedded.pro
@@ -1,4 +1,4 @@
-requires(if(wince|embedded|x11):qtHaveModule(gui))
+requires(if(embedded|x11):qtHaveModule(gui))
TEMPLATE = subdirs
SUBDIRS = styleexample raycasting flickable digiflip
diff --git a/examples/network/multistreamserver/multistreamserver.pro b/examples/network/multistreamserver/multistreamserver.pro
index 75a7e6bbec..38301e122e 100644
--- a/examples/network/multistreamserver/multistreamserver.pro
+++ b/examples/network/multistreamserver/multistreamserver.pro
@@ -16,9 +16,3 @@ EXAMPLE_FILES = animation.gif
# install
target.path = $$[QT_INSTALL_EXAMPLES]/network/multistreamserver
INSTALLS += target
-
-wince*: {
- addFiles.files += *.gif
- addFiles.path = .
- DEPLOYMENT += addFiles
-}
diff --git a/examples/opengl/opengl.pro b/examples/opengl/opengl.pro
index ef44201494..89b3e1d86e 100644
--- a/examples/opengl/opengl.pro
+++ b/examples/opengl/opengl.pro
@@ -8,14 +8,12 @@ qtHaveModule(widgets) {
SUBDIRS += contextinfo \
threadedqopenglwidget \
2dpainting \
- hellogl2
-
- !wince: SUBDIRS += \
- qopenglwidget \
- cube \
- textures \
- hellogles3 \
- computegles31
+ hellogl2 \
+ qopenglwidget \
+ cube \
+ textures \
+ hellogles3 \
+ computegles31
}
EXAMPLE_FILES += \
diff --git a/examples/qtconcurrent/qtconcurrent.pro b/examples/qtconcurrent/qtconcurrent.pro
index 6e4e5f0f16..bdf41b03ea 100644
--- a/examples/qtconcurrent/qtconcurrent.pro
+++ b/examples/qtconcurrent/qtconcurrent.pro
@@ -3,12 +3,10 @@ requires(qtHaveModule(concurrent))
TEMPLATE = subdirs
SUBDIRS = imagescaling \
map \
+ progressdialog \
runfunction \
wordcount
-!wince* {
- SUBDIRS += progressdialog
-}
!qtHaveModule(gui) {
SUBDIRS -= \
diff --git a/examples/sql/books/books.pro b/examples/sql/books/books.pro
index c64766c29f..2b3d541fe8 100644
--- a/examples/sql/books/books.pro
+++ b/examples/sql/books/books.pro
@@ -10,11 +10,3 @@ QT += sql widgets widgets
target.path = $$[QT_INSTALL_EXAMPLES]/sql/books
INSTALLS += target
-
-
-wince {
- CONFIG(debug, debug|release):sqlPlugins.files = $$QT_BUILD_TREE/plugins/sqldrivers/*d4.dll
- CONFIG(release, debug|release):sqlPlugins.files = $$QT_BUILD_TREE/plugins/sqldrivers/*[^d]4.dll
- sqlPlugins.path = sqldrivers
- INSTALLS += sqlPlugins
-}
diff --git a/examples/sql/sql.pro b/examples/sql/sql.pro
index 135d05b4e2..a427e10929 100644
--- a/examples/sql/sql.pro
+++ b/examples/sql/sql.pro
@@ -4,16 +4,14 @@ TEMPLATE = subdirs
SUBDIRS = books \
drilldown \
- cachedtable \
- relationaltablemodel \
- sqlwidgetmapper
-
-!wince:qtHaveModule(xml): SUBDIRS += masterdetail
-
-!wince: SUBDIRS += \
+ cachedtable \
querymodel \
+ relationaltablemodel \
+ sqlwidgetmapper \
tablemodel
+qtHaveModule(xml): SUBDIRS += masterdetail
+
!cross_compile:{
contains(QT_BUILD_PARTS, tools):{
SUBDIRS += sqlbrowser
diff --git a/examples/widgets/dialogs/configdialog/configdialog.pro b/examples/widgets/dialogs/configdialog/configdialog.pro
index e99fce13ac..8ba55becad 100644
--- a/examples/widgets/dialogs/configdialog/configdialog.pro
+++ b/examples/widgets/dialogs/configdialog/configdialog.pro
@@ -10,5 +10,3 @@ RESOURCES += configdialog.qrc
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/dialogs/configdialog
INSTALLS += target
-
-wince50standard-x86-msvc2005: LIBS += libcmt.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib ws2.lib
diff --git a/examples/widgets/dialogs/dialogs.pro b/examples/widgets/dialogs/dialogs.pro
index 6f19309440..82e814dcb0 100644
--- a/examples/widgets/dialogs/dialogs.pro
+++ b/examples/widgets/dialogs/dialogs.pro
@@ -3,17 +3,13 @@ QT_FOR_CONFIG += widgets
TEMPLATE = subdirs
SUBDIRS = classwizard \
configdialog \
+ extension \
+ findfiles \
+ licensewizard \
standarddialogs \
tabdialog \
trivialwizard
-!wince {
- SUBDIRS += \
- licensewizard \
- extension \
- findfiles
-}
-
!qtHaveModule(printsupport): SUBDIRS -= licensewizard
!qtConfig(wizard) {
SUBDIRS -= trivialwizard licensewizard classwizard
diff --git a/examples/widgets/dialogs/standarddialogs/standarddialogs.pro b/examples/widgets/dialogs/standarddialogs/standarddialogs.pro
index 12a814cb69..d2e9e19771 100644
--- a/examples/widgets/dialogs/standarddialogs/standarddialogs.pro
+++ b/examples/widgets/dialogs/standarddialogs/standarddialogs.pro
@@ -7,5 +7,3 @@ SOURCES = dialog.cpp \
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/dialogs/standarddialogs
INSTALLS += target
-
-wince50standard-x86-msvc2005: LIBS += libcmt.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib ws2.lib
diff --git a/examples/widgets/dialogs/tabdialog/tabdialog.pro b/examples/widgets/dialogs/tabdialog/tabdialog.pro
index c282505ac1..8a686b4f5c 100644
--- a/examples/widgets/dialogs/tabdialog/tabdialog.pro
+++ b/examples/widgets/dialogs/tabdialog/tabdialog.pro
@@ -7,5 +7,3 @@ SOURCES = main.cpp \
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/dialogs/tabdialog
INSTALLS += target
-
-wince50standard-x86-msvc2005: LIBS += libcmt.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib ws2.lib
diff --git a/examples/xml/dombookmarks/dombookmarks.pro b/examples/xml/dombookmarks/dombookmarks.pro
index 0ab4f0266d..07004377a0 100644
--- a/examples/xml/dombookmarks/dombookmarks.pro
+++ b/examples/xml/dombookmarks/dombookmarks.pro
@@ -10,10 +10,3 @@ EXAMPLE_FILES = frank.xbel jennifer.xbel
# install
target.path = $$[QT_INSTALL_EXAMPLES]/xml/dombookmarks
INSTALLS += target
-
-wince {
- addFiles.files = frank.xbel jennifer.xbel
- addFiles.path = "\\My Documents"
- INSTALLS += addFiles
-}
-
diff --git a/examples/xml/htmlinfo/htmlinfo.pro b/examples/xml/htmlinfo/htmlinfo.pro
index 8adaa780b8..e106c69b52 100644
--- a/examples/xml/htmlinfo/htmlinfo.pro
+++ b/examples/xml/htmlinfo/htmlinfo.pro
@@ -6,12 +6,6 @@ RESOURCES = resources.qrc
win32: CONFIG += console
-wince {
- htmlfiles.files = *.html
- htmlfiles.path = .
- INSTALLS += htmlfiles
-}
-
# install
target.path = $$[QT_INSTALL_EXAMPLES]/xml/htmlinfo
INSTALLS += target
diff --git a/examples/xml/saxbookmarks/saxbookmarks.pro b/examples/xml/saxbookmarks/saxbookmarks.pro
index 96a48ef5d4..d07a6e3fb8 100644
--- a/examples/xml/saxbookmarks/saxbookmarks.pro
+++ b/examples/xml/saxbookmarks/saxbookmarks.pro
@@ -12,9 +12,3 @@ EXAMPLE_FILES = frank.xbel jennifer.xbel
# install
target.path = $$[QT_INSTALL_EXAMPLES]/xml/saxbookmarks
INSTALLS += target
-
-wince {
- addFiles.files = frank.xbel jennifer.xbel
- addFiles.path = "\\My Documents"
- INSTALLS += addFiles
-}
diff --git a/mkspecs/features/silent.prf b/mkspecs/features/silent.prf
index 141e6bf9e4..6d7c170419 100644
--- a/mkspecs/features/silent.prf
+++ b/mkspecs/features/silent.prf
@@ -1,6 +1,11 @@
!macx-xcode {
- QMAKE_CC = @echo compiling $< && $$QMAKE_CC
- QMAKE_CXX = @echo compiling $< && $$QMAKE_CXX
+ msvc {
+ QMAKE_CC = @$$QMAKE_CC
+ QMAKE_CXX = @$$QMAKE_CXX
+ } else {
+ QMAKE_CC = @echo compiling $< && $$QMAKE_CC
+ QMAKE_CXX = @echo compiling $< && $$QMAKE_CXX
+ }
!contains(QMAKE_LINK, "@:"):QMAKE_LINK = @echo linking $@ && $$QMAKE_LINK
QMAKE_LINK_SHLIB = @echo linking $@ && $$QMAKE_LINK_SHLIB
}
diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc
index db6ddc3995..27abec596f 100644
--- a/qmake/doc/src/qmake-manual.qdoc
+++ b/qmake/doc/src/qmake-manual.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
@@ -1809,6 +1809,14 @@
\note Most of the time, the default \c{Info.plist} is good enough.
+ \section1 QMAKE_IOS_DEPLOYMENT_TARGET
+
+ \note This variable is used on the iOS platform only.
+
+ Specifies the hard minimum version of iOS that the application supports.
+
+ For more information, see \l {Expressing Supported iOS Versions}.
+
\section1 QMAKE_LFLAGS
Specifies a general set of flags that are passed to
@@ -2101,12 +2109,11 @@
\section1 QMAKE_MACOSX_DEPLOYMENT_TARGET
- This variable only takes effect when building on \macos. On that
- platform, the variable will be forwarded to the MACOSX_DEPLOYMENT_TARGET
- environment variable, which is interpreted by the compiler or linker.
- For more information, see the
- \l{Qt for macOS - Deployment#macOS Version Dependencies}{Deploying
- an Application on \macos} document.
+ \note This variable is used on the \macos platform only.
+
+ Specifies the hard minimum version of \macos that the application supports.
+
+ For more information, see \l{macOS Version Dependencies}.
\section1 QMAKE_MAKEFILE
@@ -2251,6 +2258,22 @@
This is only utilized if the \l{VERSION} or \l{RC_ICONS} variable is set
and the \l{RC_FILE} and \l{RES_FILE} variables are not set.
+ \section1 QMAKE_TVOS_DEPLOYMENT_TARGET
+
+ \note This variable is used on the tvOS platform only.
+
+ Specifies the hard minimum version of tvOS that the application supports.
+
+ For more information, see \l {Expressing Supported iOS Versions}.
+
+ \section1 QMAKE_WATCHOS_DEPLOYMENT_TARGET
+
+ \note This variable is used on the watchOS platform only.
+
+ Specifies the hard minimum version of watchOS that the application supports.
+
+ For more information, see \l {Expressing Supported iOS Versions}.
+
\section1 QT
Specifies the \l{All Modules}{Qt modules} that are used by your project. For
diff --git a/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp b/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp
index 805646c7d9..b2a2282085 100644
--- a/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_io_qurl.cpp
@@ -62,7 +62,7 @@ QUrl url = QUrl::fromEncoded("http://qt-project.org/List%20of%20holidays.xml");
//! [2]
bool checkUrl(const QUrl &url) {
if (!url.isValid()) {
- qDebug(QString("Invalid URL: %1").arg(url.toString()));
+ qDebug("Invalid URL: %s", qUtf8Printable(url.toString()));
return false;
}
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index 0e99daeb56..bfd97ed007 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -3148,98 +3148,6 @@ Q_CORE_EXPORT Q_DECL_CONST_FUNCTION unsigned int qt_int_sqrt(unsigned int n)
void *qMemCopy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); }
void *qMemSet(void *dest, int c, size_t n) { return memset(dest, c, n); }
-#if !defined(Q_OS_WIN) && !defined(QT_NO_THREAD) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX) && \
- defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L
-namespace {
- // There are two incompatible versions of strerror_r:
- // a) the XSI/POSIX.1 version, which returns an int,
- // indicating success or not
- // b) the GNU version, which returns a char*, which may or may not
- // be the beginning of the buffer we used
- // The GNU libc manpage for strerror_r says you should use the XSI
- // version in portable code. However, it's impossible to do that if
- // _GNU_SOURCE is defined so we use C++ overloading to decide what to do
- // depending on the return type
- static inline Q_DECL_UNUSED QString fromstrerror_helper(int, const QByteArray &buf)
- {
- return QString::fromLocal8Bit(buf.constData());
- }
- static inline Q_DECL_UNUSED QString fromstrerror_helper(const char *str, const QByteArray &)
- {
- return QString::fromLocal8Bit(str);
- }
-}
-#endif
-
-QString qt_error_string(int errorCode)
-{
- const char *s = 0;
- QString ret;
- if (errorCode == -1) {
-#if defined(Q_OS_WIN)
- errorCode = GetLastError();
-#else
- errorCode = errno;
-#endif
- }
- switch (errorCode) {
- case 0:
- break;
- case EACCES:
- s = QT_TRANSLATE_NOOP("QIODevice", "Permission denied");
- break;
- case EMFILE:
- s = QT_TRANSLATE_NOOP("QIODevice", "Too many open files");
- break;
- case ENOENT:
- s = QT_TRANSLATE_NOOP("QIODevice", "No such file or directory");
- break;
- case ENOSPC:
- s = QT_TRANSLATE_NOOP("QIODevice", "No space left on device");
- break;
- default: {
-#if defined(Q_OS_WIN)
- // Retrieve the system error message for the last-error code.
-# ifndef Q_OS_WINRT
- wchar_t *string = 0;
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
- NULL,
- errorCode,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPWSTR)&string,
- 0,
- NULL);
- ret = QString::fromWCharArray(string);
- LocalFree((HLOCAL)string);
-# else // !Q_OS_WINRT
- __declspec(thread) static wchar_t errorString[4096];
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- errorCode,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- errorString,
- ARRAYSIZE(errorString),
- NULL);
- ret = QString::fromWCharArray(errorString);
-# endif // Q_OS_WINRT
-
- if (ret.isEmpty() && errorCode == ERROR_MOD_NOT_FOUND)
- ret = QString::fromLatin1("The specified module could not be found.");
-#elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX)
- QByteArray buf(1024, '\0');
- ret = fromstrerror_helper(strerror_r(errorCode, buf.data(), buf.size()), buf);
-#else
- ret = QString::fromLocal8Bit(strerror(errorCode));
-#endif
- break; }
- }
- if (s)
- // ######## this breaks moc build currently
-// ret = QCoreApplication::translate("QIODevice", s);
- ret = QString::fromLatin1(s);
- return ret.trimmed();
-}
-
// In the C runtime on all platforms access to the environment is not thread-safe. We
// add thread-safety for the Qt wrappers.
static QBasicMutex environmentMutex;
diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h
index 3133b4a719..4a2c3f79bb 100644
--- a/src/corelib/global/qsystemdetection.h
+++ b/src/corelib/global/qsystemdetection.h
@@ -267,6 +267,9 @@
# if !defined(__MAC_10_12)
# define __MAC_10_12 101200
# endif
+# if !defined(__MAC_10_13)
+# define __MAC_10_13 101300
+# endif
# if !defined(MAC_OS_X_VERSION_10_7)
# define MAC_OS_X_VERSION_10_7 1070
# endif
@@ -285,6 +288,9 @@
# if !defined(MAC_OS_X_VERSION_10_12)
# define MAC_OS_X_VERSION_10_12 101200
# endif
+# if !defined(MAC_OS_X_VERSION_10_13)
+# define MAC_OS_X_VERSION_10_13 101300
+# endif
#
# if !defined(__IPHONE_4_3)
# define __IPHONE_4_3 40300
@@ -337,6 +343,18 @@
# if !defined(__IPHONE_10_0)
# define __IPHONE_10_0 100000
# endif
+# if !defined(__IPHONE_10_1)
+# define __IPHONE_10_1 100100
+# endif
+# if !defined(__IPHONE_10_2)
+# define __IPHONE_10_2 100200
+# endif
+# if !defined(__IPHONE_10_3)
+# define __IPHONE_10_3 100300
+# endif
+# if !defined(__IPHONE_11_0)
+# define __IPHONE_11_0 110000
+# endif
#endif
#ifdef __LSB_VERSION__
diff --git a/src/corelib/io/qabstractfileengine.cpp b/src/corelib/io/qabstractfileengine.cpp
index 169e933546..7a603544f3 100644
--- a/src/corelib/io/qabstractfileengine.cpp
+++ b/src/corelib/io/qabstractfileengine.cpp
@@ -678,6 +678,17 @@ bool QAbstractFileEngine::setPermissions(uint perms)
}
/*!
+ \since 5.9
+
+ Return an identifier that (hopefully) uniquely identifies this file in the
+ system. Returns an invalid QByteArray() if that cannot be calculated.
+*/
+QByteArray QAbstractFileEngine::id() const
+{
+ return QByteArray();
+}
+
+/*!
Return the file engine's current file name in the format
specified by \a file.
diff --git a/src/corelib/io/qabstractfileengine_p.h b/src/corelib/io/qabstractfileengine_p.h
index 5685a39e81..47b3a624fe 100644
--- a/src/corelib/io/qabstractfileengine_p.h
+++ b/src/corelib/io/qabstractfileengine_p.h
@@ -141,6 +141,7 @@ public:
virtual QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const;
virtual FileFlags fileFlags(FileFlags type=FileInfoAll) const;
virtual bool setPermissions(uint perms);
+ virtual QByteArray id() const;
virtual QString fileName(FileName file=DefaultName) const;
virtual uint ownerId(FileOwner) const;
virtual QString owner(FileOwner) const;
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index c7a06e49d5..b93fea1038 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -571,7 +571,9 @@ QFile::rename(const QString &newName)
// Note: this does not take file engines into account.
QByteArray targetId = QFileSystemEngine::id(QFileSystemEntry(newName));
if (!targetId.isNull()) {
- QByteArray fileId = QFileSystemEngine::id(QFileSystemEntry(d->fileName));
+ QByteArray fileId = d->fileEngine ?
+ d->fileEngine->id() :
+ QFileSystemEngine::id(QFileSystemEntry(d->fileName));
if (fileId != targetId || d->fileName.compare(newName, Qt::CaseInsensitive)) {
// ### Race condition. If a file is moved in after this, it /will/ be
// overwritten. On Unix, the proper solution is to use hardlinks:
diff --git a/src/corelib/io/qfilesystemengine_p.h b/src/corelib/io/qfilesystemengine_p.h
index 196ed8df69..e3e52f6eaa 100644
--- a/src/corelib/io/qfilesystemengine_p.h
+++ b/src/corelib/io/qfilesystemengine_p.h
@@ -92,6 +92,7 @@ public:
QFileSystemMetaData::MetaDataFlags what);
#if defined(Q_OS_UNIX)
static bool fillMetaData(int fd, QFileSystemMetaData &data); // what = PosixStatFlags
+ static QByteArray id(int fd);
static bool setPermissions(int fd, QFile::Permissions permissions, QSystemError &error,
QFileSystemMetaData *data = nullptr);
#endif
@@ -104,6 +105,7 @@ public:
QFileSystemMetaData::MetaDataFlags what);
static bool fillPermissions(const QFileSystemEntry &entry, QFileSystemMetaData &data,
QFileSystemMetaData::MetaDataFlags what);
+ static QByteArray id(HANDLE fHandle);
static QString owner(const QFileSystemEntry &entry, QAbstractFileEngine::FileOwner own);
static QString nativeAbsoluteFilePath(const QString &path);
#endif
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 940a0a2122..b0c23e3f82 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -328,6 +328,20 @@ QByteArray QFileSystemEngine::id(const QFileSystemEntry &entry)
}
//static
+QByteArray QFileSystemEngine::id(int id)
+{
+ QT_STATBUF statResult;
+ if (QT_FSTAT(id, &statResult)) {
+ qErrnoWarning("fstat() failed for fd %d", id);
+ return QByteArray();
+ }
+ QByteArray result = QByteArray::number(quint64(statResult.st_dev), 16);
+ result += ':';
+ result += QByteArray::number(quint64(statResult.st_ino));
+ return result;
+}
+
+//static
QString QFileSystemEngine::resolveUserName(uint userId)
{
#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD)
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp
index 889fbfea7b..eac6519de5 100644
--- a/src/corelib/io/qfilesystemengine_win.cpp
+++ b/src/corelib/io/qfilesystemengine_win.cpp
@@ -561,19 +561,21 @@ typedef struct _FILE_ID_INFO {
// File ID for Windows up to version 7.
static inline QByteArray fileId(HANDLE handle)
{
- QByteArray result;
#ifndef Q_OS_WINRT
BY_HANDLE_FILE_INFORMATION info;
if (GetFileInformationByHandle(handle, &info)) {
- result = QByteArray::number(uint(info.nFileIndexLow), 16);
- result += ':';
- result += QByteArray::number(uint(info.nFileIndexHigh), 16);
+ char buffer[sizeof "01234567:0123456701234567"];
+ qsnprintf(buffer, sizeof(buffer), "%lx:%08lx%08lx",
+ info.dwVolumeSerialNumber,
+ info.nFileIndexHigh,
+ info.nFileIndexLow);
+ return buffer;
}
#else // !Q_OS_WINRT
Q_UNUSED(handle);
Q_UNIMPLEMENTED();
#endif // Q_OS_WINRT
- return result;
+ return QByteArray();
}
// File ID for Windows starting from version 8.
@@ -609,14 +611,20 @@ QByteArray QFileSystemEngine::id(const QFileSystemEntry &entry)
FILE_SHARE_READ, OPEN_EXISTING, NULL);
#endif // Q_OS_WINRT
if (handle != INVALID_HANDLE_VALUE) {
- result = QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows8 ?
- fileIdWin8(handle) : fileId(handle);
+ result = id(handle);
CloseHandle(handle);
}
return result;
}
//static
+QByteArray QFileSystemEngine::id(HANDLE fHandle)
+{
+ return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows8 ?
+ fileIdWin8(HANDLE(fHandle)) : fileId(HANDLE(fHandle));
+}
+
+//static
QString QFileSystemEngine::owner(const QFileSystemEntry &entry, QAbstractFileEngine::FileOwner own)
{
QString name;
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp
index b7f2f0d645..037deb8942 100644
--- a/src/corelib/io/qfsfileengine.cpp
+++ b/src/corelib/io/qfsfileengine.cpp
@@ -277,7 +277,7 @@ bool QFSFileEnginePrivate::openFh(QIODevice::OpenMode openMode, FILE *fh)
if (ret != 0) {
q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError,
- qt_error_string(int(errno)));
+ QSystemError::stdString());
this->openMode = QIODevice::NotOpen;
this->fh = 0;
@@ -341,7 +341,7 @@ bool QFSFileEnginePrivate::openFd(QIODevice::OpenMode openMode, int fd)
if (ret == -1) {
q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError,
- qt_error_string(int(errno)));
+ QSystemError::stdString());
this->openMode = QIODevice::NotOpen;
this->fd = -1;
@@ -400,7 +400,7 @@ bool QFSFileEnginePrivate::closeFdFh()
if (!flushed || !closed) {
if (flushed) {
// If not flushed, we want the flush error to fall through.
- q->setError(QFile::UnspecifiedError, qt_error_string(errno));
+ q->setError(QFile::UnspecifiedError, QSystemError::stdString());
}
return false;
}
@@ -452,7 +452,7 @@ bool QFSFileEnginePrivate::flushFh()
if (ret != 0) {
q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError,
- qt_error_string(errno));
+ QSystemError::stdString());
return false;
}
return true;
@@ -567,14 +567,14 @@ bool QFSFileEnginePrivate::seekFdFh(qint64 pos)
} while (ret != 0 && errno == EINTR);
if (ret != 0) {
- q->setError(QFile::ReadError, qt_error_string(int(errno)));
+ q->setError(QFile::ReadError, QSystemError::stdString());
return false;
}
} else {
// Unbuffered stdio mode.
if (QT_LSEEK(fd, QT_OFF_T(pos), SEEK_SET) == -1) {
qWarning("QFile::at: Cannot set file position %lld", pos);
- q->setError(QFile::PositionError, qt_error_string(errno));
+ q->setError(QFile::PositionError, QSystemError::stdString());
return false;
}
}
@@ -616,7 +616,7 @@ qint64 QFSFileEnginePrivate::readFdFh(char *data, qint64 len)
Q_Q(QFSFileEngine);
if (len < 0 || len != qint64(size_t(len))) {
- q->setError(QFile::ReadError, qt_error_string(EINVAL));
+ q->setError(QFile::ReadError, QSystemError::stdString(EINVAL));
return -1;
}
@@ -662,7 +662,7 @@ qint64 QFSFileEnginePrivate::readFdFh(char *data, qint64 len)
if (!eof && readBytes == 0) {
readBytes = -1;
- q->setError(QFile::ReadError, qt_error_string(errno));
+ q->setError(QFile::ReadError, QSystemError::stdString());
}
return readBytes;
@@ -708,7 +708,7 @@ qint64 QFSFileEnginePrivate::readLineFdFh(char *data, qint64 maxlen)
// solves this.
if (!fgets(data, int(maxlen + 1), fh)) {
if (!feof(fh))
- q->setError(QFile::ReadError, qt_error_string(int(errno)));
+ q->setError(QFile::ReadError, QSystemError::stdString());
return -1; // error
}
@@ -748,7 +748,7 @@ qint64 QFSFileEnginePrivate::writeFdFh(const char *data, qint64 len)
Q_Q(QFSFileEngine);
if (len < 0 || len != qint64(size_t(len))) {
- q->setError(QFile::WriteError, qt_error_string(EINVAL));
+ q->setError(QFile::WriteError, QSystemError::stdString(EINVAL));
return -1;
}
@@ -785,7 +785,7 @@ qint64 QFSFileEnginePrivate::writeFdFh(const char *data, qint64 len)
if (len && writtenBytes == 0) {
writtenBytes = -1;
- q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError, qt_error_string(errno));
+ q->setError(errno == ENOSPC ? QFile::ResourceError : QFile::WriteError, QSystemError::stdString());
} else {
// reset the cached size, if any
metaData.clearFlags(QFileSystemMetaData::SizeAttribute);
diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h
index 80dd9363db..f352fcd475 100644
--- a/src/corelib/io/qfsfileengine_p.h
+++ b/src/corelib/io/qfsfileengine_p.h
@@ -93,6 +93,7 @@ public:
QStringList entryList(QDir::Filters filters, const QStringList &filterNames) const Q_DECL_OVERRIDE;
FileFlags fileFlags(FileFlags type) const Q_DECL_OVERRIDE;
bool setPermissions(uint perms) Q_DECL_OVERRIDE;
+ QByteArray id() const override;
QString fileName(FileName file) const Q_DECL_OVERRIDE;
uint ownerId(FileOwner) const Q_DECL_OVERRIDE;
QString owner(FileOwner) const Q_DECL_OVERRIDE;
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp
index 69961ff76a..a717a3e236 100644
--- a/src/corelib/io/qfsfileengine_unix.cpp
+++ b/src/corelib/io/qfsfileengine_unix.cpp
@@ -542,6 +542,14 @@ QAbstractFileEngine::FileFlags QFSFileEngine::fileFlags(FileFlags type) const
return ret;
}
+QByteArray QFSFileEngine::id() const
+{
+ Q_D(const QFSFileEngine);
+ if (d->fd != -1)
+ return QFileSystemEngine::id(d->fd);
+ return QFileSystemEngine::id(d->fileEntry);
+}
+
QString QFSFileEngine::fileName(FileName file) const
{
Q_D(const QFSFileEngine);
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp
index d749e32447..351c4601d1 100644
--- a/src/corelib/io/qfsfileengine_win.cpp
+++ b/src/corelib/io/qfsfileengine_win.cpp
@@ -285,7 +285,7 @@ qint64 QFSFileEnginePrivate::nativeSize() const
filled = doStat(QFileSystemMetaData::SizeAttribute);
if (!filled) {
- thatQ->setError(QFile::UnspecifiedError, qt_error_string(errno));
+ thatQ->setError(QFile::UnspecifiedError, QSystemError::stdString());
return 0;
}
return metaData.size();
@@ -352,7 +352,7 @@ qint64 QFSFileEnginePrivate::nativeRead(char *data, qint64 maxlen)
if (fh || fd != -1) {
// stdio / stdlib mode.
if (fh && nativeIsSequential() && feof(fh)) {
- q->setError(QFile::ReadError, qt_error_string(int(errno)));
+ q->setError(QFile::ReadError, QSystemError::stdString());
return -1;
}
@@ -751,6 +751,24 @@ QAbstractFileEngine::FileFlags QFSFileEngine::fileFlags(QAbstractFileEngine::Fil
return ret;
}
+QByteArray QFSFileEngine::id() const
+{
+ Q_D(const QFSFileEngine);
+ HANDLE h = d->fileHandle;
+ if (h == INVALID_HANDLE_VALUE) {
+ int localFd = d->fd;
+ if (d->fh && d->fileEntry.isEmpty())
+ localFd = QT_FILENO(d->fh);
+ if (localFd != -1)
+ h = HANDLE(_get_osfhandle(localFd));
+ }
+ if (h != INVALID_HANDLE_VALUE)
+ return QFileSystemEngine::id(h);
+
+ // file is not open, try by path
+ return QFileSystemEngine::id(d->fileEntry);
+}
+
QString QFSFileEngine::fileName(FileName file) const
{
Q_D(const QFSFileEngine);
diff --git a/src/corelib/io/qloggingcategory.cpp b/src/corelib/io/qloggingcategory.cpp
index 69af936bca..4256d4b6e1 100644
--- a/src/corelib/io/qloggingcategory.cpp
+++ b/src/corelib/io/qloggingcategory.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -334,12 +334,11 @@ bool QLoggingCategory::isEnabled(QtMsgType msgtype) const
/*!
Changes the message type \a type for the category to \a enable.
- \note Changes only affect the current QLoggingCategory object, and won't
- change the settings of other objects for the same category name.
- Use either \l setFilterRules() or \l installFilter() to change the
- configuration globally.
+ This method is meant to be used only from inside a filter
+ installed by \l installFilter(). See \l {Configuring Categories} for
+ an overview on how to configure categories globally.
- \note \c QtFatalMsg cannot be changed. It will always return \c true.
+ \note \c QtFatalMsg cannot be changed. It will always remain \c true.
*/
void QLoggingCategory::setEnabled(QtMsgType type, bool enable)
{
@@ -411,8 +410,8 @@ QLoggingCategory *QLoggingCategory::defaultCategory()
filter is free to change the respective category configuration with
\l setEnabled().
- The filter might be called concurrently from different threads, and
- therefore has to be reentrant.
+ The filter might be called from different threads, but never concurrently.
+ The filter shall not call any static functions of QLoggingCategory.
Example:
\snippet qloggingcategory/main.cpp 21
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index 984ed23812..c1187e5145 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -53,6 +53,7 @@
#include <qshareddata.h>
#include <qplatformdefs.h>
#include "private/qabstractfileengine_p.h"
+#include "private/qsystemerror_p.h"
#ifdef Q_OS_UNIX
# include "private/qcore_unix_p.h"
@@ -1282,7 +1283,7 @@ bool QResourceFileEngine::open(QIODevice::OpenMode flags)
return false;
d->uncompress();
if (!d->resource.isValid()) {
- d->errorString = qt_error_string(ENOENT);
+ d->errorString = QSystemError::stdString(ENOENT);
return false;
}
return true;
diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp
index b68e9e6d4b..ef5ff2d827 100644
--- a/src/corelib/io/qwindowspipereader.cpp
+++ b/src/corelib/io/qwindowspipereader.cpp
@@ -57,7 +57,7 @@ void QWindowsPipeReader::Overlapped::clear()
QWindowsPipeReader::QWindowsPipeReader(QObject *parent)
: QObject(parent),
handle(INVALID_HANDLE_VALUE),
- overlapped(this),
+ overlapped(nullptr),
readBufferMaxSize(0),
actualReadBufferSize(0),
stopped(true),
@@ -74,6 +74,7 @@ QWindowsPipeReader::QWindowsPipeReader(QObject *parent)
QWindowsPipeReader::~QWindowsPipeReader()
{
stop();
+ delete overlapped;
}
/*!
@@ -95,14 +96,16 @@ void QWindowsPipeReader::stop()
{
stopped = true;
if (readSequenceStarted) {
- if (!CancelIoEx(handle, &overlapped)) {
+ overlapped->pipeReader = nullptr;
+ if (!CancelIoEx(handle, overlapped)) {
const DWORD dwError = GetLastError();
if (dwError != ERROR_NOT_FOUND) {
- qErrnoWarning(dwError, "QWindowsPipeReader: qt_cancelIo on handle %x failed.",
+ qErrnoWarning(dwError, "QWindowsPipeReader: CancelIoEx on handle %p failed.",
handle);
}
}
- waitForNotification(-1);
+ overlapped = nullptr; // The object will be deleted in the I/O callback.
+ readSequenceStarted = false;
}
}
@@ -223,8 +226,10 @@ void QWindowsPipeReader::startAsyncRead()
stopped = false;
readSequenceStarted = true;
- overlapped.clear();
- if (!ReadFileEx(handle, ptr, bytesToRead, &overlapped, &readFileCompleted)) {
+ if (!overlapped)
+ overlapped = new Overlapped(this);
+ overlapped->clear();
+ if (!ReadFileEx(handle, ptr, bytesToRead, overlapped, &readFileCompleted)) {
readSequenceStarted = false;
const DWORD dwError = GetLastError();
@@ -251,7 +256,10 @@ void QWindowsPipeReader::readFileCompleted(DWORD errorCode, DWORD numberOfBytesT
OVERLAPPED *overlappedBase)
{
Overlapped *overlapped = static_cast<Overlapped *>(overlappedBase);
- overlapped->pipeReader->notified(errorCode, numberOfBytesTransfered);
+ if (overlapped->pipeReader)
+ overlapped->pipeReader->notified(errorCode, numberOfBytesTransfered);
+ else
+ delete overlapped;
}
/*!
diff --git a/src/corelib/io/qwindowspipereader_p.h b/src/corelib/io/qwindowspipereader_p.h
index 74ff5250ac..e52aa4c33d 100644
--- a/src/corelib/io/qwindowspipereader_p.h
+++ b/src/corelib/io/qwindowspipereader_p.h
@@ -105,7 +105,7 @@ private:
};
HANDLE handle;
- Overlapped overlapped;
+ Overlapped *overlapped;
qint64 readBufferMaxSize;
QRingBuffer readBuffer;
qint64 actualReadBufferSize;
diff --git a/src/corelib/io/qwindowspipewriter.cpp b/src/corelib/io/qwindowspipewriter.cpp
index 06a3572fad..8e3de2d620 100644
--- a/src/corelib/io/qwindowspipewriter.cpp
+++ b/src/corelib/io/qwindowspipewriter.cpp
@@ -56,7 +56,7 @@ void QWindowsPipeWriter::Overlapped::clear()
QWindowsPipeWriter::QWindowsPipeWriter(HANDLE pipeWriteEnd, QObject *parent)
: QObject(parent),
handle(pipeWriteEnd),
- overlapped(this),
+ overlapped(nullptr),
pendingBytesWrittenValue(0),
stopped(true),
writeSequenceStarted(false),
@@ -71,6 +71,7 @@ QWindowsPipeWriter::QWindowsPipeWriter(HANDLE pipeWriteEnd, QObject *parent)
QWindowsPipeWriter::~QWindowsPipeWriter()
{
stop();
+ delete overlapped;
}
bool QWindowsPipeWriter::waitForWrite(int msecs)
@@ -121,7 +122,10 @@ void QWindowsPipeWriter::writeFileCompleted(DWORD errorCode, DWORD numberOfBytes
OVERLAPPED *overlappedBase)
{
Overlapped *overlapped = static_cast<Overlapped *>(overlappedBase);
- overlapped->pipeWriter->notified(errorCode, numberOfBytesTransfered);
+ if (overlapped->pipeWriter)
+ overlapped->pipeWriter->notified(errorCode, numberOfBytesTransfered);
+ else
+ delete overlapped;
}
/*!
@@ -183,12 +187,14 @@ bool QWindowsPipeWriter::write(const QByteArray &ba)
if (writeSequenceStarted)
return false;
- overlapped.clear();
+ if (!overlapped)
+ overlapped = new Overlapped(this);
+ overlapped->clear();
buffer = ba;
stopped = false;
writeSequenceStarted = true;
if (!WriteFileEx(handle, buffer.constData(), buffer.size(),
- &overlapped, &writeFileCompleted)) {
+ overlapped, &writeFileCompleted)) {
writeSequenceStarted = false;
buffer.clear();
qErrnoWarning("QWindowsPipeWriter::write failed.");
@@ -204,14 +210,16 @@ void QWindowsPipeWriter::stop()
bytesWrittenPending = false;
pendingBytesWrittenValue = 0;
if (writeSequenceStarted) {
- if (!CancelIoEx(handle, &overlapped)) {
+ overlapped->pipeWriter = nullptr;
+ if (!CancelIoEx(handle, overlapped)) {
const DWORD dwError = GetLastError();
if (dwError != ERROR_NOT_FOUND) {
- qErrnoWarning(dwError, "QWindowsPipeWriter: qt_cancelIo on handle %x failed.",
+ qErrnoWarning(dwError, "QWindowsPipeWriter: CancelIoEx on handle %p failed.",
handle);
}
}
- waitForNotification(-1);
+ overlapped = nullptr; // The object will be deleted in the I/O callback.
+ writeSequenceStarted = false;
}
}
diff --git a/src/corelib/io/qwindowspipewriter_p.h b/src/corelib/io/qwindowspipewriter_p.h
index a4ecfa3bf8..d6671c3f27 100644
--- a/src/corelib/io/qwindowspipewriter_p.h
+++ b/src/corelib/io/qwindowspipewriter_p.h
@@ -143,7 +143,7 @@ private:
};
HANDLE handle;
- Overlapped overlapped;
+ Overlapped *overlapped;
QByteArray buffer;
qint64 pendingBytesWrittenValue;
bool stopped;
diff --git a/src/corelib/kernel/qsystemerror.cpp b/src/corelib/kernel/qsystemerror.cpp
index 3899f24d3b..fc825257ec 100644
--- a/src/corelib/kernel/qsystemerror.cpp
+++ b/src/corelib/kernel/qsystemerror.cpp
@@ -101,6 +101,11 @@ static QString windowsErrorString(int errorCode)
if (ret.isEmpty() && errorCode == ERROR_MOD_NOT_FOUND)
ret = QString::fromLatin1("The specified module could not be found.");
+ if (ret.endsWith(QLatin1String("\r\n")))
+ ret.chop(2);
+ if (ret.isEmpty())
+ ret = QString::fromLatin1("Unknown error 0x%1.")
+ .arg(unsigned(errorCode), 8, 16, QLatin1Char('0'));
return ret;
}
#endif
@@ -126,7 +131,7 @@ static QString standardLibraryErrorString(int errorCode)
break;
default: {
#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX)
- QByteArray buf(1024, '\0');
+ QByteArray buf(1024, Qt::Uninitialized);
ret = fromstrerror_helper(strerror_r(errorCode, buf.data(), buf.size()), buf);
#else
ret = QString::fromLocal8Bit(strerror(errorCode));
@@ -141,7 +146,7 @@ static QString standardLibraryErrorString(int errorCode)
return ret.trimmed();
}
-QString QSystemError::toString() const
+QString QSystemError::string(ErrorScope errorScope, int errorCode)
{
switch(errorScope) {
case NativeError:
@@ -161,5 +166,26 @@ QString QSystemError::toString() const
}
}
-QT_END_NAMESPACE
+QString QSystemError::stdString(int errorCode)
+{
+ return standardLibraryErrorString(errorCode == -1 ? errno : errorCode);
+}
+
+#ifdef Q_OS_WIN
+QString QSystemError::windowsString(int errorCode)
+{
+ return windowsErrorString(errorCode == -1 ? GetLastError() : errorCode);
+}
+QString qt_error_string(int code)
+{
+ return windowsErrorString(code == -1 ? GetLastError() : code);
+}
+#else
+QString qt_error_string(int code)
+{
+ return standardLibraryErrorString(code == -1 ? errno : code);
+}
+#endif
+
+QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qsystemerror_p.h b/src/corelib/kernel/qsystemerror_p.h
index 440b763149..1d8c253f53 100644
--- a/src/corelib/kernel/qsystemerror_p.h
+++ b/src/corelib/kernel/qsystemerror_p.h
@@ -69,10 +69,16 @@ public:
inline QSystemError(int error, ErrorScope scope);
inline QSystemError();
- QString toString() const;
+ inline QString toString() const;
inline ErrorScope scope() const;
inline int error() const;
+ static QString string(ErrorScope errorScope, int errorCode);
+ static QString stdString(int errorCode = -1);
+#ifdef Q_OS_WIN
+ static QString windowsString(int errorCode = -1);
+#endif
+
//data members
int errorCode;
ErrorScope errorScope;
@@ -90,6 +96,11 @@ QSystemError::QSystemError()
}
+QString QSystemError::toString() const
+{
+ return string(errorScope, errorCode);
+}
+
QSystemError::ErrorScope QSystemError::scope() const
{
return errorScope;
@@ -100,7 +111,6 @@ int QSystemError::error() const
return errorCode;
}
-
QT_END_NAMESPACE
#endif // QSYSTEMERROR_P_H
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 3d04d0802d..ebad7f1751 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -48,6 +48,7 @@
#include <qmutex.h>
#include <qmap.h>
#include <private/qcoreapplication_p.h>
+#include <private/qsystemerror_p.h>
#ifdef Q_OS_MAC
# include <private/qcore_mac_p.h>
#endif
@@ -237,7 +238,7 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
lib->errorString = file.errorString();
if (qt_debug_component()) {
qWarning("%s: %s", (const char*) QFile::encodeName(library),
- qPrintable(qt_error_string(errno)));
+ qPrintable(QSystemError::stdString()));
}
return false;
}
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h
index d7378df746..0b0f935b26 100644
--- a/src/corelib/tools/qhash.h
+++ b/src/corelib/tools/qhash.h
@@ -373,7 +373,7 @@ public:
typedef const T *pointer;
typedef const T &reference;
- inline const_iterator() : i(Q_NULLPTR) { }
+ Q_DECL_CONSTEXPR inline const_iterator() : i(Q_NULLPTR) { }
explicit inline const_iterator(void *node)
: i(reinterpret_cast<QHashData::Node *>(node)) { }
#ifdef QT_STRICT_ITERATORS
@@ -387,8 +387,8 @@ public:
inline const T &value() const { return concrete(i)->value; }
inline const T &operator*() const { return concrete(i)->value; }
inline const T *operator->() const { return &concrete(i)->value; }
- inline bool operator==(const const_iterator &o) const { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const { return i != o.i; }
+ Q_DECL_CONSTEXPR inline bool operator==(const const_iterator &o) const { return i == o.i; }
+ Q_DECL_CONSTEXPR inline bool operator!=(const const_iterator &o) const { return i != o.i; }
inline const_iterator &operator++() {
i = QHashData::nextNode(i);
diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h
index 9a663c2c20..16442014ff 100644
--- a/src/corelib/tools/qmap.h
+++ b/src/corelib/tools/qmap.h
@@ -473,7 +473,7 @@ public:
typedef const T *pointer;
typedef const T &reference;
- inline const_iterator() : i(Q_NULLPTR) { }
+ Q_DECL_CONSTEXPR inline const_iterator() : i(Q_NULLPTR) { }
inline const_iterator(const Node *node) : i(node) { }
#ifdef QT_STRICT_ITERATORS
explicit inline const_iterator(const iterator &o)
@@ -486,8 +486,8 @@ public:
inline const T &value() const { return i->value; }
inline const T &operator*() const { return i->value; }
inline const T *operator->() const { return &i->value; }
- inline bool operator==(const const_iterator &o) const { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const { return i != o.i; }
+ Q_DECL_CONSTEXPR inline bool operator==(const const_iterator &o) const { return i == o.i; }
+ Q_DECL_CONSTEXPR inline bool operator!=(const const_iterator &o) const { return i != o.i; }
inline const_iterator &operator++() {
i = i->nextNode();
diff --git a/src/network/ssl/qasn1element.cpp b/src/network/ssl/qasn1element.cpp
index dc59c41d59..6558643386 100644
--- a/src/network/ssl/qasn1element.cpp
+++ b/src/network/ssl/qasn1element.cpp
@@ -45,6 +45,8 @@
#include <QtCore/qvector.h>
#include <QDebug>
+#include <locale>
+
QT_BEGIN_NAMESPACE
typedef QMap<QByteArray, QByteArray> OidNameMap;
@@ -82,6 +84,27 @@ static OidNameMap createOidMap()
}
Q_GLOBAL_STATIC_WITH_ARGS(OidNameMap, oidNameMap, (createOidMap()))
+static bool stringToNonNegativeInt(const QByteArray &asnString, int *val)
+{
+ // Helper function for toDateTime(), which handles chunking of the original
+ // string into smaller sub-components, so we expect the whole 'asnString' to
+ // be a valid non-negative number.
+ Q_ASSERT(val);
+
+ // We want the C locale, as used by QByteArray; however, no leading sign is
+ // allowed (which QByteArray would accept), so we have to check the data:
+ const std::locale localeC;
+ for (char v : asnString) {
+ if (!std::isdigit(v, localeC))
+ return false;
+ }
+
+ bool ok = false;
+ *val = asnString.toInt(&ok);
+ Q_ASSERT(ok && *val >= 0);
+ return true;
+}
+
QAsn1Element::QAsn1Element(quint8 type, const QByteArray &value)
: mType(type)
, mValue(value)
@@ -231,15 +254,19 @@ bool QAsn1Element::toBool(bool *ok) const
QDateTime QAsn1Element::toDateTime() const
{
if (mValue.endsWith('Z')) {
- if (mType == UtcTimeType && mValue.size() == 13)
- return QDateTime(QDate(2000 + mValue.mid(0, 2).toInt(),
+ if (mType == UtcTimeType && mValue.size() == 13) {
+ int year = 0;
+ if (!stringToNonNegativeInt(mValue.mid(0, 2), &year))
+ return QDateTime();
+ // RFC 2459: YY represents a year in the range [1950, 2049]
+ return QDateTime(QDate(year < 50 ? 2000 + year : 1900 + year,
mValue.mid(2, 2).toInt(),
mValue.mid(4, 2).toInt()),
QTime(mValue.mid(6, 2).toInt(),
mValue.mid(8, 2).toInt(),
mValue.mid(10, 2).toInt()),
Qt::UTC);
- else if (mType == GeneralizedTimeType && mValue.size() == 15)
+ } else if (mType == GeneralizedTimeType && mValue.size() == 15) {
return QDateTime(QDate(mValue.mid(0, 4).toInt(),
mValue.mid(4, 2).toInt(),
mValue.mid(6, 2).toInt()),
@@ -247,6 +274,7 @@ QDateTime QAsn1Element::toDateTime() const
mValue.mid(10, 2).toInt(),
mValue.mid(12, 2).toInt()),
Qt::UTC);
+ }
}
return QDateTime();
}
diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
index 54daa2c2de..be0fac4b55 100644
--- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
+++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
@@ -256,10 +256,6 @@ public:
QKdeThemePrivate(const QStringList &kdeDirs, int kdeVersion)
: kdeDirs(kdeDirs)
, kdeVersion(kdeVersion)
- , toolButtonStyle(Qt::ToolButtonTextBesideIcon)
- , toolBarIconSize(0)
- , singleClick(true)
- , wheelScrollLines(3)
{ }
static QString kdeGlobals(const QString &kdeDir, int kdeVersion)
@@ -282,10 +278,15 @@ public:
QString iconThemeName;
QString iconFallbackThemeName;
QStringList styleNames;
- int toolButtonStyle;
- int toolBarIconSize;
- bool singleClick;
- int wheelScrollLines;
+ int toolButtonStyle = Qt::ToolButtonTextBesideIcon;
+ int toolBarIconSize = 0;
+ bool singleClick = true;
+ bool showIconsOnPushButtons = true;
+ int wheelScrollLines = 3;
+ int doubleClickInterval = 400;
+ int startDragDist = 10;
+ int startDragTime = 500;
+ int cursorBlinkRate = 1000;
};
void QKdeThemePrivate::refresh()
@@ -321,6 +322,10 @@ void QKdeThemePrivate::refresh()
if (singleClickValue.isValid())
singleClick = singleClickValue.toBool();
+ const QVariant showIconsOnPushButtonsValue = readKdeSetting(QStringLiteral("KDE/ShowIconsOnPushButtons"), kdeDirs, kdeVersion, kdeSettings);
+ if (showIconsOnPushButtonsValue.isValid())
+ showIconsOnPushButtons = showIconsOnPushButtonsValue.toBool();
+
const QVariant themeValue = readKdeSetting(QStringLiteral("Icons/Theme"), kdeDirs, kdeVersion, kdeSettings);
if (themeValue.isValid())
iconThemeName = themeValue.toString();
@@ -344,6 +349,24 @@ void QKdeThemePrivate::refresh()
if (wheelScrollLinesValue.isValid())
wheelScrollLines = wheelScrollLinesValue.toInt();
+ const QVariant doubleClickIntervalValue = readKdeSetting(QStringLiteral("KDE/DoubleClickInterval"), kdeDirs, kdeVersion, kdeSettings);
+ if (doubleClickIntervalValue.isValid())
+ doubleClickInterval = doubleClickIntervalValue.toInt();
+
+ const QVariant startDragDistValue = readKdeSetting(QStringLiteral("KDE/StartDragDist"), kdeDirs, kdeVersion, kdeSettings);
+ if (startDragDistValue.isValid())
+ startDragDist = startDragDistValue.toInt();
+
+ const QVariant startDragTimeValue = readKdeSetting(QStringLiteral("KDE/StartDragTime"), kdeDirs, kdeVersion, kdeSettings);
+ if (startDragTimeValue.isValid())
+ startDragTime = startDragTimeValue.toInt();
+
+ const QVariant cursorBlinkRateValue = readKdeSetting(QStringLiteral("KDE/CursorBlinkRate"), kdeDirs, kdeVersion, kdeSettings);
+ if (cursorBlinkRateValue.isValid()) {
+ cursorBlinkRate = cursorBlinkRateValue.toInt();
+ cursorBlinkRate = cursorBlinkRate > 0 ? qBound(200, cursorBlinkRate, 2000) : 0;
+ }
+
// Read system font, ignore 'smallestReadableFont'
if (QFont *systemFont = kdeFont(readKdeSetting(QStringLiteral("font"), kdeDirs, kdeVersion, kdeSettings)))
resources.fonts[QPlatformTheme::SystemFont] = systemFont;
@@ -519,7 +542,7 @@ QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
case QPlatformTheme::UseFullScreenForPopupMenu:
return QVariant(true);
case QPlatformTheme::DialogButtonBoxButtonsHaveIcons:
- return QVariant(true);
+ return QVariant(d->showIconsOnPushButtons);
case QPlatformTheme::DialogButtonBoxLayout:
return QVariant(QPlatformDialogHelper::KdeLayout);
case QPlatformTheme::ToolButtonStyle:
@@ -542,6 +565,14 @@ QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
return QVariant(d->singleClick);
case QPlatformTheme::WheelScrollLines:
return QVariant(d->wheelScrollLines);
+ case QPlatformTheme::MouseDoubleClickInterval:
+ return QVariant(d->doubleClickInterval);
+ case QPlatformTheme::StartDragTime:
+ return QVariant(d->startDragTime);
+ case QPlatformTheme::StartDragDistance:
+ return QVariant(d->startDragDist);
+ case QPlatformTheme::CursorFlashTime:
+ return QVariant(d->cursorBlinkRate);
case QPlatformTheme::UiEffects:
return QVariant(int(HoverEffect));
default:
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm
index fd627e3796..04dce802f3 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.mm
+++ b/src/plugins/platforms/cocoa/qcocoatheme.mm
@@ -57,6 +57,7 @@
#include <QtGui/qpainter.h>
#include <QtFontDatabaseSupport/private/qcoretextfontdatabase_p.h>
#include <QtThemeSupport/private/qabstractfileiconengine_p.h>
+#include <qpa/qplatformdialoghelper.h>
#include <qpa/qplatformintegration.h>
#include <qpa/qplatformnativeinterface.h>
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
index e5041fb863..8295d4a36c 100644
--- a/src/plugins/platforms/cocoa/qnswindowdelegate.mm
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
@@ -88,9 +88,9 @@
*/
- (NSSize)window:(NSWindow *)window willUseFullScreenContentSize:(NSSize)proposedSize
{
- Q_UNUSED(window);
- Q_ASSERT(NSEqualSizes(m_cocoaWindow->screen()->geometry().size().toCGSize(), proposedSize));
- return proposedSize;
+ Q_UNUSED(proposedSize);
+ Q_ASSERT(window == m_cocoaWindow->nativeWindow());
+ return m_cocoaWindow->screen()->geometry().size().toCGSize();
}
#endif
diff --git a/src/plugins/platforms/windows/openglblacklists/default.json b/src/plugins/platforms/windows/openglblacklists/default.json
index 6515f02830..69f4a54d05 100644
--- a/src/plugins/platforms/windows/openglblacklists/default.json
+++ b/src/plugins/platforms/windows/openglblacklists/default.json
@@ -126,18 +126,6 @@
"features": [
"disable_desktopgl"
]
- },
- {
- "id": 11,
- "description": "VMWare Workstation Player 12 has insufficient support for OpenGL",
- "vendor_id": "0x15AD",
- "device_id": [ "0x0405" ],
- "os": {
- "type": "win"
- },
- "features": [
- "disable_desktopgl", "disable_d3d11"
- ]
}
]
}
diff --git a/src/plugins/styles/mac/qmacstyle_mac.mm b/src/plugins/styles/mac/qmacstyle_mac.mm
index 1386a98586..6266728c84 100644
--- a/src/plugins/styles/mac/qmacstyle_mac.mm
+++ b/src/plugins/styles/mac/qmacstyle_mac.mm
@@ -89,7 +89,9 @@
#include <qstyleoption.h>
#include <qtoolbar.h>
#include <qtoolbutton.h>
+#if QT_CONFIG(treeview)
#include <qtreeview.h>
+#endif
#if QT_CONFIG(tableview)
#include <qtableview.h>
#endif
@@ -491,7 +493,7 @@ static QStyleHelper::WidgetSizePolicy getControlSize(const QStyleOption *option,
return wsp;
}
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
static inline bool isTreeView(const QWidget *widget)
{
return (widget && widget->parentWidget() &&
@@ -1027,7 +1029,7 @@ static QSize qt_aqua_get_known_size(QStyle::ContentsType ct, const QWidget *widg
break;
#endif
case QStyle::CT_HeaderSection:
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
if (isTreeView(widg))
ret = QSize(-1, qt_mac_aqua_get_metric(ListHeaderHeight));
#endif
diff --git a/src/plugins/styles/mac/qmacstyle_mac_p_p.h b/src/plugins/styles/mac/qmacstyle_mac_p_p.h
index f1c355e621..2dff9afacb 100644
--- a/src/plugins/styles/mac/qmacstyle_mac_p_p.h
+++ b/src/plugins/styles/mac/qmacstyle_mac_p_p.h
@@ -93,7 +93,9 @@
#include <qtextstream.h>
#include <qtoolbar.h>
#include <qtoolbutton.h>
+#if QT_CONFIG(treeview)
#include <qtreeview.h>
+#endif
#if QT_CONFIG(tableview)
#include <qtableview.h>
#endif
diff --git a/src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h b/src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h
index 36c8f9d818..c8e9edeb3b 100644
--- a/src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h
+++ b/src/plugins/styles/windowsvista/qwindowsvistastyle_p_p.h
@@ -75,7 +75,9 @@
#include <qprogressbar.h>
#include <qdockwidget.h>
#include <qlistview.h>
+#if QT_CONFIG(treeview)
#include <qtreeview.h>
+#endif
#include <qtextedit.h>
#include <qmessagebox.h>
#if QT_CONFIG(dialogbuttonbox)
diff --git a/src/testlib/qtestblacklist.cpp b/src/testlib/qtestblacklist.cpp
index af57ea0ee7..b24ce0578e 100644
--- a/src/testlib/qtestblacklist.cpp
+++ b/src/testlib/qtestblacklist.cpp
@@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE
/*
The BLACKLIST file format is a grouped listing of keywords.
- Blank lines and lines starting with # are simply ignored. An initial #-line
+ Blank lines and everything after # is simply ignored. An initial #-line
referring to this documentation is kind to readers. Comments can also be used
to indicate the reasons for ignoring particular cases.
@@ -253,8 +253,12 @@ void parseBlackList()
QByteArray function;
while (!ignored.atEnd()) {
- QByteArray line = ignored.readLine().simplified();
- if (line.isEmpty() || line.startsWith('#'))
+ QByteArray line = ignored.readLine();
+ const int commentPosition = line.indexOf('#');
+ if (commentPosition >= 0)
+ line.truncate(commentPosition);
+ line = line.simplified();
+ if (line.isEmpty())
continue;
if (line.startsWith('[')) {
function = line.mid(1, line.length() - 2);
diff --git a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp
index 7ddd0fcf5d..c76983200e 100644
--- a/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp
+++ b/src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp
@@ -62,7 +62,7 @@ static const char docTypeHeader[] =
#define PROGRAMNAME "qdbuscpp2xml"
#define PROGRAMVERSION "0.2"
-#define PROGRAMCOPYRIGHT "Copyright (C) 2016 The Qt Company Ltd."
+#define PROGRAMCOPYRIGHT "Copyright (C) 2017 The Qt Company Ltd."
static QString outputFile;
static int flags;
diff --git a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
index 9ccf8be73a..bbe738dadb 100644
--- a/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
+++ b/src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp
@@ -46,7 +46,7 @@
#define PROGRAMNAME "qdbusxml2cpp"
#define PROGRAMVERSION "0.8"
-#define PROGRAMCOPYRIGHT "Copyright (C) 2016 The Qt Company Ltd."
+#define PROGRAMCOPYRIGHT "Copyright (C) 2017 The Qt Company Ltd."
#define ANNOTATION_NO_WAIT "org.freedesktop.DBus.Method.NoReply"
@@ -1134,6 +1134,11 @@ int main(int argc, char **argv)
QDBusIntrospection::Interfaces interfaces = readInput();
cleanInterfaces(interfaces);
+ QStringList args = app.arguments();
+ args.removeFirst();
+ commandLine = QLatin1String(PROGRAMNAME " ");
+ commandLine += args.join(QLatin1Char(' '));
+
if (!proxyFile.isEmpty() || adaptorFile.isEmpty())
writeProxy(proxyFile, interfaces);
diff --git a/src/widgets/accessible/complexwidgets.cpp b/src/widgets/accessible/complexwidgets.cpp
index dd9bea1aec..50aba759c3 100644
--- a/src/widgets/accessible/complexwidgets.cpp
+++ b/src/widgets/accessible/complexwidgets.cpp
@@ -53,7 +53,6 @@
#if QT_CONFIG(whatsthis)
#include <qwhatsthis.h>
#endif
-#include <qtreeview.h>
#include <private/qtabbar_p.h>
#include <QAbstractScrollArea>
#include <QScrollArea>
diff --git a/src/widgets/accessible/itemviews.cpp b/src/widgets/accessible/itemviews.cpp
index 87c0a59563..4d1a4589ee 100644
--- a/src/widgets/accessible/itemviews.cpp
+++ b/src/widgets/accessible/itemviews.cpp
@@ -44,8 +44,11 @@
#include <qtableview.h>
#endif
#include <qlistview.h>
+#if QT_CONFIG(treeview)
#include <qtreeview.h>
#include <private/qtreeview_p.h>
+#endif
+#include <private/qwidget_p.h>
#ifndef QT_NO_ACCESSIBILITY
@@ -88,7 +91,7 @@ QAccessibleTable::QAccessibleTable(QWidget *w)
m_role = QAccessible::Table;
} else
#endif
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
if (qobject_cast<const QTreeView*>(view())) {
m_role = QAccessible::Tree;
} else
@@ -123,7 +126,7 @@ QHeaderView *QAccessibleTable::horizontalHeader() const
} else if (const QTableView *tv = qobject_cast<const QTableView*>(view())) {
header = tv->horizontalHeader();
#endif
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
} else if (const QTreeView *tv = qobject_cast<const QTreeView*>(view())) {
header = tv->header();
#endif
@@ -647,7 +650,7 @@ void QAccessibleTable::modelChange(QAccessibleTableModelChangeEvent *event)
}
}
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
// TREE VIEW
@@ -820,7 +823,7 @@ bool QAccessibleTree::selectRow(int row)
return true;
}
-#endif // QT_NO_TREEVIEW
+#endif // QT_CONFIG(treeview)
// TABLE CELL
@@ -872,7 +875,7 @@ QHeaderView *QAccessibleTableCell::horizontalHeader() const
} else if (const QTableView *tv = qobject_cast<const QTableView*>(view)) {
header = tv->horizontalHeader();
#endif
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
} else if (const QTreeView *tv = qobject_cast<const QTreeView*>(view)) {
header = tv->header();
#endif
@@ -898,7 +901,7 @@ int QAccessibleTableCell::columnIndex() const
int QAccessibleTableCell::rowIndex() const
{
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
if (role() == QAccessible::TreeItem) {
const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
Q_ASSERT(treeView);
@@ -1034,7 +1037,7 @@ QAccessible::State QAccessibleTableCell::state() const
if (view->selectionMode() == QAbstractItemView::ExtendedSelection)
st.extSelectable = true;
}
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
if (m_role == QAccessible::TreeItem) {
const QTreeView *treeView = qobject_cast<const QTreeView*>(view);
if (treeView->model()->hasChildren(m_index))
@@ -1135,7 +1138,7 @@ QRect QAccessibleTableHeaderCell::rect() const
header = tv->verticalHeader();
}
#endif
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
} else if (const QTreeView *tv = qobject_cast<const QTreeView*>(view)) {
header = tv->header();
#endif
@@ -1202,7 +1205,7 @@ QHeaderView *QAccessibleTableHeaderCell::headerView() const
header = tv->verticalHeader();
}
#endif
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
} else if (const QTreeView *tv = qobject_cast<const QTreeView*>(view)) {
header = tv->header();
#endif
diff --git a/src/widgets/accessible/itemviews_p.h b/src/widgets/accessible/itemviews_p.h
index 1b3869f2fa..9542a569db 100644
--- a/src/widgets/accessible/itemviews_p.h
+++ b/src/widgets/accessible/itemviews_p.h
@@ -145,7 +145,7 @@ private:
QAccessible::Role m_role;
};
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
class QAccessibleTree :public QAccessibleTable
{
public:
@@ -223,7 +223,7 @@ private:
void unselectCell();
friend class QAccessibleTable;
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
friend class QAccessibleTree;
#endif
};
@@ -259,7 +259,7 @@ private:
Qt::Orientation orientation;
friend class QAccessibleTable;
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
friend class QAccessibleTree;
#endif
};
diff --git a/src/widgets/accessible/qaccessiblewidgetfactory.cpp b/src/widgets/accessible/qaccessiblewidgetfactory.cpp
index ccd176cd04..a39674dc7a 100644
--- a/src/widgets/accessible/qaccessiblewidgetfactory.cpp
+++ b/src/widgets/accessible/qaccessiblewidgetfactory.cpp
@@ -46,7 +46,9 @@
#include "itemviews_p.h"
#include <qtoolbutton.h>
+#if QT_CONFIG(treeview)
#include <qtreeview.h>
+#endif
#include <qvariant.h>
#include <qaccessible.h>
@@ -140,10 +142,10 @@ QAccessibleInterface *qAccessibleFactory(const QString &classname, QObject *obje
} else if (classname == QLatin1String("QMenu")) {
iface = new QAccessibleMenu(widget);
#endif
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
} else if (classname == QLatin1String("QTreeView")) {
iface = new QAccessibleTree(widget);
-#endif // QT_NO_TREEVIEW
+#endif // QT_CONFIG(treeview)
#ifndef QT_NO_ITEMVIEWS
} else if (classname == QLatin1String("QTableView") || classname == QLatin1String("QListView")) {
iface = new QAccessibleTable(widget);
diff --git a/src/widgets/itemviews/itemviews.pri b/src/widgets/itemviews/itemviews.pri
index 4101be5631..c68aa590bc 100644
--- a/src/widgets/itemviews/itemviews.pri
+++ b/src/widgets/itemviews/itemviews.pri
@@ -9,8 +9,6 @@ HEADERS += \
itemviews/qlistview.h \
itemviews/qlistview_p.h \
itemviews/qbsptree_p.h \
- itemviews/qtreeview.h \
- itemviews/qtreeview_p.h \
itemviews/qabstractitemdelegate.h \
itemviews/qabstractitemdelegate_p.h \
itemviews/qitemdelegate.h \
@@ -26,7 +24,6 @@ SOURCES += \
itemviews/qheaderview.cpp \
itemviews/qlistview.cpp \
itemviews/qbsptree.cpp \
- itemviews/qtreeview.cpp \
itemviews/qabstractitemdelegate.cpp \
itemviews/qitemdelegate.cpp \
itemviews/qdirmodel.cpp \
@@ -70,6 +67,14 @@ qtConfig(tablewidget) {
SOURCES += itemviews/qtablewidget.cpp
}
+qtConfig(treeview) {
+ HEADERS += \
+ itemviews/qtreeview.h \
+ itemviews/qtreeview_p.h
+
+ SOURCES += itemviews/qtreeview.cpp
+}
+
qtConfig(treewidget) {
HEADERS += \
itemviews/qtreewidget.h \
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp
index 2ae885615f..78189c13c3 100644
--- a/src/widgets/itemviews/qabstractitemview.cpp
+++ b/src/widgets/itemviews/qabstractitemview.cpp
@@ -52,7 +52,6 @@
#include <qdatetime.h>
#include <qlineedit.h>
#include <qspinbox.h>
-#include <qtreeview.h>
#include <qheaderview.h>
#include <qstyleditemdelegate.h>
#include <private/qabstractitemview_p.h>
diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp
index f92cef50be..61721143ef 100644
--- a/src/widgets/itemviews/qtreeview.cpp
+++ b/src/widgets/itemviews/qtreeview.cpp
@@ -38,7 +38,6 @@
****************************************************************************/
#include "qtreeview.h"
-#ifndef QT_NO_TREEVIEW
#include <qheaderview.h>
#include <qitemdelegate.h>
#include <qapplication.h>
@@ -3996,5 +3995,3 @@ int QTreeView::visualIndex(const QModelIndex &index) const
QT_END_NAMESPACE
#include "moc_qtreeview.cpp"
-
-#endif // QT_NO_TREEVIEW
diff --git a/src/widgets/itemviews/qtreeview.h b/src/widgets/itemviews/qtreeview.h
index 3c7cbddfbb..c32c127cd1 100644
--- a/src/widgets/itemviews/qtreeview.h
+++ b/src/widgets/itemviews/qtreeview.h
@@ -45,10 +45,9 @@
class tst_QTreeView;
-QT_BEGIN_NAMESPACE
-
+QT_REQUIRE_CONFIG(treeview);
-#ifndef QT_NO_TREEVIEW
+QT_BEGIN_NAMESPACE
class QTreeViewPrivate;
class QHeaderView;
@@ -237,8 +236,6 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_sortIndicatorChanged(int column, Qt::SortOrder order))
};
-#endif // QT_NO_TREEVIEW
-
QT_END_NAMESPACE
#endif // QTREEVIEW_H
diff --git a/src/widgets/itemviews/qtreeview_p.h b/src/widgets/itemviews/qtreeview_p.h
index 63af41292b..9a391ee88a 100644
--- a/src/widgets/itemviews/qtreeview_p.h
+++ b/src/widgets/itemviews/qtreeview_p.h
@@ -57,7 +57,7 @@
#include <QtCore/qabstractitemmodel.h>
#include <QtCore/qvector.h>
-#ifndef QT_NO_TREEVIEW
+QT_REQUIRE_CONFIG(treeview);
QT_BEGIN_NAMESPACE
@@ -272,6 +272,4 @@ public:
QT_END_NAMESPACE
-#endif // QT_NO_TREEVIEW
-
#endif // QTREEVIEW_P_H
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index 593dc9e779..ceff1a50a3 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -41,6 +41,7 @@
#include "qcommonstyle_p.h"
#include <qfile.h>
+#include <qabstractitemview.h>
#include <qapplication.h>
#include <private/qguiapplication_p.h>
#include <qpa/qplatformtheme.h>
@@ -71,7 +72,9 @@
#if QT_CONFIG(rubberband)
#include <qrubberband.h>
#endif
+#if QT_CONFIG(treeview)
#include "qtreeview.h"
+#endif
#include <private/qcommonstylepixmaps_p.h>
#include <private/qmath_p.h>
#include <qdebug.h>
@@ -5252,7 +5255,7 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget
case SH_Widget_Animate:
// TODO Qt6: move this code in the SH_Widget_Animation_Duration case
// and replace false with 0 and true with 200.
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
if (qobject_cast<const QTreeView*>(widget)) {
ret = false;
} else
diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp
index eb7a1599d6..1e584f47b8 100644
--- a/src/widgets/styles/qfusionstyle.cpp
+++ b/src/widgets/styles/qfusionstyle.cpp
@@ -3668,7 +3668,6 @@ int QFusionStyle::styleHint(StyleHint hint, const QStyleOption *option, const QW
case SH_ScrollView_FrameOnlyAroundContents:
case SH_Menu_AllowActiveAndDisabled:
case SH_MainWindow_SpaceBelowMenuBar:
- case SH_DialogButtonBox_ButtonsHaveIcons:
case SH_MessageBox_CenterButtons:
case SH_RubberBand_Mask:
return 0;
diff --git a/src/widgets/styles/qpixmapstyle.cpp b/src/widgets/styles/qpixmapstyle.cpp
index de99b6ce7b..88482d28c9 100644
--- a/src/widgets/styles/qpixmapstyle.cpp
+++ b/src/widgets/styles/qpixmapstyle.cpp
@@ -55,7 +55,6 @@
#include <QComboBox>
#include <QAbstractItemView>
#include <QListView>
-#include <QTreeView>
#include <QStyledItemDelegate>
#include <QAbstractScrollArea>
#include <QScrollBar>
diff --git a/src/widgets/util/qcompleter_p.h b/src/widgets/util/qcompleter_p.h
index a9c089ac45..3cb7c59b6d 100644
--- a/src/widgets/util/qcompleter_p.h
+++ b/src/widgets/util/qcompleter_p.h
@@ -57,7 +57,7 @@
#ifndef QT_NO_COMPLETER
-#include "QtWidgets/qtreeview.h"
+#include "QtWidgets/qabstractitemview.h"
#include "QtCore/qabstractproxymodel.h"
#include "qcompleter.h"
#include "QtWidgets/qitemdelegate.h"
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index 90dfbe1633..1259c236e4 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -56,7 +56,9 @@
#include <qevent.h>
#include <qlayout.h>
#include <qscrollbar.h>
+#if QT_CONFIG(treeview)
#include <qtreeview.h>
+#endif
#include <qheaderview.h>
#include <qmath.h>
#include <qmetaobject.h>
@@ -2619,7 +2621,7 @@ void QComboBox::showPopup()
int count = 0;
QStack<QModelIndex> toCheck;
toCheck.push(view()->rootIndex());
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
QTreeView *treeView = qobject_cast<QTreeView*>(view());
if (treeView && treeView->header() && !treeView->header()->isHidden())
listHeight += treeView->header()->height();
@@ -2631,7 +2633,7 @@ void QComboBox::showPopup()
if (!idx.isValid())
continue;
listHeight += view()->visualRect(idx).height();
-#ifndef QT_NO_TREEVIEW
+#if QT_CONFIG(treeview)
if (d->model->hasChildren(idx) && treeView && treeView->isExpanded(idx))
toCheck.push(idx);
#endif
diff --git a/src/widgets/widgets/qdialogbuttonbox.cpp b/src/widgets/widgets/qdialogbuttonbox.cpp
index ad16acb96c..788ec67fb2 100644
--- a/src/widgets/widgets/qdialogbuttonbox.cpp
+++ b/src/widgets/widgets/qdialogbuttonbox.cpp
@@ -411,7 +411,9 @@ QPushButton *QDialogButtonBoxPrivate::createButton(QDialogButtonBox::StandardBut
else
addButton(button, static_cast<QDialogButtonBox::ButtonRole>(role), doLayout);
#if QT_CONFIG(shortcut)
- button->setShortcut(QGuiApplicationPrivate::platformTheme()->standardButtonShortcut(sbutton));
+ const QKeySequence standardShortcut = QGuiApplicationPrivate::platformTheme()->standardButtonShortcut(sbutton);
+ if (!standardShortcut.isEmpty())
+ button->setShortcut(standardShortcut);
#endif
return button;
}
diff --git a/tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp b/tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp
index 401ed85587..0928ecc5a1 100644
--- a/tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp
+++ b/tests/auto/network/ssl/qasn1element/tst_qasn1element.cpp
@@ -134,6 +134,33 @@ void tst_QAsn1Element::dateTime_data()
QTest::newRow("UTCTime - no trailing Z")
<< QByteArray::fromHex("170d30373034313730373430323659")
<< QDateTime();
+ QTest::newRow("UTCTime - year 1950")
+ << QByteArray::fromHex("170d3530313232343035353530305a")
+ << QDateTime(QDate(1950, 12, 24), QTime(5, 55), Qt::UTC);
+ QTest::newRow("UTCTime - year 1999")
+ << QByteArray::fromHex("170d3939313232343035353530305a")
+ << QDateTime(QDate(1999, 12, 24), QTime(5, 55), Qt::UTC);
+ QTest::newRow("UTCTime - year 2000")
+ << QByteArray::fromHex("170d3030313232343035353530305a")
+ << QDateTime(QDate(2000, 12, 24), QTime(5, 55), Qt::UTC);
+ QTest::newRow("UTCTime - year 2049")
+ << QByteArray::fromHex("170d3439313232343035353530305a")
+ << QDateTime(QDate(2049, 12, 24), QTime(5, 55), Qt::UTC);
+ QTest::newRow("UTCTime - invalid year ('-9')")
+ << QByteArray::fromHex("170d2d39313232343035353530305a")
+ << QDateTime();
+ QTest::newRow("UTCTime - invalid year ('*9')")
+ << QByteArray::fromHex("170d2a39313232343035353530305a")
+ << QDateTime();
+ QTest::newRow("UTCTime - invalid year ('5*')")
+ << QByteArray::fromHex("170d352a313232343035353530305a")
+ << QDateTime();
+ QTest::newRow("UTCTime - invalid year ('AB')")
+ << QByteArray::fromHex("170d4142313232343035353530305a")
+ << QDateTime();
+ QTest::newRow("UTCTime - invalid year ('+1')")
+ << QByteArray::fromHex("170d2b31313232343035353530305a")
+ << QDateTime();
QTest::newRow("GeneralizedTime - 20510829095341Z")
<< QByteArray::fromHex("180f32303531303832393039353334315a")
<< QDateTime(QDate(2051, 8, 29), QTime(9, 53, 41), Qt::UTC);
diff --git a/tests/auto/tools/qmakelib/evaltest.cpp b/tests/auto/tools/qmakelib/evaltest.cpp
index 10a5d7c0c3..387a2fb84e 100644
--- a/tests/auto/tools/qmakelib/evaltest.cpp
+++ b/tests/auto/tools/qmakelib/evaltest.cpp
@@ -2341,7 +2341,11 @@ void tst_qmakelib::addTestFunctions(const QString &qindir)
QTest::newRow("include(): fail")
<< "include(include/nope.pri): OK = 1"
<< "OK = UNDEF"
+#ifdef Q_OS_WIN
+ << "Cannot read " + m_indir + "/include/nope.pri: The system cannot find the file specified."
+#else
<< "Cannot read " + m_indir + "/include/nope.pri: No such file or directory"
+#endif
<< true;
QTest::newRow("include(): silent fail")