diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2016-07-26 10:43:29 +0200 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2016-07-26 10:43:29 +0200 |
commit | 6c5de416c9e77433b20b95621c75666a47fbffbd (patch) | |
tree | 313690f41f9d6a1d8dd569b47156305463e3d615 | |
parent | 091e61b3525c700ce4198086bbd0d95a59fcb31f (diff) | |
parent | 8ea6e8d525b9dd8703ebdd0938706bd9785858a4 (diff) | |
download | qtbase-6c5de416c9e77433b20b95621c75666a47fbffbd.tar.gz |
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts:
src/corelib/io/qtemporarydir.cpp
One side encapsulated a repeated piece of #if-ery in a local define;
the other added to the #if-ery. Made its addition to the other's.
src/corelib/kernel/qeventdispatcher_unix_p.h
One side moved some members into a struct; this collided with a #undef
check that neither side now has. Discarded the #undef part.
src/gui/opengl/qopengltexturehelper_p.h
5.7 deleted a bunch of methods; not clear why merge got confused.
src/tools/moc/moc.cpp
One added a name to the copyright header; another changed its URL.
Change-Id: I9e9032b819f030d67f1915445acf2793e98713fa
42 files changed, 868 insertions, 440 deletions
diff --git a/config.tests/unix/precomp.test b/config.tests/unix/precomp.test index 9ffea20ff9..0b8377b21a 100755 --- a/config.tests/unix/precomp.test +++ b/config.tests/unix/precomp.test @@ -5,7 +5,7 @@ COMPILER=$1 VERBOSE=$2 case "$COMPILER" in -icpc) +*icpc) cat >header.h <<EOF #define HEADER_H @@ -548,7 +548,7 @@ if [ "$BUILD_ON_MAC" = "yes" ]; then exit 2 fi - if ! /usr/bin/xcrun -find xcrun >/dev/null 2>&1; then + if ! /usr/bin/xcrun -find xcodebuild >/dev/null 2>&1; then echo >&2 echo " Xcode not set up properly. You may need to confirm the license" >&2 echo " agreement by running /usr/bin/xcodebuild without arguments." >&2 @@ -3033,7 +3033,10 @@ case "$XPLATFORM" in *unsupported*) ;; *android-g++*) - XPLATFORM_ANDROID=yes + XPLATFORM_ANDROID=g++ + ;; + *android-clang*) + XPLATFORM_ANDROID=clang ;; esac @@ -3237,7 +3240,7 @@ if ( [ "$CFG_XCB" = "system" ] || [ "$CFG_XCB" = "qt" ] ) && [ "$CFG_XKBCOMMON" exit 101 fi -if [ "$XPLATFORM_ANDROID" = "yes" ]; then +if [ "$XPLATFORM_ANDROID" != "no" ]; then if [ "$CFG_DBUS" = "auto" ]; then CFG_DBUS="no" fi @@ -3447,7 +3450,7 @@ QMAKE_CONF_COMPILER=`getXQMakeConf QMAKE_CXX` TEST_COMPILER=$QMAKE_CONF_COMPILER -if [ "$XPLATFORM_ANDROID" = "yes" ] ; then +if [ "$XPLATFORM_ANDROID" != "no" ] ; then ANDROID_NDK_TOOLCHAIN_PREFIX= ANDROID_NDK_TOOLS_PREFIX= ANDROID_PLATFORM_ARCH= @@ -3487,7 +3490,11 @@ if [ "$XPLATFORM_ANDROID" = "yes" ] ; then exit 1 ;; esac - QMAKE_CONF_COMPILER=$CFG_DEFAULT_ANDROID_NDK_ROOT/toolchains/$ANDROID_NDK_TOOLCHAIN_PREFIX-$CFG_DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION/prebuilt/$CFG_DEFAULT_ANDROID_NDK_HOST/bin/$ANDROID_NDK_TOOLS_PREFIX-g++ + if [ "$XPLATFORM_ANDROID" = "g++" ] ; then + QMAKE_CONF_COMPILER=$CFG_DEFAULT_ANDROID_NDK_ROOT/toolchains/$ANDROID_NDK_TOOLCHAIN_PREFIX-$CFG_DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION/prebuilt/$CFG_DEFAULT_ANDROID_NDK_HOST/bin/$ANDROID_NDK_TOOLS_PREFIX-g++ + else + QMAKE_CONF_COMPILER=$CFG_DEFAULT_ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$CFG_DEFAULT_ANDROID_NDK_HOST/bin/clang++ + fi TEST_COMPILER="$QMAKE_CONF_COMPILER --sysroot=$CFG_DEFAULT_ANDROID_NDK_ROOT/platforms/$CFG_DEFAULT_ANDROID_PLATFORM/$ANDROID_PLATFORM_ARCH/" if [ "$CFG_ANDROID_STYLE_ASSETS" = "yes" ]; then QMAKE_CONFIG="$QMAKE_CONFIG android-style-assets" @@ -4663,7 +4670,7 @@ elif [ "$CFG_ARCH" != "mips" ]; then fi [ "$XPLATFORM_MINGW" = "yes" ] && QMakeVar add styles "windowsxp windowsvista" -[ "$XPLATFORM_ANDROID" = "yes" ] && QMakeVar add styles "android" +[ "$XPLATFORM_ANDROID" != "no" ] && QMakeVar add styles "android" # check IPC support if ! compileTest unix/ipc_sysv "ipc_sysv" ; then diff --git a/doc/global/manifest-meta.qdocconf b/doc/global/manifest-meta.qdocconf index bb242eb98f..7ebe86a431 100644 --- a/doc/global/manifest-meta.qdocconf +++ b/doc/global/manifest-meta.qdocconf @@ -250,6 +250,7 @@ manifestmeta.thumbnail.names = "QtCore/Contiguous Cache Example" \ "QtHelp/*" \ "QtMultimedia/AudioEngine Example" \ "QtQml/Extending QML*" \ + "QtQuick/C++ Extensions: Image Response Provider Example" \ "QtQuick/Qt Quick Examples - Accessibility" \ "QtSensors/Qt Sensors - SensorGesture QML Type example" \ "QtWinExtras/Icon Extractor" diff --git a/mkspecs/android-clang/qmake.conf b/mkspecs/android-clang/qmake.conf new file mode 100644 index 0000000000..6d53bb921d --- /dev/null +++ b/mkspecs/android-clang/qmake.conf @@ -0,0 +1,32 @@ +# qmake configuration for building with android-g++ +MAKEFILE_GENERATOR = UNIX +QMAKE_PLATFORM = android +QMAKE_COMPILER = gcc clang llvm + +CONFIG += android_install unversioned_soname unversioned_libname android_deployment_settings + +include(../common/linux.conf) +include(../common/clang.conf) +include(../common/android-base-head.conf) + +NDK_LLVM_PATH = $$NDK_ROOT/toolchains/llvm/prebuilt/$$NDK_HOST +QMAKE_CC = $$NDK_LLVM_PATH/bin/clang +QMAKE_CXX = $$NDK_LLVM_PATH/bin/clang++ +QMAKE_GCC = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-g++ + +equals(ANDROID_TARGET_ARCH, armeabi-v7a): \ + QMAKE_CFLAGS = -target armv7-none-linux-androideabi +else: equals(ANDROID_TARGET_ARCH, armeabi): \ + QMAKE_CFLAGS = -target armv5te-none-linux-androideabi +else: equals(ANDROID_TARGET_ARCH, arm64-v8a): \ + QMAKE_CFLAGS = -target aarch64-none-linux-android +else: equals(ANDROID_TARGET_ARCH, x86): \ + QMAKE_CFLAGS = -target i686-none-linux-android +else: equals(ANDROID_TARGET_ARCH, x86_64): \ + QMAKE_CFLAGS = -target x86_64-none-linux-android +else: equals(ANDROID_TARGET_ARCH, mips): \ + QMAKE_CFLAGS += -target mipsel-none-linux-android +else: equals(ANDROID_TARGET_ARCH, mips64): \ + QMAKE_CFLAGS = -target mips64el-none-linux-android + +include(../common/android-base-tail.conf) diff --git a/mkspecs/android-clang/qplatformdefs.h b/mkspecs/android-clang/qplatformdefs.h new file mode 100644 index 0000000000..9d3820fa27 --- /dev/null +++ b/mkspecs/android-clang/qplatformdefs.h @@ -0,0 +1,176 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the qmake spec of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPLATFORMDEFS_H +#define QPLATFORMDEFS_H + +#define QT_QPA_DEFAULT_PLATFORM_NAME "android" + +// Get Qt defines/settings + +#include "qglobal.h" + +// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs + +// 1) need to reset default environment if _BSD_SOURCE is defined +// 2) need to specify POSIX thread interfaces explicitly in glibc 2.0 +// 3) it seems older glibc need this to include the X/Open stuff + +#include <unistd.h> + +// We are hot - unistd.h should have turned on the specific APIs we requested + +#include <features.h> +#include <pthread.h> +#include <dirent.h> +#include <fcntl.h> +#include <grp.h> +#include <pwd.h> +#include <signal.h> +#include <dlfcn.h> + +#include <sys/types.h> +#include <sys/ioctl.h> +#include <sys/ipc.h> +#include <sys/time.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/wait.h> + +#ifndef QT_NO_IPV6IFNAME +#include <net/if.h> +#endif + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#ifdef QT_LARGEFILE_SUPPORT +#define QT_STATBUF struct stat64 +#define QT_STATBUF4TSTAT struct stat64 +#define QT_STAT ::stat64 +#define QT_FSTAT ::fstat64 +#define QT_LSTAT ::lstat64 +#define QT_OPEN ::open64 +#define QT_TRUNCATE ::truncate64 +#define QT_FTRUNCATE ::ftruncate64 +#define QT_LSEEK ::lseek64 +#else +#define QT_STATBUF struct stat +#define QT_STATBUF4TSTAT struct stat +#define QT_STAT ::stat +#define QT_FSTAT ::fstat +#define QT_LSTAT ::lstat +#define QT_OPEN ::open +#define QT_TRUNCATE ::truncate +#define QT_FTRUNCATE ::ftruncate +#define QT_LSEEK ::lseek +#endif + +#ifdef QT_LARGEFILE_SUPPORT +#define QT_FOPEN ::fopen64 +#define QT_FSEEK ::fseeko64 +#define QT_FTELL ::ftello64 +#define QT_FGETPOS ::fgetpos64 +#define QT_FSETPOS ::fsetpos64 +#define QT_MMAP ::mmap64 +#define QT_FPOS_T fpos64_t +#define QT_OFF_T off64_t +#else +#define QT_FOPEN ::fopen +#define QT_FSEEK ::fseek +#define QT_FTELL ::ftell +#define QT_FGETPOS ::fgetpos +#define QT_FSETPOS ::fsetpos +#define QT_MMAP ::mmap +#define QT_FPOS_T fpos_t +#define QT_OFF_T long +#endif + +#define QT_STAT_REG S_IFREG +#define QT_STAT_DIR S_IFDIR +#define QT_STAT_MASK S_IFMT +#define QT_STAT_LNK S_IFLNK +#define QT_SOCKET_CONNECT ::connect +#define QT_SOCKET_BIND ::bind +#define QT_FILENO fileno +#define QT_CLOSE ::close +#define QT_READ ::read +#define QT_WRITE ::write +#define QT_ACCESS ::access +#define QT_GETCWD ::getcwd +#define QT_CHDIR ::chdir +#define QT_MKDIR ::mkdir +#define QT_RMDIR ::rmdir +#define QT_OPEN_LARGEFILE O_LARGEFILE +#define QT_OPEN_RDONLY O_RDONLY +#define QT_OPEN_WRONLY O_WRONLY +#define QT_OPEN_RDWR O_RDWR +#define QT_OPEN_CREAT O_CREAT +#define QT_OPEN_TRUNC O_TRUNC +#define QT_OPEN_APPEND O_APPEND + +// Directory iteration +#define QT_DIR DIR + +#define QT_OPENDIR ::opendir +#define QT_CLOSEDIR ::closedir + +#if defined(QT_LARGEFILE_SUPPORT) \ + && defined(QT_USE_XOPEN_LFS_EXTENSIONS) \ + && !defined(QT_NO_READDIR64) +#define QT_DIRENT struct dirent64 +#define QT_READDIR ::readdir64 +#define QT_READDIR_R ::readdir64_r +#else +#define QT_DIRENT struct dirent +#define QT_READDIR ::readdir +#define QT_READDIR_R ::readdir_r +#endif + +#define QT_SOCKET_CONNECT ::connect +#define QT_SOCKET_BIND ::bind + + +#define QT_SIGNAL_RETTYPE void +#define QT_SIGNAL_ARGS int +#define QT_SIGNAL_IGNORE SIG_IGN + +#define QT_SOCKLEN_T socklen_t + +#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500) +#define QT_SNPRINTF ::snprintf +#define QT_VSNPRINTF ::vsnprintf +#endif + +#endif // QPLATFORMDEFS_H diff --git a/mkspecs/android-g++/qmake.conf b/mkspecs/android-g++/qmake.conf index ef78c42de9..93bd5fa1c2 100644 --- a/mkspecs/android-g++/qmake.conf +++ b/mkspecs/android-g++/qmake.conf @@ -7,202 +7,12 @@ CONFIG += android_install unversioned_soname unversioned_libname include(../common/linux.conf) include(../common/gcc-base-unix.conf) +include(../common/android-base-head.conf) -load(device_config) - -NDK_ROOT = $$(ANDROID_NDK_ROOT) -!exists($$NDK_ROOT) { - NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT -} - -NDK_HOST = $$(ANDROID_NDK_HOST) -isEmpty(NDK_HOST): NDK_HOST = $$DEFAULT_ANDROID_NDK_HOST - -ANDROID_PLATFORM = $$(ANDROID_NDK_PLATFORM) -isEmpty(ANDROID_PLATFORM): ANDROID_PLATFORM = $$DEFAULT_ANDROID_PLATFORM - -ANDROID_TARGET_ARCH = $$(ANDROID_TARGET_ARCH) -isEmpty(ANDROID_TARGET_ARCH): ANDROID_TARGET_ARCH = $$DEFAULT_ANDROID_TARGET_ARCH - -NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX) -isEmpty(NDK_TOOLCHAIN_PREFIX) { - equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86 - else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLCHAIN_PREFIX = x86_64 - else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLCHAIN_PREFIX = mipsel-linux-android - else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLCHAIN_PREFIX = mips64el-linux-android - else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLCHAIN_PREFIX = aarch64-linux-android - else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi -} - -NDK_TOOLS_PREFIX = $$(ANDROID_NDK_TOOLS_PREFIX) -isEmpty(NDK_TOOLS_PREFIX) { - equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLS_PREFIX = i686-linux-android - else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLS_PREFIX = x86_64-linux-android - else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLS_PREFIX = mipsel-linux-android - else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLS_PREFIX = mips64el-linux-android - else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLS_PREFIX = aarch64-linux-android - else: NDK_TOOLS_PREFIX = arm-linux-androideabi -} - -NDK_TOOLCHAIN_VERSION = $$(ANDROID_NDK_TOOLCHAIN_VERSION) -isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = $$DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION - -equals(ANDROID_TARGET_ARCH, x86): ANDROID_ARCHITECTURE = x86 -else: equals(ANDROID_TARGET_ARCH, x86_64): ANDROID_ARCHITECTURE = x86_64 -else: equals(ANDROID_TARGET_ARCH, mips): ANDROID_ARCHITECTURE = mips -else: equals(ANDROID_TARGET_ARCH, mips64): ANDROID_ARCHITECTURE = mips64 -else: equals(ANDROID_TARGET_ARCH, arm64-v8a): ANDROID_ARCHITECTURE = arm64 -else: ANDROID_ARCHITECTURE = arm - -!equals(NDK_TOOLCHAIN_VERSION, 4.4.3): ANDROID_CXXSTL_SUFFIX = -$$NDK_TOOLCHAIN_VERSION - -NDK_TOOLCHAIN = $$NDK_TOOLCHAIN_PREFIX-$$NDK_TOOLCHAIN_VERSION -NDK_TOOLCHAIN_PATH = $$NDK_ROOT/toolchains/$$NDK_TOOLCHAIN/prebuilt/$$NDK_HOST - - -ANDROID_SDK_ROOT = $$(ANDROID_SDK_ROOT) -isEmpty(ANDROID_SDK_ROOT): ANDROID_SDK_ROOT = $$DEFAULT_ANDROID_SDK_ROOT - -ANDROID_SDK_BUILD_TOOLS_REVISION = $$(ANDROID_BUILD_TOOLS_REVISION) -isEmpty(ANDROID_SDK_BUILD_TOOLS_REVISION) { - SDK_BUILD_TOOLS_REVISIONS = $$files($$ANDROID_SDK_ROOT/build-tools/*) - for (REVISION, SDK_BUILD_TOOLS_REVISIONS) { - BASENAME = $$basename(REVISION) - greaterThan(BASENAME, $$ANDROID_SDK_BUILD_TOOLS_REVISION): ANDROID_SDK_BUILD_TOOLS_REVISION = $$BASENAME - } -} - -CONFIG += $$ANDROID_PLATFORM -ANDROID_PLATFORM_ROOT_PATH = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/ -ANDROID_PLATFORM_PATH = $$ANDROID_PLATFORM_ROOT_PATH/usr - -# used to compile platform plugins for android-4 and android-5 -QMAKE_ANDROID_PLATFORM_INCDIR = $$ANDROID_PLATFORM_PATH/include -QMAKE_ANDROID_PLATFORM_LIBDIR = $$ANDROID_PLATFORM_PATH/lib - -ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/libs/$$ANDROID_TARGET_ARCH -ANDROID_SOURCES_CXX_STL_INCDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/include $$ANDROID_SOURCES_CXX_STL_LIBDIR/include - -equals(ANDROID_TARGET_ARCH, x86_64)|equals(ANDROID_TARGET_ARCH, mips64): \ - QMAKE_ANDROID_PLATFORM_LIBDIR = $${QMAKE_ANDROID_PLATFORM_LIBDIR}64 - -# modifications to g++.conf QMAKE_CC = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-gcc - -equals(ANDROID_TARGET_ARCH, armeabi-v7a): \ - QMAKE_CFLAGS = -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack -fno-builtin-memmove -else: equals(ANDROID_TARGET_ARCH, armeabi): \ - QMAKE_CFLAGS = -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack -fno-builtin-memmove -else: equals(ANDROID_TARGET_ARCH, arm64-v8a): \ - QMAKE_CFLAGS = -ffunction-sections -funwind-tables -fstack-protector -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -DANDROID -Wa,--noexecstack -else: equals(ANDROID_TARGET_ARCH, x86): \ - QMAKE_CFLAGS = -ffunction-sections -funwind-tables -O2 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -DANDROID -Wa,--noexecstack -else: equals(ANDROID_TARGET_ARCH, x86_64): \ - QMAKE_CFLAGS = -ffunction-sections -funwind-tables -fstack-protector -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -DANDROID -Wa,--noexecstack -else: equals(ANDROID_TARGET_ARCH, mips): \ - QMAKE_CFLAGS = -fno-strict-aliasing -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -O2 -fomit-frame-pointer -funswitch-loops -finline-limit=300 -DANDROID -Wa,--noexecstack -else: equals(ANDROID_TARGET_ARCH, mips64): \ - QMAKE_CFLAGS = -fno-strict-aliasing -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -fomit-frame-pointer -funswitch-loops -finline-limit=300 -DANDROID -Werror -Wa,--noexecstack - -QMAKE_CFLAGS_WARN_ON = -Wall -Wno-psabi -W -QMAKE_CFLAGS_WARN_OFF = -Wno-psabi -equals(ANDROID_TARGET_ARCH, x86) { - QMAKE_CFLAGS_RELEASE = -O2 - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -O2 - QMAKE_CFLAGS_DEBUG = -g -} else: equals(ANDROID_TARGET_ARCH, x86_64) { - QMAKE_CFLAGS_RELEASE = -O2 - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -O2 - QMAKE_CFLAGS_DEBUG = -g -} else: equals(ANDROID_TARGET_ARCH, mips) { - QMAKE_CFLAGS_RELEASE = -O2 - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -O2 - QMAKE_CFLAGS_DEBUG = -g -fno-omit-frame-pointer -} else: equals(ANDROID_TARGET_ARCH, mips64) { - QMAKE_CFLAGS_RELEASE = -O2 - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -O2 - QMAKE_CFLAGS_DEBUG = -g -fno-omit-frame-pointer -} else: equals(ANDROID_TARGET_ARCH, arm64-v8a) { - QMAKE_CFLAGS_RELEASE = -O2 - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -O2 - QMAKE_CFLAGS_DEBUG = -g -fno-omit-frame-pointer -} else { # arm - QMAKE_CFLAGS_RELEASE = -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 - QMAKE_CFLAGS_DEBUG = -g -marm -O0 -fno-omit-frame-pointer - equals(ANDROID_TARGET_ARCH, armeabi):if(equals(NDK_TOOLCHAIN_VERSION, 4.8)|equals(NDK_TOOLCHAIN_VERSION, 4.9)) { - DEFINES += QT_OS_ANDROID_GCC_48_WORKAROUND - } else { - QMAKE_CFLAGS_RELEASE += -mthumb - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -mthumb - } -} - -QMAKE_CFLAGS_SHLIB = -fPIC -QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses -QMAKE_CFLAGS_THREAD = -D_REENTRANT -QMAKE_CFLAGS_HIDESYMS = -fvisibility=hidden - QMAKE_CXX = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-g++ -QMAKE_CXXFLAGS = $$QMAKE_CFLAGS -std=c++11 -QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON -QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF -QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE -QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG -QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB -QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC -QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD -QMAKE_CXXFLAGS_HIDESYMS = $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden - -QMAKE_LINK = $$QMAKE_CXX -QMAKE_LINK_SHLIB = $$QMAKE_LINK - -# modifications to linux.conf -QMAKE_AR = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-ar cqs -QMAKE_OBJCOPY = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-objcopy -QMAKE_NM = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-nm -P - -QMAKE_STRIP = -#$$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-strip - -QMAKE_RANLIB = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-ranlib - -equals(ANDROID_TARGET_ARCH, armeabi)|equals(ANDROID_TARGET_ARCH, armeabi-v7a): \ - LIBGCC_PATH_FULL = $$system("$$QMAKE_CC -mthumb-interwork -print-libgcc-file-name") -else: \ - LIBGCC_PATH_FULL = $$system("$$QMAKE_CC -print-libgcc-file-name") - -LIBGCC_PATH = $$dirname(LIBGCC_PATH_FULL) - -QMAKE_INCDIR = $$ANDROID_SOURCES_CXX_STL_INCDIR $$QMAKE_ANDROID_PLATFORM_INCDIR -QMAKE_LIBDIR = $$ANDROID_SOURCES_CXX_STL_LIBDIR $$QMAKE_ANDROID_PLATFORM_LIBDIR $$LIBGCC_PATH -QMAKE_INCDIR_X11 = -QMAKE_LIBDIR_X11 = -QMAKE_INCDIR_OPENGL = $$QMAKE_ANDROID_PLATFORM_INCDIR -QMAKE_LIBDIR_OPENGL = $$QMAKE_ANDROID_PLATFORM_LIBDIR - -QMAKE_LINK = $$QMAKE_CXX -QMAKE_LINK_SHLIB = $$QMAKE_CXX -QMAKE_LFLAGS = --sysroot=$$ANDROID_PLATFORM_ROOT_PATH -QMAKE_RPATHLINK = $$QMAKE_ANDROID_PLATFORM_LIBDIR -QMAKE_LFLAGS_APP = -Wl,--no-undefined -Wl,-z,noexecstack -shared -QMAKE_LFLAGS_SHLIB = -Wl,--no-undefined -Wl,-z,noexecstack -shared -QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB -QMAKE_LFLAGS_NOUNDEF = -Wl,--no-undefined -QMAKE_LFLAGS_RPATH = -Wl,-rpath= -QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link= - -QMAKE_LIBS_PRIVATE = -lgnustl_shared -llog -lz -lm -ldl -lc -lgcc -QMAKE_LIBS_X11 = -QMAKE_LIBS_THREAD = -QMAKE_LIBS_EGL = -lEGL -QMAKE_LIBS_OPENGL = -QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 - -!exists($$NDK_ROOT): error("You need to set the ANDROID_NDK_ROOT environment variable to point to your Android NDK.") +QMAKE_GCC = $$QMAKE_CXX -load(qt_config) +QMAKE_CFLAGS = -QMAKE_DEFAULT_LIBDIRS = $$QMAKE_LIBDIR -QMAKE_DEFAULT_INCDIRS = $$QMAKE_INCDIR +include(../common/android-base-tail.conf) diff --git a/mkspecs/common/android-base-head.conf b/mkspecs/common/android-base-head.conf new file mode 100644 index 0000000000..7b2e988808 --- /dev/null +++ b/mkspecs/common/android-base-head.conf @@ -0,0 +1,78 @@ +load(device_config) + +NDK_ROOT = $$(ANDROID_NDK_ROOT) +!exists($$NDK_ROOT) { + NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT +} + +NDK_HOST = $$(ANDROID_NDK_HOST) +isEmpty(NDK_HOST): NDK_HOST = $$DEFAULT_ANDROID_NDK_HOST + +ANDROID_PLATFORM = $$(ANDROID_NDK_PLATFORM) +isEmpty(ANDROID_PLATFORM): ANDROID_PLATFORM = $$DEFAULT_ANDROID_PLATFORM + +ANDROID_TARGET_ARCH = $$(ANDROID_TARGET_ARCH) +isEmpty(ANDROID_TARGET_ARCH): ANDROID_TARGET_ARCH = $$DEFAULT_ANDROID_TARGET_ARCH + +NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX) +isEmpty(NDK_TOOLCHAIN_PREFIX) { + equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86 + else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLCHAIN_PREFIX = x86_64 + else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLCHAIN_PREFIX = mipsel-linux-android + else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLCHAIN_PREFIX = mips64el-linux-android + else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLCHAIN_PREFIX = aarch64-linux-android + else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi +} + +NDK_TOOLS_PREFIX = $$(ANDROID_NDK_TOOLS_PREFIX) +isEmpty(NDK_TOOLS_PREFIX) { + equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLS_PREFIX = i686-linux-android + else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLS_PREFIX = x86_64-linux-android + else: equals(ANDROID_TARGET_ARCH, mips): NDK_TOOLS_PREFIX = mipsel-linux-android + else: equals(ANDROID_TARGET_ARCH, mips64): NDK_TOOLS_PREFIX = mips64el-linux-android + else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLS_PREFIX = aarch64-linux-android + else: NDK_TOOLS_PREFIX = arm-linux-androideabi +} + +NDK_TOOLCHAIN_VERSION = $$(ANDROID_NDK_TOOLCHAIN_VERSION) +isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = $$DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION + +equals(ANDROID_TARGET_ARCH, x86): ANDROID_ARCHITECTURE = x86 +else: equals(ANDROID_TARGET_ARCH, x86_64): ANDROID_ARCHITECTURE = x86_64 +else: equals(ANDROID_TARGET_ARCH, mips): ANDROID_ARCHITECTURE = mips +else: equals(ANDROID_TARGET_ARCH, mips64): ANDROID_ARCHITECTURE = mips64 +else: equals(ANDROID_TARGET_ARCH, arm64-v8a): ANDROID_ARCHITECTURE = arm64 +else: ANDROID_ARCHITECTURE = arm + +!equals(NDK_TOOLCHAIN_VERSION, 4.4.3): ANDROID_CXXSTL_SUFFIX = -$$NDK_TOOLCHAIN_VERSION + +NDK_TOOLCHAIN = $$NDK_TOOLCHAIN_PREFIX-$$NDK_TOOLCHAIN_VERSION +NDK_TOOLCHAIN_PATH = $$NDK_ROOT/toolchains/$$NDK_TOOLCHAIN/prebuilt/$$NDK_HOST + + +ANDROID_SDK_ROOT = $$(ANDROID_SDK_ROOT) +isEmpty(ANDROID_SDK_ROOT): ANDROID_SDK_ROOT = $$DEFAULT_ANDROID_SDK_ROOT + +ANDROID_SDK_BUILD_TOOLS_REVISION = $$(ANDROID_BUILD_TOOLS_REVISION) +isEmpty(ANDROID_SDK_BUILD_TOOLS_REVISION) { + SDK_BUILD_TOOLS_REVISIONS = $$files($$ANDROID_SDK_ROOT/build-tools/*) + for (REVISION, SDK_BUILD_TOOLS_REVISIONS) { + BASENAME = $$basename(REVISION) + greaterThan(BASENAME, $$ANDROID_SDK_BUILD_TOOLS_REVISION): ANDROID_SDK_BUILD_TOOLS_REVISION = $$BASENAME + } +} + +CONFIG += $$ANDROID_PLATFORM +ANDROID_PLATFORM_ROOT_PATH = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/ +ANDROID_PLATFORM_PATH = $$ANDROID_PLATFORM_ROOT_PATH/usr + +# used to compile platform plugins for android-4 and android-5 +QMAKE_ANDROID_PLATFORM_INCDIR = $$ANDROID_PLATFORM_PATH/include +QMAKE_ANDROID_PLATFORM_LIBDIR = $$ANDROID_PLATFORM_PATH/lib + +ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/libs/$$ANDROID_TARGET_ARCH +ANDROID_SOURCES_CXX_STL_INCDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/include $$ANDROID_SOURCES_CXX_STL_LIBDIR/include + +equals(ANDROID_TARGET_ARCH, x86_64)|equals(ANDROID_TARGET_ARCH, mips64): \ + QMAKE_ANDROID_PLATFORM_LIBDIR = $${QMAKE_ANDROID_PLATFORM_LIBDIR}64 + diff --git a/mkspecs/common/android-base-tail.conf b/mkspecs/common/android-base-tail.conf new file mode 100644 index 0000000000..0dcaf64cff --- /dev/null +++ b/mkspecs/common/android-base-tail.conf @@ -0,0 +1,105 @@ +# -fstack-protector-strong offers good protection against stack smashing attacks. +# It is (currently) enabled only on Android because we know for sure that Andoroid compilers supports it +QMAKE_CFLAGS += -fstack-protector-strong -DANDROID + +equals(ANDROID_TARGET_ARCH, armeabi-v7a): \ + QMAKE_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -fno-builtin-memmove +else: equals(ANDROID_TARGET_ARCH, armeabi): \ + QMAKE_CFLAGS += -march=armv5te -mtune=xscale -msoft-float -fno-builtin-memmove +# -fno-builtin-memmove is used to workaround https://code.google.com/p/android/issues/detail?id=81692 + +QMAKE_CFLAGS += --sysroot=$$ANDROID_PLATFORM_ROOT_PATH +QMAKE_CFLAGS_WARN_ON = -Wall -W +QMAKE_CFLAGS_WARN_OFF = +equals(ANDROID_TARGET_ARCH, armeabi-v7a) | equals(ANDROID_TARGET_ARCH, armeabi) { + QMAKE_CFLAGS_RELEASE = -Os + QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -Os + QMAKE_CFLAGS_DEBUG = -g -marm -O0 + equals(ANDROID_TARGET_ARCH, armeabi):if(equals(NDK_TOOLCHAIN_VERSION, 4.8)|equals(NDK_TOOLCHAIN_VERSION, 4.9)) { + DEFINES += QT_OS_ANDROID_GCC_48_WORKAROUND + } else { + QMAKE_CFLAGS_RELEASE += -mthumb + QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -mthumb + } + + # Don't override our options with -O3 + QMAKE_CFLAGS_OPTIMIZE_FULL = +} else { + QMAKE_CFLAGS_RELEASE = -O2 + QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -O2 + QMAKE_CFLAGS_DEBUG = -g +} + +QMAKE_CFLAGS_SHLIB = -fPIC +QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses +QMAKE_CFLAGS_THREAD = -D_REENTRANT +QMAKE_CFLAGS_HIDESYMS = -fvisibility=hidden +QMAKE_CFLAGS_NEON = -mfpu=neon + +QMAKE_CXXFLAGS_CXX11 = -std=c++11 +QMAKE_CXXFLAGS_CXX14 = -std=c++14 +QMAKE_CXXFLAGS_CXX1Z = -std=c++1z +QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11 +QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++14 +QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z + +QMAKE_CXXFLAGS = $$QMAKE_CFLAGS +QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON +QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF +QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE +QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO +QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG +QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB +QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC +QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD +QMAKE_CXXFLAGS_HIDESYMS = $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden + +# modifications to linux.conf +QMAKE_AR = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-ar cqs +QMAKE_OBJCOPY = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-objcopy +QMAKE_NM = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-nm -P + +QMAKE_STRIP = +#$$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-strip + +QMAKE_RANLIB = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-ranlib + +equals(ANDROID_TARGET_ARCH, armeabi)|equals(ANDROID_TARGET_ARCH, armeabi-v7a): \ + LIBGCC_PATH_FULL = $$system("$$QMAKE_GCC -mthumb-interwork -print-libgcc-file-name") +else: \ + LIBGCC_PATH_FULL = $$system("$$QMAKE_GCC -print-libgcc-file-name") + +LIBGCC_PATH = $$dirname(LIBGCC_PATH_FULL) + +QMAKE_INCDIR = $$ANDROID_SOURCES_CXX_STL_INCDIR $$QMAKE_ANDROID_PLATFORM_INCDIR +QMAKE_LIBDIR = $$ANDROID_SOURCES_CXX_STL_LIBDIR $$QMAKE_ANDROID_PLATFORM_LIBDIR $$LIBGCC_PATH +QMAKE_INCDIR_X11 = +QMAKE_LIBDIR_X11 = +QMAKE_INCDIR_OPENGL = $$QMAKE_ANDROID_PLATFORM_INCDIR +QMAKE_LIBDIR_OPENGL = $$QMAKE_ANDROID_PLATFORM_LIBDIR + +QMAKE_LINK = $$QMAKE_GCC +QMAKE_LINK_SHLIB = $$QMAKE_GCC +QMAKE_LFLAGS = --sysroot=$$ANDROID_PLATFORM_ROOT_PATH +QMAKE_RPATHLINK = $$QMAKE_ANDROID_PLATFORM_LIBDIR +QMAKE_LFLAGS_APP = -Wl,--no-undefined -Wl,-z,noexecstack -shared +QMAKE_LFLAGS_SHLIB = -Wl,--no-undefined -Wl,-z,noexecstack -shared +QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB +QMAKE_LFLAGS_NOUNDEF = -Wl,--no-undefined +QMAKE_LFLAGS_RPATH = -Wl,-rpath= +QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link= + +QMAKE_LIBS_PRIVATE = -lgnustl_shared -llog -lz -lm -ldl -lc -lgcc +QMAKE_LIBS_X11 = +QMAKE_LIBS_THREAD = +QMAKE_LIBS_EGL = -lEGL +QMAKE_LIBS_OPENGL = +QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 + + +!exists($$NDK_ROOT): error("You need to set the ANDROID_NDK_ROOT environment variable to point to your Android NDK.") + +load(qt_config) + +QMAKE_DEFAULT_LIBDIRS = $$QMAKE_LIBDIR +QMAKE_DEFAULT_INCDIRS = $$QMAKE_INCDIR diff --git a/mkspecs/features/mac/default_pre.prf b/mkspecs/features/mac/default_pre.prf index 0cc8cd6dfd..5df99d1acd 100644 --- a/mkspecs/features/mac/default_pre.prf +++ b/mkspecs/features/mac/default_pre.prf @@ -12,7 +12,7 @@ isEmpty(QMAKE_XCODE_DEVELOPER_PATH) { error("Xcode is not installed in $${QMAKE_XCODE_DEVELOPER_PATH}. Please use xcode-select to choose Xcode installation path.") # Make sure Xcode is set up properly - isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null"))): \ + isEmpty($$list($$system("/usr/bin/xcrun -find xcodebuild 2>/dev/null"))): \ error("Xcode not set up properly. You may need to confirm the license agreement by running /usr/bin/xcodebuild.") } diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp index 10b13837d5..ef19c78723 100644 --- a/qmake/library/qmakebuiltins.cpp +++ b/qmake/library/qmakebuiltins.cpp @@ -57,6 +57,8 @@ #include <utime.h> #include <errno.h> #include <unistd.h> +#include <signal.h> +#include <sys/wait.h> #include <sys/stat.h> #include <sys/utsname.h> #else @@ -1515,9 +1517,14 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinConditional( runProcess(&proc, args.at(0).toQString(m_tmp2)); return returnBool(proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0); #else - return returnBool(system((QLatin1String("cd ") - + IoUtils::shellQuote(QDir::toNativeSeparators(currentDirectory())) - + QLatin1String(" && ") + args.at(0)).toLocal8Bit().constData()) == 0); + int ec = system((QLatin1String("cd ") + + IoUtils::shellQuote(QDir::toNativeSeparators(currentDirectory())) + + QLatin1String(" && ") + args.at(0)).toLocal8Bit().constData()); +# ifdef Q_OS_UNIX + if (ec != -1 && WIFSIGNALED(ec) && (WTERMSIG(ec) == SIGQUIT || WTERMSIG(ec) == SIGINT)) + raise(WTERMSIG(ec)); +# endif + return returnBool(ec == 0); #endif #else return ReturnTrue; diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index c37a690646..af026b8976 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -429,15 +429,13 @@ qint64 QFSFileEnginePrivate::nativeWrite(const char *data, qint64 len) if (fileHandle == INVALID_HANDLE_VALUE) return -1; - qint64 bytesToWrite = DWORD(len); // <- lossy + qint64 bytesToWrite = len; // Writing on Windows fails with ERROR_NO_SYSTEM_RESOURCES when // the chunks are too large, so we limit the block size to 32MB. - static const DWORD maxBlockSize = 32 * 1024 * 1024; - + const DWORD blockSize = DWORD(qMin(bytesToWrite, qint64(32 * 1024 * 1024))); qint64 totalWritten = 0; do { - DWORD blockSize = qMin<DWORD>(bytesToWrite, maxBlockSize); DWORD bytesWritten; if (!WriteFile(fileHandle, data + totalWritten, blockSize, &bytesWritten, NULL)) { if (totalWritten == 0) { diff --git a/src/corelib/io/qtemporarydir.cpp b/src/corelib/io/qtemporarydir.cpp index 563913bc12..6e50a8513e 100644 --- a/src/corelib/io/qtemporarydir.cpp +++ b/src/corelib/io/qtemporarydir.cpp @@ -51,8 +51,12 @@ #include "qcoreapplication.h" #endif +#if !defined(Q_OS_QNX) && !defined(Q_OS_WIN) && !defined(Q_OS_ANDROID) && !defined(Q_OS_INTEGRITY) +# define USE_SYSTEM_MKDTEMP +#endif + #include <stdlib.h> // mkdtemp -#if defined(Q_OS_QNX) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) || defined(Q_OS_INTEGRITY) +#ifndef USE_SYSTEM_MKDTEMP #include <private/qfilesystemengine_p.h> #endif @@ -98,8 +102,7 @@ static QString defaultTemplateName() return QDir::tempPath() + QLatin1Char('/') + baseName + QLatin1String("-XXXXXX"); } -#if defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) || defined(Q_OS_INTEGRITY) - +#ifndef USE_SYSTEM_MKDTEMP static int nextRand(int &v) { int r = v % 62; @@ -109,30 +112,28 @@ static int nextRand(int &v) return r; } -QPair<QString, bool> q_mkdtemp(char *templateName) +QPair<QString, bool> q_mkdtemp(QString templateName) { - static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + Q_ASSERT(templateName.endsWith(QLatin1String("XXXXXX"))); - const size_t length = strlen(templateName); + static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - char *XXXXXX = templateName + length - 6; + const int length = templateName.size(); - Q_ASSERT((length >= 6u) && strncmp(XXXXXX, "XXXXXX", 6) == 0); + QChar *XXXXXX = templateName.data() + length - 6; for (int i = 0; i < 256; ++i) { int v = qrand(); /* Fill in the random bits. */ - XXXXXX[0] = letters[nextRand(v)]; - XXXXXX[1] = letters[nextRand(v)]; - XXXXXX[2] = letters[nextRand(v)]; - XXXXXX[3] = letters[nextRand(v)]; - XXXXXX[4] = letters[nextRand(v)]; - XXXXXX[5] = letters[v % 62]; - - QString templateNameStr = QFile::decodeName(templateName); - - QFileSystemEntry fileSystemEntry(templateNameStr); + XXXXXX[0] = QLatin1Char(letters[nextRand(v)]); + XXXXXX[1] = QLatin1Char(letters[nextRand(v)]); + XXXXXX[2] = QLatin1Char(letters[nextRand(v)]); + XXXXXX[3] = QLatin1Char(letters[nextRand(v)]); + XXXXXX[4] = QLatin1Char(letters[nextRand(v)]); + XXXXXX[5] = QLatin1Char(letters[v % 62]); + + QFileSystemEntry fileSystemEntry(templateName); if (QFileSystemEngine::createDirectory(fileSystemEntry, false)) { QSystemError error; QFileSystemEngine::setPermissions(fileSystemEntry, @@ -141,10 +142,10 @@ QPair<QString, bool> q_mkdtemp(char *templateName) QFile::ExeOwner, error); if (error.error() != 0) { if (!QFileSystemEngine::removeDirectory(fileSystemEntry, false)) - qWarning() << "Unable to remove unused directory" << templateNameStr; + qWarning() << "Unable to remove unused directory" << templateName; continue; } - return qMakePair(QFile::decodeName(templateName), true); + return qMakePair(templateName, true); } # ifdef Q_OS_WIN const int exists = ERROR_ALREADY_EXISTS; @@ -159,7 +160,7 @@ QPair<QString, bool> q_mkdtemp(char *templateName) return qMakePair(qt_error_string(), false); } -#else // defined(Q_OS_QNX ) || defined(Q_OS_WIN) || defined(Q_OS_ANDROID) +#else // !USE_SYSTEM_MKDTEMP QPair<QString, bool> q_mkdtemp(char *templateName) { @@ -167,14 +168,21 @@ QPair<QString, bool> q_mkdtemp(char *templateName) return qMakePair(ok ? QFile::decodeName(templateName) : qt_error_string(), ok); } -#endif +#endif // USE_SYSTEM_MKDTEMP void QTemporaryDirPrivate::create(const QString &templateName) { +#ifndef USE_SYSTEM_MKDTEMP + QString buffer = templateName; + if (!buffer.endsWith(QLatin1String("XXXXXX"))) + buffer += QLatin1String("XXXXXX"); + const QPair<QString, bool> result = q_mkdtemp(buffer); +#else // !USE_SYSTEM_MKDTEMP QByteArray buffer = QFile::encodeName(templateName); if (!buffer.endsWith("XXXXXX")) buffer += "XXXXXX"; QPair<QString, bool> result = q_mkdtemp(buffer.data()); // modifies buffer +#endif // USE_SYSTEM_MKDTEMP pathOrError = result.first; success = result.second; } diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp index 260b877291..41d55c8fde 100644 --- a/src/corelib/kernel/qjni.cpp +++ b/src/corelib/kernel/qjni.cpp @@ -476,7 +476,7 @@ QJNIObjectPrivate::QJNIObjectPrivate(jobject obj) env->DeleteLocalRef(cls); } template <> -void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jmethodID id = getCachedMethodID(env, d->m_jclass, d->m_className, methodName, sig); @@ -486,7 +486,7 @@ void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *si } template <> -void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -495,7 +495,7 @@ void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig } template <> -jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jboolean res = 0; @@ -507,7 +507,7 @@ jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const } template <> -jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -517,7 +517,7 @@ jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const c } template <> -jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jbyte res = 0; @@ -529,7 +529,7 @@ jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char * } template <> -jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -539,7 +539,7 @@ jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *s } template <> -jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jchar res = 0; @@ -551,7 +551,7 @@ jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char * } template <> -jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -561,7 +561,7 @@ jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *s } template <> -jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jshort res = 0; @@ -573,7 +573,7 @@ jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char } template <> -jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -583,7 +583,7 @@ jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char } template <> -jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jint res = 0; @@ -595,7 +595,7 @@ jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *si } template <> -jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -605,7 +605,7 @@ jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig } template <> -jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jlong res = 0; @@ -617,7 +617,7 @@ jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char * } template <> -jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -627,7 +627,7 @@ jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *s } template <> -jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jfloat res = 0.f; @@ -639,7 +639,7 @@ jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char } template <> -jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -649,7 +649,7 @@ jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char } template <> -jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const char *sig, va_list args) const +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const char *sig, va_list args) const { QJNIEnvironmentPrivate env; jdouble res = 0.; @@ -661,7 +661,7 @@ jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const ch } template <> -jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const char *sig, ...) const +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const char *sig, ...) const { va_list args; va_start(args, sig); @@ -671,61 +671,61 @@ jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const cha } template <> -void QJNIObjectPrivate::callMethod<void>(const char *methodName) const +Q_CORE_EXPORT void QJNIObjectPrivate::callMethod<void>(const char *methodName) const { callMethod<void>(methodName, "()V"); } template <> -jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName) const +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName) const { return callMethod<jboolean>(methodName, "()Z"); } template <> -jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName) const +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName) const { return callMethod<jbyte>(methodName, "()B"); } template <> -jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName) const +Q_CORE_EXPORT jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName) const { return callMethod<jchar>(methodName, "()C"); } template <> -jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName) const +Q_CORE_EXPORT jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName) const { return callMethod<jshort>(methodName, "()S"); } template <> -jint QJNIObjectPrivate::callMethod<jint>(const char *methodName) const +Q_CORE_EXPORT jint QJNIObjectPrivate::callMethod<jint>(const char *methodName) const { return callMethod<jint>(methodName, "()I"); } template <> -jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName) const +Q_CORE_EXPORT jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName) const { return callMethod<jlong>(methodName, "()J"); } template <> -jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName) const +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName) const { return callMethod<jfloat>(methodName, "()F"); } template <> -jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName) const +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName) const { return callMethod<jdouble>(methodName, "()D"); } template <> -void QJNIObjectPrivate::callStaticMethodV<void>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethodV<void>(const char *className, const char *methodName, const char *sig, va_list args) @@ -741,7 +741,7 @@ void QJNIObjectPrivate::callStaticMethodV<void>(const char *className, } template <> -void QJNIObjectPrivate::callStaticMethod<void>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(const char *className, const char *methodName, const char *sig, ...) @@ -753,7 +753,7 @@ void QJNIObjectPrivate::callStaticMethod<void>(const char *className, } template <> -void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -766,7 +766,7 @@ void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz, } template <> -void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, const char *methodName, const char *sig, ...) @@ -778,7 +778,7 @@ void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, } template <> -jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className, +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className, const char *methodName, const char *sig, va_list args) @@ -797,7 +797,7 @@ jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className, } template <> -jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, const char *methodName, const char *sig, ...) @@ -810,7 +810,7 @@ jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, } template <> -jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz, +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -826,7 +826,7 @@ jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz, } template <> -jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, const char *methodName, const char *sig, ...) @@ -839,7 +839,7 @@ jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, } template <> -jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className, +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className, const char *methodName, const char *sig, va_list args) @@ -858,7 +858,7 @@ jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className, } template <> -jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, const char *methodName, const char *sig, ...) @@ -871,7 +871,7 @@ jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, } template <> -jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz, +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -887,7 +887,7 @@ jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz, } template <> -jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, const char *methodName, const char *sig, ...) @@ -900,7 +900,7 @@ jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, } template <> -jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className, +Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className, const char *methodName, const char *sig, va_list args) @@ -919,7 +919,7 @@ jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className, } template <> -jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, +Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, const char *methodName, const char *sig, ...) @@ -932,7 +932,7 @@ jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, } template <> -jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz, +Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -948,7 +948,7 @@ jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz, } template <> -jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, +Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, const char *methodName, const char *sig, ...) @@ -961,7 +961,7 @@ jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, } template <> -jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className, +Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className, const char *methodName, const char *sig, va_list args) @@ -980,7 +980,7 @@ jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className, } template <> -jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, +Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, const char *methodName, const char *sig, ...) @@ -993,7 +993,7 @@ jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, } template <> -jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz, +Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -1009,7 +1009,7 @@ jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz, } template <> -jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, +Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, const char *methodName, const char *sig, ...) @@ -1022,7 +1022,7 @@ jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, } template <> -jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className, +Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className, const char *methodName, const char *sig, va_list args) @@ -1041,7 +1041,7 @@ jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className, } template <> -jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, +Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, const char *methodName, const char *sig, ...) @@ -1054,7 +1054,7 @@ jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, } template <> -jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz, +Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -1070,7 +1070,7 @@ jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz, } template <> -jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, +Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, const char *methodName, const char *sig, ...) @@ -1083,7 +1083,7 @@ jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, } template <> -jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className, +Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className, const char *methodName, const char *sig, va_list args) @@ -1102,7 +1102,7 @@ jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className, } template <> -jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, +Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, const char *methodName, const char *sig, ...) @@ -1115,7 +1115,7 @@ jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, } template <> -jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz, +Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -1131,7 +1131,7 @@ jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz, } template <> -jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, +Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, const char *methodName, const char *sig, ...) @@ -1144,7 +1144,7 @@ jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, } template <> -jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className, +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className, const char *methodName, const char *sig, va_list args) @@ -1163,7 +1163,7 @@ jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className, } template <> -jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, const char *methodName, const char *sig, ...) @@ -1176,7 +1176,7 @@ jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, } template <> -jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz, +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -1192,7 +1192,7 @@ jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz, } template <> -jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, const char *methodName, const char *sig, ...) @@ -1205,7 +1205,7 @@ jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, } template <> -jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className, +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className, const char *methodName, const char *sig, va_list args) @@ -1224,7 +1224,7 @@ jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className, } template <> -jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, const char *methodName, const char *sig, ...) @@ -1237,7 +1237,7 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, } template <> -jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz, +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz, const char *methodName, const char *sig, va_list args) @@ -1253,7 +1253,7 @@ jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz, } template <> -jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, const char *methodName, const char *sig, ...) @@ -1266,109 +1266,109 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, } template <> -void QJNIObjectPrivate::callStaticMethod<void>(const char *className, const char *methodName) +Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(const char *className, const char *methodName) { callStaticMethod<void>(className, methodName, "()V"); } template <> -void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, const char *methodName) +Q_CORE_EXPORT void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz, const char *methodName) { callStaticMethod<void>(clazz, methodName, "()V"); } template <> -jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, const char *methodName) +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className, const char *methodName) { return callStaticMethod<jboolean>(className, methodName, "()Z"); } template <> -jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, const char *methodName) +Q_CORE_EXPORT jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz, const char *methodName) { return callStaticMethod<jboolean>(clazz, methodName, "()Z"); } template <> -jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, const char *methodName) +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className, const char *methodName) { return callStaticMethod<jbyte>(className, methodName, "()B"); } template <> -jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, const char *methodName) +Q_CORE_EXPORT jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz, const char *methodName) { return callStaticMethod<jbyte>(clazz, methodName, "()B"); } template <> -jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, const char *methodName) +Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className, const char *methodName) { return callStaticMethod<jchar>(className, methodName, "()C"); } template <> -jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, const char *methodName) +Q_CORE_EXPORT jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz, const char *methodName) { return callStaticMethod<jchar>(clazz, methodName, "()C"); } template <> -jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, const char *methodName) +Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className, const char *methodName) { return callStaticMethod<jshort>(className, methodName, "()S"); } template <> -jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, const char *methodName) +Q_CORE_EXPORT jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz, const char *methodName) { return callStaticMethod<jshort>(clazz, methodName, "()S"); } template <> -jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, const char *methodName) +Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className, const char *methodName) { return callStaticMethod<jint>(className, methodName, "()I"); } template <> -jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, const char *methodName) +Q_CORE_EXPORT jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz, const char *methodName) { return callStaticMethod<jint>(clazz, methodName, "()I"); } template <> -jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, const char *methodName) +Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className, const char *methodName) { return callStaticMethod<jlong>(className, methodName, "()J"); } template <> -jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, const char *methodName) +Q_CORE_EXPORT jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz, const char *methodName) { return callStaticMethod<jlong>(clazz, methodName, "()J"); } template <> -jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, const char *methodName) +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className, const char *methodName) { return callStaticMethod<jfloat>(className, methodName, "()F"); } template <> -jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, const char *methodName) +Q_CORE_EXPORT jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz, const char *methodName) { return callStaticMethod<jfloat>(clazz, methodName, "()F"); } template <> -jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, const char *methodName) +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className, const char *methodName) { return callStaticMethod<jdouble>(className, methodName, "()D"); } template <> -jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, const char *methodName) +Q_CORE_EXPORT jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, const char *methodName) { return callStaticMethod<jdouble>(clazz, methodName, "()D"); } @@ -1403,49 +1403,49 @@ QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod(const char *methodName, } template <> -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jstring>(const char *methodName) const +Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jstring>(const char *methodName) const { return callObjectMethod(methodName, "()Ljava/lang/String;"); } template <> -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbooleanArray>(const char *methodName) const +Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbooleanArray>(const char *methodName) const { return callObjectMethod(methodName, "()[Z"); } template <> -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbyteArray>(const char *methodName) const +Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jbyteArray>(const char *methodName) const { return callObjectMethod(methodName, "()[B"); } template <> -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jshortArray>(const char *methodName) const +Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jshortArray>(const char *methodName) const { return callObjectMethod(methodName, "()[S"); } template <> -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jintArray>(const char *methodName) const +Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jintArray>(const char *methodName) const { return callObjectMethod(methodName, "()[I"); } template <> -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jlongArray>(const char *methodName) const +Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jlongArray>(const char *methodName) const { return callObjectMethod(methodName, "()[J"); } template <> -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jfloatArray>(const char *methodName) const +Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jfloatArray>(const char *methodName) const { return callObjectMethod(methodName, "()[F"); } template <> -QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jdoubleArray>(const char *methodName) const +Q_CORE_EXPORT QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jdoubleArray>(const char *methodName) const { return callObjectMethod(methodName, "()[D"); } @@ -1516,7 +1516,7 @@ QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(jclass clazz, } template <> -jboolean QJNIObjectPrivate::getField<jboolean>(const char *fieldName) const +Q_CORE_EXPORT jboolean QJNIObjectPrivate::getField<jboolean>(const char *fieldName) const { QJNIEnvironmentPrivate env; jboolean res = 0; @@ -1528,7 +1528,7 @@ jboolean QJNIObjectPrivate::getField<jboolean>(const char *fieldName) const } template <> -jbyte QJNIObjectPrivate::getField<jbyte>(const char *fieldName) const +Q_CORE_EXPORT jbyte QJNIObjectPrivate::getField<jbyte>(const char *fieldName) const { QJNIEnvironmentPrivate env; jbyte res = 0; @@ -1540,7 +1540,7 @@ jbyte QJNIObjectPrivate::getField<jbyte>(const char *fieldName) const } template <> -jchar QJNIObjectPrivate::getField<jchar>(const char *fieldName) const +Q_CORE_EXPORT jchar QJNIObjectPrivate::getField<jchar>(const char *fieldName) const { QJNIEnvironmentPrivate env; jchar res = 0; @@ -1552,7 +1552,7 @@ jchar QJNIObjectPrivate::getField<jchar>(const char *fieldName) const } template <> -jshort QJNIObjectPrivate::getField<jshort>(const char *fieldName) const +Q_CORE_EXPORT jshort QJNIObjectPrivate::getField<jshort>(const char *fieldName) const { QJNIEnvironmentPrivate env; jshort res = 0; @@ -1564,7 +1564,7 @@ jshort QJNIObjectPrivate::getField<jshort>(const char *fieldName) const } template <> -jint QJNIObjectPrivate::getField<jint>(const char *fieldName) const +Q_CORE_EXPORT jint QJNIObjectPrivate::getField<jint>(const char *fieldName) const { QJNIEnvironmentPrivate env; jint res = 0; @@ -1576,7 +1576,7 @@ jint QJNIObjectPrivate::getField<jint>(const char *fieldName) const } template <> -jlong QJNIObjectPrivate::getField<jlong>(const char *fieldName) const +Q_CORE_EXPORT jlong QJNIObjectPrivate::getField<jlong>(const char *fieldName) const { QJNIEnvironmentPrivate env; jlong res = 0; @@ -1588,7 +1588,7 @@ jlong QJNIObjectPrivate::getField<jlong>(const char *fieldName) const } template <> -jfloat QJNIObjectPrivate::getField<jfloat>(const char *fieldName) const +Q_CORE_EXPORT jfloat QJNIObjectPrivate::getField<jfloat>(const char *fieldName) const { QJNIEnvironmentPrivate env; jfloat res = 0.f; @@ -1600,7 +1600,7 @@ jfloat QJNIObjectPrivate::getField<jfloat>(const char *fieldName) const } template <> -jdouble QJNIObjectPrivate::getField<jdouble>(const char *fieldName) const +Q_CORE_EXPORT jdouble QJNIObjectPrivate::getField<jdouble>(const char *fieldName) const { QJNIEnvironmentPrivate env; jdouble res = 0.; @@ -1612,7 +1612,7 @@ jdouble QJNIObjectPrivate::getField<jdouble>(const char *fieldName) const } template <> -jboolean QJNIObjectPrivate::getStaticField<jboolean>(jclass clazz, const char *fieldName) +Q_CORE_EXPORT jboolean QJNIObjectPrivate::getStaticField<jboolean>(jclass clazz, const char *fieldName) { QJNIEnvironmentPrivate env; jboolean res = 0; @@ -1624,7 +1624,7 @@ jboolean QJNIObjectPrivate::getStaticField<jboolean>(jclass clazz, const char *f } template <> -jboolean QJNIObjectPrivate::getStaticField<jboolean>(const char *className, const char *fieldName) +Q_CORE_EXPORT jboolean QJNIObjectPrivate::getStaticField<jboolean>(const char *className, const char *fieldName) { QJNIEnvironmentPrivate env; jclass clazz = loadClass(className, env); @@ -1639,7 +1639,7 @@ jboolean QJNIObjectPrivate::getStaticField<jboolean>(const char *className, cons } template <> -jbyte QJNIObjectPrivate::getStaticField<jbyte>(jclass clazz, const char *fieldName) +Q_CORE_EXPORT jbyte QJNIObjectPrivate::getStaticField<jbyte>(jclass clazz, const char *fieldName) { QJNIEnvironmentPrivate env; jbyte res = 0; @@ -1651,7 +1651,7 @@ jbyte QJNIObjectPrivate::getStaticField<jbyte>(jclass clazz, const char *fieldNa } template <> -jbyte QJNIObjectPrivate::getStaticField<jbyte>(const char *className, const char *fieldName) +Q_CORE_EXPORT jbyte QJNIObjectPrivate::getStaticField<jbyte>(const char *className, const char *fieldName) { QJNIEnvironmentPrivate env; jclass clazz = loadClass(className, env); @@ -1666,7 +1666,7 @@ jbyte QJNIObjectPrivate::getStaticField<jbyte>(const char *className, const char } template <> -jchar QJNIObjectPrivate::getStaticField<jchar>(jclass clazz, const char *fieldName) +Q_CORE_EXPORT jchar QJNIObjectPrivate::getStaticField<jchar>(jclass clazz, const char *fieldName) { QJNIEnvironmentPrivate env; jchar res = 0; @@ -1678,7 +1678,7 @@ jchar QJNIObjectPrivate::getStaticField<jchar>(jclass clazz, const char *fieldNa } template <> -jchar QJNIObjectPrivate::getStaticField<jchar>(const char *className, const char *fieldName) +Q_CORE_EXPORT jchar QJNIObjectPrivate::getStaticField<jchar>(const char *className, const char *fieldName) { QJNIEnvironmentPrivate env; jclass clazz = loadClass(className, env); @@ -1693,7 +1693,7 @@ jchar QJNIObjectPrivate::getStaticField<jchar>(const char *className, const char } template <> -jshort QJNIObjectPrivate::getStaticField<jshort>(jclass clazz, const char *fieldName) +Q_CORE_EXPORT jshort QJNIObjectPrivate::getStaticField<jshort>(jclass clazz, const char *fieldName) { QJNIEnvironmentPrivate env; jshort res = 0; @@ -1705,7 +1705,7 @@ jshort QJNIObjectPrivate::getStaticField<jshort>(jclass clazz, const char *field } template <> -jshort QJNIObjectPrivate::getStaticField<jshort>(const char *className, const char *fieldName) +Q_CORE_EXPORT jshort QJNIObjectPrivate::getStaticField<jshort>(const char *className, const char *fieldName) { QJNIEnvironmentPrivate env; jclass clazz = loadClass(className, env); @@ -1720,7 +1720,7 @@ jshort QJNIObjectPrivate::getStaticField<jshort>(const char *className, const ch } template <> -jint QJNIObjectPrivate::getStaticField<jint>(jclass clazz, const char *fieldName) +Q_CORE_EXPORT jint QJNIObjectPrivate::getStaticField<jint>(jclass clazz, const char *fieldName) { QJNIEnvironmentPrivate env; jint res = 0; @@ -1732,7 +1732,7 @@ jint QJNIObjectPrivate::getStaticField<jint>(jclass clazz, const char *fieldName } template <> -jint QJNIObjectPrivate::getStaticField<jint>(const char *className, const char *fieldName) +Q_CORE_EXPORT jint QJNIObjectPrivate::getStaticField<jint>(const char *className, const char *fieldName) { QJNIEnvironmentPrivate env; jclass clazz = loadClass(className, env); @@ -1747,7 +1747,7 @@ jint QJNIObjectPrivate::getStaticField<jint>(const char *className, const char * } template <> -jlong QJNIObjectPrivate::getStaticField<jlong>(jclass clazz, const char *fieldName) +Q_CORE_EXPORT jlong QJNIObjectPrivate::getStaticField<jlong>(jclass clazz, const char *fieldName) { QJNIEnvironmentPrivate env; jlong res = 0; @@ -1759,7 +1759,7 @@ jlong QJNIObjectPrivate::getStaticField<jlong>(jclass clazz, const char *fieldNa } template <> -jlong QJNIObjectPrivate::getStaticField<jlong>(const char *className, const char *fieldName) +Q_CORE_EXPORT jlong QJNIObjectPrivate::getStaticField<jlong>(const char *className, const char *fieldName) { QJNIEnvironmentPrivate env; jclass clazz = loadClass(className, env); @@ -1774,7 +1774,7 @@ jlong QJNIObjectPrivate::getStaticField<jlong>(const char *className, const char } template <> -jfloat QJNIObjectPrivate::getStaticField<jfloat>(jclass clazz, const char *fieldName) +Q_CORE_EXPORT jfloat QJNIObjectPrivate::getStaticField<jfloat>(jclass clazz, const char *fieldName) { QJNIEnvironmentPrivate env; jfloat res = 0.f; @@ -1786,7 +1786,7 @@ jfloat QJNIObjectPrivate::getStaticField<jfloat>(jclass clazz, const char *field } template <> -jfloat QJNIObjectPrivate::getStaticField<jfloat>(const char *className, const char *fieldName) +Q_CORE_EXPORT jfloat QJNIObjectPrivate::getStaticField<jfloat>(const char *className, const char *fieldName) { QJNIEnvironmentPrivate env; jclass clazz = loadClass(className, env); @@ -1801,7 +1801,7 @@ jfloat QJNIObjectPrivate::getStaticField<jfloat>(const char *className, const ch } template <> -jdouble QJNIObjectPrivate::getStaticField<jdouble>(jclass clazz, const char *fieldName) +Q_CORE_EXPORT jdouble QJNIObjectPrivate::getStaticField<jdouble>(jclass clazz, const char *fieldName) { QJNIEnvironmentPrivate env; jdouble res = 0.; @@ -1813,7 +1813,7 @@ jdouble QJNIObjectPrivate::getStaticField<jdouble>(jclass clazz, const char *fie } template <> -jdouble QJNIObjectPrivate::getStaticField<jdouble>(const char *className, const char *fieldName) +Q_CORE_EXPORT jdouble QJNIObjectPrivate::getStaticField<jdouble>(const char *className, const char *fieldName) { QJNIEnvironmentPrivate env; jclass clazz = loadClass(className, env); @@ -1885,7 +1885,7 @@ QJNIObjectPrivate QJNIObjectPrivate::getStaticObjectField(jclass clazz, } template <> -void QJNIObjectPrivate::setField<jboolean>(const char *fieldName, jboolean value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jboolean>(const char *fieldName, jboolean value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "Z"); @@ -1895,7 +1895,7 @@ void QJNIObjectPrivate::setField<jboolean>(const char *fieldName, jboolean value } template <> -void QJNIObjectPrivate::setField<jbyte>(const char *fieldName, jbyte value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbyte>(const char *fieldName, jbyte value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "B"); @@ -1905,7 +1905,7 @@ void QJNIObjectPrivate::setField<jbyte>(const char *fieldName, jbyte value) } template <> -void QJNIObjectPrivate::setField<jchar>(const char *fieldName, jchar value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jchar>(const char *fieldName, jchar value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "C"); @@ -1915,7 +1915,7 @@ void QJNIObjectPrivate::setField<jchar>(const char *fieldName, jchar value) } template <> -void QJNIObjectPrivate::setField<jshort>(const char *fieldName, jshort value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jshort>(const char *fieldName, jshort value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "S"); @@ -1925,7 +1925,7 @@ void QJNIObjectPrivate::setField<jshort>(const char *fieldName, jshort value) } template <> -void QJNIObjectPrivate::setField<jint>(const char *fieldName, jint value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jint>(const char *fieldName, jint value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "I"); @@ -1935,7 +1935,7 @@ void QJNIObjectPrivate::setField<jint>(const char *fieldName, jint value) } template <> -void QJNIObjectPrivate::setField<jlong>(const char *fieldName, jlong value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jlong>(const char *fieldName, jlong value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "J"); @@ -1945,7 +1945,7 @@ void QJNIObjectPrivate::setField<jlong>(const char *fieldName, jlong value) } template <> -void QJNIObjectPrivate::setField<jfloat>(const char *fieldName, jfloat value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jfloat>(const char *fieldName, jfloat value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "F"); @@ -1955,7 +1955,7 @@ void QJNIObjectPrivate::setField<jfloat>(const char *fieldName, jfloat value) } template <> -void QJNIObjectPrivate::setField<jdouble>(const char *fieldName, jdouble value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jdouble>(const char *fieldName, jdouble value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "D"); @@ -1965,7 +1965,7 @@ void QJNIObjectPrivate::setField<jdouble>(const char *fieldName, jdouble value) } template <> -void QJNIObjectPrivate::setField<jbooleanArray>(const char *fieldName, jbooleanArray value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbooleanArray>(const char *fieldName, jbooleanArray value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[Z"); @@ -1975,7 +1975,7 @@ void QJNIObjectPrivate::setField<jbooleanArray>(const char *fieldName, jbooleanA } template <> -void QJNIObjectPrivate::setField<jbyteArray>(const char *fieldName, jbyteArray value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jbyteArray>(const char *fieldName, jbyteArray value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[B"); @@ -1985,7 +1985,7 @@ void QJNIObjectPrivate::setField<jbyteArray>(const char *fieldName, jbyteArray v } template <> -void QJNIObjectPrivate::setField<jcharArray>(const char *fieldName, jcharArray value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jcharArray>(const char *fieldName, jcharArray value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[C"); @@ -1995,7 +1995,7 @@ void QJNIObjectPrivate::setField<jcharArray>(const char *fieldName, jcharArray v } template <> -void QJNIObjectPrivate::setField<jshortArray>(const char *fieldName, jshortArray value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jshortArray>(const char *fieldName, jshortArray value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[S"); @@ -2005,7 +2005,7 @@ void QJNIObjectPrivate::setField<jshortArray>(const char *fieldName, jshortArray } template <> -void QJNIObjectPrivate::setField<jintArray>(const char *fieldName, jintArray value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jintArray>(const char *fieldName, jintArray value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[I"); @@ -2015,7 +2015,7 @@ void QJNIObjectPrivate::setField<jintArray>(const char *fieldName, jintArray val } template <> -void QJNIObjectPrivate::setField<jlongArray>(const char *fieldName, jlongArray value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jlongArray>(const char *fieldName, jlongArray value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[J"); @@ -2025,7 +2025,7 @@ void QJNIObjectPrivate::setField<jlongArray>(const char *fieldName, jlongArray v } template <> -void QJNIObjectPrivate::setField<jfloatArray>(const char *fieldName, jfloatArray value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jfloatArray>(const char *fieldName, jfloatArray value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[F"); @@ -2035,7 +2035,7 @@ void QJNIObjectPrivate::setField<jfloatArray>(const char *fieldName, jfloatArray } template <> -void QJNIObjectPrivate::setField<jdoubleArray>(const char *fieldName, jdoubleArray value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jdoubleArray>(const char *fieldName, jdoubleArray value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "[D"); @@ -2045,7 +2045,7 @@ void QJNIObjectPrivate::setField<jdoubleArray>(const char *fieldName, jdoubleArr } template <> -void QJNIObjectPrivate::setField<jstring>(const char *fieldName, jstring value) +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jstring>(const char *fieldName, jstring value) { QJNIEnvironmentPrivate env; jfieldID id = getCachedFieldID(env, d->m_jclass, d->m_className, fieldName, "Ljava/lang/String;"); @@ -2055,7 +2055,7 @@ void QJNIObjectPrivate::setField<jstring>(const char *fieldName, jstring value) } template <> -void QJNIObjectPrivate::setField<jobject>(const char *fieldName, +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jobject>(const char *fieldName, const char *sig, jobject value) { @@ -2067,7 +2067,7 @@ void QJNIObjectPrivate::setField<jobject>(const char *fieldName, } template <> -void QJNIObjectPrivate::setField<jobjectArray>(const char *fieldName, +Q_CORE_EXPORT void QJNIObjectPrivate::setField<jobjectArray>(const char *fieldName, const char *sig, jobjectArray value) { @@ -2079,7 +2079,7 @@ void QJNIObjectPrivate::setField<jobjectArray>(const char *fieldName, } template <> -void QJNIObjectPrivate::setStaticField<jboolean>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jboolean>(jclass clazz, const char *fieldName, jboolean value) { @@ -2090,7 +2090,7 @@ void QJNIObjectPrivate::setStaticField<jboolean>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jboolean>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jboolean>(const char *className, const char *fieldName, jboolean value) { @@ -2107,7 +2107,7 @@ void QJNIObjectPrivate::setStaticField<jboolean>(const char *className, } template <> -void QJNIObjectPrivate::setStaticField<jbyte>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jbyte>(jclass clazz, const char *fieldName, jbyte value) { @@ -2118,7 +2118,7 @@ void QJNIObjectPrivate::setStaticField<jbyte>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jbyte>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jbyte>(const char *className, const char *fieldName, jbyte value) { @@ -2135,7 +2135,7 @@ void QJNIObjectPrivate::setStaticField<jbyte>(const char *className, } template <> -void QJNIObjectPrivate::setStaticField<jchar>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jchar>(jclass clazz, const char *fieldName, jchar value) { @@ -2146,7 +2146,7 @@ void QJNIObjectPrivate::setStaticField<jchar>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jchar>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jchar>(const char *className, const char *fieldName, jchar value) { @@ -2163,7 +2163,7 @@ void QJNIObjectPrivate::setStaticField<jchar>(const char *className, } template <> -void QJNIObjectPrivate::setStaticField<jshort>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jshort>(jclass clazz, const char *fieldName, jshort value) { @@ -2174,7 +2174,7 @@ void QJNIObjectPrivate::setStaticField<jshort>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jshort>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jshort>(const char *className, const char *fieldName, jshort value) { @@ -2191,7 +2191,7 @@ void QJNIObjectPrivate::setStaticField<jshort>(const char *className, } template <> -void QJNIObjectPrivate::setStaticField<jint>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jint>(jclass clazz, const char *fieldName, jint value) { @@ -2202,7 +2202,7 @@ void QJNIObjectPrivate::setStaticField<jint>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jint>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jint>(const char *className, const char *fieldName, jint value) { @@ -2219,7 +2219,7 @@ void QJNIObjectPrivate::setStaticField<jint>(const char *className, } template <> -void QJNIObjectPrivate::setStaticField<jlong>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jlong>(jclass clazz, const char *fieldName, jlong value) { @@ -2230,7 +2230,7 @@ void QJNIObjectPrivate::setStaticField<jlong>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jlong>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jlong>(const char *className, const char *fieldName, jlong value) { @@ -2247,7 +2247,7 @@ void QJNIObjectPrivate::setStaticField<jlong>(const char *className, } template <> -void QJNIObjectPrivate::setStaticField<jfloat>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jfloat>(jclass clazz, const char *fieldName, jfloat value) { @@ -2258,7 +2258,7 @@ void QJNIObjectPrivate::setStaticField<jfloat>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jfloat>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jfloat>(const char *className, const char *fieldName, jfloat value) { @@ -2275,7 +2275,7 @@ void QJNIObjectPrivate::setStaticField<jfloat>(const char *className, } template <> -void QJNIObjectPrivate::setStaticField<jdouble>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jdouble>(jclass clazz, const char *fieldName, jdouble value) { @@ -2286,7 +2286,7 @@ void QJNIObjectPrivate::setStaticField<jdouble>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jdouble>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jdouble>(const char *className, const char *fieldName, jdouble value) { @@ -2303,7 +2303,7 @@ void QJNIObjectPrivate::setStaticField<jdouble>(const char *className, } template <> -void QJNIObjectPrivate::setStaticField<jobject>(jclass clazz, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jobject>(jclass clazz, const char *fieldName, const char *sig, jobject value) @@ -2315,7 +2315,7 @@ void QJNIObjectPrivate::setStaticField<jobject>(jclass clazz, } template <> -void QJNIObjectPrivate::setStaticField<jobject>(const char *className, +Q_CORE_EXPORT void QJNIObjectPrivate::setStaticField<jobject>(const char *className, const char *fieldName, const char *sig, jobject value) diff --git a/src/corelib/kernel/qjnionload.cpp b/src/corelib/kernel/qjnionload.cpp index f80da36240..c936bf42fd 100644 --- a/src/corelib/kernel/qjnionload.cpp +++ b/src/corelib/kernel/qjnionload.cpp @@ -44,6 +44,11 @@ Q_CORE_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { Q_UNUSED(reserved) + static bool initialized = false; + if (initialized) + return JNI_VERSION_1_6; + initialized = true; + typedef union { JNIEnv *nenv; void *venv; diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h index ee3be5553b..f292a97db1 100644 --- a/src/corelib/tools/qdatetime.h +++ b/src/corelib/tools/qdatetime.h @@ -124,8 +124,8 @@ QT_DEPRECATED inline bool setYMD(int y, int m, int d) static bool isValid(int y, int m, int d); static bool isLeapYear(int year); - static Q_DECL_CONSTEXPR inline QDate fromJulianDay(qint64 jd) - { return jd >= minJd() && jd <= maxJd() ? QDate(jd) : QDate() ; } + static Q_DECL_CONSTEXPR inline QDate fromJulianDay(qint64 jd_) + { return jd_ >= minJd() && jd_ <= maxJd() ? QDate(jd_) : QDate() ; } Q_DECL_CONSTEXPR inline qint64 toJulianDay() const { return jd; } private: diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index e9a5443121..fc23c29148 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -493,14 +493,14 @@ private: void deref() Q_DECL_NOTHROW { deref(d); } - static void deref(Data *d) Q_DECL_NOTHROW + static void deref(Data *dd) Q_DECL_NOTHROW { - if (!d) return; - if (!d->strongref.deref()) { - d->destroy(); + if (!dd) return; + if (!dd->strongref.deref()) { + dd->destroy(); } - if (!d->weakref.deref()) - delete d; + if (!dd->weakref.deref()) + delete dd; } template <class X> diff --git a/src/corelib/tools/qtimezoneprivate.cpp b/src/corelib/tools/qtimezoneprivate.cpp index 763d12b702..56da197542 100644 --- a/src/corelib/tools/qtimezoneprivate.cpp +++ b/src/corelib/tools/qtimezoneprivate.cpp @@ -656,10 +656,11 @@ QTimeZonePrivate *QUtcTimeZonePrivate::clone() QTimeZonePrivate::Data QUtcTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const { - Data d = invalidData(); + Data d; d.abbreviation = m_abbreviation; d.atMSecsSinceEpoch = forMSecsSinceEpoch; - d.offsetFromUtc = m_offsetFromUtc; + d.standardTimeOffset = d.offsetFromUtc = m_offsetFromUtc; + d.daylightTimeOffset = 0; return d; } diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp index c2630c8593..6e717f2233 100644 --- a/src/corelib/tools/qtimezoneprivate_tz.cpp +++ b/src/corelib/tools/qtimezoneprivate_tz.cpp @@ -907,7 +907,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const { // If the required time is after the last transition and we have a POSIX rule then use it if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < forMSecsSinceEpoch - &&!m_posixRule.isEmpty() && forMSecsSinceEpoch >= 0) { + && !m_posixRule.isEmpty() && forMSecsSinceEpoch >= 0) { const int year = QDateTime::fromMSecsSinceEpoch(forMSecsSinceEpoch, Qt::UTC).date().year(); const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0; QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1, @@ -951,7 +951,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::nextTransition(qint64 afterMSecsSince { // If the required time is after the last transition and we have a POSIX rule then use it if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < afterMSecsSinceEpoch - &&!m_posixRule.isEmpty() && afterMSecsSinceEpoch >= 0) { + && !m_posixRule.isEmpty() && afterMSecsSinceEpoch >= 0) { const int year = QDateTime::fromMSecsSinceEpoch(afterMSecsSinceEpoch, Qt::UTC).date().year(); const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0; QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1, @@ -977,7 +977,7 @@ QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecs { // If the required time is after the last transition and we have a POSIX rule then use it if (m_tranTimes.size() > 0 && m_tranTimes.last().atMSecsSinceEpoch < beforeMSecsSinceEpoch - &&!m_posixRule.isEmpty() && beforeMSecsSinceEpoch > 0) { + && !m_posixRule.isEmpty() && beforeMSecsSinceEpoch > 0) { const int year = QDateTime::fromMSecsSinceEpoch(beforeMSecsSinceEpoch, Qt::UTC).date().year(); const int lastMSecs = (m_tranTimes.size() > 0) ? m_tranTimes.last().atMSecsSinceEpoch : 0; QVector<QTimeZonePrivate::Data> posixTrans = calculatePosixTransitions(m_posixRule, year - 1, diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp index 3949d2c3ac..83b26d50ab 100644 --- a/src/corelib/xml/qxmlstream.cpp +++ b/src/corelib/xml/qxmlstream.cpp @@ -1181,6 +1181,10 @@ inline int QXmlStreamReaderPrivate::fastScanLiteralContent() } // fall through default: + if (c < 0x20) { + putChar(c); + return n; + } textBuffer += QChar(c); ++n; } diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index d33e1053c8..64dafdddc3 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -4251,6 +4251,8 @@ void QImage::setAlphaChannel(const QImage &alphaChannel) } else { const QImage sourceImage = alphaChannel.convertToFormat(QImage::Format_RGB32); + if (sourceImage.isNull()) + return; const uchar *src_data = sourceImage.d->data; uchar *dest_data = d->data; for (int y=0; y<h; ++y) { diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h index 0a207667ad..570212966f 100644 --- a/src/gui/kernel/qevent.h +++ b/src/gui/kernel/qevent.h @@ -534,7 +534,7 @@ public: }; class Attribute { public: - Attribute(AttributeType t, int s, int l, QVariant val) : type(t), start(s), length(l), value(qMove(val)) {} + Attribute(AttributeType typ, int s, int l, QVariant val) : type(typ), start(s), length(l), value(qMove(val)) {} AttributeType type; int start; diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp index e45a1d61ba..bcd3e830dd 100644 --- a/src/gui/kernel/qplatformwindow.cpp +++ b/src/gui/kernel/qplatformwindow.cpp @@ -581,6 +581,20 @@ void QPlatformWindow::invalidateSurface() { } +static QSize fixInitialSize(QSize size, const QWindow *w, + int defaultWidth, int defaultHeight) +{ + if (size.width() == 0) { + const int minWidth = w->minimumWidth(); + size.setWidth(minWidth > 0 ? minWidth : defaultWidth); + } + if (size.height() == 0) { + const int minHeight = w->minimumHeight(); + size.setHeight(minHeight > 0 ? minHeight : defaultHeight); + } + return size; +} + /*! Helper function to get initial geometry on windowing systems which do not do smart positioning and also do not provide a means of centering a @@ -593,19 +607,18 @@ void QPlatformWindow::invalidateSurface() QRect QPlatformWindow::initialGeometry(const QWindow *w, const QRect &initialGeometry, int defaultWidth, int defaultHeight) { + if (!w->isTopLevel()) { + const qreal factor = QHighDpiScaling::factor(w); + const QSize size = fixInitialSize(QHighDpi::fromNative(initialGeometry.size(), factor), + w, defaultWidth, defaultHeight); + return QRect(initialGeometry.topLeft(), QHighDpi::toNative(size, factor)); + } const QScreen *screen = effectiveScreen(w); if (!screen) return initialGeometry; QRect rect(QHighDpi::fromNativePixels(initialGeometry, w)); - if (rect.width() == 0) { - const int minWidth = w->minimumWidth(); - rect.setWidth(minWidth > 0 ? minWidth : defaultWidth); - } - if (rect.height() == 0) { - const int minHeight = w->minimumHeight(); - rect.setHeight(minHeight > 0 ? minHeight : defaultHeight); - } - if (w->isTopLevel() && qt_window_private(const_cast<QWindow*>(w))->positionAutomatic + rect.setSize(fixInitialSize(rect.size(), w, defaultWidth, defaultHeight)); + if (qt_window_private(const_cast<QWindow*>(w))->positionAutomatic && w->type() != Qt::Popup) { const QRect availableGeometry = screen->availableGeometry(); // Center unless the geometry ( + unknown window frame) is too large for the screen). diff --git a/src/gui/opengl/qopengltexturehelper_p.h b/src/gui/opengl/qopengltexturehelper_p.h index a255672602..6b26527269 100644 --- a/src/gui/opengl/qopengltexturehelper_p.h +++ b/src/gui/opengl/qopengltexturehelper_p.h @@ -76,6 +76,14 @@ QT_BEGIN_NAMESPACE #define GL_TEXTURE_COMPARE_FUNC 0x884D #endif +// use GL_APICALL only on Android + __clang__ +#if !defined(Q_OS_ANDROID) || !defined(__clang__) +# undef GL_APICALL +# define GL_APICALL +#elif !defined(GL_APICALL) +# define GL_APICALL +#endif + class QOpenGLContext; class QOpenGLTextureHelper @@ -754,15 +762,15 @@ private: // OpenGL 1.3 void (QOPENGLF_APIENTRYP GetCompressedTexImage)(GLenum target, GLint level, GLvoid *img); void (QOPENGLF_APIENTRYP CompressedTexSubImage1D)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); - void (QOPENGLF_APIENTRYP CompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); + GL_APICALL void (QOPENGLF_APIENTRYP CompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); void (QOPENGLF_APIENTRYP CompressedTexSubImage3D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); void (QOPENGLF_APIENTRYP CompressedTexImage1D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); - void (QOPENGLF_APIENTRYP CompressedTexImage2D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); + GL_APICALL void (QOPENGLF_APIENTRYP CompressedTexImage2D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); void (QOPENGLF_APIENTRYP CompressedTexImage3D)(GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); - void (QOPENGLF_APIENTRYP ActiveTexture)(GLenum texture); + GL_APICALL void (QOPENGLF_APIENTRYP ActiveTexture)(GLenum texture); // OpenGL 3.0 - void (QOPENGLF_APIENTRYP GenerateMipmap)(GLenum target); + GL_APICALL void (QOPENGLF_APIENTRYP GenerateMipmap)(GLenum target); // OpenGL 3.2 void (QOPENGLF_APIENTRYP TexImage3DMultisample)(GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); diff --git a/src/gui/opengl/qopenglvertexarrayobject.cpp b/src/gui/opengl/qopenglvertexarrayobject.cpp index 6753064a60..babe52aa83 100644 --- a/src/gui/opengl/qopenglvertexarrayobject.cpp +++ b/src/gui/opengl/qopenglvertexarrayobject.cpp @@ -358,9 +358,11 @@ QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject() Q_D(QOpenGLVertexArrayObject); QOpenGLContext *oldContext = 0; + QSurface *oldContextSurface = 0; QScopedPointer<QOffscreenSurface> offscreenSurface; if (d->context && ctx && d->context != ctx) { oldContext = ctx; + oldContextSurface = ctx->surface(); // Cannot just make the current surface current again with another context. // The format may be incompatible and some platforms (iOS) may impose // restrictions on using a window with different contexts. Create an @@ -380,7 +382,7 @@ QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject() destroy(); if (oldContext) { - if (!oldContext->makeCurrent(oldContext->surface())) + if (!oldContext->makeCurrent(oldContextSurface)) qWarning("QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject() failed to restore current context"); } } diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp index 828dbc318c..12631b3a73 100644 --- a/src/gui/text/qfont.cpp +++ b/src/gui/text/qfont.cpp @@ -76,7 +76,9 @@ QT_BEGIN_NAMESPACE - +#ifndef QFONTCACHE_DECREASE_TRIGGER_LIMIT +# define QFONTCACHE_DECREASE_TRIGGER_LIMIT 256 +#endif bool QFontDef::exactMatch(const QFontDef &other) const { @@ -2800,7 +2802,7 @@ void QFontCache::insertEngineData(const QFontDef &def, QFontEngineData *engineDa engineData->ref.ref(); // Decrease now rather than waiting - if (total_cost > min_cost * 2) + if (total_cost > min_cost * 2 && engineDataCache.size() >= QFONTCACHE_DECREASE_TRIGGER_LIMIT) decreaseCache(); engineDataCache.insert(def, engineData); @@ -2849,7 +2851,7 @@ void QFontCache::insertEngine(const Key &key, QFontEngine *engine, bool insertMu #endif engine->ref.ref(); // Decrease now rather than waiting - if (total_cost > min_cost * 2) + if (total_cost > min_cost * 2 && engineCache.size() >= QFONTCACHE_DECREASE_TRIGGER_LIMIT) decreaseCache(); Engine data(engine); diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp index 3f42f8828a..51ee51a64a 100644 --- a/src/plugins/bearer/connman/qconnmanengine.cpp +++ b/src/plugins/bearer/connman/qconnmanengine.cpp @@ -91,7 +91,7 @@ void QConnmanEngine::initialize() this, SLOT(updateServices(ConnmanMapList,QList<QDBusObjectPath>))); connect(connmanManager,SIGNAL(servicesReady(QStringList)),this,SLOT(servicesReady(QStringList))); - connect(connmanManager,SIGNAL(scanFinished()),this,SLOT(finishedScan())); + connect(connmanManager,SIGNAL(scanFinished(bool)),this,SLOT(finishedScan(bool))); foreach (const QString &servPath, connmanManager->getServices()) { addServiceConfiguration(servPath); @@ -203,11 +203,15 @@ void QConnmanEngine::requestUpdate() void QConnmanEngine::doRequestUpdate() { - connmanManager->requestScan("wifi"); + bool scanned = connmanManager->requestScan("wifi"); + if (!scanned) + Q_EMIT updateCompleted(); } -void QConnmanEngine::finishedScan() +void QConnmanEngine::finishedScan(bool error) { + if (error) + Q_EMIT updateCompleted(); } void QConnmanEngine::updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed) diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h index 3827ea167f..23c158ac34 100644 --- a/src/plugins/bearer/connman/qconnmanengine.h +++ b/src/plugins/bearer/connman/qconnmanengine.h @@ -100,7 +100,7 @@ private Q_SLOTS: void updateServices(const ConnmanMapList &changed, const QList<QDBusObjectPath> &removed); void servicesReady(const QStringList &); - void finishedScan(); + void finishedScan(bool error); void changedModem(); void serviceStateChanged(const QString &state); void configurationChange(QConnmanServiceInterface * service); diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp index 135aad4dec..7fbbe2cd07 100644 --- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp +++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp @@ -249,13 +249,16 @@ QStringList QConnmanManagerInterface::getServices() return servicesList; } -void QConnmanManagerInterface::requestScan(const QString &type) +bool QConnmanManagerInterface::requestScan(const QString &type) { + bool scanned = false; Q_FOREACH (QConnmanTechnologyInterface *tech, technologiesMap) { if (tech->type() == type) { tech->scan(); + scanned = true; } } + return scanned; } void QConnmanManagerInterface::technologyAdded(const QDBusObjectPath &path, const QVariantMap &) @@ -265,7 +268,7 @@ void QConnmanManagerInterface::technologyAdded(const QDBusObjectPath &path, cons QConnmanTechnologyInterface *tech; tech = new QConnmanTechnologyInterface(path.path(),this); technologiesMap.insert(path.path(),tech); - connect(tech,SIGNAL(scanFinished()),this,SIGNAL(scanFinished())); + connect(tech,SIGNAL(scanFinished(bool)),this,SIGNAL(scanFinished(bool))); } } @@ -501,7 +504,11 @@ void QConnmanTechnologyInterface::scan() void QConnmanTechnologyInterface::scanReply(QDBusPendingCallWatcher *call) { - Q_EMIT scanFinished(); + QDBusPendingReply<QVariantMap> props_reply = *call; + if (props_reply.isError()) { + qDebug() << props_reply.error().message(); + } + Q_EMIT scanFinished(props_reply.isError()); call->deleteLater(); } diff --git a/src/plugins/bearer/connman/qconnmanservice_linux_p.h b/src/plugins/bearer/connman/qconnmanservice_linux_p.h index 0e774d50c3..d2804ebca6 100644 --- a/src/plugins/bearer/connman/qconnmanservice_linux_p.h +++ b/src/plugins/bearer/connman/qconnmanservice_linux_p.h @@ -115,7 +115,7 @@ public: bool getOfflineMode(); QStringList getTechnologies(); QStringList getServices(); - void requestScan(const QString &type); + bool requestScan(const QString &type); QHash<QString, QConnmanTechnologyInterface *> technologiesMap; @@ -126,7 +126,7 @@ Q_SIGNALS: void servicesChanged(const ConnmanMapList&, const QList<QDBusObjectPath> &); void servicesReady(const QStringList &); - void scanFinished(); + void scanFinished(bool error); protected: void connectNotify(const QMetaMethod &signal); @@ -211,7 +211,7 @@ public: Q_SIGNALS: void propertyChanged(const QString &, const QDBusVariant &value); void propertyChangedContext(const QString &,const QString &,const QDBusVariant &); - void scanFinished(); + void scanFinished(bool error); protected: void connectNotify(const QMetaMethod &signal); QVariant getProperty(const QString &); diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 52f34166eb..6419ba2c51 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -840,6 +840,11 @@ QT_END_NAMESPACE Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void */*reserved*/) { + static bool initialized = false; + if (initialized) + return JNI_VERSION_1_6; + initialized = true; + QT_USE_NAMESPACE typedef union { JNIEnv *nativeEnvironment; diff --git a/src/plugins/platforms/cocoa/qmacclipboard.h b/src/plugins/platforms/cocoa/qmacclipboard.h index a4b5cf00d6..a3abacf849 100644 --- a/src/plugins/platforms/cocoa/qmacclipboard.h +++ b/src/plugins/platforms/cocoa/qmacclipboard.h @@ -75,6 +75,7 @@ private: uchar mime_type; mutable QPointer<QMimeData> mime; mutable bool mac_mime_source; + bool resolvingBeforeDestruction; static OSStatus promiseKeeper(PasteboardRef, PasteboardItemID, CFStringRef, void *); void clear_helper(); public: diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm index 70d1170edb..721b0fb4d1 100644 --- a/src/plugins/platforms/cocoa/qmacclipboard.mm +++ b/src/plugins/platforms/cocoa/qmacclipboard.mm @@ -87,6 +87,7 @@ QMacPasteboard::QMacPasteboard(PasteboardRef p, uchar mt) mime_type = mt ? mt : uchar(QMacInternalPasteboardMime::MIME_ALL); paste = p; CFRetain(paste); + resolvingBeforeDestruction = false; } QMacPasteboard::QMacPasteboard(uchar mt) @@ -100,6 +101,7 @@ QMacPasteboard::QMacPasteboard(uchar mt) } else { qDebug("PasteBoard: Error creating pasteboard: [%d]", (int)err); } + resolvingBeforeDestruction = false; } QMacPasteboard::QMacPasteboard(CFStringRef name, uchar mt) @@ -113,23 +115,14 @@ QMacPasteboard::QMacPasteboard(CFStringRef name, uchar mt) } else { qDebug("PasteBoard: Error creating pasteboard: %s [%d]", QCFString::toQString(name).toLatin1().constData(), (int)err); } + resolvingBeforeDestruction = false; } QMacPasteboard::~QMacPasteboard() { // commit all promises for paste after exit close - for (int i = 0; i < promises.count(); ++i) { - const Promise &promise = promises.at(i); - // At this point app teardown has started and control is somewhere in the Q[Core]Application - // destructor. Skip "lazy" promises where the application has not provided data; - // the application will generally not be in a state to provide it. - if (promise.dataRequestType == LazyRequest) - continue; - QCFString flavor = QCFString(promise.convertor->flavorFor(promise.mime)); - NSInteger pbItemId = promise.itemId; - promiseKeeper(paste, reinterpret_cast<PasteboardItemID>(pbItemId), flavor, this); - } - + resolvingBeforeDestruction = true; + PasteboardResolvePromises(paste); if (paste) CFRelease(paste); } @@ -181,7 +174,7 @@ OSStatus QMacPasteboard::promiseKeeper(PasteboardRef paste, PasteboardItemID id, // to request the data from the application. QVariant promiseData; if (promise.dataRequestType == LazyRequest) { - if (!promise.mimeData.isNull()) + if (!qpaste->resolvingBeforeDestruction && !promise.mimeData.isNull()) promiseData = promise.mimeData->variantData(promise.mime); } else { promiseData = promise.variantData; diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index f57446cf0d..ff4cfe63cb 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -407,8 +407,13 @@ QVariant QWindowsTheme::themeHint(ThemeHint hint) const return QVariant(booleanSystemParametersInfo(SPI_GETSNAPTODEFBUTTON, false)); case ContextMenuOnMouseRelease: return QVariant(true); - case WheelScrollLines: - return QVariant(int(dWordSystemParametersInfo(SPI_GETWHEELSCROLLLINES, 3))); + case WheelScrollLines: { + int result = 3; + const DWORD scrollLines = dWordSystemParametersInfo(SPI_GETWHEELSCROLLLINES, DWORD(result)); + if (scrollLines != DWORD(-1)) // Special value meaning "scroll one screen", unimplemented in Qt. + result = int(scrollLines); + return QVariant(result); + } default: break; } diff --git a/src/testlib/doc/src/qttestlib-manual.qdoc b/src/testlib/doc/src/qttestlib-manual.qdoc index fc8f3b747e..624c314f6c 100644 --- a/src/testlib/doc/src/qttestlib-manual.qdoc +++ b/src/testlib/doc/src/qttestlib-manual.qdoc @@ -254,7 +254,7 @@ \li \c -nocrashhandler \br Disables the crash handler on Unix platforms. On Windows, it re-enables the Windows Error Reporting dialog, which is - turned off by default. + turned off by default. This is useful for debugging crashes. \li \c -platform \e name \br This command line argument applies to all Qt applications, but might be diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 783a0cc4bb..88f9e899bf 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -453,7 +453,7 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, char *argv[], bool qml) " -mousedelay ms : Set default delay for mouse simulation to ms milliseconds\n" " -maxwarnings n : Sets the maximum amount of messages to output.\n" " 0 means unlimited, default: 2000\n" - " -nocrashhandler : Disables the crash handler\n" + " -nocrashhandler : Disables the crash handler. Useful for debugging crashes.\n" "\n" " Benchmarking options:\n" #ifdef QTESTLIB_USE_VALGRIND diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index f2efcadad7..87fb1318f9 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2016 Olivier Goffart <ogoffart@woboq.com> ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -179,6 +180,8 @@ Type Moc::parseType() case Q_SLOT_TOKEN: type.name += lexem(); return type; + case NOTOKEN: + return type; default: prev(); break; @@ -213,6 +216,8 @@ Type Moc::parseType() type.name += lexem(); isVoid |= (lookup(0) == VOID); break; + case NOTOKEN: + return type; default: prev(); ; diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 0c034777ff..4dc517b78a 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -1923,7 +1923,7 @@ NSView *QMacStylePrivate::cocoaControl(QCocoaWidget widget) const } case QCocoaPushButton: { NSButton *bc = (NSButton *)bv; - bc.buttonType = NSMomentaryPushButton; + bc.buttonType = NSMomentaryLightButton; bc.bezelStyle = NSRoundedBezelStyle; break; } diff --git a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp index 72a57c5905..0e73ea7862 100644 --- a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp +++ b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp @@ -34,6 +34,7 @@ #include <qfile.h> #include <qdir.h> #include <qset.h> +#include <qtextcodec.h> #ifdef Q_OS_WIN # include <windows.h> #endif @@ -108,6 +109,38 @@ void tst_QTemporaryDir::getSetCheck() QCOMPARE(true, obj1.autoRemove()); } +static inline bool canHandleUnicodeFileNames() +{ +#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) + return true; +#else + // Check for UTF-8 by converting the Euro symbol (see tst_utf8) + return QFile::encodeName(QString(QChar(0x20AC))) == QByteArrayLiteral("\342\202\254"); +#endif +} + +static QString hanTestText() +{ + QString text; + text += QChar(0x65B0); + text += QChar(0x5E10); + text += QChar(0x6237); + return text; +} + +static QString umlautTestText() +{ + QString text; + text += QChar(0xc4); + text += QChar(0xe4); + text += QChar(0xd6); + text += QChar(0xf6); + text += QChar(0xdc); + text += QChar(0xfc); + text += QChar(0xdf); + return text; +} + void tst_QTemporaryDir::fileTemplate_data() { QTest::addColumn<QString>("constructorTemplate"); @@ -124,6 +157,14 @@ void tst_QTemporaryDir::fileTemplate_data() QTest::newRow("constructor with XXXX suffix") << "qt_XXXXXX_XXXX" << "qt_"; QTest::newRow("constructor with XXXX prefix") << "qt_XXXX" << "qt_"; QTest::newRow("constructor with XXXXX prefix") << "qt_XXXXX" << "qt_"; + if (canHandleUnicodeFileNames()) { + // Test Umlauts (contained in Latin1) + QString prefix = "qt_" + umlautTestText(); + QTest::newRow("Umlauts") << (prefix + "XXXXXX") << prefix; + // Test Chinese + prefix = "qt_" + hanTestText(); + QTest::newRow("Chinese characters") << (prefix + "XXXXXX") << prefix; + } } void tst_QTemporaryDir::fileTemplate() diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp index 4cfbdf8c16..8ebde627df 100644 --- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp @@ -34,6 +34,7 @@ #include <qfile.h> #include <qdir.h> #include <qset.h> +#include <qtextcodec.h> #if defined(Q_OS_WIN) # include <windows.h> @@ -140,6 +141,38 @@ void tst_QTemporaryFile::getSetCheck() QCOMPARE(true, obj1.autoRemove()); } +static inline bool canHandleUnicodeFileNames() +{ +#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) + return true; +#else + // Check for UTF-8 by converting the Euro symbol (see tst_utf8) + return QFile::encodeName(QString(QChar(0x20AC))) == QByteArrayLiteral("\342\202\254"); +#endif +} + +static QString hanTestText() +{ + QString text; + text += QChar(0x65B0); + text += QChar(0x5E10); + text += QChar(0x6237); + return text; +} + +static QString umlautTestText() +{ + QString text; + text += QChar(0xc4); + text += QChar(0xe4); + text += QChar(0xd6); + text += QChar(0xf6); + text += QChar(0xdc); + text += QChar(0xfc); + text += QChar(0xdf); + return text; +} + void tst_QTemporaryFile::fileTemplate_data() { QTest::addColumn<QString>("constructorTemplate"); @@ -166,6 +199,14 @@ void tst_QTemporaryFile::fileTemplate_data() QTest::newRow("set template, with xxx") << "" << "qt_" << ".xxx" << "qt_XXXXXX.xxx"; QTest::newRow("set template, with >6 X's") << "" << "qt_" << ".xxx" << "qt_XXXXXXXXXXXXXX.xxx"; QTest::newRow("set template, with >6 X's, no suffix") << "" << "qt_" << "" << "qt_XXXXXXXXXXXXXX"; + if (canHandleUnicodeFileNames()) { + // Test Umlauts (contained in Latin1) + QString prefix = "qt_" + umlautTestText(); + QTest::newRow("Umlauts") << (prefix + "XXXXXX") << prefix << QString() << QString(); + // Test Chinese + prefix = "qt_" + hanTestText(); + QTest::newRow("Chinese characters") << (prefix + "XXXXXX") << prefix << QString() << QString(); + } } void tst_QTemporaryFile::fileTemplate() diff --git a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp index 26d443c2c6..9556a167c5 100644 --- a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp +++ b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp @@ -557,6 +557,8 @@ private slots: void checkCommentIndentation_data() const; void crashInXmlStreamReader() const; void write8bitCodec() const; + void invalidStringCharacters_data() const; + void invalidStringCharacters() const; void hasError() const; private: @@ -1614,6 +1616,63 @@ void tst_QXmlStream::write8bitCodec() const QVERIFY(decodedText.startsWith(expected)); } +void tst_QXmlStream::invalidStringCharacters() const +{ + // test scan in attributes + QFETCH(QString, testString); + QFETCH(bool, expectedResultNoError); + + QByteArray values = testString.toUtf8(); + QBuffer inBuffer; + inBuffer.setData(values); + QVERIFY(inBuffer.open(QIODevice::ReadOnly)); + QXmlStreamReader reader(&inBuffer); + do { + reader.readNext(); + } while (!reader.atEnd()); + QCOMPARE((reader.error() == QXmlStreamReader::NoError), expectedResultNoError); +} + +void tst_QXmlStream::invalidStringCharacters_data() const +{ + // test scan in attributes + QTest::addColumn<bool>("expectedResultNoError"); + QTest::addColumn<QString>("testString"); + QChar ctrl(0x1A); + QTest::newRow("utf8, attributes, legal") << true << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'/>"); + QTest::newRow("utf8, attributes, only char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='")+ctrl+QString("'/>"); + QTest::newRow("utf8, attributes, 1st char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='")+ctrl+QString("abc'/>"); + QTest::newRow("utf8, attributes, middle char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='abc")+ctrl+QString("efgx'/>"); + QTest::newRow("utf8, attributes, last char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='abcde")+ctrl+QString("'/>"); + // + QTest::newRow("utf8, text, legal") << true << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'>abcx1A</root>"); + QTest::newRow("utf8, text, only, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'>")+ctrl+QString("</root>"); + QTest::newRow("utf8, text, 1st char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'>abc")+ctrl+QString("def</root>"); + QTest::newRow("utf8, text, middle char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'>abc")+ctrl+QString("efg</root>"); + QTest::newRow("utf8, text, last char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'>abc")+ctrl+QString("</root>"); + // + QTest::newRow("utf8, cdata text, legal") << true << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'><![CDATA[abcdefghi]]></root>"); + QTest::newRow("utf8, cdata text, only, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'><![CDATA[")+ctrl+QString("]]></root>"); + QTest::newRow("utf8, cdata text, 1st char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'><![CDATA[")+ctrl+QString("abcdefghi]]></root>"); + QTest::newRow("utf8, cdata text, middle char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'><![CDATA[abcd")+ctrl+QString("efghi]]></root>"); + QTest::newRow("utf8, cdata text, last char, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'><![CDATA[abcdefghi")+ctrl+QString("]]></root>"); + // + QTest::newRow("utf8, mixed, control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='a")+ctrl+QString("a'><![CDATA[abcdefghi")+ctrl+QString("]]></root>"); + QTest::newRow("utf8, tag") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><roo")+ctrl+QString("t attr='aa'><![CDATA[abcdefghi]]></roo")+ctrl+QString("t>"); + // + QTest::newRow("utf8, attributes, 1st char, legal escaping hex") << true << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='a '/>"); + QTest::newRow("utf8, attributes, 1st char, control escaping hex") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aaa'/>"); + QTest::newRow("utf8, attributes, middle char, legal escaping hex") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aaaaaa'/>"); + QTest::newRow("utf8, attributes, last char, control escaping hex") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aaa'/>"); + QTest::newRow("utf8, attributes, 1st char, legal escaping dec") << true << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='a '/>"); + QTest::newRow("utf8, attributes, 1st char, control escaping dec") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aaaa'/>"); + QTest::newRow("utf8, attributes, middle char, legal escaping dec") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aaaaaaaa'/>"); + QTest::newRow("utf8, attributes, last char, control escaping dec") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aaaaaa'/>"); + QTest::newRow("utf8, tag escaping") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='aa'><![CDATA[abcdefghi]]></root>"); + // + QTest::newRow("utf8, mix of illegal control") << false << QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><root attr='a�a'><![CDATA[abcdefghi]]></root>"); + // +} #include "tst_qxmlstream.moc" // vim: et:ts=4:sw=4:sts=4 diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index ef4fb5bda5..b49d7bc477 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -1938,6 +1938,13 @@ void tst_Moc::warnings_data() << 1 << QString("IGNORE_ALL_STDOUT") << QString(":-1: Error: Unexpected character in macro argument list."); + + QTest::newRow("QTBUG-54815: Crash on invalid input") + << QByteArray("class M{(})F<{}d000000000000000#0") + << QStringList() + << 0 + << QString() + << QString("standard input:1: Note: No relevant classes found. No output generated."); } void tst_Moc::warnings() diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro index 8e77a321dd..801297790e 100644 --- a/tests/manual/manual.pro +++ b/tests/manual/manual.pro @@ -4,6 +4,7 @@ SUBDIRS = bearerex \ filetest \ foreignwindows \ gestures \ +highdpi \ inputmethodhints \ keypadnavigation \ lance \ |