commit
c63f23a65d
|
@ -0,0 +1,10 @@
|
|||
--- 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
|
|
@ -0,0 +1,49 @@
|
|||
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
|
|
@ -0,0 +1,100 @@
|
|||
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
|
|
@ -0,0 +1,97 @@
|
|||
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
|
|
@ -0,0 +1,87 @@
|
|||
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
|
|
@ -0,0 +1,158 @@
|
|||
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
|
|
@ -0,0 +1,125 @@
|
|||
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
|
|
@ -0,0 +1,271 @@
|
|||
From e9041c7fc1052167f1ec2df0ea9623059e55d00f Mon Sep 17 00:00:00 2001
|
||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Date: Thu, 28 Apr 2016 22:09:01 -0700
|
||||
Subject: [PATCH] Fix parsing of tzfile(5) POSIX rule zone names with bracket
|
||||
quotes
|
||||
|
||||
POSIX.1-2001 allows quoting a zone name so that it can contain other
|
||||
characters besides letters, by enclosing it in angle brackets ('<' and
|
||||
'>'). This hadn't been used until recently (tzdata2016b), when the
|
||||
Asia/Barnaul rule started using a zone name "+07" (the name variable
|
||||
contained the value "<+07>-7").
|
||||
|
||||
Thanks to Paul Eggert for reporting and investigating the root cause.
|
||||
|
||||
Task-number: QTBUG-53071
|
||||
Change-Id: Id5480807d25e49e78b79ffff1449bc410776cb66
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
|
||||
---
|
||||
src/corelib/tools/qtimezoneprivate_tz.cpp | 176 ++++++++++++++-------
|
||||
.../auto/corelib/tools/qtimezone/tst_qtimezone.cpp | 10 ++
|
||||
2 files changed, 130 insertions(+), 56 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp
|
||||
index 85ed345..cb9581a 100644
|
||||
--- a/src/corelib/tools/qtimezoneprivate_tz.cpp
|
||||
+++ b/src/corelib/tools/qtimezoneprivate_tz.cpp
|
||||
@@ -41,6 +41,8 @@
|
||||
|
||||
#include <qdebug.h>
|
||||
|
||||
+#include "qlocale_tools_p.h"
|
||||
+
|
||||
#include <algorithm>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
@@ -384,25 +386,100 @@ static QTime parsePosixTime(const QByteArray &timeRule)
|
||||
return QTime(2, 0, 0);
|
||||
}
|
||||
|
||||
-static int parsePosixOffset(const QByteArray &timeRule)
|
||||
+static int parsePosixOffset(const char *begin, const char *end)
|
||||
{
|
||||
// Format "[+|-]hh[:mm[:ss]]"
|
||||
- QList<QByteArray> parts = timeRule.split(':');
|
||||
- int count = parts.count();
|
||||
- if (count == 3) {
|
||||
- int hour = parts.at(0).toInt();
|
||||
- int sign = hour >= 0 ? -1 : 1;
|
||||
- return sign * ((qAbs(hour) * 60 * 60) + (parts.at(1).toInt() * 60) + parts.at(2).toInt());
|
||||
- } else if (count == 2) {
|
||||
- int hour = parts.at(0).toInt();
|
||||
- int sign = hour >= 0 ? -1 : 1;
|
||||
- return sign * ((qAbs(hour) * 60 * 60) + (parts.at(1).toInt() * 60));
|
||||
- } else if (count == 1) {
|
||||
- int hour = parts.at(0).toInt();
|
||||
- int sign = hour >= 0 ? -1 : 1;
|
||||
- return sign * (qAbs(hour) * 60 * 60);
|
||||
- }
|
||||
- return 0;
|
||||
+ int hour, min = 0, sec = 0;
|
||||
+
|
||||
+ // note that the sign is inverted because POSIX counts in hours West of GMT
|
||||
+ bool negate = true;
|
||||
+ if (*begin == '+') {
|
||||
+ ++begin;
|
||||
+ } else if (*begin == '-') {
|
||||
+ negate = false;
|
||||
+ ++begin;
|
||||
+ }
|
||||
+
|
||||
+ bool ok = false;
|
||||
+ hour = qstrtoll(begin, &begin, 10, &ok);
|
||||
+ if (!ok)
|
||||
+ return INT_MIN;
|
||||
+ if (begin < end && *begin == ':') {
|
||||
+ // minutes
|
||||
+ ++begin;
|
||||
+ min = qstrtoll(begin, &begin, 10, &ok);
|
||||
+ if (!ok || min < 0)
|
||||
+ return INT_MIN;
|
||||
+
|
||||
+ if (begin < end && *begin == ':') {
|
||||
+ // seconds
|
||||
+ ++begin;
|
||||
+ sec = qstrtoll(begin, &begin, 10, &ok);
|
||||
+ if (!ok || sec < 0)
|
||||
+ return INT_MIN;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // we must have consumed everything
|
||||
+ if (begin != end)
|
||||
+ return INT_MIN;
|
||||
+
|
||||
+ int value = (hour * 60 + min) * 60 + sec;
|
||||
+ return negate ? -value : value;
|
||||
+}
|
||||
+
|
||||
+static inline bool asciiIsLetter(char ch)
|
||||
+{
|
||||
+ ch |= 0x20; // lowercases if it is a letter, otherwise just corrupts ch
|
||||
+ return ch >= 'a' && ch <= 'z';
|
||||
+}
|
||||
+
|
||||
+// Returns the zone name, the offset (in seconds) and advances \a begin to
|
||||
+// where the parsing ended. Returns a zone of INT_MIN in case an offset
|
||||
+// couldn't be read.
|
||||
+static QPair<QString, int> parsePosixZoneNameAndOffset(const char *&pos, const char *end)
|
||||
+{
|
||||
+ static const char offsetChars[] = "0123456789:";
|
||||
+ QPair<QString, int> result = qMakePair(QString(), INT_MIN);
|
||||
+
|
||||
+ const char *nameBegin = pos;
|
||||
+ const char *nameEnd;
|
||||
+ Q_ASSERT(pos < end);
|
||||
+
|
||||
+ if (*pos == '<') {
|
||||
+ nameBegin = pos + 1; // skip the '<'
|
||||
+ nameEnd = nameBegin;
|
||||
+ while (nameEnd < end && *nameEnd != '>') {
|
||||
+ // POSIX says only alphanumeric, but we allow anything
|
||||
+ ++nameEnd;
|
||||
+ }
|
||||
+ pos = nameEnd + 1; // skip the '>'
|
||||
+ } else {
|
||||
+ nameBegin = pos;
|
||||
+ nameEnd = nameBegin;
|
||||
+ while (nameEnd < end && asciiIsLetter(*nameEnd))
|
||||
+ ++nameEnd;
|
||||
+ pos = nameEnd;
|
||||
+ }
|
||||
+ if (nameEnd - nameBegin < 3)
|
||||
+ return result; // name must be at least 3 characters long
|
||||
+
|
||||
+ // zone offset, form [+-]hh:mm:ss
|
||||
+ const char *zoneBegin = pos;
|
||||
+ const char *zoneEnd = pos;
|
||||
+ if (zoneEnd < end && (zoneEnd[0] == '+' || zoneEnd[0] == '-'))
|
||||
+ ++zoneEnd;
|
||||
+ while (zoneEnd < end) {
|
||||
+ if (strchr(offsetChars, char(*zoneEnd)) == NULL)
|
||||
+ break;
|
||||
+ ++zoneEnd;
|
||||
+ }
|
||||
+
|
||||
+ result.first = QString::fromUtf8(nameBegin, nameEnd - nameBegin);
|
||||
+ if (zoneEnd > zoneBegin)
|
||||
+ result.second = parsePosixOffset(zoneBegin, zoneEnd);
|
||||
+ pos = zoneEnd;
|
||||
+ return result;
|
||||
}
|
||||
|
||||
static QVector<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray &posixRule,
|
||||
@@ -419,51 +496,38 @@ static QVector<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArra
|
||||
|
||||
// POSIX Format is like "TZ=CST6CDT,M3.2.0/2:00:00,M11.1.0/2:00:00"
|
||||
// i.e. "std offset dst [offset],start[/time],end[/time]"
|
||||
- // See http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
|
||||
+ // See the section about TZ at http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html
|
||||
QList<QByteArray> parts = posixRule.split(',');
|
||||
|
||||
- QString name = QString::fromUtf8(parts.at(0));
|
||||
- QString stdName;
|
||||
- QString stdOffsetString;
|
||||
- QString dstName;
|
||||
- QString dstOffsetString;
|
||||
- bool parsedStdName = false;
|
||||
- bool parsedStdOffset = false;
|
||||
- for (int i = 0; i < name.size(); ++i) {
|
||||
- if (name.at(i).isLetter()) {
|
||||
- if (parsedStdName) {
|
||||
- parsedStdOffset = true;
|
||||
- dstName.append(name.at(i));
|
||||
- } else {
|
||||
- stdName.append(name.at(i));
|
||||
+ QPair<QString, int> stdZone, dstZone;
|
||||
+ {
|
||||
+ const QByteArray &zoneinfo = parts.at(0);
|
||||
+ const char *begin = zoneinfo.constBegin();
|
||||
+
|
||||
+ stdZone = parsePosixZoneNameAndOffset(begin, zoneinfo.constEnd());
|
||||
+ if (stdZone.second == INT_MIN) {
|
||||
+ stdZone.second = 0; // reset to UTC if we failed to parse
|
||||
+ } else if (begin < zoneinfo.constEnd()) {
|
||||
+ dstZone = parsePosixZoneNameAndOffset(begin, zoneinfo.constEnd());
|
||||
+ if (dstZone.second == INT_MIN) {
|
||||
+ // if the dst offset isn't provided, it is 1 hour ahead of the standard offset
|
||||
+ dstZone.second = stdZone.second + (60 * 60);
|
||||
}
|
||||
- } else {
|
||||
- parsedStdName = true;
|
||||
- if (parsedStdOffset)
|
||||
- dstOffsetString.append(name.at(i));
|
||||
- else
|
||||
- stdOffsetString.append(name.at(i));
|
||||
}
|
||||
}
|
||||
|
||||
- int utcOffset = parsePosixOffset(stdOffsetString.toUtf8());
|
||||
-
|
||||
// If only the name part then no transitions
|
||||
if (parts.count() == 1) {
|
||||
QTimeZonePrivate::Data data;
|
||||
data.atMSecsSinceEpoch = lastTranMSecs;
|
||||
- data.offsetFromUtc = utcOffset;
|
||||
- data.standardTimeOffset = utcOffset;
|
||||
+ data.offsetFromUtc = stdZone.second;
|
||||
+ data.standardTimeOffset = stdZone.second;
|
||||
data.daylightTimeOffset = 0;
|
||||
- data.abbreviation = stdName;
|
||||
+ data.abbreviation = stdZone.first;
|
||||
result << data;
|
||||
return result;
|
||||
}
|
||||
|
||||
- // If not populated the total dst offset is 1 hour
|
||||
- int dstOffset = utcOffset + (60 * 60);
|
||||
- if (!dstOffsetString.isEmpty())
|
||||
- dstOffset = parsePosixOffset(dstOffsetString.toUtf8());
|
||||
|
||||
// Get the std to dst transtion details
|
||||
QList<QByteArray> dstParts = parts.at(1).split('/');
|
||||
@@ -486,18 +550,18 @@ static QVector<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArra
|
||||
for (int year = startYear; year <= endYear; ++year) {
|
||||
QTimeZonePrivate::Data dstData;
|
||||
QDateTime dst(calculatePosixDate(dstDateRule, year), dstTime, Qt::UTC);
|
||||
- dstData.atMSecsSinceEpoch = dst.toMSecsSinceEpoch() - (utcOffset * 1000);
|
||||
- dstData.offsetFromUtc = dstOffset;
|
||||
- dstData.standardTimeOffset = utcOffset;
|
||||
- dstData.daylightTimeOffset = dstOffset - utcOffset;
|
||||
- dstData.abbreviation = dstName;
|
||||
+ dstData.atMSecsSinceEpoch = dst.toMSecsSinceEpoch() - (stdZone.second * 1000);
|
||||
+ dstData.offsetFromUtc = dstZone.second;
|
||||
+ dstData.standardTimeOffset = stdZone.second;
|
||||
+ dstData.daylightTimeOffset = dstZone.second - stdZone.second;
|
||||
+ dstData.abbreviation = dstZone.first;
|
||||
QTimeZonePrivate::Data stdData;
|
||||
QDateTime std(calculatePosixDate(stdDateRule, year), stdTime, Qt::UTC);
|
||||
- stdData.atMSecsSinceEpoch = std.toMSecsSinceEpoch() - (dstOffset * 1000);
|
||||
- stdData.offsetFromUtc = utcOffset;
|
||||
- stdData.standardTimeOffset = utcOffset;
|
||||
+ stdData.atMSecsSinceEpoch = std.toMSecsSinceEpoch() - (dstZone.second * 1000);
|
||||
+ stdData.offsetFromUtc = stdZone.second;
|
||||
+ stdData.standardTimeOffset = stdZone.second;
|
||||
stdData.daylightTimeOffset = 0;
|
||||
- stdData.abbreviation = stdName;
|
||||
+ stdData.abbreviation = stdZone.first;
|
||||
// Part of the high year will overflow
|
||||
if (year == 292278994 && (dstData.atMSecsSinceEpoch < 0 || stdData.atMSecsSinceEpoch < 0)) {
|
||||
if (dstData.atMSecsSinceEpoch > 0) {
|
||||
diff --git a/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp
|
||||
index ea83510..ce72e7c 100644
|
||||
--- a/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp
|
||||
+++ b/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp
|
||||
@@ -847,6 +847,16 @@ void tst_QTimeZone::tzTest()
|
||||
QTzTimeZonePrivate::Data datatz2 = tztz2.data(std);
|
||||
QTzTimeZonePrivate::Data datautc2 = tzutc2.data(std);
|
||||
QCOMPARE(datatz2.offsetFromUtc, datautc2.offsetFromUtc);
|
||||
+
|
||||
+ // Test a timezone with a name that isn't all letters
|
||||
+ QTzTimeZonePrivate tzBarnaul("Asia/Barnaul");
|
||||
+ if (tzBarnaul.isValid()) {
|
||||
+ QCOMPARE(tzBarnaul.data(std).abbreviation, QString("+07"));
|
||||
+
|
||||
+ // first full day of the new rule (tzdata2016b)
|
||||
+ QDateTime dt(QDate(2016, 3, 28), QTime(0, 0, 0), Qt::UTC);
|
||||
+ QCOMPARE(tzBarnaul.data(dt.toMSecsSinceEpoch()).abbreviation, QString("+07"));
|
||||
+ }
|
||||
#endif // Q_OS_UNIX
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
From cd25866f6533923c208f52d58516f3725f69cefb Mon Sep 17 00:00:00 2001
|
||||
From: Thiago Macieira <thiago.macieira@intel.com>
|
||||
Date: Wed, 18 May 2016 13:38:55 -0700
|
||||
Subject: [PATCH] Use the code we already have for parsing the transition time
|
||||
too
|
||||
|
||||
It's there and it's more efficient anyway.
|
||||
|
||||
Change-Id: Ie9fd7afe060b4e4a8052fffd144fc40647430268
|
||||
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
|
||||
Reviewed-by: Brett Stottlemyer <bstottle@ford.com>
|
||||
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
|
||||
---
|
||||
src/corelib/tools/qtimezoneprivate_tz.cpp | 68 ++++++++++++++++++-------------
|
||||
1 file changed, 40 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp
|
||||
index cb9581a..bfa967e 100644
|
||||
--- a/src/corelib/tools/qtimezoneprivate_tz.cpp
|
||||
+++ b/src/corelib/tools/qtimezoneprivate_tz.cpp
|
||||
@@ -372,37 +372,21 @@ static QDate calculatePosixDate(const QByteArray &dateRule, int year)
|
||||
}
|
||||
}
|
||||
|
||||
-static QTime parsePosixTime(const QByteArray &timeRule)
|
||||
+// returns the time in seconds, INT_MIN if we failed to parse
|
||||
+static int parsePosixTime(const char *begin, const char *end)
|
||||
{
|
||||
- // Format "HH:mm:ss", put check parts count just in case
|
||||
- QList<QByteArray> parts = timeRule.split(':');
|
||||
- int count = parts.count();
|
||||
- if (count == 3)
|
||||
- return QTime(parts.at(0).toInt(), parts.at(1).toInt(), parts.at(2).toInt());
|
||||
- else if (count == 2)
|
||||
- return QTime(parts.at(0).toInt(), parts.at(1).toInt(), 0);
|
||||
- else if (count == 1)
|
||||
- return QTime(parts.at(0).toInt(), 0, 0);
|
||||
- return QTime(2, 0, 0);
|
||||
-}
|
||||
-
|
||||
-static int parsePosixOffset(const char *begin, const char *end)
|
||||
-{
|
||||
- // Format "[+|-]hh[:mm[:ss]]"
|
||||
+ // Format "hh[:mm[:ss]]"
|
||||
int hour, min = 0, sec = 0;
|
||||
|
||||
- // note that the sign is inverted because POSIX counts in hours West of GMT
|
||||
- bool negate = true;
|
||||
- if (*begin == '+') {
|
||||
- ++begin;
|
||||
- } else if (*begin == '-') {
|
||||
- negate = false;
|
||||
- ++begin;
|
||||
- }
|
||||
+ // Note that the calls to qstrtoll do *not* check the end pointer, which
|
||||
+ // means they proceed until they find a non-digit. We check that we're
|
||||
+ // still in range at the end, but we may have read from past end. It's the
|
||||
+ // caller's responsibility to ensure that begin is part of a
|
||||
+ // null-terminated string.
|
||||
|
||||
bool ok = false;
|
||||
hour = qstrtoll(begin, &begin, 10, &ok);
|
||||
- if (!ok)
|
||||
+ if (!ok || hour < 0)
|
||||
return INT_MIN;
|
||||
if (begin < end && *begin == ':') {
|
||||
// minutes
|
||||
@@ -424,7 +408,35 @@ static int parsePosixOffset(const char *begin, const char *end)
|
||||
if (begin != end)
|
||||
return INT_MIN;
|
||||
|
||||
- int value = (hour * 60 + min) * 60 + sec;
|
||||
+ return (hour * 60 + min) * 60 + sec;
|
||||
+}
|
||||
+
|
||||
+static QTime parsePosixTransitionTime(const QByteArray &timeRule)
|
||||
+{
|
||||
+ // Format "hh[:mm[:ss]]"
|
||||
+ int value = parsePosixTime(timeRule.constBegin(), timeRule.constEnd());
|
||||
+ if (value == INT_MIN) {
|
||||
+ // if we failed to parse, return 02:00
|
||||
+ return QTime(2, 0, 0);
|
||||
+ }
|
||||
+ return QTime::fromMSecsSinceStartOfDay(value * 1000);
|
||||
+}
|
||||
+
|
||||
+static int parsePosixOffset(const char *begin, const char *end)
|
||||
+{
|
||||
+ // Format "[+|-]hh[:mm[:ss]]"
|
||||
+ // note that the sign is inverted because POSIX counts in hours West of GMT
|
||||
+ bool negate = true;
|
||||
+ if (*begin == '+') {
|
||||
+ ++begin;
|
||||
+ } else if (*begin == '-') {
|
||||
+ negate = false;
|
||||
+ ++begin;
|
||||
+ }
|
||||
+
|
||||
+ int value = parsePosixTime(begin, end);
|
||||
+ if (value == INT_MIN)
|
||||
+ return value;
|
||||
return negate ? -value : value;
|
||||
}
|
||||
|
||||
@@ -534,7 +546,7 @@ static QVector<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArra
|
||||
QByteArray dstDateRule = dstParts.at(0);
|
||||
QTime dstTime;
|
||||
if (dstParts.count() > 1)
|
||||
- dstTime = parsePosixTime(dstParts.at(1));
|
||||
+ dstTime = parsePosixTransitionTime(dstParts.at(1));
|
||||
else
|
||||
dstTime = QTime(2, 0, 0);
|
||||
|
||||
@@ -543,7 +555,7 @@ static QVector<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArra
|
||||
QByteArray stdDateRule = stdParts.at(0);
|
||||
QTime stdTime;
|
||||
if (stdParts.count() > 1)
|
||||
- stdTime = parsePosixTime(stdParts.at(1));
|
||||
+ stdTime = parsePosixTransitionTime(stdParts.at(1));
|
||||
else
|
||||
stdTime = QTime(2, 0, 0);
|
|
@ -1,147 +1,129 @@
|
|||
# Description: A cross-platform application and UI framework
|
||||
# Description: Qt Free Edition, version 5.x
|
||||
# URL: http://qt-project.org/
|
||||
# Packager: pierre at nutyx dot org, tnut at nutyx dot org, fanch at nutyx dot org
|
||||
# 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 ca-certificates cups dbus glib gstreamer-plugins-base icu jasper libjpeg-turbo libmng libpng libtiff libwebp xorg-mesa mtdev openssl pcre sqlite ruby gstreamer1-plugins-base geoclue gtk2 harfbuzz postgresql pulseaudio unixodbc libxkbcommon mariadb
|
||||
# Packager: alihan-ozturk28@hotmail.com
|
||||
# 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.5.1
|
||||
release=2
|
||||
version=5.6.0
|
||||
release=1
|
||||
|
||||
_name=qt-everywhere-opensource-src-${version}
|
||||
|
||||
source=(http://download.qt-project.org/official_releases/qt/${version%.*}/$version/single/${_name}.tar.xz)
|
||||
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-53071.patch
|
||||
qtbug-53071b.patch
|
||||
qt5-webengine-nss.patch)
|
||||
|
||||
build() {
|
||||
cd qt-everywhere-opensource-src-$version
|
||||
|
||||
QT5PREFIX=/usr
|
||||
QT5BINDIR=$QT5PREFIX/lib/qt5/bin
|
||||
# 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
|
||||
|
||||
cd ${_name}*
|
||||
# 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
|
||||
|
||||
./configure -prefix $QT5PREFIX \
|
||||
-sysconfdir /etc/xdg \
|
||||
-bindir $QT5BINDIR \
|
||||
-plugindir /usr/lib/qt5/plugins \
|
||||
-importdir /usr/lib/qt5/imports \
|
||||
-headerdir /usr/include/qt5 \
|
||||
-datadir /usr/share/qt5 \
|
||||
-docdir /usr/share/doc/qt5 \
|
||||
-translationdir /usr/share/qt5/translations \
|
||||
-examplesdir /usr/share/doc/qt5/examples \
|
||||
-plugin-sql-{psql,mysql,sqlite,odbc} \
|
||||
-confirm-license \
|
||||
-opensource \
|
||||
-dbus-linked \
|
||||
-openssl-linked \
|
||||
-system-harfbuzz \
|
||||
-system-sqlite \
|
||||
-optimized-qmake \
|
||||
# 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
|
||||
|
||||
# Respect system CXX
|
||||
[ "$CXX" ] || CXX=g++
|
||||
sed -i "/^QMAKE_CXX\s/s|=.*|= $CXX|" qtbase/mkspecs/common/g++-base.conf
|
||||
|
||||
# Remove obsolete xorg path
|
||||
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 -prefix /usr/share/qt5 \
|
||||
-bindir /usr/share/qt5/bin \
|
||||
-headerdir /usr/share/qt5/include \
|
||||
-libdir /usr/share/qt5/lib \
|
||||
-libexecdir /usr/share/qt5/lib \
|
||||
-plugindir /usr/share/qt5/plugins \
|
||||
-sysconfdir /usr/etc/xdg \
|
||||
-openssl-linked -dbus-linked \
|
||||
-system-lib{png,jpeg} -system-{zlib,sqlite} \
|
||||
-no-cups -optimized-qmake \
|
||||
-x{cursor,inerama,kb,randr,render} \
|
||||
-nomake examples \
|
||||
-no-rpath \
|
||||
-skip qtwebengine
|
||||
-no-separate-debug-info -no-strip -shared -no-rpath \
|
||||
-opensource -confirm-license -release -reduce-relocations
|
||||
|
||||
make
|
||||
make INSTALL_ROOT=$PKG install
|
||||
|
||||
find $PKG/usr/ -name qt_lib_bootstrap_private.pri \
|
||||
-exec sed -i -e "s:$PWD/qtbase:/$QT5PREfiX/lib/:g" {} \; &&
|
||||
# Fix paths
|
||||
find $PKG/usr/share/qt5/lib -type f -name '*.prl' \
|
||||
-exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d;s/\(QMAKE_PRL_LIBS =\).*/\1/' {} \;
|
||||
|
||||
find $PKG/usr -name \*.prl \
|
||||
-exec sed -i -e '/^QmAKE_PRL_BUiLD_DiR/d' {} \;
|
||||
sed -e "s|$PWD/qtbase|/usr/share/qt5/lib|g" \
|
||||
-i $PKG/usr/share/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri
|
||||
|
||||
install -v -dm755 $PKG/usr/share/pixmaps/
|
||||
# Remove unnecessary files
|
||||
rm -rf $(find $PKG/usr/share/qt5/mkspecs/* | \
|
||||
egrep -v '(linux-g++|common|modules|pri|features)')
|
||||
|
||||
install -v -Dm644 qttools/src/assistant/assistant/images/assistant-128.png \
|
||||
$PKG/usr/share/pixmaps/assistant-qt5.png
|
||||
rm -f $PKG/usr/share/qt5/mkspecs/linux-g++/linux-g++
|
||||
rm -rf $PKG/usr/share/qt5/mkspecs/features/{mac,win32}
|
||||
rm -rf $PKG/usr/share/qt5/mkspecs/common/mac*
|
||||
rm -rf $PKG/usr/share/qt5/{phrasebooks,translations}
|
||||
|
||||
install -v -Dm644 qttools/src/designer/src/designer/images/designer.png \
|
||||
$PKG/usr/share/pixmaps/designer-qt5.png
|
||||
# Install linker config
|
||||
install -d $PKG/{etc/ld.so.conf.d,usr/{bin,lib,include}}
|
||||
echo "/usr/share/qt5/lib" > $PKG/etc/ld.so.conf.d/qt5.conf
|
||||
|
||||
install -v -Dm644 qttools/src/linguist/linguist/images/icons/linguist-128-32.png \
|
||||
$PKG/usr/share/pixmaps/linguist-qt5.png
|
||||
ln -s ../share/qt5/include $PKG/usr/include/qt5
|
||||
ln -s ../share/qt5/lib $PKG/usr/lib/qt5
|
||||
ln -s linux-g++ $PKG/usr/share/qt5/mkspecs/default
|
||||
|
||||
install -v -Dm644 qttools/src/qdbus/qdbusviewer/images/qdbusviewer-128.png \
|
||||
$PKG/usr/share/pixmaps/qdbusviewer-qt5.png
|
||||
# Install pkg config
|
||||
mv $PKG/usr/share/qt5/lib/pkgconfig $PKG/usr/lib
|
||||
|
||||
install -dm755 $PKG/usr/share/applications
|
||||
# Fix paths
|
||||
sed \
|
||||
-e "s|-L$SRC/qt-everywhere-opensource-src-$version/lib ||g" \
|
||||
-e "s|$SRC/qt-everywhere-opensource-src-$version/bin|/usr/share/qt5/bin|g" \
|
||||
-i $PKG/usr/lib/pkgconfig/*.pc
|
||||
|
||||
|
||||
cat > $PKG/usr/share/applications/assistant-qt5.desktop << "EOf"
|
||||
[Desktop Entry]
|
||||
Name=Qt5 Assistant
|
||||
comment=Shows Qt5 documentation and examples
|
||||
Exec=$QT5BINDIR/assistant-qt5
|
||||
icon=assistant-qt5
|
||||
Terminal=false
|
||||
Encoding=UTf-8
|
||||
Type=Application
|
||||
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
|
||||
Exec=$QT5BINDIR/designer-qt5
|
||||
icon=designer-qt5
|
||||
mimeType=application/x-designer;
|
||||
Terminal=false
|
||||
Encoding=UTf-8
|
||||
Type=Application
|
||||
categories=Qt;Development;
|
||||
EOf
|
||||
|
||||
cat > $PKG/usr/share/applications/linguist-qt5.desktop << "EOf"
|
||||
[Desktop Entry]
|
||||
Name=Qt5 Linguist
|
||||
comment=Add translations to Qt5 applications
|
||||
Exec=$QT5BINDIR/linguist-qt5
|
||||
icon=linguist-qt5
|
||||
mimeType=text/vnd.trolltech.linguist;application/x-linguist;
|
||||
Terminal=false
|
||||
Encoding=UTf-8
|
||||
Type=Application
|
||||
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
|
||||
Exec=$QT5BINDIR/qdbusviewer-qt5
|
||||
icon=qdbusviewer-qt5
|
||||
Terminal=false
|
||||
Encoding=UTf-8
|
||||
Type=Application
|
||||
categories=Qt;Development;Debugger;
|
||||
EOf
|
||||
|
||||
mkdir -p $PKG/etc/profile.d
|
||||
cat > $PKG/etc/profile.d/qt5.sh << EOf
|
||||
# Begin /etc/profile.d/qt5.sh
|
||||
|
||||
QT5PREFIX=$QT5PREFIX
|
||||
QT5DIR=$QT5PREFIX
|
||||
QT5BINDIR=$QT5PREFIX/lib/qt5/bin
|
||||
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
|
||||
ln -sv /usr/lib/qt5/bin/$(basename $i) $PKG/usr/bin/$(basename $i)-qt5
|
||||
# Install useful symlinks
|
||||
install -d $PKG/usr/bin
|
||||
for b in $PKG/usr/share/qt5/bin/*; do
|
||||
ln -s /usr/share/qt5/bin/$(basename $b) $PKG/usr/bin/$(basename $b)-qt5
|
||||
done
|
||||
|
||||
# cmake
|
||||
install -d $PKG/usr/lib/cmake
|
||||
for b in $PKG/usr/share/qt5/lib/cmake/*; do
|
||||
ln -s /usr/share/qt5/lib/cmake/$(basename $b) $PKG/usr/lib/cmake/$(basename $b)
|
||||
done
|
||||
|
||||
cat > $PKG/usr/bin/setqt5 << EOF
|
||||
if [ "x\$QT4BINDIR" != "x/usr/bin" ] && [ "x\$QT4BINDIR" != "x" ]; then pathremove $QT4BINDIR; fi
|
||||
if [ "x\$QT5BINDIR" != "x/usr/bin" ]; then pathprepend $QT5BINDIR; fi
|
||||
echo \$PATH
|
||||
EOF
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue