qt5.güncellendi
This commit is contained in:
		
							parent
							
								
									2f1b4ac9db
								
							
						
					
					
						commit
						666e598418
					
				
					 11 changed files with 124 additions and 679 deletions
				
			
		| 
						 | 
				
			
			@ -1,10 +0,0 @@
 | 
			
		|||
--- qtbase-opensource-src-5.6.0-rc/config.tests/unix/alsa/alsatest.cpp.0	2016-02-29 08:15:48.203031809 +0000
 | 
			
		||||
+++ qtbase-opensource-src-5.6.0-rc/config.tests/unix/alsa/alsatest.cpp	2016-02-29 08:16:39.712811962 +0000
 | 
			
		||||
@@ -32,7 +32,7 @@
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 
 | 
			
		||||
 #include <alsa/asoundlib.h>
 | 
			
		||||
-#if(!(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 10))
 | 
			
		||||
+#if(!(SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 10)))
 | 
			
		||||
 #error "Alsa version found too old, require >= 1.0.10"
 | 
			
		||||
 #endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,49 +0,0 @@
 | 
			
		|||
diff -ur qtwebengine-opensource-src-5.6.0-beta/src/3rdparty/chromium/net/socket/ssl_client_socket_openssl.cc 
 | 
			
		||||
qtwebengine-opensource-src-5.6.0-beta-chimera-nss-init/src/3rdparty/chromium/net/socket/ssl_client_socket_openssl.cc
 | 
			
		||||
--- qtwebengine-opensource-src-5.6.0-beta/src/3rdparty/chromium/net/socket/ssl_client_socket_openssl.cc	2015-12-10 18:17:21.000000000 +0100
 | 
			
		||||
+++ qtwebengine-opensource-src-5.6.0-beta-chimera-nss-init/src/3rdparty/chromium/net/socket/ssl_client_socket_openssl.cc	2016-01-14 
 | 
			
		||||
17:11:38.432633534 +0100
 | 
			
		||||
@@ -57,6 +57,10 @@
 | 
			
		||||
 #include "net/ssl/ssl_platform_key.h"
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
+#if defined(USE_NSS_CERTS) || defined(OS_IOS)
 | 
			
		||||
+#include "net/cert_net/nss_ocsp.h"
 | 
			
		||||
+#endif
 | 
			
		||||
