Merge remote-tracking branch 'origin/5.5' into 5.6
Conflicts: src/network/socket/qnativesocketengine_p.h src/network/ssl/qsslsocket_mac.cpp src/network/ssl/qsslsocket_mac_p.h src/widgets/kernel/qwidget.cpp Change-Id: I39592cb37d710dfaf8640769ba3c1b637927d7f4
This commit is contained in:
commit
8c57e8c012
@ -64,7 +64,13 @@ HRESULT NativeWindow::createSwapChain(ID3D11Device* device, DXGIFactory* factory
|
||||
swapChainDesc.Windowed = TRUE;
|
||||
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
||||
|
||||
return factory->CreateSwapChain(device, &swapChainDesc, swapChain);
|
||||
const HRESULT result = factory->CreateSwapChain(device, &swapChainDesc, swapChain);
|
||||
if (SUCCEEDED(result))
|
||||
{
|
||||
const HRESULT makeWindowAssociationResult = factory->MakeWindowAssociation(mWindow, DXGI_MWA_NO_ALT_ENTER);
|
||||
UNUSED_TRACE_VARIABLE(makeWindowAssociationResult);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 00f0a46199b622b05619f56e29f172fb61fe6e82 Mon Sep 17 00:00:00 2001
|
||||
From: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
|
||||
Date: Mon, 23 Nov 2015 14:00:02 +0100
|
||||
Subject: [PATCH] ANGLE/D3D11: Suppress keyboard handling of DXGI.
|
||||
|
||||
Set the DXGI_MWA_NO_ALT_ENTER to suppress the Alt-Enter shortcut
|
||||
causing the window to become full screen.
|
||||
|
||||
Task-number: QTBUG-44904
|
||||
Change-Id: Ia4156ddee37a8a3da6e9e3130022c63a674f4429
|
||||
---
|
||||
.../angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp
|
||||
index 0a4f45b..696dfd7 100644
|
||||
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp
|
||||
+++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow.cpp
|
||||
@@ -64,7 +64,13 @@ HRESULT NativeWindow::createSwapChain(ID3D11Device* device, DXGIFactory* factory
|
||||
swapChainDesc.Windowed = TRUE;
|
||||
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
||||
|
||||
- return factory->CreateSwapChain(device, &swapChainDesc, swapChain);
|
||||
+ const HRESULT result = factory->CreateSwapChain(device, &swapChainDesc, swapChain);
|
||||
+ if (SUCCEEDED(result))
|
||||
+ {
|
||||
+ const HRESULT makeWindowAssociationResult = factory->MakeWindowAssociation(mWindow, DXGI_MWA_NO_ALT_ENTER);
|
||||
+ UNUSED_TRACE_VARIABLE(makeWindowAssociationResult);
|
||||
+ }
|
||||
+ return result;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
--
|
||||
2.5.0.windows.1
|
||||
|
@ -6,7 +6,6 @@ HEADERS += \
|
||||
arch/qatomic_armv7.h \
|
||||
arch/qatomic_bootstrap.h \
|
||||
arch/qatomic_ia64.h \
|
||||
arch/qatomic_mips.h \
|
||||
arch/qatomic_x86.h \
|
||||
arch/qatomic_gcc.h \
|
||||
arch/qatomic_cxx11.h
|
||||
|
@ -204,7 +204,7 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
|
||||
CFRelease(bundleUrl);
|
||||
|
||||
CFURLRef resourcesUrl = CFBundleCopyResourcesDirectoryURL(mainBundle);
|
||||
CFStringRef cfResourcesPath = CFURLCopyPath(bundleUrl);
|
||||
CFStringRef cfResourcesPath = CFURLCopyPath(resourcesUrl);
|
||||
QString resourcesPath = QCFString::toQString(cfResourcesPath);
|
||||
CFRelease(cfResourcesPath);
|
||||
CFRelease(resourcesUrl);
|
||||
|
@ -75,8 +75,15 @@ public:
|
||||
~QPlatformBackingStorePrivate()
|
||||
{
|
||||
#ifndef QT_NO_OPENGL
|
||||
if (blitter)
|
||||
blitter->destroy();
|
||||
QOpenGLContext *ctx = QOpenGLContext::currentContext();
|
||||
if (ctx) {
|
||||
if (textureId)
|
||||
ctx->functions()->glDeleteTextures(1, &textureId);
|
||||
if (blitter)
|
||||
blitter->destroy();
|
||||
} else if (textureId || blitter) {
|
||||
qWarning("No context current during QPlatformBackingStore destruction, OpenGL resources not released");
|
||||
}
|
||||
delete blitter;
|
||||
#endif
|
||||
}
|
||||
|
@ -672,6 +672,24 @@ int QNativeSocketEngine::accept()
|
||||
return d->nativeAccept();
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the number of bytes that are currently available for
|
||||
reading. On error, -1 is returned.
|
||||
|
||||
For UDP sockets, this function returns the accumulated size of all
|
||||
pending datagrams, and it is therefore more useful for UDP sockets
|
||||
to call hasPendingDatagrams() and pendingDatagramSize().
|
||||
*/
|
||||
qint64 QNativeSocketEngine::bytesAvailable() const
|
||||
{
|
||||
Q_D(const QNativeSocketEngine);
|
||||
Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::bytesAvailable(), -1);
|
||||
Q_CHECK_NOT_STATE(QNativeSocketEngine::bytesAvailable(), QAbstractSocket::UnconnectedState, -1);
|
||||
|
||||
return d->nativeBytesAvailable();
|
||||
}
|
||||
|
||||
#ifndef QT_NO_UDPSOCKET
|
||||
#ifndef QT_NO_NETWORKINTERFACE
|
||||
|
||||
/*!
|
||||
@ -733,23 +751,6 @@ bool QNativeSocketEngine::setMulticastInterface(const QNetworkInterface &iface)
|
||||
|
||||
#endif // QT_NO_NETWORKINTERFACE
|
||||
|
||||
/*!
|
||||
Returns the number of bytes that are currently available for
|
||||
reading. On error, -1 is returned.
|
||||
|
||||
For UDP sockets, this function returns the accumulated size of all
|
||||
pending datagrams, and it is therefore more useful for UDP sockets
|
||||
to call hasPendingDatagrams() and pendingDatagramSize().
|
||||
*/
|
||||
qint64 QNativeSocketEngine::bytesAvailable() const
|
||||
{
|
||||
Q_D(const QNativeSocketEngine);
|
||||
Q_CHECK_VALID_SOCKETLAYER(QNativeSocketEngine::bytesAvailable(), -1);
|
||||
Q_CHECK_NOT_STATE(QNativeSocketEngine::bytesAvailable(), QAbstractSocket::UnconnectedState, -1);
|
||||
|
||||
return d->nativeBytesAvailable();
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns \c true if there is at least one datagram pending. This
|
||||
function is only called by UDP sockets, where a datagram can have
|
||||
@ -834,6 +835,7 @@ qint64 QNativeSocketEngine::writeDatagram(const char *data, qint64 size, const Q
|
||||
|
||||
return d->nativeSendDatagram(data, size, header);
|
||||
}
|
||||
#endif // QT_NO_UDPSOCKET
|
||||
|
||||
/*!
|
||||
Writes a block of \a size bytes from \a data to the socket.
|
||||
|
@ -124,6 +124,12 @@ public:
|
||||
int accept() Q_DECL_OVERRIDE;
|
||||
void close() Q_DECL_OVERRIDE;
|
||||
|
||||
qint64 bytesAvailable() const Q_DECL_OVERRIDE;
|
||||
|
||||
qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE;
|
||||
qint64 write(const char *data, qint64 len) Q_DECL_OVERRIDE;
|
||||
|
||||
#ifndef QT_NO_UDPSOCKET
|
||||
#ifndef QT_NO_NETWORKINTERFACE
|
||||
bool joinMulticastGroup(const QHostAddress &groupAddress,
|
||||
const QNetworkInterface &iface) Q_DECL_OVERRIDE;
|
||||
@ -133,16 +139,12 @@ public:
|
||||
bool setMulticastInterface(const QNetworkInterface &iface) Q_DECL_OVERRIDE;
|
||||
#endif
|
||||
|
||||
qint64 bytesAvailable() const Q_DECL_OVERRIDE;
|
||||
|
||||
qint64 read(char *data, qint64 maxlen) Q_DECL_OVERRIDE;
|
||||
qint64 write(const char *data, qint64 len) Q_DECL_OVERRIDE;
|
||||
|
||||
qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader * = 0,
|
||||
PacketHeaderOptions = WantNone) Q_DECL_OVERRIDE;
|
||||
qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &) Q_DECL_OVERRIDE;
|
||||
bool hasPendingDatagrams() const Q_DECL_OVERRIDE;
|
||||
qint64 pendingDatagramSize() const Q_DECL_OVERRIDE;
|
||||
#endif // QT_NO_UDPSOCKET
|
||||
|
||||
qint64 bytesToWrite() const Q_DECL_OVERRIDE;
|
||||
|
||||
|
@ -51,12 +51,291 @@
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
|
||||
#include <QtCore/private/qcore_mac_p.h>
|
||||
|
||||
#ifdef Q_OS_OSX
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#endif
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
static SSLContextRef qt_createSecureTransportContext(QSslSocket::SslMode mode)
|
||||
{
|
||||
const bool isServer = mode == QSslSocket::SslServerMode;
|
||||
SSLContextRef context = Q_NULLPTR;
|
||||
|
||||
#ifndef Q_OS_OSX
|
||||
const SSLProtocolSide side = isServer ? kSSLServerSide : kSSLClientSide;
|
||||
// We never use kSSLDatagramType, so it's kSSLStreamType unconditionally.
|
||||
context = SSLCreateContext(Q_NULLPTR, side, kSSLStreamType);
|
||||
if (!context)
|
||||
qCWarning(lcSsl) << "SSLCreateContext failed";
|
||||
#else // Q_OS_OSX
|
||||
|
||||
#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_8, __IPHONE_NA)
|
||||
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) {
|
||||
const SSLProtocolSide side = isServer ? kSSLServerSide : kSSLClientSide;
|
||||
// We never use kSSLDatagramType, so it's kSSLStreamType unconditionally.
|
||||
context = SSLCreateContext(Q_NULLPTR, side, kSSLStreamType);
|
||||
if (!context)
|
||||
qCWarning(lcSsl) << "SSLCreateContext failed";
|
||||
} else {
|
||||
#else
|
||||
{
|
||||
#endif
|
||||
const OSStatus errCode = SSLNewContext(isServer, &context);
|
||||
if (errCode != noErr || !context)
|
||||
qCWarning(lcSsl) << "SSLNewContext failed with error:" << errCode;
|
||||
}
|
||||
#endif // !Q_OS_OSX
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
static void qt_releaseSecureTransportContext(SSLContextRef context)
|
||||
{
|
||||
if (!context)
|
||||
return;
|
||||
|
||||
#ifndef Q_OS_OSX
|
||||
CFRelease(context);
|
||||
#else
|
||||
|
||||
#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_8, __IPHONE_NA)
|
||||
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) {
|
||||
CFRelease(context);
|
||||
} else {
|
||||
#else
|
||||
{
|
||||
#endif // QT_MAC_PLATFORM_...
|
||||
const OSStatus errCode = SSLDisposeContext(context);
|
||||
if (errCode != noErr)
|
||||
qCWarning(lcSsl) << "SSLDisposeContext failed with error:" << errCode;
|
||||
}
|
||||
#endif // !Q_OS_OSX
|
||||
}
|
||||
|
||||
static bool qt_setSessionProtocol(SSLContextRef context, const QSslConfigurationPrivate &configuration,
|
||||
QTcpSocket *plainSocket)
|
||||
{
|
||||
Q_ASSERT(context);
|
||||
|
||||
#ifndef QSSLSOCKET_DEBUG
|
||||
Q_UNUSED(plainSocket)
|
||||
#endif
|
||||
|
||||
OSStatus err = noErr;
|
||||
|
||||
#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_8, __IPHONE_5_0)
|
||||
if (configuration.protocol == QSsl::SslV3) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : SSLv3";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kSSLProtocol3);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_0) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.0";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol1);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_1) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.1";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol11);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol11);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_2) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol12);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::AnyProtocol) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : any";
|
||||
#endif
|
||||
// kSSLProtocol3, since kSSLProtocol2 is disabled:
|
||||
err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::TlsV1SslV3) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : SSLv3 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::SecureProtocols) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_0OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_1OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol11);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_2OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol12);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "no protocol version found in the configuration";
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
return err == noErr;
|
||||
}
|
||||
|
||||
#ifdef Q_OS_OSX
|
||||
|
||||
static bool qt_setSessionProtocolOSX(SSLContextRef context, const QSslConfigurationPrivate &configuration,
|
||||
QTcpSocket *plainSocket)
|
||||
{
|
||||
// This function works with (now) deprecated API that does not even exist on
|
||||
// iOS but is the only API we have on OS X below 10.8
|
||||
|
||||
// Without SSLSetProtocolVersionMin/Max functions it's quite difficult
|
||||
// to have the required result:
|
||||
// If we use SSLSetProtocolVersion - any constant except the ones with 'Only' suffix -
|
||||
// allows a negotiation and we can not set the lower limit.
|
||||
// SSLSetProtocolVersionEnabled supports only a limited subset of constants, if you believe their docs:
|
||||
// kSSLProtocol2
|
||||
// kSSLProtocol3
|
||||
// kTLSProtocol1
|
||||
// kSSLProtocolAll
|
||||
// Here we can only have a look into the SecureTransport's code and hope that what we see there
|
||||
// and what we have on 10.7 is similar:
|
||||
// SSLSetProtocoLVersionEnabled actually accepts other constants also,
|
||||
// called twice with two different protocols it sets a range,
|
||||
// called once with a protocol (when all protocols were disabled)
|
||||
// - only this protocol is enabled (without a lower limit negotiation).
|
||||
|
||||
Q_ASSERT(context);
|
||||
|
||||
#ifndef QSSLSOCKET_DEBUG
|
||||
Q_UNUSED(plainSocket)
|
||||
#endif
|
||||
|
||||
OSStatus err = noErr;
|
||||
|
||||
// First, disable ALL:
|
||||
if (SSLSetProtocolVersionEnabled(context, kSSLProtocolAll, false) != noErr)
|
||||
return false;
|
||||
|
||||
if (configuration.protocol == QSsl::SslV3) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : SSLv3";
|
||||
#endif
|
||||
err = SSLSetProtocolVersion(context, kSSLProtocol3Only);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_0) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.0";
|
||||
#endif
|
||||
err = SSLSetProtocolVersion(context, kTLSProtocol1Only);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_1) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.1";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol11, true);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_2) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol12, true);
|
||||
} else if (configuration.protocol == QSsl::AnyProtocol) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : any";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionEnabled(context, kSSLProtocolAll, true);
|
||||
} else if (configuration.protocol == QSsl::TlsV1SslV3) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : SSLv3 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol12, true);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionEnabled(context, kSSLProtocol3, true);
|
||||
} else if (configuration.protocol == QSsl::SecureProtocols) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol12, true);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol1, true);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_0OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol12, true);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol1, true);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_1OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol12, true);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol11, true);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_2OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionEnabled(context, kTLSProtocol12, true);
|
||||
} else {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "no protocol version found in the configuration";
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return err == noErr;
|
||||
}
|
||||
|
||||
#endif // Q_OS_OSX
|
||||
|
||||
QSecureTransportContext::QSecureTransportContext(SSLContextRef c)
|
||||
: context(c)
|
||||
{
|
||||
}
|
||||
|
||||
QSecureTransportContext::~QSecureTransportContext()
|
||||
{
|
||||
qt_releaseSecureTransportContext(context);
|
||||
}
|
||||
|
||||
QSecureTransportContext::operator SSLContextRef()const
|
||||
{
|
||||
return context;
|
||||
}
|
||||
|
||||
void QSecureTransportContext::reset(SSLContextRef newContext)
|
||||
{
|
||||
qt_releaseSecureTransportContext(context);
|
||||
context = newContext;
|
||||
}
|
||||
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(QMutex, qt_securetransport_mutex, (QMutex::Recursive))
|
||||
|
||||
//#define QSSLSOCKET_DEBUG
|
||||
@ -144,7 +423,7 @@ void QSslSocketPrivate::ensureInitialized()
|
||||
// from QSslCertificatePrivate's ctor.
|
||||
s_loadedCiphersAndCerts = true;
|
||||
|
||||
QCFType<SSLContextRef> context(SSLCreateContext(Q_NULLPTR, kSSLClientSide, kSSLStreamType));
|
||||
const QSecureTransportContext context(qt_createSecureTransportContext(QSslSocket::SslClientMode));
|
||||
if (context) {
|
||||
QList<QSslCipher> ciphers;
|
||||
QList<QSslCipher> defaultCiphers;
|
||||
@ -171,7 +450,6 @@ void QSslSocketPrivate::ensureInitialized()
|
||||
if (!s_loadRootCertsOnDemand)
|
||||
setDefaultCaCertificates(systemCaCertificates());
|
||||
} else {
|
||||
qCWarning(lcSsl) << "SSLCreateContext failed";
|
||||
s_loadedCiphersAndCerts = false;
|
||||
}
|
||||
|
||||
@ -656,11 +934,7 @@ bool QSslSocketBackendPrivate::initSslContext()
|
||||
Q_ASSERT_X(!context, Q_FUNC_INFO, "invalid socket state, context is not null");
|
||||
Q_ASSERT(plainSocket);
|
||||
|
||||
SSLProtocolSide side = kSSLClientSide;
|
||||
if (mode == QSslSocket::SslServerMode)
|
||||
side = kSSLServerSide;
|
||||
|
||||
context = SSLCreateContext(Q_NULLPTR, side, kSSLStreamType);
|
||||
context.reset(qt_createSecureTransportContext(mode));
|
||||
if (!context) {
|
||||
setErrorAndEmit(QAbstractSocket::SslInternalError, "SSLCreateContext failed");
|
||||
return false;
|
||||
@ -756,7 +1030,7 @@ bool QSslSocketBackendPrivate::initSslContext()
|
||||
|
||||
void QSslSocketBackendPrivate::destroySslContext()
|
||||
{
|
||||
context = Q_NULLPTR;
|
||||
context.reset(Q_NULLPTR);
|
||||
}
|
||||
|
||||
static QByteArray _q_makePkcs12(const QList<QSslCertificate> &certs, const QSslKey &key, const QString &passPhrase);
|
||||
@ -853,8 +1127,6 @@ bool QSslSocketBackendPrivate::setSessionProtocol()
|
||||
{
|
||||
Q_ASSERT_X(context, Q_FUNC_INFO, "invalid SSL context (null)");
|
||||
|
||||
OSStatus err = noErr;
|
||||
|
||||
// QSsl::SslV2 == kSSLProtocol2 is disabled in secure transport and
|
||||
// always fails with errSSLIllegalParam:
|
||||
// if (version < MINIMUM_STREAM_VERSION || version > MAXIMUM_STREAM_VERSION)
|
||||
@ -865,85 +1137,20 @@ bool QSslSocketBackendPrivate::setSessionProtocol()
|
||||
return false;
|
||||
}
|
||||
|
||||
if (configuration.protocol == QSsl::SslV3) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : SSLv3";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kSSLProtocol3);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_0) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.0";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol1);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_1) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.1";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol11);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol11);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_2) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol12);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::AnyProtocol) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : any";
|
||||
#endif
|
||||
// kSSLProtocol3, since kSSLProtocol2 is disabled:
|
||||
err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::TlsV1SslV3) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : SSLv3 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::SecureProtocols) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_0OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_1OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.1 - TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol11);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else if (configuration.protocol == QSsl::TlsV1_2OrLater) {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.2";
|
||||
#endif
|
||||
err = SSLSetProtocolVersionMin(context, kTLSProtocol12);
|
||||
if (err == noErr)
|
||||
err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
|
||||
} else {
|
||||
#ifdef QSSLSOCKET_DEBUG
|
||||
qCDebug(lcSsl) << plainSocket << "no protocol version found in the configuration";
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
#ifndef Q_OS_OSX
|
||||
return qt_setSessionProtocol(context, configuration, plainSocket);
|
||||
#else
|
||||
|
||||
return err == noErr;
|
||||
#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_8, __IPHONE_NA)
|
||||
if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) {
|
||||
return qt_setSessionProtocol(context, configuration, plainSocket);
|
||||
} else {
|
||||
#else
|
||||
{
|
||||
#endif
|
||||
return qt_setSessionProtocolOSX(context, configuration, plainSocket);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool QSslSocketBackendPrivate::canIgnoreTrustVerificationFailure() const
|
||||
|
@ -45,8 +45,6 @@
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include <QtCore/private/qcore_mac_p.h>
|
||||
|
||||
#include <QtCore/qstring.h>
|
||||
#include <QtCore/qglobal.h>
|
||||
#include <QtCore/qlist.h>
|
||||
@ -59,6 +57,20 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QSecureTransportContext
|
||||
{
|
||||
public:
|
||||
explicit QSecureTransportContext(SSLContextRef context);
|
||||
~QSecureTransportContext();
|
||||
|
||||
operator SSLContextRef () const;
|
||||
void reset(SSLContextRef newContext);
|
||||
private:
|
||||
SSLContextRef context;
|
||||
|
||||
Q_DISABLE_COPY(QSecureTransportContext);
|
||||
};
|
||||
|
||||
class QSslSocketBackendPrivate : public QSslSocketPrivate
|
||||
{
|
||||
Q_DECLARE_PUBLIC(QSslSocket)
|
||||
@ -76,8 +88,8 @@ public:
|
||||
void startServerEncryption() Q_DECL_OVERRIDE;
|
||||
void transmit() Q_DECL_OVERRIDE;
|
||||
|
||||
static QList<QSslError> (verify)(QList<QSslCertificate> certificateChain,
|
||||
const QString &hostName);
|
||||
static QList<QSslError> verify(QList<QSslCertificate> certificateChain,
|
||||
const QString &hostName);
|
||||
|
||||
static bool importPkcs12(QIODevice *device,
|
||||
QSslKey *key, QSslCertificate *cert,
|
||||
@ -101,7 +113,7 @@ private:
|
||||
bool checkSslErrors();
|
||||
bool startHandshake();
|
||||
|
||||
mutable QCFType<SSLContextRef> context;
|
||||
QSecureTransportContext context;
|
||||
|
||||
Q_DISABLE_COPY(QSslSocketBackendPrivate);
|
||||
};
|
||||
|
@ -71,6 +71,7 @@ QOpenGLCompositorBackingStore::QOpenGLCompositorBackingStore(QWindow *window)
|
||||
: QPlatformBackingStore(window),
|
||||
m_window(window),
|
||||
m_bsTexture(0),
|
||||
m_bsTextureContext(0),
|
||||
m_textures(new QPlatformTextureList),
|
||||
m_lockedWidgetTextures(0)
|
||||
{
|
||||
@ -78,6 +79,14 @@ QOpenGLCompositorBackingStore::QOpenGLCompositorBackingStore(QWindow *window)
|
||||
|
||||
QOpenGLCompositorBackingStore::~QOpenGLCompositorBackingStore()
|
||||
{
|
||||
if (m_bsTexture) {
|
||||
QOpenGLContext *ctx = QOpenGLContext::currentContext();
|
||||
if (ctx && m_bsTextureContext && ctx->shareGroup() == m_bsTextureContext->shareGroup())
|
||||
glDeleteTextures(1, &m_bsTexture);
|
||||
else
|
||||
qWarning("QOpenGLCompositorBackingStore: Texture is not valid in the current context");
|
||||
}
|
||||
|
||||
delete m_textures;
|
||||
}
|
||||
|
||||
@ -89,6 +98,8 @@ QPaintDevice *QOpenGLCompositorBackingStore::paintDevice()
|
||||
void QOpenGLCompositorBackingStore::updateTexture()
|
||||
{
|
||||
if (!m_bsTexture) {
|
||||
m_bsTextureContext = QOpenGLContext::currentContext();
|
||||
Q_ASSERT(m_bsTextureContext);
|
||||
glGenTextures(1, &m_bsTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, m_bsTexture);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
|
@ -83,6 +83,7 @@ private:
|
||||
QImage m_image;
|
||||
QRegion m_dirty;
|
||||
uint m_bsTexture;
|
||||
QOpenGLContext *m_bsTextureContext;
|
||||
QPlatformTextureList *m_textures;
|
||||
QPlatformTextureList *m_lockedWidgetTextures;
|
||||
};
|
||||
|
@ -1,5 +1,7 @@
|
||||
TEMPLATE = subdirs
|
||||
|
||||
load(qfeatures)
|
||||
|
||||
contains(QT_CONFIG, evdev) {
|
||||
SUBDIRS += evdevmouse evdevtouch evdevkeyboard evdevtablet
|
||||
}
|
||||
@ -8,7 +10,9 @@ contains(QT_CONFIG, tslib) {
|
||||
SUBDIRS += tslib
|
||||
}
|
||||
|
||||
SUBDIRS += tuiotouch
|
||||
!contains(QT_DISABLED_FEATURES, udpsocket) {
|
||||
SUBDIRS += tuiotouch
|
||||
}
|
||||
|
||||
contains(QT_CONFIG, libinput) {
|
||||
SUBDIRS += libinput
|
||||
|
@ -351,6 +351,7 @@
|
||||
{
|
||||
QWindowSystemInterface::handleKeyEvent(qApp->focusWindow(), QEvent::KeyPress, key, modifiers);
|
||||
QWindowSystemInterface::handleKeyEvent(qApp->focusWindow(), QEvent::KeyRelease, key, modifiers);
|
||||
QWindowSystemInterface::flushWindowSystemEvents();
|
||||
}
|
||||
|
||||
#ifndef QT_NO_SHORTCUT
|
||||
@ -898,7 +899,6 @@
|
||||
// UITextInput selects the text to be deleted before calling this method. To avoid
|
||||
// drawing the selection, we flush after posting the key press/release.
|
||||
[self sendKeyPressRelease:Qt::Key_Backspace modifiers:Qt::NoModifier];
|
||||
QWindowSystemInterface::flushWindowSystemEvents();
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -1633,7 +1633,7 @@ void QWin32PrintEnginePrivate::updatePageLayout()
|
||||
|
||||
// Update orientation first as is needed to obtain printable margins when changing page size
|
||||
m_pageLayout.setOrientation(devMode->dmOrientation == DMORIENT_LANDSCAPE ? QPageLayout::Landscape : QPageLayout::Portrait);
|
||||
if (devMode->dmPaperSize >= DMPAPER_USER) {
|
||||
if (devMode->dmPaperSize >= DMPAPER_LAST) {
|
||||
// Is a custom size
|
||||
QPageSize pageSize = QPageSize(QSizeF(devMode->dmPaperWidth / 10.0f, devMode->dmPaperLength / 10.0f),
|
||||
QPageSize::Millimeter);
|
||||
|
@ -1971,6 +1971,8 @@ void QFileDialog::setIconProvider(QFileIconProvider *provider)
|
||||
QFileIconProvider *QFileDialog::iconProvider() const
|
||||
{
|
||||
Q_D(const QFileDialog);
|
||||
if (!d->model)
|
||||
return Q_NULLPTR;
|
||||
return d->model->iconProvider();
|
||||
}
|
||||
|
||||
|
@ -2241,8 +2241,10 @@ void QApplicationPrivate::notifyActiveWindowChange(QWindow *previous)
|
||||
QApplication::setActiveWindow(tlw);
|
||||
// QTBUG-37126, Active X controls may set the focus on native child widgets.
|
||||
if (wnd && tlw && wnd != tlw->windowHandle()) {
|
||||
if (QWidgetWindow *widgetWindow = qobject_cast<QWidgetWindow *>(wnd))
|
||||
widgetWindow->widget()->setFocus(Qt::ActiveWindowFocusReason);
|
||||
if (QWidgetWindow *widgetWindow = qobject_cast<QWidgetWindow *>(wnd)) {
|
||||
if (widgetWindow->widget()->inherits("QAxHostWidget"))
|
||||
widgetWindow->widget()->setFocus(Qt::ActiveWindowFocusReason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -73,6 +73,7 @@
|
||||
#include <QtGui/qinputmethod.h>
|
||||
#include <QtGui/qopenglcontext.h>
|
||||
#include <QtGui/private/qopenglcontext_p.h>
|
||||
#include <QtGui/qoffscreensurface.h>
|
||||
|
||||
#include <private/qgraphicseffect_p.h>
|
||||
#include <qbackingstore.h>
|
||||
@ -1822,26 +1823,49 @@ void QWidgetPrivate::deleteSysExtra()
|
||||
{
|
||||
}
|
||||
|
||||
static void deleteBackingStore(QWidgetPrivate *d)
|
||||
{
|
||||
QTLWExtra *topData = d->topData();
|
||||
|
||||
// The context must be current when destroying the backing store as it may attempt to
|
||||
// release resources like textures and shader programs. The window may not be suitable
|
||||
// anymore as there will often not be a platform window underneath at this stage. Fall
|
||||
// back to a QOffscreenSurface in this case.
|
||||
QScopedPointer<QOffscreenSurface> tempSurface;
|
||||
#ifndef QT_NO_OPENGL
|
||||
if (d->textureChildSeen && topData->shareContext) {
|
||||
if (topData->window->handle()) {
|
||||
topData->shareContext->makeCurrent(topData->window);
|
||||
} else {
|
||||
tempSurface.reset(new QOffscreenSurface);
|
||||
tempSurface->setFormat(topData->shareContext->format());
|
||||
tempSurface->create();
|
||||
topData->shareContext->makeCurrent(tempSurface.data());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
delete topData->backingStore;
|
||||
topData->backingStore = 0;
|
||||
|
||||
#ifndef QT_NO_OPENGL
|
||||
if (d->textureChildSeen && topData->shareContext)
|
||||
topData->shareContext->doneCurrent();
|
||||
#endif
|
||||
}
|
||||
|
||||
void QWidgetPrivate::deleteTLSysExtra()
|
||||
{
|
||||
if (extra && extra->topextra) {
|
||||
//the qplatformbackingstore may hold a reference to the window, so the backingstore
|
||||
//needs to be deleted first. If the backingstore holds GL resources, we need to
|
||||
// make the context current here, since the platform bs does not have a reference
|
||||
// to the widget.
|
||||
// make the context current here. This is taken care of by deleteBackingStore().
|
||||
|
||||
#ifndef QT_NO_OPENGL
|
||||
if (textureChildSeen && extra->topextra->shareContext)
|
||||
extra->topextra->shareContext->makeCurrent(extra->topextra->window);
|
||||
#endif
|
||||
extra->topextra->backingStoreTracker.destroy();
|
||||
delete extra->topextra->backingStore;
|
||||
extra->topextra->backingStore = 0;
|
||||
deleteBackingStore(this);
|
||||
#ifndef QT_NO_OPENGL
|
||||
qDeleteAll(extra->topextra->widgetTextures);
|
||||
extra->topextra->widgetTextures.clear();
|
||||
if (textureChildSeen && extra->topextra->shareContext)
|
||||
extra->topextra->shareContext->doneCurrent();
|
||||
delete extra->topextra->shareContext;
|
||||
extra->topextra->shareContext = 0;
|
||||
#endif
|
||||
@ -12013,7 +12037,7 @@ void QWidget::setBackingStore(QBackingStore *store)
|
||||
return;
|
||||
|
||||
QBackingStore *oldStore = topData->backingStore;
|
||||
delete topData->backingStore;
|
||||
deleteBackingStore(d);
|
||||
topData->backingStore = store;
|
||||
|
||||
QWidgetBackingStore *bs = d->maybeBackingStore();
|
||||
|
@ -165,6 +165,7 @@ private slots:
|
||||
#endif // QT_BUILD_INTERNAL
|
||||
#endif
|
||||
void rejectModalDialogs();
|
||||
void QTBUG49600_nativeIconProviderCrash();
|
||||
|
||||
private:
|
||||
void cleanupSettingsFile();
|
||||
@ -1487,5 +1488,13 @@ void tst_QFiledialog::rejectModalDialogs()
|
||||
QVERIFY(file.isEmpty());
|
||||
}
|
||||
|
||||
void tst_QFiledialog::QTBUG49600_nativeIconProviderCrash()
|
||||
{
|
||||
if (!QGuiApplicationPrivate::platformTheme()->usePlatformNativeDialog(QPlatformTheme::FileDialog))
|
||||
QSKIP("This platform always uses widgets to realize its QFileDialog, instead of the native file dialog.");
|
||||
QFileDialog fd;
|
||||
fd.iconProvider();
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QFiledialog)
|
||||
#include "tst_qfiledialog.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user