Merge remote-tracking branch 'gerrit/5.8' into dev

Change-Id: Ib31cae9b57f6fb078739c409162bf2987eb430ad
This commit is contained in:
Tor Arne Vestbø 2016-11-05 01:52:00 +01:00
commit e79ceb9734
18 changed files with 208 additions and 159 deletions

View File

@ -50,6 +50,8 @@ int main(int, char**)
{
ComPtr<ID2D1Factory1> d2dFactory;
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, d2dFactory.ReleaseAndGetAddressOf());
ComPtr<IDXGISurface1> surface;
(void)surface; // Q_UNUSED
return 0;
}

View File

@ -124,7 +124,7 @@ defineTest(qtConfTest_detectPkgConfig) {
!isEmpty(pkgConfig): {
qtLog("Found pkg-config from environment variable: $$pkgConfig")
} else {
pkgConfig = $$PKG_CONFIG
pkgConfig = $$QMAKE_PKG_CONFIG
!isEmpty(pkgConfig) {
qtLog("Found pkg-config from mkspec: $$pkgConfig")

View File

@ -237,17 +237,58 @@ defineTest(qtAddTargetEnv) {
defineReplace(pkgConfigExecutable) {
isEmpty(PKG_CONFIG) {
!isEmpty(QMAKE_PKG_CONFIG): \
!isEmpty(QMAKE_PKG_CONFIG) {
# Assumed to be properly sysrootified.
PKG_CONFIG = $$QMAKE_PKG_CONFIG
else: \
export(PKG_CONFIG)
} else {
PKG_CONFIG = pkg-config
!cross_compile {
export(PKG_CONFIG)
} else {
# Cross compiling, ensure that pkg-config is set up sanely.
sysroot = $$[QT_SYSROOT]
sysroot.name = PKG_CONFIG_SYSROOT_DIR
sysroot.value = $$PKG_CONFIG_SYSROOT_DIR
libdir.name = PKG_CONFIG_LIBDIR
libdir.value = $$PKG_CONFIG_LIBDIR
QT_TOOL_NAME = pkg-config
qtAddToolEnv(PKG_CONFIG, sysroot libdir, SYS)
pkgConfigLibdir = $$(PKG_CONFIG_LIBDIR)
isEmpty(pkgConfigLibdir) {
isEmpty(sysroot) {
warning("Cross compiling without sysroot. Disabling pkg-config.")
return()
}
!exists("$$sysroot/usr/lib/pkgconfig") {
warning("Disabling pkg-config since PKG_CONFIG_LIBDIR is not set and the")
warning("host's .pc files would be used (even if you set PKG_CONFIG_PATH).")
warning("Set this variable to the directory that contains target .pc files")
warning("for pkg-config to function correctly when cross-compiling.")
return()
}
pkgConfigLibdir = $$system_path($$sysroot/usr/lib/pkgconfig)$$QMAKE_DIRLIST_SEP$$system_path($$sysroot/usr/share/pkgconfig)
!isEmpty(GCC_MACHINE_DUMP): \
pkgConfigLibdir = "$$pkgConfigLibdir$$QMAKE_DIRLIST_SEP$$system_path($$sysroot/usr/lib/$$GCC_MACHINE_DUMP/pkgconfig)"
message("PKG_CONFIG_LIBDIR automatically set to $$pkgConfigLibdir")
}
pkgConfigSysrootDir = $$(PKG_CONFIG_SYSROOT_DIR)
isEmpty(pkgConfigSysrootDir) {
isEmpty(sysroot) {
warning("Disabling pkg-config since PKG_CONFIG_SYSROOT_DIR is not set.")
warning("Set this variable to your sysroot for pkg-config to function")
warning("correctly when cross-compiling.")
return()
}
pkgConfigSysrootDir = $$sysroot
message("PKG_CONFIG_SYSROOT_DIR automatically set to $$pkgConfigSysrootDir")
}
sysroot.name = PKG_CONFIG_SYSROOT_DIR
sysroot.value = $$pkgConfigSysrootDir
libdir.name = PKG_CONFIG_LIBDIR
libdir.value = $$pkgConfigLibdir
QT_TOOL_NAME = pkg-config
qtAddToolEnv(PKG_CONFIG, sysroot libdir, SYS)
}
}
}
equals(QMAKE_HOST.os, Windows): \
@ -259,11 +300,6 @@ defineReplace(pkgConfigExecutable) {
}
defineTest(packagesExist) {
!qtConfig(pkg-config) {
warning("pkg-config disabled, can't check package existence")
return(false)
}
# this can't be done in global scope here because qt_functions is loaded
# before the .pro is parsed, so if the .pro set PKG_CONFIG, we wouldn't know it
# yet. oops.

View File

@ -0,0 +1,25 @@
Copyright (C) 2000 Ming-Che Chuang
Copyright (C) 2001, 2002 James Su, Turbolinux Inc.
Copyright (C) 2002 WU Yi, HancomLinux Inc.
Copyright (C) 2001, 2002 Anthony Fok, ThizLinux Laboratory Ltd.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.

View File

@ -1060,13 +1060,6 @@
# undef Q_COMPILER_VARIADIC_TEMPLATES
# endif
# endif
# if defined(_LIBCPP_VERSION)
// libc++ uses __has_feature(cxx_atomic), so disable the feature if the compiler
// doesn't support it. That's required for the Intel compiler 14.x or earlier on OS X, for example.
# if !__has_feature(cxx_atomic)
# undef Q_COMPILER_ATOMICS
# endif
# endif
# if defined(Q_COMPILER_THREADSAFE_STATICS) && defined(Q_OS_MAC)
// Apple's low-level implementation of the C++ support library
// (libc++abi.dylib, shared between libstdc++ and libc++) has deadlocks. The

View File

@ -2625,21 +2625,28 @@ QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs
*/
QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
{
ushort a = after.unicode();
ushort b = before.unicode();
if (d->size) {
detach();
ushort *i = d->data();
const ushort *e = i + d->size;
if (cs == Qt::CaseSensitive) {
for (; i != e; ++i)
if (*i == b)
*i = a;
} else {
b = foldCase(b);
for (; i != e; ++i)
if (foldCase(*i) == b)
*i = a;
const int idx = indexOf(before, 0, cs);
if (idx != -1) {
detach();
const ushort a = after.unicode();
ushort *i = d->data();
const ushort *e = i + d->size;
i += idx;
*i = a;
if (cs == Qt::CaseSensitive) {
const ushort b = before.unicode();
while (++i != e) {
if (*i == b)
*i = a;
}
} else {
const ushort b = foldCase(before.unicode());
while (++i != e) {
if (foldCase(*i) == b)
*i = a;
}
}
}
}
return *this;

View File

@ -720,7 +720,7 @@ bool QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ProcessEventsFl
// deferredFlushWindowSystemEvents from the Gui thread.
QMutexLocker locker(&QWindowSystemInterfacePrivate::flushEventMutex);
QWindowSystemInterfacePrivate::FlushEventsEvent *e = new QWindowSystemInterfacePrivate::FlushEventsEvent(flags);
QWindowSystemInterfacePrivate::handleWindowSystemEvent<SynchronousDelivery>(e);
QWindowSystemInterfacePrivate::handleWindowSystemEvent<AsynchronousDelivery>(e);
QWindowSystemInterfacePrivate::eventsFlushed.wait(&QWindowSystemInterfacePrivate::flushEventMutex);
} else {
sendWindowSystemEvents(flags);

View File

@ -253,6 +253,19 @@
library names through OPENSSL_LIBS.
For example:
OPENSSL_LIBS='-L/opt/ssl/lib -lssl -lcrypto' ./configure -openssl-linked"
},
{
"type": "warning",
"condition": "features.libproxy && input.qt_namespace == ''",
"message": "Some of libproxy's plugins may use incompatible Qt versions.
Some platforms and distributions ship libproxy with plugins, such
as config_kde4.so, that are linked against old versions of Qt; and
libproxy loads these plugins automatically when initialized. If Qt
is not in a namespace, that loading causes a crash. Even if the
systems on which you build and test have no such plugins, your
users' systems may have them. We therefore recommend that you
combine -libproxy with -qtnamespace when configuring Qt."
}
],

View File

@ -18,7 +18,6 @@ HEADERS += kernel/qtnetworkglobal.h \
kernel/qnetworkinterface.h \
kernel/qnetworkinterface_p.h \
kernel/qnetworkproxy.h \
kernel/qnetworkproxy_p.h \
kernel/qurlinfo_p.h
SOURCES += kernel/qauthenticator.cpp \

View File

@ -224,7 +224,6 @@
#ifndef QT_NO_NETWORKPROXY
#include "private/qnetworkproxy_p.h"
#include "private/qnetworkrequest_p.h"
#include "private/qsocks5socketengine_p.h"
#include "private/qhttpsocketengine_p.h"
@ -256,10 +255,12 @@ public:
#ifndef QT_NO_HTTP
, httpSocketEngineHandler(0)
#endif
{
#ifdef QT_USE_SYSTEM_PROXIES
setApplicationProxyFactory(new QSystemConfigurationProxyFactory);
, useSystemProxies(true)
#else
, useSystemProxies(false)
#endif
{
#ifndef QT_NO_SOCKS5
socks5SocketEngineHandler = new QSocks5SocketEngineHandler();
#endif
@ -280,6 +281,24 @@ public:
#endif
}
bool usesSystemConfiguration() const
{
return useSystemProxies;
}
void setUseSystemConfiguration(bool enable)
{
QMutexLocker lock(&mutex);
useSystemProxies = enable;
if (useSystemProxies) {
if (applicationLevelProxy)
*applicationLevelProxy = QNetworkProxy();
delete applicationLevelProxyFactory;
applicationLevelProxyFactory = nullptr;
}
}
void setApplicationProxy(const QNetworkProxy &proxy)
{
QMutexLocker lock(&mutex);
@ -288,6 +307,7 @@ public:
*applicationLevelProxy = proxy;
delete applicationLevelProxyFactory;
applicationLevelProxyFactory = 0;
useSystemProxies = false;
}
void setApplicationProxyFactory(QNetworkProxyFactory *factory)
@ -299,6 +319,7 @@ public:
*applicationLevelProxy = QNetworkProxy();
delete applicationLevelProxyFactory;
applicationLevelProxyFactory = factory;
useSystemProxies = false;
}
QNetworkProxy applicationProxy()
@ -318,6 +339,7 @@ private:
#ifndef QT_NO_HTTP
QHttpSocketEngineHandler *httpSocketEngineHandler;
#endif
bool useSystemProxies;
};
QList<QNetworkProxy> QGlobalNetworkProxy::proxyForQuery(const QNetworkProxyQuery &query)
@ -339,10 +361,19 @@ QList<QNetworkProxy> QGlobalNetworkProxy::proxyForQuery(const QNetworkProxyQuery
if (!applicationLevelProxyFactory) {
if (applicationLevelProxy
&& applicationLevelProxy->type() != QNetworkProxy::DefaultProxy)
&& applicationLevelProxy->type() != QNetworkProxy::DefaultProxy) {
result << *applicationLevelProxy;
else
} else if (useSystemProxies) {
result = QNetworkProxyFactory::systemProxyForQuery(query);
// Make sure NoProxy is in the list, so that QTcpServer can work:
// it searches for the first proxy that can has the ListeningCapability capability
// if none have (as is the case with HTTP proxies), it fails to bind.
// NoProxy allows it to fallback to the 'no proxy' case and bind.
result << QNetworkProxy(QNetworkProxy::NoProxy);
} else {
result << QNetworkProxy(QNetworkProxy::NoProxy);
}
return result;
}
@ -717,7 +748,8 @@ quint16 QNetworkProxy::port() const
Setting a default proxy value with this function will override the
application proxy factory set with
QNetworkProxyFactory::setApplicationProxyFactory.
QNetworkProxyFactory::setApplicationProxyFactory, and disable the
use of a system proxy.
\sa QNetworkProxyFactory, applicationProxy(), QAbstractSocket::setProxy(), QTcpServer::setProxy()
*/
@ -1465,6 +1497,17 @@ QNetworkProxyFactory::~QNetworkProxyFactory()
{
}
/*!
\since 5.8
Returns whether the use of platform-specific proxy settings are enabled.
*/
bool QNetworkProxyFactory::usesSystemConfiguration()
{
if (globalNetworkProxy())
return globalNetworkProxy()->usesSystemConfiguration();
return false;
}
/*!
\since 4.6
@ -1472,23 +1515,16 @@ QNetworkProxyFactory::~QNetworkProxyFactory()
Enables the use of the platform-specific proxy settings, and only those.
See systemProxyForQuery() for more information.
Internally, this method (when called with \a enable set to true)
sets an application-wide proxy factory. For this reason, this method
is mutually exclusive with setApplicationProxyFactory(): calling
setApplicationProxyFactory() overrides the use of the system-wide proxy,
and calling setUseSystemConfiguration() overrides any
application proxy or proxy factory that was previously set.
Calling setUseSystemConfiguration(\c{true}) will reset any proxy or
QNetworkProxyFactory already set.
\note See the systemProxyForQuery() documentation for a list of
limitations related to the use of system proxies.
*/
void QNetworkProxyFactory::setUseSystemConfiguration(bool enable)
{
if (enable) {
setApplicationProxyFactory(new QSystemConfigurationProxyFactory);
} else {
setApplicationProxyFactory(0);
}
if (globalNetworkProxy())
globalNetworkProxy()->setUseSystemConfiguration(enable);
}
/*!
@ -1504,7 +1540,7 @@ void QNetworkProxyFactory::setUseSystemConfiguration(bool enable)
If you set a proxy factory with this function, any application
level proxies set with QNetworkProxy::setApplicationProxy will be
overridden.
overridden, and usesSystemConfiguration() will return \c{false}.
\sa QNetworkProxy::setApplicationProxy(),
QAbstractSocket::proxy(), QAbstractSocket::setProxy()

View File

@ -213,6 +213,7 @@ public:
virtual QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery &query = QNetworkProxyQuery()) = 0;
static bool usesSystemConfiguration();
static void setUseSystemConfiguration(bool enable);
static void setApplicationProxyFactory(QNetworkProxyFactory *factory);
static QList<QNetworkProxy> proxyForQuery(const QNetworkProxyQuery &query);

View File

@ -1,84 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2009 David Faure <dfaure@kdab.net>
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtNetwork module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** 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 https://www.qt.io/terms-conditions. For further
** information use the contact form at https://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 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QNETWORKPROXY_P_H
#define QNETWORKPROXY_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtNetwork/private/qtnetworkglobal_p.h>
#ifndef QT_NO_NETWORKPROXY
QT_BEGIN_NAMESPACE
class QSystemConfigurationProxyFactory : public QNetworkProxyFactory
{
public:
QSystemConfigurationProxyFactory() : QNetworkProxyFactory() {}
virtual QList<QNetworkProxy> queryProxy(const QNetworkProxyQuery& query)
{
QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery(query);
// Make sure NoProxy is in the list, so that QTcpServer can work:
// it searches for the first proxy that can has the ListeningCapability capability
// if none have (as is the case with HTTP proxies), it fails to bind.
// NoProxy allows it to fallback to the 'no proxy' case and bind.
proxies.append(QNetworkProxy::NoProxy);
return proxies;
}
};
QT_END_NAMESPACE
#endif // QT_NO_NETWORKINTERFACE
#endif

View File

@ -329,6 +329,7 @@ bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket::
hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, readOp.GetAddressOf());
RETURN_OK_IF_FAILED_WITH_ARGS("initialize(): Failed to read from the socket buffer (%s).",
socketDescription(this).constData());
QMutexLocker locker(&d->readOperationsMutex);
d->pendingReadOps.append(readOp);
d->socketState = socketState;
hr = readOp->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get());
@ -574,6 +575,7 @@ void QNativeSocketEngine::close()
}
#endif // _MSC_VER >= 1900
QMutexLocker locker(&d->readOperationsMutex);
for (ComPtr<IAsyncBufferOperation> readOp : d->pendingReadOps) {
ComPtr<IAsyncInfo> info;
hr = readOp.As(&info);
@ -585,6 +587,7 @@ void QNativeSocketEngine::close()
Q_ASSERT_SUCCEEDED(hr);
}
}
locker.unlock();
if (d->socketDescriptor != -1) {
ComPtr<IClosable> socket;
@ -659,6 +662,7 @@ qint64 QNativeSocketEngine::read(char *data, qint64 maxlen)
if (d->socketType != QAbstractSocket::TcpSocket)
return -1;
QMutexLocker mutexLocker(&d->readMutex);
// There will be a read notification when the socket was closed by the remote host. If that
// happens and there isn't anything left in the buffer, we have to return -1 in order to signal
// the closing of the socket.
@ -667,7 +671,6 @@ qint64 QNativeSocketEngine::read(char *data, qint64 maxlen)
return -1;
}
QMutexLocker mutexLocker(&d->readMutex);
qint64 b = d->readBytes.read(data, maxlen);
d->bytesAvailable = d->readBytes.size() - d->readBytes.pos();
return b;
@ -701,7 +704,7 @@ qint64 QNativeSocketEngine::readDatagram(char *data, qint64 maxlen, QIpPacketHea
{
#ifndef QT_NO_UDPSOCKET
Q_D(QNativeSocketEngine);
d->readMutex.lock();
QMutexLocker locker(&d->readMutex);
if (d->socketType != QAbstractSocket::UdpSocket || d->pendingDatagrams.isEmpty()) {
if (header)
header->clear();
@ -721,7 +724,7 @@ qint64 QNativeSocketEngine::readDatagram(char *data, qint64 maxlen, QIpPacketHea
} else {
readOrigin = datagram.data;
}
d->readMutex.unlock();
locker.unlock();
memcpy(data, readOrigin, qMin(maxlen, qint64(datagram.data.length())));
return readOrigin.length();
#else
@ -772,12 +775,14 @@ qint64 QNativeSocketEngine::writeDatagram(const char *data, qint64 len, const QI
bool QNativeSocketEngine::hasPendingDatagrams() const
{
Q_D(const QNativeSocketEngine);
QMutexLocker locker(&d->readMutex);
return d->pendingDatagrams.length() > 0;
}
qint64 QNativeSocketEngine::pendingDatagramSize() const
{
Q_D(const QNativeSocketEngine);
QMutexLocker locker(&d->readMutex);
if (d->pendingDatagrams.isEmpty())
return -1;
@ -943,6 +948,7 @@ void QNativeSocketEngine::establishRead()
ComPtr<IAsyncBufferOperation> readOp;
hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, readOp.GetAddressOf());
RETURN_HR_IF_FAILED("establishRead(): Failed to initiate socket read");
QMutexLocker locker(&d->readOperationsMutex);
d->pendingReadOps.append(readOp);
hr = readOp->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get());
RETURN_HR_IF_FAILED("establishRead(): Failed to register read callback");
@ -1419,15 +1425,15 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async
}
Q_Q(QNativeSocketEngine);
QMutexLocker locker(&readOperationsMutex);
for (int i = 0; i < pendingReadOps.count(); ++i) {
if (pendingReadOps.at(i).Get() == asyncInfo) {
pendingReadOps.takeAt(i);
break;
}
}
locker.unlock();
static QMutex mutex;
mutex.lock();
// A read in UnconnectedState will close the socket and return -1 and thus tell the caller,
// that the connection was closed. The socket cannot be closed here, as the subsequent read
// might fail then.
@ -1465,7 +1471,7 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async
hr = byteArrayAccess->Buffer(&data);
Q_ASSERT_SUCCEEDED(hr);
readMutex.lock();
QMutexLocker readLocker(&readMutex);
if (readBytes.atEnd()) // Everything has been read; the buffer is safe to reset
readBytes.close();
if (!readBytes.isOpen())
@ -1476,11 +1482,10 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async
readBytes.write(reinterpret_cast<const char*>(data), qint64(bufferLength));
readBytes.seek(readPos);
bytesAvailable = readBytes.size() - readBytes.pos();
readMutex.unlock();
readLocker.unlock();
if (notifyOnRead)
emit q->readReady();
mutex.unlock();
hr = QEventDispatcherWinRT::runOnXamlThread([buffer, q, this]() {
UINT32 readBufferLength;
@ -1501,6 +1506,7 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async
socketDescription(q).constData());
return S_OK;
}
QMutexLocker locker(&readOperationsMutex);
pendingReadOps.append(readOp);
hr = readOp->put_Completed(Callback<SocketReadCompletedHandler>(this, &QNativeSocketEnginePrivate::handleReadyRead).Get());
if (FAILED(hr)) {

View File

@ -214,13 +214,27 @@ private:
{ return reinterpret_cast<ABI::Windows::Networking::Sockets::IDatagramSocket *>(socketDescriptor); }
Microsoft::WRL::ComPtr<ABI::Windows::Networking::Sockets::IStreamSocketListener> tcpListener;
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncAction> connectOp;
// Protected by readOperationsMutex. Written in handleReadyRead (native callback)
QVector<Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Storage::Streams::IBuffer *, UINT32>>> pendingReadOps;
// Protected by readMutex. Written in handleReadyRead (native callback)
QBuffer readBytes;
QMutex readMutex;
bool emitOnNewDatagram;
// In case of TCP readMutex protects readBytes and bytesAvailable. In case of UDP it is
// pendingDatagrams. They are written inside native callbacks (handleReadyRead and
// handleNewDatagrams/putIntoPendingDatagramsList)
mutable QMutex readMutex;
// As pendingReadOps is changed inside handleReadyRead(native callback) it has to be protected
QMutex readOperationsMutex;
// Protected by readMutex. Written in handleReadyRead (native callback)
QAtomicInteger<int> bytesAvailable;
// Protected by readMutex. Written in handleNewDatagrams/putIntoPendingDatagramsList
QList<WinRtDatagram> pendingDatagrams;
QList<ABI::Windows::Networking::Sockets::IStreamSocket *> pendingConnections;
QList<ABI::Windows::Networking::Sockets::IStreamSocket *> currentConnections;
QEventLoop eventLoop;

View File

@ -49,6 +49,7 @@
#include <QtCore/private/qsystemlibrary_p.h>
#include <QtGui/private/qguiapplication_p.h>
#include <qpa/qplatformintegration.h>
#include <QtGui/private/qhighdpiscaling_p.h>
#if defined(QT_USE_DIRECTWRITE2)
# include <dwrite_2.h>
@ -185,6 +186,9 @@ namespace {
static DWRITE_RENDERING_MODE hintingPreferenceToRenderingMode(QFont::HintingPreference hintingPreference)
{
if (QHighDpiScaling::isActive() && hintingPreference == QFont::PreferDefaultHinting)
hintingPreference = QFont::PreferVerticalHinting;
switch (hintingPreference) {
case QFont::PreferNoHinting:
return DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC;

View File

@ -13,11 +13,6 @@ HEADERS += \
qtConfig(freetype) {
SOURCES += $$PWD/qwindowsfontdatabase_ft.cpp
HEADERS += $$PWD/qwindowsfontdatabase_ft_p.h
qtConfig(system-freetype) {
include($$QT_SOURCE_TREE/src/platformsupport/fontdatabases/basic/basic.pri)
} else {
include($$QT_SOURCE_TREE/src/3rdparty/freetype_dependency.pri)
}
}
qtConfig(directwrite) {

View File

@ -48,8 +48,7 @@ HEADERS = \
quiview.h \
quiaccessibilityelement.h \
qiosplatformaccessibility.h \
qiostextresponder.h \
qiosfileenginefactory.h
qiostextresponder.h
!tvos {
LIBS += -framework AssetsLibrary

View File

@ -4,8 +4,9 @@
"Name": "Callgrind",
"QDocModule": "qttestlib",
"QtUsage": "Used on Linux ond MacOS in the Qt Test module.",
"Files": "valgrind_p.h callgrind_p.h",
"Description": "callgrind_p.h is part of Valgrind: an instrumentation framework for building dynamic analysis tools.",
"Description": "Part of Valgrind: an instrumentation framework for building dynamic analysis tools.",
"Homepage": "http://valgrind.org/",
"License": "BSD 4-clause \"Original\" or \"Old\" License",
"LicenseId": "BSD-4-Clause",
@ -17,8 +18,9 @@
"Name": "Cycle",
"QDocModule": "qttestlib",
"QtUsage": "Used in the Qt Test module.",
"Files": "cycle_p.h",
"Description": "cycle_p.h allows to access the CPU's cycle counters.",
"Description": "Allows to access the CPU's cycle counters.",
"License": "MIT License",
"LicenseId": "MIT",
"LicenseFile": "CYCLE_LICENSE.txt",
@ -30,8 +32,9 @@ Copyright (c) 2003, 2006 Massachusetts Institute of Technology"
"Name": "Linux Performance Events",
"QDocModule": "qttestlib",
"QtUsage": "Used on Linux and Android in the Qt Test module.",
"Files": "linux_perf_event_p.h",
"Description": "linux_perf_event_p.h allows access to the LInux kernel's performance events.",
"Description": "Allows access to the Linux kernel's performance events.",
"License": "GNU General Public License v2.0 only",
"LicenseId": "GPL-2.0",
"LicenseFile": "LINUX_LICENSE.txt",