+
 | 
			
		||||
 namespace net {
 | 
			
		||||
 
 | 
			
		||||
 namespace {
 | 
			
		||||
@@ -795,6 +799,14 @@
 | 
			
		||||
   DCHECK(!ssl_);
 | 
			
		||||
   DCHECK(!transport_bio_);
 | 
			
		||||
 
 | 
			
		||||
+#if defined(USE_NSS_CERTS) || defined(OS_IOS)
 | 
			
		||||
+  if (ssl_config_.cert_io_enabled) {
 | 
			
		||||
+    // TODO(davidben): Move this out of SSLClientSocket. See
 | 
			
		||||
+    // https://crbug.com/539520.
 | 
			
		||||
+    EnsureNSSHttpIOInit();
 | 
			
		||||
+  }
 | 
			
		||||
+#endif
 | 
			
		||||
+
 | 
			
		||||
   SSLContext* context = SSLContext::GetInstance();
 | 
			
		||||
   crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
 | 
			
		||||
   
 | 
			
		||||
diff -ur qtwebengine-opensource-src-5.6.0-beta/src/core/config/linux.pri qtwebengine-opensource-src-5.6.0-beta-linux-pri/src/core/config/linux.pri
 | 
			
		||||
--- qtwebengine-opensource-src-5.6.0-beta/src/core/config/linux.pri	2015-12-14 16:27:24.000000000 +0100
 | 
			
		||||
+++ qtwebengine-opensource-src-5.6.0-beta-linux-pri/src/core/config/linux.pri	2016-01-14 17:31:05.765975551 +0100
 | 
			
		||||
@@ -18,7 +18,13 @@
 | 
			
		||||
     use_kerberos=0 \
 | 
			
		||||
     use_pango=0
 | 
			
		||||
 
 | 
			
		||||
-!use?(nss) {
 | 
			
		||||
+use?(nss) {
 | 
			
		||||
+# do a "chimera build" (BoringSSL code, NSS certs): This is the default in
 | 
			
		||||
+# Chromium 47+, and it is the only variant that works with NSS 3.21.
 | 
			
		||||
+    GYP_CONFIG += use_nss_certs=1 \
 | 
			
		||||
+        use_openssl=1 \
 | 
			
		||||
+        use_openssl_certs=0
 | 
			
		||||
+} else {
 | 
			
		||||
     GYP_CONFIG += use_nss_certs=0 \
 | 
			
		||||
         use_openssl=1 \
 | 
			
		||||
         use_openssl_certs=1
 | 
			
		||||
| 
						 | 
				
			
			@ -1,100 +0,0 @@
 | 
			
		|||
From 60cd1c67759642018ef93cc45a90714729100d9d Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
 | 
			
		||||
Date: Thu, 28 Apr 2016 11:30:30 +0200
 | 
			
		||||
Subject: [PATCH] xcb: don't compress tablet motion events
 | 
			
		||||
 | 
			
		||||
7edd10e6c added this compression feature, but it's not a good idea for
 | 
			
		||||
drawing-tablet applications, because smooth drawing depends on receiving
 | 
			
		||||
every movement of the stylus.
 | 
			
		||||
 | 
			
		||||
Also show the device ID in qt.qpa.input.devices category logging.
 | 
			
		||||
 | 
			
		||||
[ChangeLog][X11] The new X event compression feature that was added in
 | 
			
		||||
5.6.0 no longer applies to motion events from drawing tablets.
 | 
			
		||||
 | 
			
		||||
Task-number: QTBUG-44964
 | 
			
		||||
Change-Id: Icd2ca8ca77d8f80c2f39160c74208db10e382501
 | 
			
		||||
Reviewed-by: Gatis Paeglis <gatis.paeglis@theqtcompany.com>
 | 
			
		||||
---
 | 
			
		||||
 src/plugins/platforms/xcb/qxcbconnection.cpp     |  7 ++++++-
 | 
			
		||||
 src/plugins/platforms/xcb/qxcbconnection.h       |  1 +
 | 
			
		||||
 src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | 21 ++++++++++++++-------
 | 
			
		||||
 3 files changed, 21 insertions(+), 8 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
 | 
			
		||||
index edfaf2b..669ef3a 100644
 | 
			
		||||
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
 | 
			
		||||
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
 | 
			
		||||
@@ -1626,8 +1626,13 @@ bool QXcbConnection::compressEvent(xcb_generic_event_t *event, int currentIndex,
 | 
			
		||||
         if (!m_xi2Enabled)
 | 
			
		||||
             return false;
 | 
			
		||||
 
 | 
			
		||||
-        // compress XI_Motion
 | 
			
		||||
+        // compress XI_Motion, but not from tablet devices
 | 
			
		||||
         if (isXIType(event, m_xiOpCode, XI_Motion)) {
 | 
			
		||||
+#ifndef QT_NO_TABLETEVENT
 | 
			
		||||
+            xXIDeviceEvent *xdev = reinterpret_cast<xXIDeviceEvent *>(event);
 | 
			
		||||
+            if (const_cast<QXcbConnection *>(this)->tabletDataForDevice(xdev->sourceid))
 | 
			
		||||
+                return false;
 | 
			
		||||
+#endif // QT_NO_TABLETEVENT
 | 
			
		||||
             for (int j = nextIndex; j < eventqueue->size(); ++j) {
 | 
			
		||||
                 xcb_generic_event_t *next = eventqueue->at(j);
 | 
			
		||||
                 if (!isValid(next))
 | 
			
		||||
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
 | 
			
		||||
index 7ba9588..501da1c 100644
 | 
			
		||||
--- a/src/plugins/platforms/xcb/qxcbconnection.h
 | 
			
		||||
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
 | 
			
		||||
@@ -578,6 +578,7 @@ private slots:
 | 
			
		||||
     bool xi2HandleTabletEvent(void *event, TabletData *tabletData, QXcbWindowEventListener *eventListener);
 | 
			
		||||
     void xi2ReportTabletEvent(TabletData &tabletData, void *event);
 | 
			
		||||
     QVector<TabletData> m_tabletData;
 | 
			
		||||
+    TabletData *tabletDataForDevice(int id);
 | 
			
		||||
 #endif // !QT_NO_TABLETEVENT
 | 
			
		||||
     struct ScrollingDevice {
 | 
			
		||||
         ScrollingDevice() : deviceId(0), verticalIndex(0), horizontalIndex(0), orientations(0), legacyOrientations(0) { }
 | 
			
		||||
diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
 | 
			
		||||
index 9911afb..025dde3 100644
 | 
			
		||||
--- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
 | 
			
		||||
+++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
 | 
			
		||||
@@ -113,7 +113,7 @@ void QXcbConnection::xi2SetupDevices()
 | 
			
		||||
         // Only non-master pointing devices are relevant here.
 | 
			
		||||
         if (devices[i].use != XISlavePointer)
 | 
			
		||||
             continue;
 | 
			
		||||
-        qCDebug(lcQpaXInputDevices) << "input device "<< devices[i].name;
 | 
			
		||||
+        qCDebug(lcQpaXInputDevices) << "input device " << devices[i].name << "ID" << devices[i].deviceid;
 | 
			
		||||
 #ifndef QT_NO_TABLETEVENT
 | 
			
		||||
         TabletData tabletData;
 | 
			
		||||
 #endif
 | 
			
		||||
@@ -507,12 +507,9 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event)
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
 #ifndef QT_NO_TABLETEVENT
 | 
			
		||||
-    for (int i = 0; i < m_tabletData.count(); ++i) {
 | 
			
		||||
-        if (m_tabletData.at(i).deviceId == sourceDeviceId) {
 | 
			
		||||
-            if (xi2HandleTabletEvent(xiEvent, &m_tabletData[i], eventListener))
 | 
			
		||||
-                return;
 | 
			
		||||
-        }
 | 
			
		||||
-    }
 | 
			
		||||
+    QXcbConnection::TabletData *tablet = tabletDataForDevice(sourceDeviceId);
 | 
			
		||||
+    if (tablet && xi2HandleTabletEvent(xiEvent, tablet, eventListener))
 | 
			
		||||
+        return;
 | 
			
		||||
 #endif // QT_NO_TABLETEVENT
 | 
			
		||||
 
 | 
			
		||||
 #ifdef XCB_USE_XINPUT21
 | 
			
		||||
@@ -1198,6 +1195,16 @@ void QXcbConnection::xi2ReportTabletEvent(TabletData &tabletData, void *event)
 | 
			
		||||
                                               xTilt, yTilt, tangentialPressure,
 | 
			
		||||
                                               rotation, 0, tabletData.serialId);
 | 
			
		||||
 }
 | 
			
		||||
+
 | 
			
		||||
+QXcbConnection::TabletData *QXcbConnection::tabletDataForDevice(int id)
 | 
			
		||||
+{
 | 
			
		||||
+    for (int i = 0; i < m_tabletData.count(); ++i) {
 | 
			
		||||
+        if (m_tabletData.at(i).deviceId == id)
 | 
			
		||||
+            return &m_tabletData[i];
 | 
			
		||||
+    }
 | 
			
		||||
+    return Q_NULLPTR;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 #endif // QT_NO_TABLETEVENT
 | 
			
		||||
 
 | 
			
		||||
 #endif // XCB_USE_XINPUT2
 | 
			
		||||
| 
						 | 
				
			
			@ -1,97 +0,0 @@
 | 
			
		|||
From 269fdbdd2bedda5f5eacb751224d3a3fc3eed5bc Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Urs Fleisch <ufleisch@users.sourceforge.net>
 | 
			
		||||
Date: Fri, 26 Feb 2016 17:46:09 +0100
 | 
			
		||||
Subject: [PATCH] xcb: Fix drag and drop to applications like Emacs and
 | 
			
		||||
 Chromium.
 | 
			
		||||
MIME-Version: 1.0
 | 
			
		||||
Content-Type: text/plain; charset=UTF-8
 | 
			
		||||
Content-Transfer-Encoding: 8bit
 | 
			
		||||
 | 
			
		||||
Drops without matching time stamp do not work. I have fixed the issue by
 | 
			
		||||
reanimating the findXdndAwareParent() function (adapted to XCB) and
 | 
			
		||||
using it to find a matching transaction if all else fails.
 | 
			
		||||
 | 
			
		||||
Task-number: QTBUG-45812
 | 
			
		||||
Change-Id: Ibca15bbab02ccf2f25280418e9edf36972ebf9a0
 | 
			
		||||
Reviewed-by: Błażej Szczygieł <spaz16@wp.pl>
 | 
			
		||||
Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
 | 
			
		||||
Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
 | 
			
		||||
---
 | 
			
		||||
 src/plugins/platforms/xcb/qxcbdrag.cpp | 55 +++++++++++++++++++++++++++-------
 | 
			
		||||
 1 file changed, 44 insertions(+), 11 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
 | 
			
		||||
index f5cc873..f1428d0 100644
 | 
			
		||||
--- a/src/plugins/platforms/xcb/qxcbdrag.cpp
 | 
			
		||||
+++ b/src/plugins/platforms/xcb/qxcbdrag.cpp
 | 
			
		||||
@@ -1072,6 +1072,40 @@ void QXcbDrag::cancel()
 | 
			
		||||
         send_leave();
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+// find an ancestor with XdndAware on it
 | 
			
		||||
+static xcb_window_t findXdndAwareParent(QXcbConnection *c, xcb_window_t window)
 | 
			
		||||
+{
 | 
			
		||||
+    xcb_window_t target = 0;
 | 
			
		||||
+    forever {
 | 
			
		||||
+        // check if window has XdndAware
 | 
			
		||||
+        xcb_get_property_cookie_t gpCookie = Q_XCB_CALL(
 | 
			
		||||
+            xcb_get_property(c->xcb_connection(), false, window,
 | 
			
		||||
+                             c->atom(QXcbAtom::XdndAware), XCB_GET_PROPERTY_TYPE_ANY, 0, 0));
 | 
			
		||||
+        xcb_get_property_reply_t *gpReply = xcb_get_property_reply(
 | 
			
		||||
+            c->xcb_connection(), gpCookie, 0);
 | 
			
		||||
+        bool aware = gpReply && gpReply->type != XCB_NONE;
 | 
			
		||||
+        free(gpReply);
 | 
			
		||||
+        if (aware) {
 | 
			
		||||
+            target = window;
 | 
			
		||||
+            break;
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        // try window's parent
 | 
			
		||||
+        xcb_query_tree_cookie_t qtCookie = Q_XCB_CALL(
 | 
			
		||||
+            xcb_query_tree_unchecked(c->xcb_connection(), window));
 | 
			
		||||
+        xcb_query_tree_reply_t *qtReply = xcb_query_tree_reply(
 | 
			
		||||
+            c->xcb_connection(), qtCookie, NULL);
 | 
			
		||||
+        if (!qtReply)
 | 
			
		||||
+            break;
 | 
			
		||||
+        xcb_window_t root = qtReply->root;
 | 
			
		||||
+        xcb_window_t parent = qtReply->parent;
 | 
			
		||||
+        free(qtReply);
 | 
			
		||||
+        if (window == root)
 | 
			
		||||
+            break;
 | 
			
		||||
+        window = parent;
 | 
			
		||||
+    }
 | 
			
		||||
+    return target;
 | 
			
		||||
+}
 | 
			
		||||
 
 | 
			
		||||
 void QXcbDrag::handleSelectionRequest(const xcb_selection_request_event_t *event)
 | 
			
		||||
 {
 | 
			
		||||
@@ -1099,17 +1133,16 @@ void QXcbDrag::handleSelectionRequest(const xcb_selection_request_event_t *event
 | 
			
		||||
             // xcb_convert_selection() that we sent the XdndDrop event to.
 | 
			
		||||
             at = findTransactionByWindow(event->requestor);
 | 
			
		||||
         }
 | 
			
		||||
-//        if (at == -1 && event->time == XCB_CURRENT_TIME) {
 | 
			
		||||
-//            // previous Qt versions always requested the data on a child of the target window
 | 
			
		||||
-//            // using CurrentTime... but it could be asking for either drop data or the current drag's data
 | 
			
		||||
-//            Window target = findXdndAwareParent(event->requestor);
 | 
			
		||||
-//            if (target) {
 | 
			
		||||
-//                if (current_target && current_target == target)
 | 
			
		||||
-//                    at = -2;
 | 
			
		||||
-//                else
 | 
			
		||||
-//                    at = findXdndDropTransactionByWindow(target);
 | 
			
		||||
-//            }
 | 
			
		||||
-//        }
 | 
			
		||||
+
 | 
			
		||||
+        if (at == -1 && event->time == XCB_CURRENT_TIME) {
 | 
			
		||||
+            xcb_window_t target = findXdndAwareParent(connection(), event->requestor);
 | 
			
		||||
+            if (target) {
 | 
			
		||||
+                if (current_target == target)
 | 
			
		||||
+                    at = -2;
 | 
			
		||||
+                else
 | 
			
		||||
+                    at = findTransactionByWindow(target);
 | 
			
		||||
+            }
 | 
			
		||||
+        }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     QDrag *transactionDrag = 0;
 | 
			
		||||
-- 
 | 
			
		||||
2.7.1
 | 
			
		||||
| 
						 | 
				
			
			@ -1,87 +0,0 @@
 | 
			
		|||
From b024fbe83863fc57364a52c717d5b43d654bdb5d Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Weng Xuetian <wengxt@gmail.com>
 | 
			
		||||
Date: Sat, 5 Mar 2016 12:23:21 -0800
 | 
			
		||||
Subject: [PATCH] QtDBus: clean up signal hooks and object tree in
 | 
			
		||||
 closeConnection
 | 
			
		||||
 | 
			
		||||
If a QObject is added or passed as receiver to QDBusConnection::connect()
 | 
			
		||||
and it is managed by Q_GLOBAL_STATIC or similar mechanism, it is
 | 
			
		||||
possible that when that its destructor is called after the dbus daemon
 | 
			
		||||
thread ends. In that case, QObject::destroyed connected via
 | 
			
		||||
Qt::BlockingQueuedConnection to QDBusConnectionPrivate will cause dead
 | 
			
		||||
lock since the thread is no longer processing events.
 | 
			
		||||
 | 
			
		||||
Task-number: QTBUG-51648
 | 
			
		||||
Change-Id: I1a1810a6d6d0234af0269d5f3fc1f54101bf1547
 | 
			
		||||
---
 | 
			
		||||
 src/dbus/qdbusconnection_p.h |  1 +
 | 
			
		||||
 src/dbus/qdbusintegrator.cpp | 28 +++++++++++++++++++++++++++-
 | 
			
		||||
 2 files changed, 28 insertions(+), 1 deletion(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h
 | 
			
		||||
index c77daf7..565eb83 100644
 | 
			
		||||
--- a/src/dbus/qdbusconnection_p.h
 | 
			
		||||
+++ b/src/dbus/qdbusconnection_p.h
 | 
			
		||||
@@ -254,6 +254,7 @@ private:
 | 
			
		||||
                      const QVector<int> &metaTypes, int slotIdx);
 | 
			
		||||
 
 | 
			
		||||
     SignalHookHash::Iterator removeSignalHookNoLock(SignalHookHash::Iterator it);
 | 
			
		||||
+    void disconnectObjectTree(ObjectTreeNode &node);
 | 
			
		||||
 
 | 
			
		||||
     bool isServiceRegisteredByThread(const QString &serviceName);
 | 
			
		||||
 
 | 
			
		||||
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
index cd44861..a3cd47b 100644
 | 
			
		||||
--- a/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
+++ b/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
@@ -1030,7 +1030,6 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate()
 | 
			
		||||
                  qPrintable(name));
 | 
			
		||||
 
 | 
			
		||||
     closeConnection();
 | 
			
		||||
-    rootNode.children.clear();  // free resources
 | 
			
		||||
     qDeleteAll(cachedMetaObjects);
 | 
			
		||||
 
 | 
			
		||||
     if (mode == ClientMode || mode == PeerMode) {
 | 
			
		||||
@@ -1052,6 +1051,20 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate()
 | 
			
		||||
     }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+void QDBusConnectionPrivate::disconnectObjectTree(QDBusConnectionPrivate::ObjectTreeNode &haystack)
 | 
			
		||||
+{
 | 
			
		||||
+    QDBusConnectionPrivate::ObjectTreeNode::DataList::Iterator it = haystack.children.begin();
 | 
			
		||||
+
 | 
			
		||||
+    while (it != haystack.children.end()) {
 | 
			
		||||
+        disconnectObjectTree(*it);
 | 
			
		||||
+        it++;
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    if (haystack.obj) {
 | 
			
		||||
+        haystack.obj->disconnect(this);
 | 
			
		||||
+    }
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 void QDBusConnectionPrivate::closeConnection()
 | 
			
		||||
 {
 | 
			
		||||
     QDBusWriteLocker locker(CloseConnectionAction, this);
 | 
			
		||||
@@ -1075,6 +1088,19 @@ void QDBusConnectionPrivate::closeConnection()
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     qDeleteAll(pendingCalls);
 | 
			
		||||
+
 | 
			
		||||
+    // clean up all signal hook and object tree, to avoid QObject::destroyed
 | 
			
		||||
+    // being activated to dbus daemon thread which already quits.
 | 
			
		||||
+    // dbus connection is already closed, so there is nothing we could do be clean
 | 
			
		||||
+    // up everything here.
 | 
			
		||||
+    SignalHookHash::iterator sit = signalHooks.begin();
 | 
			
		||||
+    while (sit != signalHooks.end()) {
 | 
			
		||||
+        sit.value().obj->disconnect(this);
 | 
			
		||||
+        sit++;
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    disconnectObjectTree(rootNode);
 | 
			
		||||
+    rootNode.children.clear();  // free resources
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void QDBusConnectionPrivate::checkThread()
 | 
			
		||||
-- 
 | 
			
		||||
2.7.1
 | 
			
		||||
| 
						 | 
				
			
			@ -1,158 +0,0 @@
 | 
			
		|||
From acde2e69df5dedc624674107596f276125e22864 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Weng Xuetian <wengxt@gmail.com>
 | 
			
		||||
Date: Thu, 3 Mar 2016 21:56:53 -0800
 | 
			
		||||
Subject: [PATCH] QtDBus: finish all pending call with error if disconnected
 | 
			
		||||
 | 
			
		||||
libdbus will send a local signal if connection gets disconnected. When
 | 
			
		||||
this happens, end all pending calls with QDBusError::Disconnected.
 | 
			
		||||
 | 
			
		||||
Task-number: QTBUG-51649
 | 
			
		||||
Change-Id: I5c7d2a468bb5da746d0c0e53e458c1e376f186a9
 | 
			
		||||
---
 | 
			
		||||
 src/dbus/dbus_minimal_p.h                          |  2 ++
 | 
			
		||||
 src/dbus/qdbusintegrator.cpp                       | 26 +++++++++++++++++-----
 | 
			
		||||
 src/dbus/qdbusutil_p.h                             |  6 +++++
 | 
			
		||||
 .../dbus/qdbusconnection/tst_qdbusconnection.cpp   | 22 ++++++++++++++++++
 | 
			
		||||
 .../dbus/qdbusconnection/tst_qdbusconnection.h     |  1 +
 | 
			
		||||
 5 files changed, 51 insertions(+), 6 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/dbus/dbus_minimal_p.h b/src/dbus/dbus_minimal_p.h
 | 
			
		||||
index f0a2954..8f25b24 100644
 | 
			
		||||
--- a/src/dbus/dbus_minimal_p.h
 | 
			
		||||
+++ b/src/dbus/dbus_minimal_p.h
 | 
			
		||||
@@ -99,9 +99,11 @@ typedef dbus_uint32_t  dbus_bool_t;
 | 
			
		||||
 /* dbus-shared.h */
 | 
			
		||||
 #define DBUS_SERVICE_DBUS      "org.freedesktop.DBus"
 | 
			
		||||
 #define DBUS_PATH_DBUS  "/org/freedesktop/DBus"
 | 
			
		||||
+#define DBUS_PATH_LOCAL "/org/freedesktop/DBus/Local"
 | 
			
		||||
 #define DBUS_INTERFACE_DBUS           "org.freedesktop.DBus"
 | 
			
		||||
 #define DBUS_INTERFACE_INTROSPECTABLE "org.freedesktop.DBus.Introspectable"
 | 
			
		||||
 #define DBUS_INTERFACE_PROPERTIES     "org.freedesktop.DBus.Properties"
 | 
			
		||||
+#define DBUS_INTERFACE_LOCAL "org.freedesktop.DBus.Local"
 | 
			
		||||
 
 | 
			
		||||
 #define DBUS_NAME_FLAG_ALLOW_REPLACEMENT 0x1 /**< Allow another service to become the primary owner if requested */
 | 
			
		||||
 #define DBUS_NAME_FLAG_REPLACE_EXISTING  0x2 /**< Request to replace the current primary owner */
 | 
			
		||||
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
index cd44861..320419f 100644
 | 
			
		||||
--- a/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
+++ b/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
@@ -519,6 +519,14 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg)
 | 
			
		||||
     switch (amsg.type()) {
 | 
			
		||||
     case QDBusMessage::SignalMessage:
 | 
			
		||||
         handleSignal(amsg);
 | 
			
		||||
+        // Check local disconnected signal from libdbus
 | 
			
		||||
+        if (amsg.interface() == QDBusUtil::dbusInterfaceLocal()
 | 
			
		||||
+            && amsg.path() == QDBusUtil::dbusPathLocal()
 | 
			
		||||
+            && amsg.member() == QDBusUtil::disconnected()
 | 
			
		||||
+            && !QDBusMessagePrivate::isLocal(amsg)) {
 | 
			
		||||
+            while (!pendingCalls.isEmpty())
 | 
			
		||||
+                processFinishedCall(pendingCalls.first());
 | 
			
		||||
+        }
 | 
			
		||||
         // if there are any other filters in this DBusConnection,
 | 
			
		||||
         // let them see the signal too
 | 
			
		||||
         return false;
 | 
			
		||||
@@ -1767,10 +1775,16 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call)
 | 
			
		||||
 
 | 
			
		||||
     QDBusMessage &msg = call->replyMessage;
 | 
			
		||||
     if (call->pending) {
 | 
			
		||||
-        // decode the message
 | 
			
		||||
-        DBusMessage *reply = q_dbus_pending_call_steal_reply(call->pending);
 | 
			
		||||
-        msg = QDBusMessagePrivate::fromDBusMessage(reply, connection->capabilities);
 | 
			
		||||
-        q_dbus_message_unref(reply);
 | 
			
		||||
+        // when processFinishedCall is called and pending call is not completed,
 | 
			
		||||
+        // it means we received disconnected signal from libdbus
 | 
			
		||||
+        if (q_dbus_pending_call_get_completed(call->pending)) {
 | 
			
		||||
+            // decode the message
 | 
			
		||||
+            DBusMessage *reply = q_dbus_pending_call_steal_reply(call->pending);
 | 
			
		||||
+            msg = QDBusMessagePrivate::fromDBusMessage(reply, connection->capabilities);
 | 
			
		||||
+            q_dbus_message_unref(reply);
 | 
			
		||||
+        } else {
 | 
			
		||||
+            msg = QDBusMessage::createError(QDBusError::Disconnected, QDBusUtil::disconnectedErrorMessage());
 | 
			
		||||
+        }
 | 
			
		||||
     }
 | 
			
		||||
     qDBusDebug() << connection << "got message reply:" << msg;
 | 
			
		||||
 
 | 
			
		||||
@@ -2070,8 +2084,8 @@ void QDBusConnectionPrivate::sendInternal(QDBusPendingCallPrivate *pcall, void *
 | 
			
		||||
             pcall->pending = pending;
 | 
			
		||||
             q_dbus_pending_call_set_notify(pending, qDBusResultReceived, pcall, 0);
 | 
			
		||||
 
 | 
			
		||||
-            // DBus won't notify us when a peer disconnects so we need to track these ourselves
 | 
			
		||||
-            if (mode == QDBusConnectionPrivate::PeerMode)
 | 
			
		||||
+            // DBus won't notify us when a peer disconnects or server terminates so we need to track these ourselves
 | 
			
		||||
+            if (mode == QDBusConnectionPrivate::PeerMode || mode == QDBusConnectionPrivate::ClientMode)
 | 
			
		||||
                 pendingCalls.append(pcall);
 | 
			
		||||
 
 | 
			
		||||
             return;
 | 
			
		||||
diff --git a/src/dbus/qdbusutil_p.h b/src/dbus/qdbusutil_p.h
 | 
			
		||||
index 8f5ae92..ca70ff9 100644
 | 
			
		||||
--- a/src/dbus/qdbusutil_p.h
 | 
			
		||||
+++ b/src/dbus/qdbusutil_p.h
 | 
			
		||||
@@ -155,6 +155,8 @@ namespace QDBusUtil
 | 
			
		||||
     { return QStringLiteral(DBUS_SERVICE_DBUS); }
 | 
			
		||||
     inline QString dbusPath()
 | 
			
		||||
     { return QStringLiteral(DBUS_PATH_DBUS); }
 | 
			
		||||
+    inline QString dbusPathLocal()
 | 
			
		||||
+    { return QStringLiteral(DBUS_PATH_LOCAL); }
 | 
			
		||||
     inline QString dbusInterface()
 | 
			
		||||
     {
 | 
			
		||||
         // it's the same string, but just be sure
 | 
			
		||||
@@ -165,8 +167,12 @@ namespace QDBusUtil
 | 
			
		||||
     { return QStringLiteral(DBUS_INTERFACE_PROPERTIES); }
 | 
			
		||||
     inline QString dbusInterfaceIntrospectable()
 | 
			
		||||
     { return QStringLiteral(DBUS_INTERFACE_INTROSPECTABLE); }
 | 
			
		||||
+    inline QString dbusInterfaceLocal()
 | 
			
		||||
+    { return QStringLiteral(DBUS_INTERFACE_LOCAL); }
 | 
			
		||||
     inline QString nameOwnerChanged()
 | 
			
		||||
     { return QStringLiteral("NameOwnerChanged"); }
 | 
			
		||||
+    inline QString disconnected()
 | 
			
		||||
+    { return QStringLiteral("Disconnected"); }
 | 
			
		||||
     inline QString disconnectedErrorMessage()
 | 
			
		||||
     { return QStringLiteral("Not connected to D-Bus server"); }
 | 
			
		||||
 }
 | 
			
		||||
diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
 | 
			
		||||
index e91f87d..6c7e6b1 100644
 | 
			
		||||
--- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
 | 
			
		||||
+++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
 | 
			
		||||
@@ -1218,6 +1218,28 @@ void tst_QDBusConnection::callVirtualObjectLocal()
 | 
			
		||||
     QCOMPARE(obj.replyArguments, subPathReply.arguments());
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+void tst_QDBusConnection::pendingCallWhenDisconnected()
 | 
			
		||||
+{
 | 
			
		||||
+    QDBusServer *server = new QDBusServer;
 | 
			
		||||
+    QDBusConnection con = QDBusConnection::connectToPeer(server->address(), "disconnect");
 | 
			
		||||
+    QTestEventLoop::instance().enterLoop(2);
 | 
			
		||||
+    QVERIFY(!QTestEventLoop::instance().timeout());
 | 
			
		||||
+    QVERIFY(con.isConnected());
 | 
			
		||||
+
 | 
			
		||||
+    delete server;
 | 
			
		||||
+
 | 
			
		||||
+    // Make sure we call the method before we know it is disconnected.
 | 
			
		||||
+    QVERIFY(con.isConnected());
 | 
			
		||||
+    QDBusMessage message = QDBusMessage::createMethodCall("", "/", QString(), "method");
 | 
			
		||||
+    QDBusPendingCall reply = con.asyncCall(message);
 | 
			
		||||
+
 | 
			
		||||
+    QTestEventLoop::instance().enterLoop(2);
 | 
			
		||||
+    QVERIFY(!con.isConnected());
 | 
			
		||||
+    QVERIFY(reply.isFinished());
 | 
			
		||||
+    QVERIFY(reply.isError());
 | 
			
		||||
+    QVERIFY(reply.error().type() == QDBusError::Disconnected);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 QString MyObject::path;
 | 
			
		||||
 QString MyObjectWithoutInterface::path;
 | 
			
		||||
 QString MyObjectWithoutInterface::interface;
 | 
			
		||||
diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h
 | 
			
		||||
index a53ba32..720e484 100644
 | 
			
		||||
--- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h
 | 
			
		||||
+++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h
 | 
			
		||||
@@ -121,6 +121,7 @@ private slots:
 | 
			
		||||
     void registerVirtualObject();
 | 
			
		||||
     void callVirtualObject();
 | 
			
		||||
     void callVirtualObjectLocal();
 | 
			
		||||
+    void pendingCallWhenDisconnected();
 | 
			
		||||
 
 | 
			
		||||
 public:
 | 
			
		||||
     QString serviceName() const { return "org.qtproject.Qt.Autotests.QDBusConnection"; }
 | 
			
		||||
-- 
 | 
			
		||||
2.7.1
 | 
			
		||||
| 
						 | 
				
			
			@ -1,125 +0,0 @@
 | 
			
		|||
From 11c5e716b08b6b3c5a7c9fce96b0cde8624ec869 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Thiago Macieira <thiago.macieira@intel.com>
 | 
			
		||||
Date: Tue, 15 Mar 2016 11:00:20 -0700
 | 
			
		||||
Subject: [PATCH] Fix QtDBus deadlock inside kded/kiod
 | 
			
		||||
 | 
			
		||||
Whenever a message spy was installed, we failed to actually process
 | 
			
		||||
looped-back messages by queueing them for processing by the spy. That
 | 
			
		||||
had as a consequence that the caller got an error reply. Worse, since
 | 
			
		||||
the message had been queued, QtDBus would attempt to deliver it later.
 | 
			
		||||
Since that message had isLocal==true, bad things happened inside the
 | 
			
		||||
manager thread.
 | 
			
		||||
 | 
			
		||||
The correct solution is not to queue the message for the filter. If the
 | 
			
		||||
message is local, then simply deliver directly, as we're still in the
 | 
			
		||||
user's thread. This used to be the behavior in Qt 5.5.
 | 
			
		||||
 | 
			
		||||
Task-number: QTBUG-51676
 | 
			
		||||
Change-Id: I1dc112894cde7121e8ce302ae51b438ade1ff612
 | 
			
		||||
---
 | 
			
		||||
 src/dbus/qdbusintegrator.cpp | 42 ++++++++++++++++++++++++++++++++----------
 | 
			
		||||
 src/dbus/qdbusintegrator_p.h |  1 +
 | 
			
		||||
 2 files changed, 33 insertions(+), 10 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
index cd44861..478a2c4 100644
 | 
			
		||||
--- a/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
+++ b/src/dbus/qdbusintegrator.cpp
 | 
			
		||||
@@ -481,6 +481,11 @@ QDBusSpyCallEvent::~QDBusSpyCallEvent()
 | 
			
		||||
 
 | 
			
		||||
 void QDBusSpyCallEvent::placeMetaCall(QObject *)
 | 
			
		||||
 {
 | 
			
		||||
+    invokeSpyHooks(msg, hooks, hookCount);
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
+inline void QDBusSpyCallEvent::invokeSpyHooks(const QDBusMessage &msg, const Hook *hooks, int hookCount)
 | 
			
		||||
+{
 | 
			
		||||
     // call the spy hook list
 | 
			
		||||
     for (int i = 0; i < hookCount; ++i)
 | 
			
		||||
         hooks[i](msg);
 | 
			
		||||
@@ -509,7 +514,12 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg)
 | 
			
		||||
 {
 | 
			
		||||
     if (!ref.load())
 | 
			
		||||
         return false;
 | 
			
		||||
-    if (!dispatchEnabled && !QDBusMessagePrivate::isLocal(amsg)) {
 | 
			
		||||
+
 | 
			
		||||
+    // local message are always delivered, regardless of filtering
 | 
			
		||||
+    // or whether the dispatcher is enabled
 | 
			
		||||
+    bool isLocal = QDBusMessagePrivate::isLocal(amsg);
 | 
			
		||||
+
 | 
			
		||||
+    if (!dispatchEnabled && !isLocal) {
 | 
			
		||||
         // queue messages only, we'll handle them later
 | 
			
		||||
         qDBusDebug() << this << "delivery is suspended";
 | 
			
		||||
         pendingMessages << amsg;
 | 
			
		||||
@@ -523,13 +533,23 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg)
 | 
			
		||||
         // let them see the signal too
 | 
			
		||||
         return false;
 | 
			
		||||
     case QDBusMessage::MethodCallMessage:
 | 
			
		||||
-        // run it through the spy filters (if any) before the regular processing
 | 
			
		||||
+        // run it through the spy filters (if any) before the regular processing:
 | 
			
		||||
+        // a) if it's a local message, we're in the caller's thread, so invoke the filter directly
 | 
			
		||||
+        // b) if it's an external message, post to the main thread
 | 
			
		||||
         if (Q_UNLIKELY(qDBusSpyHookList.exists()) && qApp) {
 | 
			
		||||
             const QDBusSpyHookList &list = *qDBusSpyHookList;
 | 
			
		||||
-            qDBusDebug() << this << "invoking message spies";
 | 
			
		||||
-            QCoreApplication::postEvent(qApp, new QDBusSpyCallEvent(this, QDBusConnection(this),
 | 
			
		||||
-                                                                    amsg, list.constData(), list.size()));
 | 
			
		||||
-            return true;
 | 
			
		||||
+            if (isLocal) {
 | 
			
		||||
+                Q_ASSERT(QThread::currentThread() != thread());
 | 
			
		||||
+                qDBusDebug() << this << "invoking message spies directly";
 | 
			
		||||
+                QDBusSpyCallEvent::invokeSpyHooks(amsg, list.constData(), list.size());
 | 
			
		||||
+            } else {
 | 
			
		||||
+                qDBusDebug() << this << "invoking message spies via event";
 | 
			
		||||
+                QCoreApplication::postEvent(qApp, new QDBusSpyCallEvent(this, QDBusConnection(this),
 | 
			
		||||
+                                                                        amsg, list.constData(), list.size()));
 | 
			
		||||
+
 | 
			
		||||
+                // we'll be called back, so return
 | 
			
		||||
+                return true;
 | 
			
		||||
+            }
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         handleObjectCall(amsg);
 | 
			
		||||
@@ -1451,9 +1471,9 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg)
 | 
			
		||||
     // that means the dispatchLock mutex is locked
 | 
			
		||||
     // must not call out to user code in that case
 | 
			
		||||
     //
 | 
			
		||||
-    // however, if the message is internal, handleMessage was called
 | 
			
		||||
-    // directly and no lock is in place. We can therefore call out to
 | 
			
		||||
-    // user code, if necessary
 | 
			
		||||
+    // however, if the message is internal, handleMessage was called directly
 | 
			
		||||
+    // (user's thread) and no lock is in place. We can therefore call out to
 | 
			
		||||
+    // user code, if necessary.
 | 
			
		||||
     ObjectTreeNode result;
 | 
			
		||||
     int usedLength;
 | 
			
		||||
     QThread *objThread = 0;
 | 
			
		||||
@@ -1492,12 +1512,14 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg)
 | 
			
		||||
                                                            usedLength, msg));
 | 
			
		||||
             return;
 | 
			
		||||
         } else if (objThread != QThread::currentThread()) {
 | 
			
		||||
-            // synchronize with other thread
 | 
			
		||||
+            // looped-back message, targeting another thread:
 | 
			
		||||
+            // synchronize with it
 | 
			
		||||
             postEventToThread(HandleObjectCallPostEventAction, result.obj,
 | 
			
		||||
                               new QDBusActivateObjectEvent(QDBusConnection(this), this, result,
 | 
			
		||||
                                                            usedLength, msg, &sem));
 | 
			
		||||
             semWait = true;
 | 
			
		||||
         } else {
 | 
			
		||||
+            // looped-back message, targeting current thread
 | 
			
		||||
             semWait = false;
 | 
			
		||||
         }
 | 
			
		||||
     } // release the lock
 | 
			
		||||
diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h
 | 
			
		||||
index 2bbebdf..c0d9c22 100644
 | 
			
		||||
--- a/src/dbus/qdbusintegrator_p.h
 | 
			
		||||
+++ b/src/dbus/qdbusintegrator_p.h
 | 
			
		||||
@@ -145,6 +145,7 @@ public:
 | 
			
		||||
     {}
 | 
			
		||||
     ~QDBusSpyCallEvent();
 | 
			
		||||
     void placeMetaCall(QObject *) Q_DECL_OVERRIDE;
 | 
			
		||||
+    static inline void invokeSpyHooks(const QDBusMessage &msg, const Hook *hooks, int hookCount);
 | 
			
		||||
 
 | 
			
		||||
     QDBusConnection conn;   // keeps the refcount in QDBusConnectionPrivate up
 | 
			
		||||
     QDBusMessage msg;
 | 
			
		||||
-- 
 | 
			
		||||
2.7.1
 | 
			
		||||
| 
						 | 
				
			
			@ -269,3 +269,4 @@ index ea83510..ce72e7c 100644
 | 
			
		|||
+    }
 | 
			
		||||
 #endif // Q_OS_UNIX
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,3 +119,4 @@ index cb9581a..bfa967e 100644
 | 
			
		|||
+        stdTime = parsePosixTransitionTime(stdParts.at(1));
 | 
			
		||||
     else
 | 
			
		||||
         stdTime = QTime(2, 0, 0);
 | 
			
		||||
 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										90
									
								
								talimatname/genel/qt5/qtbug-53237.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								talimatname/genel/qt5/qtbug-53237.patch
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,90 @@
 | 
			
		|||
From 8e889378115c69508b050a511621ac8e30ec4158 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: Jesus Fernandez <jesus.fernandez@theqtcompany.com>
 | 
			
		||||
Date: Mon, 13 Jun 2016 19:09:15 +0200
 | 
			
		||||
Subject: [PATCH] Fix UNSIGNED values in QMYSQL
 | 
			
		||||
 | 
			
		||||
The unsigned flag in columns was ignored when creating the list of
 | 
			
		||||
bound values in a mysql table. So the result iteration with
 | 
			
		||||
QSqlQuery::next stops after the first wrong truncated value.
 | 
			
		||||
 | 
			
		||||
[ChangeLog][QtSql] Fixed QSqlQuery::prepare value truncation error when
 | 
			
		||||
using UNSIGNED values in a MySQL database.
 | 
			
		||||
 | 
			
		||||
Task-number: QTBUG-53969
 | 
			
		||||
Task-number: QTBUG-53237
 | 
			
		||||
Change-Id: I10d977993445f2794f1dd8c88b2e83517ef524f3
 | 
			
		||||
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
 | 
			
		||||
---
 | 
			
		||||
 src/sql/drivers/mysql/qsql_mysql.cpp              |  1 +
 | 
			
		||||
 tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp | 39 +++++++++++++++++++++++
 | 
			
		||||
 2 files changed, 40 insertions(+)
 | 
			
		||||
 | 
			
		||||
diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp
 | 
			
		||||
index 96bdcc4..55bf499 100644
 | 
			
		||||
--- a/src/sql/drivers/mysql/qsql_mysql.cpp
 | 
			
		||||
+++ b/src/sql/drivers/mysql/qsql_mysql.cpp
 | 
			
		||||
@@ -387,6 +387,7 @@ bool QMYSQLResultPrivate::bindInValues()
 | 
			
		||||
         bind->buffer_length = f.bufLength = fieldInfo->length + 1;
 | 
			
		||||
         bind->is_null = &f.nullIndicator;
 | 
			
		||||
         bind->length = &f.bufLength;
 | 
			
		||||
+        bind->is_unsigned = fieldInfo->flags & UNSIGNED_FLAG ? 1 : 0;
 | 
			
		||||
         f.outField=field;
 | 
			
		||||
 
 | 
			
		||||
         ++i;
 | 
			
		||||
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
 | 
			
		||||
index bd553d5..f1c4333 100644
 | 
			
		||||
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
 | 
			
		||||
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
 | 
			
		||||
@@ -233,6 +233,9 @@ private slots:
 | 
			
		||||
     void QTBUG_36211_data() { generic_data("QPSQL"); }
 | 
			
		||||
     void QTBUG_36211();
 | 
			
		||||
 
 | 
			
		||||
+    void QTBUG_53969_data() { generic_data("QMYSQL"); }
 | 
			
		||||
+    void QTBUG_53969();
 | 
			
		||||
+
 | 
			
		||||
     void sqlite_constraint_data() { generic_data("QSQLITE"); }
 | 
			
		||||
     void sqlite_constraint();
 | 
			
		||||
 
 | 
			
		||||
@@ -3652,6 +3655,42 @@ void tst_QSqlQuery::QTBUG_36211()
 | 
			
		||||
     }
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+void tst_QSqlQuery::QTBUG_53969()
 | 
			
		||||
+{
 | 
			
		||||
+    QFETCH( QString, dbName );
 | 
			
		||||
+    QVector<int> values = QVector<int>() << 10 << 20 << 127 << 128 << 1, tableValues;
 | 
			
		||||
+    QSqlDatabase db = QSqlDatabase::database( dbName );
 | 
			
		||||
+    CHECK_DATABASE( db );
 | 
			
		||||
+    tableValues.reserve(values.size());
 | 
			
		||||
+    if (tst_Databases::getDatabaseType(db) == QSqlDriver::MySqlServer) {
 | 
			
		||||
+        const QString tableName(qTableName("bug53969", __FILE__, db));
 | 
			
		||||
+        tst_Databases::safeDropTable( db, tableName );
 | 
			
		||||
+
 | 
			
		||||
+        QSqlQuery q(db);
 | 
			
		||||
+        QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id INT AUTO_INCREMENT PRIMARY KEY, "
 | 
			
		||||
+                                    "test_number TINYINT(3) UNSIGNED)")
 | 
			
		||||
+                            .arg(tableName)));
 | 
			
		||||
+
 | 
			
		||||
+        QVERIFY_SQL(q, prepare("INSERT INTO " + tableName + " (test_number) VALUES (:value)"));
 | 
			
		||||
+
 | 
			
		||||
+        QVector<int>::iterator begin = values.begin(), end = values.end(), it;
 | 
			
		||||
+        for (it = begin; it != end; ++it) {
 | 
			
		||||
+            q.bindValue(":value", *it);
 | 
			
		||||
+            QVERIFY_SQL(q, exec());
 | 
			
		||||
+        }
 | 
			
		||||
+
 | 
			
		||||
+        QVERIFY_SQL(q, prepare("SELECT test_number FROM " + tableName));
 | 
			
		||||
+        QVERIFY_SQL(q, exec());
 | 
			
		||||
+
 | 
			
		||||
+        while (q.next()) {
 | 
			
		||||
+            bool ok;
 | 
			
		||||
+            tableValues.push_back(q.value(0).toUInt(&ok));
 | 
			
		||||
+            QVERIFY(ok);
 | 
			
		||||
+        }
 | 
			
		||||
+        QCOMPARE(values, tableValues);
 | 
			
		||||
+    }
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 void tst_QSqlQuery::oraOCINumber()
 | 
			
		||||
 {
 | 
			
		||||
     QFETCH( QString, dbName );
 | 
			
		||||
| 
						 | 
				
			
			@ -4,45 +4,27 @@
 | 
			
		|||
# Depends on: xorg-proto xorg-libxkbfile xorg-xtrans xorg-libx11 xorg-libxext xorg-libfs xorg-libice xorg-libsm xorg-libxscrnsaver xorg-libxt xorg-libxmu xorg-libxpm xorg-libxaw xorg-libxfixes xorg-libxcomposite xorg-libxrender xorg-libxcursor xorg-libxdamage xorg-libfontenc xorg-libxfont xorg-libxft xorg-libxi xorg-libxinerama xorg-libxrandr xorg-libxres xorg-libxtst xorg-libxv xorg-libxvmc xorg-libxxf86dga xorg-libxxf86vm xorg-libdmx xorg-libpciaccess xorg-libxkbfile xorg-libxshmfence  xcb-proto xcb-util-image xcb-util-keysyms xcb-util-renderutil xcb-util-wm alsa-lib cups dbus glib gstreamer-plugins-base icu jasper libjpeg-turbo libmng libpng libtiff libwebp xorg-mesa mtdev pcre sqlite ruby gstreamer1-plugins-base geoclue gtk2 harfbuzz postgresql pulseaudio unixodbc libxkbcommon mariadb
 | 
			
		||||
 | 
			
		||||
name=qt5
 | 
			
		||||
version=5.6.0
 | 
			
		||||
version=5.7.0
 | 
			
		||||
release=1
 | 
			
		||||
 | 
			
		||||
source=(http://download.qt.io/official_releases/qt/${version%.*}/$version/single/qt-everywhere-opensource-src-$version.tar.xz
 | 
			
		||||
	qt5-alsa1.11.patch
 | 
			
		||||
	qtbug-51648.patch
 | 
			
		||||
	qtbug-51649.patch
 | 
			
		||||
	qtbug-51676.patch
 | 
			
		||||
	qtbug-45812.patch
 | 
			
		||||
	qtbug-44964.patch
 | 
			
		||||
        qtbug-53237.patch
 | 
			
		||||
	    qtbug-53071.patch
 | 
			
		||||
	qtbug-53071b.patch
 | 
			
		||||
	qt5-webengine-nss.patch)
 | 
			
		||||
	    qtbug-53071b.patch)
 | 
			
		||||
 | 
			
		||||
build() {
 | 
			
		||||
 | 
			
		||||
QT5PREFIX=/usr
 | 
			
		||||
QT5BINDIR=$QT5PREFIX/lib/qt5/bin
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cd qt-everywhere-opensource-src-$version
 | 
			
		||||
 | 
			
		||||
# Backport fixes for QtDBus deadlocks
 | 
			
		||||
patch -p1 -d qtbase -i $SRC/qtbug-51648.patch
 | 
			
		||||
patch -p1 -d qtbase -i $SRC/qtbug-51649.patch
 | 
			
		||||
patch -p1 -d qtbase -i $SRC/qtbug-51676.patch
 | 
			
		||||
 | 
			
		||||
# Fix drag and drop from some applications
 | 
			
		||||
patch -p1 -d qtbase -i $SRC/qtbug-45812.patch
 | 
			
		||||
 | 
			
		||||
# Fix parsing of tzfile(5) POSIX rule zone names with bracket quotes
 | 
			
		||||
patch -p1 -d qtbase -i $SRC/qtbug-53071.patch
 | 
			
		||||
patch -p1 -d qtbase -i $SRC/qtbug-53071b.patch
 | 
			
		||||
 | 
			
		||||
# Don't compress tablet motion events
 | 
			
		||||
patch -p1 -d qtbase -i $SRC/qtbug-44964.patch
 | 
			
		||||
 | 
			
		||||
# Broken SSL for some sites #1870
 | 
			
		||||
# https://github.com/QupZilla/qupzilla/issues/1870
 | 
			
		||||
patch -p1 -d qtwebengine -i $SRC/qt5-webengine-nss.patch
 | 
			
		||||
# Fix UNSIGNED values in QMYSQL
 | 
			
		||||
patch -p1 -d qtbase -i $SRC/qtbug-53237.patch
 | 
			
		||||
 | 
			
		||||
# Respect system CXX
 | 
			
		||||
[ "$CXX" ] || CXX=g++
 | 
			
		||||
| 
						 | 
				
			
			@ -53,20 +35,13 @@ sed -i 's|X11R6/||g' qtbase/mkspecs/*/*.conf
 | 
			
		|||
 | 
			
		||||
# Respect system CXXFLAGS
 | 
			
		||||
sed -i "s|^\(QMAKE_CFLAGS_RELEASE.*\)|\1 ${CXXFLAGS}|" qtbase/mkspecs/common/gcc-base.conf
 | 
			
		||||
#sed -i "s|-O2|$CXXFLAGS|" qtbase/mkspecs/common/g++-unix.conf
 | 
			
		||||
#sed -i "s|-O2|${CXXFLAGS}|" qtbase/mkspecs/common/{g++,gcc}-base.conf
 | 
			
		||||
 | 
			
		||||
# Respect system LDFLAGS
 | 
			
		||||
sed -i "s|^\(QMAKE_LFLAGS_RELEASE.*\)|\1 ${LDFLAGS}|" qtbase/mkspecs/common/g++-unix.conf
 | 
			
		||||
#sed -i "/^QMAKE_LFLAGS\s/s|+=|+= ${LDFLAGS}|g" qtbase/mkspecs/common/gcc-base.conf
 | 
			
		||||
 | 
			
		||||
# Fix quoting bug
 | 
			
		||||
sed -i 's|"$COMPILER" -c|$COMPILER -c|' qtbase/config.tests/unix/fvisibility.test
 | 
			
		||||
 | 
			
		||||
export QTDIR="$PWD"
 | 
			
		||||
export LD_LIBRARY_PATH="$QTDIR/qtbase/lib:$QTDIR/qttools/lib:$LD_LIBRARY_PATH"
 | 
			
		||||
export QT_PLUGIN_PATH="$QTDIR/qtbase/plugins"
 | 
			
		||||
 | 
			
		||||
./configure  -opensource -confirm-license \
 | 
			
		||||
			 -prefix         $QT5PREFIX                  \
 | 
			
		||||
			 -sysconfdir     /etc/xdg                    \
 | 
			
		||||
| 
						 | 
				
			
			@ -77,12 +52,17 @@ export QT_PLUGIN_PATH="$QTDIR/qtbase/plugins"
 | 
			
		|||
			 -datadir        /usr/share/qt5              \
 | 
			
		||||
			 -translationdir /usr/share/qt5/translations \
 | 
			
		||||
			 -plugin-sql-{psql,mysql,sqlite,odbc}  \
 | 
			
		||||
			 -openssl-linked -dbus-linked \
 | 
			
		||||
			 -system-lib{png,jpeg} -system-{zlib,sqlite} \
 | 
			
		||||
			 -no-cups -optimized-qmake \
 | 
			
		||||
			 -x{cursor,inerama,kb,randr,render} \
 | 
			
		||||
			 -openssl-linked \
 | 
			
		||||
			 -dbus-linked \
 | 
			
		||||
			 -system-sqlite \
 | 
			
		||||
			 -system-zlib \
 | 
			
		||||
			 -system-harfbuzz \
 | 
			
		||||
			 -optimized-qmake \
 | 
			
		||||
			 -nomake examples \
 | 
			
		||||
			 -no-separate-debug-info -no-strip -shared -no-rpath \
 | 
			
		||||
			 -no-separate-debug-info \
 | 
			
		||||
			 -no-strip \
 | 
			
		||||
			 -shared \
 | 
			
		||||
			 -no-rpath \
 | 
			
		||||
			 -release -reduce-relocations
 | 
			
		||||
 | 
			
		||||
make
 | 
			
		||||
| 
						 | 
				
			
			@ -114,53 +94,53 @@ install -dm755 $PKG/usr/share/applications
 | 
			
		|||
cat > $PKG/usr/share/applications/assistant-qt5.desktop << "EOf"
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Name=Qt5 Assistant
 | 
			
		||||
comment=Shows Qt5 documentation and examples
 | 
			
		||||
Comment=Shows Qt5 documentation and examples
 | 
			
		||||
Exec=assistant-qt5
 | 
			
		||||
icon=/usr/share/pixmaps/assistant-qt5
 | 
			
		||||
Icon=/usr/share/pixmaps/assistant-qt5
 | 
			
		||||
Terminal=false
 | 
			
		||||
Encoding=UTf-8
 | 
			
		||||
Type=Application
 | 
			
		||||
categories=Qt;Development;Documentation;
 | 
			
		||||
Categories=Qt;Development;Documentation;
 | 
			
		||||
EOf
 | 
			
		||||
 | 
			
		||||
cat > $PKG/usr/share/applications/designer-qt5.desktop << "EOf"
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Name=Qt5 Designer
 | 
			
		||||
GenericName=interface Designer
 | 
			
		||||
comment=Design GUis for Qt5 applications
 | 
			
		||||
Comment=Design GUis for Qt5 applications
 | 
			
		||||
Exec=designer-qt5
 | 
			
		||||
icon=/usr/share/pixmaps/designer-qt5
 | 
			
		||||
mimeType=application/x-designer;
 | 
			
		||||
Icon=/usr/share/pixmaps/designer-qt5
 | 
			
		||||
MimeType=application/x-designer;
 | 
			
		||||
Terminal=false
 | 
			
		||||
Encoding=UTf-8
 | 
			
		||||
Type=Application
 | 
			
		||||
categories=Qt;Development;
 | 
			
		||||
Categories=Qt;Development;
 | 
			
		||||
EOf
 | 
			
		||||
 | 
			
		||||
cat > $PKG/usr/share/applications/linguist-qt5.desktop << "EOf"
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Name=Qt5 Linguist
 | 
			
		||||
comment=Add translations to Qt5 applications
 | 
			
		||||
Comment=Add translations to Qt5 applications
 | 
			
		||||
Exec=linguist-qt5
 | 
			
		||||
icon=/usr/share/pixmaps/linguist-qt5
 | 
			
		||||
mimeType=text/vnd.trolltech.linguist;application/x-linguist;
 | 
			
		||||
Icon=/usr/share/pixmaps/linguist-qt5
 | 
			
		||||
MimeType=text/vnd.trolltech.linguist;application/x-linguist;
 | 
			
		||||
Terminal=false
 | 
			
		||||
Encoding=UTf-8
 | 
			
		||||
Type=Application
 | 
			
		||||
categories=Qt;Development;
 | 
			
		||||
Categories=Qt;Development;
 | 
			
		||||
EOf
 | 
			
		||||
 | 
			
		||||
cat > $PKG/usr/share/applications/qdbusviewer-qt5.desktop << "EOf"
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Name=Qt5 QDbusviewer
 | 
			
		||||
GenericName=D-Bus Debugger
 | 
			
		||||
comment=Debug D-Bus applications
 | 
			
		||||
Comment=Debug D-Bus applications
 | 
			
		||||
Exec=qdbusviewer-qt5
 | 
			
		||||
icon=/usr/share/pixmaps/qdbusviewer-qt5
 | 
			
		||||
Icon=/usr/share/pixmaps/qdbusviewer-qt5
 | 
			
		||||
Terminal=false
 | 
			
		||||
Encoding=UTf-8
 | 
			
		||||
Type=Application
 | 
			
		||||
categories=Qt;Development;Debugger;
 | 
			
		||||
Categories=Qt;Development;Debugger;
 | 
			
		||||
EOf
 | 
			
		||||
 | 
			
		||||
mkdir -p $PKG/etc/profile.d
 | 
			
		||||
| 
						 | 
				
			
			@ -175,8 +155,7 @@ export QT5PREFIX QT5BINDIR QT5DIR
 | 
			
		|||
# End /etc/profile.d/qt5.sh
 | 
			
		||||
EOf
 | 
			
		||||
 | 
			
		||||
### Creation des liens /usr/bin vers les binaires se trouvant
 | 
			
		||||
### dans le dossier /usr/lib/qt5/bin en ajoutant qt5 Ã  la fin du lien
 | 
			
		||||
 | 
			
		||||
mkdir -p $PKG/usr/bin
 | 
			
		||||
 | 
			
		||||
for i in $PKG/usr/lib/qt5/bin/*; do 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue