diff options
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 af7ff74389..2cfb718932 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 dadd5d9bcf..ab762d2b4d 100644 --- a/src/corelib/io/qfsfileengine_unix.cpp +++ b/src/corelib/io/qfsfileengine_unix.cpp @@ -546,6 +546,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 6d8db1a72e..5a7057aa80 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; } @@ -753,6 +753,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") |