From 67c2b69d45eb43078b7e4193ced6cd513602483c Mon Sep 17 00:00:00 2001 From: Bjoern Erik Nilsen Date: Wed, 6 May 2009 16:32:01 +0200 Subject: Crash in QWidget::render when passing an untransformed QPixmap painter. The crash only occurred on Windows and X11 when running with -graphicssystem raster. The reason is that the actual paint device in QRasterPaintEngine::begin() is changed to pixmap->data->buffer(), which means QPaintEngine::paintDevice() returns something else than what it was told to paint on (see cb0c899b56b84154f69ddc545991bc6ded96ab01) The root of the problem, however, was that we used a weird condition (painter->worldMatrixEnabled(), added in 345072b9 for Qt 4.4) to find the target device. We did that because the shared painter was completely different in 4.4. We refactored it in 4.5.0, and we can only trust QPaintEngine::paintDevice to be the target device. Auto-test included. Task-number: 252837 Reviewed-by: Trond --- src/gui/kernel/qwidget.cpp | 2 +- tests/auto/qwidget/tst_qwidget.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index fb9c8cb..b96d8b3 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -4805,7 +4805,7 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset, Q_ASSERT(engine); QPaintEnginePrivate *enginePriv = engine->d_func(); Q_ASSERT(enginePriv); - QPaintDevice *target = painter->worldMatrixEnabled() ? engine->paintDevice() : painter->device(); + QPaintDevice *target = engine->paintDevice(); Q_ASSERT(target); // Render via a pixmap when dealing with non-opaque painters or printers. diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index dee48a3..5896df9 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -287,6 +287,7 @@ private slots: void render_systemClip2(); void render_systemClip3_data(); void render_systemClip3(); + void render_task252837(); void setContentsMargins(); @@ -7097,6 +7098,16 @@ void tst_QWidget::render_systemClip3() } } +void tst_QWidget::render_task252837() +{ + QWidget widget; + widget.resize(200, 200); + + QPixmap pixmap(widget.size()); + QPainter painter(&pixmap); + // Please do not crash. + widget.render(&painter); +} void tst_QWidget::setContentsMargins() { QLabel label("why does it always rain on me?"); -- cgit v0.12 From 9f7e8dcd408f8a082d6b8355c78c692d71becbb8 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Mon, 4 May 2009 14:29:39 +0200 Subject: Fix crash in QWebView when application has a style sheet Task: 252796 Rev-By: Tor Arne --- src/gui/styles/qstylesheetstyle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/styles/qstylesheetstyle.cpp b/src/gui/styles/qstylesheetstyle.cpp index 058660e..714b8c5 100644 --- a/src/gui/styles/qstylesheetstyle.cpp +++ b/src/gui/styles/qstylesheetstyle.cpp @@ -4926,7 +4926,7 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op case CT_LineEdit: #ifndef QT_NO_SPINBOX // ### hopelessly broken QAbstractSpinBox (part 2) - if (QAbstractSpinBox *spinBox = qobject_cast(w->parentWidget())) { + if (QAbstractSpinBox *spinBox = qobject_cast(w ? w->parentWidget() : 0)) { QRenderRule rule = renderRule(spinBox, opt); if (rule.hasBox() || !rule.hasNativeBorder()) return csz; -- cgit v0.12 From a86c2b58d80b0688b98d0eaf243508a096f699b1 Mon Sep 17 00:00:00 2001 From: Nils Christian Roscher-Nielsen Date: Wed, 6 May 2009 17:42:51 +0200 Subject: Fixed typo in README file Reviewed-by: David Boddie --- examples/phonon/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/phonon/README b/examples/phonon/README index d0f4462..51213cb 100644 --- a/examples/phonon/README +++ b/examples/phonon/README @@ -1,4 +1,4 @@ -Qt usese the Phonon cross-platform multimedia framework to play common +Qt uses the Phonon cross-platform multimedia framework to play common multimedia formats. Applications can be written to take advantage of the native multimedia -- cgit v0.12 From 42e10c0dda9acfb3a5344bd20172898e7ed2846d Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Wed, 6 May 2009 10:50:02 -0700 Subject: Make Scale public Needed for fallback warnings Reviewed-by: TrustMe --- src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp index 6d8f617..18e0d55 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp @@ -211,6 +211,8 @@ static QCache imageCache(4*1024*1024); // 4 MB class QDirectFBPaintEnginePrivate : public QRasterPaintEnginePrivate { public: + enum Scale { NoScale, Scaled, NegativeScale }; + QDirectFBPaintEnginePrivate(QDirectFBPaintEngine *p); ~QDirectFBPaintEnginePrivate(); @@ -266,7 +268,7 @@ private: bool simplePen; bool matrixRotShear; - enum Scale { NoScale, Scaled, NegativeScale } scale; + Scale scale; SurfaceCache *surfaceCache; QTransform transform; -- cgit v0.12 From df83ea844e2254723cbd9fabf91586cbad0756a3 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Wed, 6 May 2009 11:35:28 -0700 Subject: Pass the scale parameter as an int. We're just printout out the integer value anyway. Reviewed-by: TrustMe --- src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp index 18e0d55..91a60e7 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp @@ -80,7 +80,7 @@ template inline const T *ptr(const T &t) { return &t; } template <> inline const bool* ptr(const bool &) { return 0; } template static void rasterFallbackWarn(const char *msg, const char *func, const device *dev, - QDirectFBPaintEnginePrivate::Scale scale, bool matrixRotShear, bool simplePen, + int scale, bool matrixRotShear, bool simplePen, bool dfbHandledClip, bool forceRasterPrimitives, const char *nameOne, const T1 &one, const char *nameTwo, const T2 &two, -- cgit v0.12 From 311978919f63c2c23dd09b4743ff12cf2a8a47bb Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Wed, 6 May 2009 14:23:03 -0700 Subject: Improved debug output for directfb:debug Include info on the primary surface pixelformat. Reviewed-by: TrustMe --- src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp index 25e24fd..f571d1b 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp @@ -818,7 +818,7 @@ static const QByteArray flagDescriptions(uint mask, const FlagDescription *flags -static void printDirectFBInfo(IDirectFB *fb) +static void printDirectFBInfo(IDirectFB *fb, IDirectFBSurface *primarySurface) { DFBResult result; DFBGraphicsDeviceDescription dev; @@ -829,10 +829,14 @@ static void printDirectFBInfo(IDirectFB *fb) return; } - qDebug("Device: %s (%s), Driver: %s v%i.%i (%s)\n" + DFBSurfacePixelFormat pixelFormat; + primarySurface->GetPixelFormat(primarySurface, &pixelFormat); + + qDebug("Device: %s (%s), Driver: %s v%i.%i (%s) Pixelformat: %d (%d)\n" "acceleration: 0x%x%s\nblit: 0x%x%s\ndraw: 0x%0x%s\nvideo: %iKB\n", dev.name, dev.vendor, dev.driver.name, dev.driver.major, - dev.driver.minor, dev.driver.vendor, dev.acceleration_mask, + dev.driver.minor, dev.driver.vendor, DFB_PIXELFORMAT_INDEX(pixelFormat), + QDirectFBScreen::getImageFormat(primarySurface), dev.acceleration_mask, ::flagDescriptions(dev.acceleration_mask, accelerationDescriptions).constData(), dev.blitting_flags, ::flagDescriptions(dev.blitting_flags, blitDescriptions).constData(), dev.drawing_flags, ::flagDescriptions(dev.drawing_flags, drawDescriptions).constData(), @@ -883,9 +887,6 @@ bool QDirectFBScreen::connect(const QString &displaySpec) return false; } - if (displayArgs.contains(QLatin1String("debug"), Qt::CaseInsensitive)) - printDirectFBInfo(d_ptr->dfb); - if (displayArgs.contains(QLatin1String("videoonly"), Qt::CaseInsensitive)) d_ptr->directFBFlags |= VideoOnly; @@ -952,6 +953,9 @@ bool QDirectFBScreen::connect(const QString &displaySpec) return false; } + if (displayArgs.contains(QLatin1String("debug"), Qt::CaseInsensitive)) + printDirectFBInfo(d_ptr->dfb, d_ptr->dfbSurface); + // Work out what format we're going to use for surfaces with an alpha channel d_ptr->alphaPixmapFormat = QDirectFBScreen::getImageFormat(d_ptr->dfbSurface); setPixelFormat(d_ptr->alphaPixmapFormat); -- cgit v0.12 From a83d4edbb27ca5394e97de6387f9bdc1fc0d98ae Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Wed, 6 May 2009 16:43:52 -0700 Subject: Use proper ways to create "window" surface Reviewed-by: TrustMe --- src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp index f1e3c84..8c64293 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp @@ -178,15 +178,7 @@ void QDirectFBWindowSurface::setGeometry(const QRect &rect, const QRegion &mask) "Unable to get DirectFB handle!"); } - DFBSurfaceDescription description; - description.flags = DFBSurfaceDescriptionFlags(DSDESC_WIDTH | - DSDESC_HEIGHT | - DSDESC_PIXELFORMAT); - description.width = rect.width(); - description.height = rect.height(); - QDirectFBScreen::initSurfaceDescriptionPixelFormat(&description, - screen->pixelFormat()); - dfbSurface = screen->createDFBSurface(description, false); + dfbSurface = screen->createDFBSurface(rect.size(), screen->pixelFormat(), QDirectFBScreen::DontTrackSurface); forceRaster = (dfbSurface && QDirectFBScreen::getImageFormat(dfbSurface) == QImage::Format_RGB32); } else { Q_ASSERT(dfbSurface); -- cgit v0.12 From 0d8434ecfec5a088bc0c755964dae1dfcb35305e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20S=C3=B8rvig?= Date: Thu, 7 May 2009 09:41:35 +0200 Subject: Fix configure error on Mac with "-arch x86" STRING="${STRING/x86/i386}" actually replaces whole words only, so we don't need to fixup x86_64 afterwards. Reviewed-by: nrc --- configure | 1 - 1 file changed, 1 deletion(-) diff --git a/configure b/configure index 20bf457..bd77174 100755 --- a/configure +++ b/configure @@ -2717,7 +2717,6 @@ if [ "$PLATFORM_MAC" = "yes" ]; then # Build commmand line arguments we can pass to the compiler during configure tests # by prefixing each arch with "-arch". CFG_MAC_ARCHS_GCC_FORMAT="${CFG_MAC_ARCHS/x86/i386}" - CFG_MAC_ARCHS_GCC_FORMAT="${CFG_MAC_ARCHS/i386_64/x86_64}" for ARCH in $CFG_MAC_ARCHS_GCC_FORMAT; do MAC_ARCHS_COMMANDLINE="$MAC_ARCHS_COMMANDLINE -arch $ARCH" done -- cgit v0.12 From 83566cfac942c8ca7620cf95ae47655d6ff475c3 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 5 May 2009 20:48:46 +0200 Subject: Make QDBusPendingCallWatcher emit a signal if it is created on an already-finished call. This fixes a bit of a "surprise" when calling a local method (which returns and finishes immediately) or when by accident calling a function that returns QDBusReply instead of QDBusPendingCall/Reply. Reviewed-by: Trust Me --- src/dbus/qdbuspendingcall.cpp | 10 ++- .../auto/qdbuspendingcall/tst_qdbuspendingcall.cpp | 73 ++++++++++++++++++++++ 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/src/dbus/qdbuspendingcall.cpp b/src/dbus/qdbuspendingcall.cpp index 9753bbe..955f4a0 100644 --- a/src/dbus/qdbuspendingcall.cpp +++ b/src/dbus/qdbuspendingcall.cpp @@ -432,9 +432,14 @@ inline void QDBusPendingCallWatcherPrivate::_q_finished() QDBusPendingCallWatcher::QDBusPendingCallWatcher(const QDBusPendingCall &call, QObject *parent) : QObject(*new QDBusPendingCallWatcherPrivate, parent), QDBusPendingCall(call) { - if (d) { - if (!d->watcherHelper) + if (d) { // QDBusPendingCall::d + if (!d->watcherHelper) { d->watcherHelper = new QDBusPendingCallWatcherHelper; + if (isFinished()) { + // cause a signal emission anyways + QMetaObject::invokeMethod(d->watcherHelper, "finished", Qt::QueuedConnection); + } + } d->watcherHelper->add(this); } } @@ -464,6 +469,7 @@ void QDBusPendingCallWatcher::waitForFinished() d->waitForFinished(); // our signals were queued, so deliver them + QCoreApplication::sendPostedEvents(d->watcherHelper, QEvent::MetaCall); QCoreApplication::sendPostedEvents(this, QEvent::MetaCall); } } diff --git a/tests/auto/qdbuspendingcall/tst_qdbuspendingcall.cpp b/tests/auto/qdbuspendingcall/tst_qdbuspendingcall.cpp index 58707f1..947e8d6 100644 --- a/tests/auto/qdbuspendingcall/tst_qdbuspendingcall.cpp +++ b/tests/auto/qdbuspendingcall/tst_qdbuspendingcall.cpp @@ -90,6 +90,8 @@ private Q_SLOTS: void watcher(); void watcher_error(); void watcher_waitForFinished(); + void watcher_waitForFinished_alreadyFinished(); + void watcher_waitForFinished_alreadyFinished_eventLoop(); void watcher_waitForFinished_error(); void callInsideWaitForFinished(); @@ -375,6 +377,77 @@ void tst_QDBusPendingCall::watcher_waitForFinished() QVERIFY(args2.at(0).toStringList().contains(conn.baseService())); } +void tst_QDBusPendingCall::watcher_waitForFinished_alreadyFinished() +{ + QDBusPendingCall ac = sendMessage(); + QVERIFY(!ac.isFinished()); + QVERIFY(!ac.isError()); + QVERIFY(ac.reply().type() == QDBusMessage::InvalidMessage); + + ac.waitForFinished(); + QVERIFY(ac.isFinished()); + QVERIFY(!ac.isError()); + + callCount = 0; + watchArgument = 0; + + // create a watcher on an already-finished reply + QDBusPendingCallWatcher watch(ac); + connect(&watch, SIGNAL(finished(QDBusPendingCallWatcher*)), + SLOT(finished(QDBusPendingCallWatcher*))); + + watch.waitForFinished(); + + QVERIFY(ac.isFinished()); + QVERIFY(!ac.isError()); + + QCOMPARE(callCount, 1); + QCOMPARE(slotCalled, (int)FinishCalled); + QCOMPARE(watchArgument, &watch); + QVERIFY(!watch.isError()); + + const QVariantList args2 = ac.reply().arguments(); + QVERIFY(!args2.isEmpty()); + QVERIFY(args2.at(0).toStringList().contains(conn.baseService())); +} + +void tst_QDBusPendingCall::watcher_waitForFinished_alreadyFinished_eventLoop() +{ + QDBusPendingCall ac = sendMessage(); + QVERIFY(!ac.isFinished()); + QVERIFY(!ac.isError()); + QVERIFY(ac.reply().type() == QDBusMessage::InvalidMessage); + + ac.waitForFinished(); + QVERIFY(ac.isFinished()); + QVERIFY(!ac.isError()); + + callCount = 0; + watchArgument = 0; + + // create a watcher on an already-finished reply + QDBusPendingCallWatcher watch(ac); + connect(&watch, SIGNAL(finished(QDBusPendingCallWatcher*)), + SLOT(finished(QDBusPendingCallWatcher*))); + connect(&watch, SIGNAL(finished(QDBusPendingCallWatcher*)), + &QTestEventLoop::instance(), SLOT(exitLoop())); + + QTestEventLoop::instance().enterLoop(1); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QVERIFY(ac.isFinished()); + QVERIFY(!ac.isError()); + + QCOMPARE(callCount, 1); + QCOMPARE(slotCalled, (int)FinishCalled); + QCOMPARE(watchArgument, &watch); + QVERIFY(!watch.isError()); + + const QVariantList args2 = ac.reply().arguments(); + QVERIFY(!args2.isEmpty()); + QVERIFY(args2.at(0).toStringList().contains(conn.baseService())); +} + void tst_QDBusPendingCall::watcher_waitForFinished_error() { QDBusPendingCall ac = sendError(); -- cgit v0.12 From 2fddd3c9b7e45b58b56fec9b89c78af0a8f75731 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 6 May 2009 13:47:24 +0200 Subject: Clarify documentation in QNetworkProxy about SOCKS5 supporting domain name resolution Task-number: 252761 --- src/network/kernel/qnetworkproxy.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp index f4ece97..5a00840 100644 --- a/src/network/kernel/qnetworkproxy.cpp +++ b/src/network/kernel/qnetworkproxy.cpp @@ -86,10 +86,11 @@ The SOCKS5 support in Qt 4 is based on \l{RFC 1928} and \l{RFC 1929}. The supported authentication methods are no authentication and username/password authentication. Both IPv4 and IPv6 are - supported, but domain name resolution via the SOCKS server is not - supported; i.e. all domain names are resolved locally. There are - several things to remember when using SOCKS5 with QUdpSocket and - QTcpServer: + supported. Domain names are resolved through the SOCKS5 server if + the QNetworkProxy::HostNameLookupCapability is enabled, otherwise + they are resolved locally and the IP address is sent to the + server. There are several things to remember when using SOCKS5 + with QUdpSocket and QTcpServer: With QUdpSocket, a call to \l {QUdpSocket::bind()}{bind()} may fail with a timeout error. If a port number other than 0 is passed to -- cgit v0.12 From 03b29811a3a6eb34421c476d829075505aa42ada Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 6 May 2009 14:30:21 +0200 Subject: Make QNetworkProxy calculate the capabilities for a new proxy type If you write: QNetworkProxy proxy; proxy.setType(QNetworkProxy::HttpProxy); Then now QNetworkProxy will set the capabilities to the default value for the new proxy type. Previously, it wouldn't do that: default values were set only for the type passed in the constructor. Reviewed-by: Peter Hartmann --- src/network/kernel/qnetworkproxy.cpp | 13 +++++++--- tests/auto/qnetworkproxy/tst_qnetworkproxy.cpp | 33 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp index 5a00840..62bdfc7 100644 --- a/src/network/kernel/qnetworkproxy.cpp +++ b/src/network/kernel/qnetworkproxy.cpp @@ -366,7 +366,8 @@ static QNetworkProxy::Capabilities defaultCapabilitiesForType(QNetworkProxy::Pro int(QNetworkProxy::HostNameLookupCapability)), }; - Q_ASSERT(int(type) >= 0 && int(type) <= int(QNetworkProxy::FtpCachingProxy)); + if (int(type) < 0 && int(type) > int(QNetworkProxy::FtpCachingProxy)) + type = QNetworkProxy::DefaultProxy; return QNetworkProxy::Capabilities(defaults[int(type)]); } @@ -379,6 +380,7 @@ public: QNetworkProxy::Capabilities capabilities; quint16 port; QNetworkProxy::ProxyType type; + bool capabilitiesSet; inline QNetworkProxyPrivate(QNetworkProxy::ProxyType t = QNetworkProxy::DefaultProxy, const QString &h = QString(), quint16 p = 0, @@ -388,7 +390,8 @@ public: password(pw), capabilities(defaultCapabilitiesForType(t)), port(p), - type(t) + type(t), + capabilitiesSet(false) { } inline bool operator==(const QNetworkProxyPrivate &other) const @@ -491,13 +494,16 @@ QNetworkProxy &QNetworkProxy::operator=(const QNetworkProxy &other) Sets the proxy type for this instance to be \a type. Note that changing the type of a proxy does not change - the set of capabilities this QNetworkProxy object holds. + the set of capabilities this QNetworkProxy object holds if any + capabilities have been set with setCapabilities(). \sa type(), setCapabilities() */ void QNetworkProxy::setType(QNetworkProxy::ProxyType type) { d->type = type; + if (!d->capabilitiesSet) + d->capabilities = defaultCapabilitiesForType(type); } /*! @@ -520,6 +526,7 @@ QNetworkProxy::ProxyType QNetworkProxy::type() const void QNetworkProxy::setCapabilities(Capabilities capabilities) { d->capabilities = capabilities; + d->capabilitiesSet = true; } /*! diff --git a/tests/auto/qnetworkproxy/tst_qnetworkproxy.cpp b/tests/auto/qnetworkproxy/tst_qnetworkproxy.cpp index 31a5391..0760ce8 100644 --- a/tests/auto/qnetworkproxy/tst_qnetworkproxy.cpp +++ b/tests/auto/qnetworkproxy/tst_qnetworkproxy.cpp @@ -59,6 +59,7 @@ public: private slots: void getSetCheck(); + void capabilitiesPerType(); }; tst_QNetworkProxy::tst_QNetworkProxy() @@ -79,6 +80,38 @@ void tst_QNetworkProxy::getSetCheck() QCOMPARE(quint16(0), obj1.port()); obj1.setPort(quint16(0xffff)); QCOMPARE(quint16(0xffff), obj1.port()); + + obj1.setType(QNetworkProxy::DefaultProxy); + QCOMPARE(obj1.type(), QNetworkProxy::DefaultProxy); + obj1.setType(QNetworkProxy::HttpProxy); + QCOMPARE(obj1.type(), QNetworkProxy::HttpProxy); + obj1.setType(QNetworkProxy::Socks5Proxy); + QCOMPARE(obj1.type(), QNetworkProxy::Socks5Proxy); +} + +void tst_QNetworkProxy::capabilitiesPerType() +{ + QNetworkProxy proxy(QNetworkProxy::Socks5Proxy); + QVERIFY(proxy.capabilities() & QNetworkProxy::TunnelingCapability); + QVERIFY(proxy.capabilities() & QNetworkProxy::HostNameLookupCapability); + QVERIFY(proxy.capabilities() & QNetworkProxy::UdpTunnelingCapability); + + proxy.setType(QNetworkProxy::NoProxy); + // verify that the capabilities changed + QVERIFY(!(proxy.capabilities() & QNetworkProxy::HostNameLookupCapability)); + QVERIFY(proxy.capabilities() & QNetworkProxy::UdpTunnelingCapability); + + proxy.setType(QNetworkProxy::HttpProxy); + QVERIFY(proxy.capabilities() & QNetworkProxy::HostNameLookupCapability); + QVERIFY(!(proxy.capabilities() & QNetworkProxy::UdpTunnelingCapability)); + + // now set the capabilities on stone: + proxy.setCapabilities(QNetworkProxy::TunnelingCapability | QNetworkProxy::UdpTunnelingCapability); + QCOMPARE(proxy.capabilities(), QNetworkProxy::TunnelingCapability | QNetworkProxy::UdpTunnelingCapability); + + // changing the type shouldn't change the capabilities any more + proxy.setType(QNetworkProxy::Socks5Proxy); + QCOMPARE(proxy.capabilities(), QNetworkProxy::TunnelingCapability | QNetworkProxy::UdpTunnelingCapability); } QTEST_MAIN(tst_QNetworkProxy) -- cgit v0.12 From 846f47d0fa98942e6df22cd7b6dbf594aaf116f5 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 6 May 2009 14:31:49 +0200 Subject: Fix OpenSSL dynamic loading on OpenBSD. OpenBSD's OpenSSL libraries are linked in a bizarre way: libssl.so doesn't link to libcrypto.so, even though it depends on it. I don't claim to understand why, but they do it. So make sure we export its symbols for libssl to see and we load libcrypto first. Task-number: 252042 Patch by: Marc Espie Reviewed-by: Peter Hartmann --- src/network/ssl/qsslsocket_openssl_symbols.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index e09e764..42c09f5 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -364,11 +364,14 @@ static QPair loadOpenSsl() // DT_RPATH tags on our library header as well as other system-specific search // paths. See the man page for dlopen(3) on your system for more information. +#ifdef Q_OS_OPENBSD + libcrypto->setLoadHints(QLibrary::ExportExternalSymbolsHint); +#endif #ifdef SHLIB_VERSION_NUMBER // first attempt: the canonical name is libssl.so. libssl->setFileNameAndVersion(QLatin1String("ssl"), QLatin1String(SHLIB_VERSION_NUMBER)); libcrypto->setFileNameAndVersion(QLatin1String("crypto"), QLatin1String(SHLIB_VERSION_NUMBER)); - if (libssl->load() && libcrypto->load()) { + if (libcrypto->load() && libssl->load()) { // libssl.so. and libcrypto.so. found return pair; } else { @@ -380,7 +383,7 @@ static QPair loadOpenSsl() // second attempt: find the development files libssl.so and libcrypto.so libssl->setFileNameAndVersion(QLatin1String("ssl"), -1); libcrypto->setFileNameAndVersion(QLatin1String("crypto"), -1); - if (libssl->load() && libcrypto->load()) { + if (libcrypto->load() && libssl->load()) { // libssl.so.0 and libcrypto.so.0 found return pair; } else { @@ -395,7 +398,7 @@ static QPair loadOpenSsl() crypto.replace(QLatin1String("ssl"), QLatin1String("crypto")); libssl->setFileNameAndVersion(ssl, -1); libcrypto->setFileNameAndVersion(crypto, -1); - if (libssl->load() && libcrypto->load()) { + if (libcrypto->load() && libssl->load()) { // libssl.so.0 and libcrypto.so.0 found return pair; } else { -- cgit v0.12 From b7803b824905b115c8e4cfc38e353c707fbaad17 Mon Sep 17 00:00:00 2001 From: kh Date: Thu, 7 May 2009 11:25:17 +0200 Subject: Cleanup, no functional change. --- .../tools/assistant/preferencesdialog.cpp | 127 +++++++++++++-------- 1 file changed, 79 insertions(+), 48 deletions(-) diff --git a/tools/assistant/tools/assistant/preferencesdialog.cpp b/tools/assistant/tools/assistant/preferencesdialog.cpp index 094bd9c..233f44a 100644 --- a/tools/assistant/tools/assistant/preferencesdialog.cpp +++ b/tools/assistant/tools/assistant/preferencesdialog.cpp @@ -59,36 +59,38 @@ QT_BEGIN_NAMESPACE PreferencesDialog::PreferencesDialog(QHelpEngineCore *helpEngine, QWidget *parent) : QDialog(parent) + , m_helpEngine(helpEngine) , m_appFontChanged(false) , m_browserFontChanged(false) { - m_helpEngine = helpEngine; m_ui.setupUi(this); - connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), - SIGNAL(clicked()), this, SLOT(applyChanges())); - connect(m_ui.buttonBox->button(QDialogButtonBox::Cancel), - SIGNAL(clicked()), this, SLOT(reject())); + connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), + this, SLOT(applyChanges())); + connect(m_ui.buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), + this, SLOT(reject())); - m_hideFiltersTab = !m_helpEngine->customValue(QLatin1String("EnableFilterFunctionality"), - true).toBool(); - m_hideDocsTab = !m_helpEngine->customValue(QLatin1String("EnableDocumentationManager"), - true).toBool(); + QLatin1String key("EnableFilterFunctionality"); + m_hideFiltersTab = !m_helpEngine->customValue(key, true).toBool(); + + key = QLatin1String("EnableDocumentationManager"); + m_hideDocsTab = !m_helpEngine->customValue(key, true).toBool(); if (!m_hideFiltersTab) { m_ui.attributeWidget->header()->hide(); m_ui.attributeWidget->setRootIsDecorated(false); + connect(m_ui.attributeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(updateFilterMap())); connect(m_ui.filterWidget, - SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(updateAttributes(QListWidgetItem*))); + SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, + SLOT(updateAttributes(QListWidgetItem*))); - connect(m_ui.filterAddButton, SIGNAL(clicked()), - this, SLOT(addFilter())); - connect(m_ui.filterRemoveButton, SIGNAL(clicked()), - this, SLOT(removeFilter())); + connect(m_ui.filterAddButton, SIGNAL(clicked()), this, + SLOT(addFilter())); + connect(m_ui.filterRemoveButton, SIGNAL(clicked()), this, + SLOT(removeFilter())); updateFilterPage(); } else { @@ -106,22 +108,34 @@ PreferencesDialog::PreferencesDialog(QHelpEngineCore *helpEngine, QWidget *paren } else { m_ui.tabWidget->removeTab(m_ui.tabWidget->indexOf(m_ui.docsTab)); } + updateFontSettingsPage(); updateOptionsPage(); } PreferencesDialog::~PreferencesDialog() { + QLatin1String key(""); if (m_appFontChanged) { - m_helpEngine->setCustomValue(QLatin1String("appFont"), m_appFontPanel->selectedFont()); - m_helpEngine->setCustomValue(QLatin1String("useAppFont"), m_appFontPanel->isChecked()); - m_helpEngine->setCustomValue(QLatin1String("appWritingSystem"), m_appFontPanel->writingSystem()); + key = QLatin1String("appFont"); + m_helpEngine->setCustomValue(key, m_appFontPanel->selectedFont()); + + key = QLatin1String("useAppFont"); + m_helpEngine->setCustomValue(key, m_appFontPanel->isChecked()); + + key = QLatin1String("appWritingSystem"); + m_helpEngine->setCustomValue(key, m_appFontPanel->writingSystem()); } if (m_browserFontChanged) { - m_helpEngine->setCustomValue(QLatin1String("browserFont"), m_browserFontPanel->selectedFont()); - m_helpEngine->setCustomValue(QLatin1String("useBrowserFont"), m_browserFontPanel->isChecked()); - m_helpEngine->setCustomValue(QLatin1String("browserWritingSystem"), m_browserFontPanel->writingSystem()); + key = QLatin1String("browserFont"); + m_helpEngine->setCustomValue(key, m_browserFontPanel->selectedFont()); + + key = QLatin1String("useBrowserFont"); + m_helpEngine->setCustomValue(key, m_browserFontPanel->isChecked()); + + key = QLatin1String("browserWritingSystem"); + m_helpEngine->setCustomValue(key, m_browserFontPanel->writingSystem()); } if (m_appFontChanged || m_browserFontChanged) { @@ -129,8 +143,10 @@ PreferencesDialog::~PreferencesDialog() emit updateBrowserFont(); } - if (!m_ui.homePageLineEdit->text().isEmpty()) - m_helpEngine->setCustomValue(QLatin1String("homepage"), m_ui.homePageLineEdit->text()); + if (!m_ui.homePageLineEdit->text().isEmpty()) { + key = QLatin1String("homepage"); + m_helpEngine->setCustomValue(key, m_ui.homePageLineEdit->text()); + } } void PreferencesDialog::showDialog() @@ -173,7 +189,7 @@ void PreferencesDialog::updateAttributes(QListWidgetItem *item) if (item) checkedList = m_filterMap.value(item->text()); QTreeWidgetItem *itm; - for (int i=0; itopLevelItemCount(); ++i) { + for (int i = 0; i < m_ui.attributeWidget->topLevelItemCount(); ++i) { itm = m_ui.attributeWidget->topLevelItem(i); if (checkedList.contains(itm->text(0))) itm->setCheckState(0, Qt::Checked); @@ -192,7 +208,7 @@ void PreferencesDialog::updateFilterMap() QStringList newAtts; QTreeWidgetItem *itm = 0; - for (int i=0; itopLevelItemCount(); ++i) { + for (int i = 0; i < m_ui.attributeWidget->topLevelItemCount(); ++i) { itm = m_ui.attributeWidget->topLevelItem(i); if (itm->checkState(0) == Qt::Checked) newAtts.append(itm->text(0)); @@ -219,8 +235,8 @@ void PreferencesDialog::addFilter() void PreferencesDialog::removeFilter() { - QListWidgetItem *item = m_ui.filterWidget - ->takeItem(m_ui.filterWidget->currentRow()); + QListWidgetItem *item = + m_ui.filterWidget ->takeItem(m_ui.filterWidget->currentRow()); if (!item) return; @@ -362,35 +378,50 @@ void PreferencesDialog::updateFontSettingsPage() m_ui.stackedWidget_2->setCurrentIndex(0); const QString customSettings(tr("Use custom settings")); - QFont font = qVariantValue(m_helpEngine->customValue(QLatin1String("appFont"))); - QFontDatabase::WritingSystem writingSystem = static_cast - (m_helpEngine->customValue(QLatin1String("appWritingSystem")).toInt()); - m_appFontPanel->setTitle(customSettings); + + QLatin1String key = QLatin1String("appFont"); + QFont font = qVariantValue(m_helpEngine->customValue(key)); m_appFontPanel->setSelectedFont(font); - m_appFontPanel->setWritingSystem(writingSystem); - m_appFontPanel->setChecked(m_helpEngine->customValue(QLatin1String("useAppFont")).toBool()); - QFont font2 = qVariantValue(m_helpEngine->customValue(QLatin1String("browserFont"))); - writingSystem = static_cast - (m_helpEngine->customValue(QLatin1String("browserWritingSystem")).toInt()); + key = QLatin1String("appWritingSystem"); + QFontDatabase::WritingSystem system = static_cast + (m_helpEngine->customValue(key).toInt()); + m_appFontPanel->setWritingSystem(system); + + key = QLatin1String("useAppFont"); + m_appFontPanel->setChecked(m_helpEngine->customValue(key).toBool()); m_browserFontPanel->setTitle(customSettings); - m_browserFontPanel->setSelectedFont(font2); - m_browserFontPanel->setWritingSystem(writingSystem); - m_browserFontPanel->setChecked(m_helpEngine->customValue(QLatin1String("useBrowserFont")).toBool()); - connect(m_appFontPanel, SIGNAL(toggled(bool)), this, SLOT(appFontSettingToggled(bool))); - connect(m_browserFontPanel, SIGNAL(toggled(bool)), this, SLOT(browserFontSettingToggled(bool))); + key = QLatin1String("browserFont"); + font = qVariantValue(m_helpEngine->customValue(key)); + m_browserFontPanel->setSelectedFont(font); + + key = QLatin1String("browserWritingSystem"); + system = static_cast + (m_helpEngine->customValue(key).toInt()); + m_browserFontPanel->setWritingSystem(system); + + key = QLatin1String("useBrowserFont"); + m_browserFontPanel->setChecked(m_helpEngine->customValue(key).toBool()); + + connect(m_appFontPanel, SIGNAL(toggled(bool)), this, + SLOT(appFontSettingToggled(bool))); + connect(m_browserFontPanel, SIGNAL(toggled(bool)), this, + SLOT(browserFontSettingToggled(bool))); QList allCombos = qFindChildren(m_appFontPanel); - foreach (QComboBox* box, allCombos) - connect(box, SIGNAL(currentIndexChanged(int)), this, SLOT(appFontSettingChanged(int))); + foreach (QComboBox* box, allCombos) { + connect(box, SIGNAL(currentIndexChanged(int)), this, + SLOT(appFontSettingChanged(int))); + } - allCombos.clear(); allCombos = qFindChildren(m_browserFontPanel); - foreach (QComboBox* box, allCombos) - connect(box, SIGNAL(currentIndexChanged(int)), this, SLOT(browserFontSettingChanged(int))); + foreach (QComboBox* box, allCombos) { + connect(box, SIGNAL(currentIndexChanged(int)), this, + SLOT(browserFontSettingChanged(int))); + } } void PreferencesDialog::appFontSettingToggled(bool on) @@ -436,8 +467,8 @@ void PreferencesDialog::updateOptionsPage() void PreferencesDialog::restoreDefaultHomepage() { - QString homepage = m_helpEngine->customValue( - QLatin1String("defaultHomepage"), QLatin1String("help")).toString(); + QString homepage = m_helpEngine->customValue(QLatin1String("defaultHomepage"), + QLatin1String("help")).toString(); m_ui.homePageLineEdit->setText(homepage); } -- cgit v0.12 From acd6ac49150a126a08afd864210d0627487c6d3d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 7 May 2009 11:41:23 +0200 Subject: Fix strange context menu related bug on Windows Mobile Fixes 245347 again and does not trigger 252319 Task-number: 245347 Reviewed-by: Maurice --- src/gui/kernel/qlayout.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qlayout.cpp b/src/gui/kernel/qlayout.cpp index 1d5a70d..4463aab 100644 --- a/src/gui/kernel/qlayout.cpp +++ b/src/gui/kernel/qlayout.cpp @@ -1028,8 +1028,13 @@ void QLayout::freeze(int w, int h) void QLayout::setMenuBar(QWidget *widget) { Q_D(QLayout); - if (widget) - addChildWidget(widget); + +#ifdef Q_OS_WINCE_WM + if (widget && widget->size().height() > 0) +#else + if (widget) +#endif + addChildWidget(widget); d->menubar = widget; } -- cgit v0.12 From 4f00772e4e02433d6231f2c6c64cf7d97dccf4f9 Mon Sep 17 00:00:00 2001 From: kh Date: Thu, 7 May 2009 11:53:30 +0200 Subject: Implement new cmd option to remove the full text search index. --- tools/assistant/tools/assistant/cmdlineparser.cpp | 9 ++++++ tools/assistant/tools/assistant/cmdlineparser.h | 2 ++ tools/assistant/tools/assistant/main.cpp | 35 +++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/tools/assistant/tools/assistant/cmdlineparser.cpp b/tools/assistant/tools/assistant/cmdlineparser.cpp index 0dae785..67eaa44 100644 --- a/tools/assistant/tools/assistant/cmdlineparser.cpp +++ b/tools/assistant/tools/assistant/cmdlineparser.cpp @@ -56,6 +56,7 @@ CmdLineParser::CmdLineParser() m_bookmarks(Untouched), m_search(Untouched), m_register(None), + m_removeSearchIndex(false), m_copy(false), m_quiet(false) { @@ -83,6 +84,7 @@ CmdLineParser::CmdLineParser() " (.qch) from the give collection\n" " file.\n" "-setCurrentFilter filter Set the filter as the active filter.\n" + "-remove-search-index Removes the full text search index.\n" "-quiet Does not display any error or\n" " status message.\n" "-help Displays this help.\n" @@ -217,6 +219,8 @@ CmdLineParser::Result CmdLineParser::parse(const QStringList &arguments) error = QObject::tr("Missing filter argument!"); break; } + } else if (arg == QLatin1String("-remove-search-index")) { + m_removeSearchIndex = true; } else if (arg == QLatin1String("-quiet")) { continue; } else if (arg == QLatin1String("-help")) { @@ -307,6 +311,11 @@ QString CmdLineParser::currentFilter() const return m_currentFilter; } +bool CmdLineParser::removeSearchIndex() const +{ + return m_removeSearchIndex; +} + CmdLineParser::RegisterState CmdLineParser::registerRequest() const { return m_register; diff --git a/tools/assistant/tools/assistant/cmdlineparser.h b/tools/assistant/tools/assistant/cmdlineparser.h index 332d464..263138b 100644 --- a/tools/assistant/tools/assistant/cmdlineparser.h +++ b/tools/assistant/tools/assistant/cmdlineparser.h @@ -67,6 +67,7 @@ public: ShowState bookmarks() const; ShowState search() const; QString currentFilter() const; + bool removeSearchIndex() const; RegisterState registerRequest() const; QString helpFile() const; @@ -90,6 +91,7 @@ private: ShowState m_search; RegisterState m_register; QString m_currentFilter; + bool m_removeSearchIndex; bool m_copy; bool m_quiet; }; diff --git a/tools/assistant/tools/assistant/main.cpp b/tools/assistant/tools/assistant/main.cpp index 794be02..75955ec 100644 --- a/tools/assistant/tools/assistant/main.cpp +++ b/tools/assistant/tools/assistant/main.cpp @@ -52,6 +52,8 @@ #include +#include + #include #include "mainwindow.h" @@ -166,6 +168,17 @@ referencedHelpFilesExistAll(QHelpEngineCore& user, QStringList& nameSpaces) return (counter != nameSpaces.count()) ? false : true; } +QString indexFilesFolder(const QString &collectionFile) +{ + QString indexFilesFolder = QLatin1String(".fulltextsearch"); + if (!collectionFile.isEmpty()) { + QFileInfo fi(collectionFile); + indexFilesFolder = QLatin1Char('.') + + fi.fileName().left(fi.fileName().lastIndexOf(QLatin1String(".qhc"))); + } + return indexFilesFolder; +} + int main(int argc, char *argv[]) { QApplication a(argc, argv); @@ -212,6 +225,28 @@ int main(int argc, char *argv[]) return 0; } + if (cmd.removeSearchIndex()) { + QString file = cmdCollectionFile; + if (file.isEmpty()) + file = MainWindow::defaultHelpCollectionFileName(); + QString path = QFileInfo(file).path(); + path += QLatin1String("/") + indexFilesFolder(file); + + QLocalSocket localSocket; + localSocket.connectToServer(QString(QLatin1String("QtAssistant%1")) + .arg(QLatin1String(QT_VERSION_STR))); + + QDir dir(path); // check if there is no other instance ruinning + if (!localSocket.waitForConnected() && dir.exists()) { + QStringList lst = dir.entryList(QDir::Files | QDir::Hidden); + foreach (const QString &item, lst) + dir.remove(item); + return 0; + } else { + return -1; + } + } + { QSqlDatabase db; QStringList sqlDrivers(db.drivers()); -- cgit v0.12 From 52415f1bae93f2aa10ea00bbbd88e835d3a91c6e Mon Sep 17 00:00:00 2001 From: Norwegian Rock Cat Date: Thu, 7 May 2009 12:15:49 +0200 Subject: Ensure that small and mini spin boxes are drawn correctly. When we fixed the stuff for normal spin boxes, we neglected to tweak the small and mini variants. We now adjust pixels for them as well. Task-number: 252301 Reviewed-by: Jens Bache-Wiig --- src/gui/styles/qmacstyle_mac.mm | 96 ++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/src/gui/styles/qmacstyle_mac.mm b/src/gui/styles/qmacstyle_mac.mm index c973b41..7a870fe 100644 --- a/src/gui/styles/qmacstyle_mac.mm +++ b/src/gui/styles/qmacstyle_mac.mm @@ -549,7 +549,6 @@ extern QPaintDevice *qt_mac_safe_pdev; //qapplication_mac.cpp QMacCGStyle globals *****************************************************************************/ const int qt_mac_hitheme_version = 0; //the HITheme version we speak -const int macSpinBoxSep = 5; // distance between spinwidget and the lineedit const int macItemFrame = 2; // menu item frame width const int macItemHMargin = 3; // menu item hor text margin const int macItemVMargin = 2; // menu item ver text margin @@ -2376,7 +2375,14 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW break; case PM_SpinBoxFrameWidth: GetThemeMetric(kThemeMetricEditTextFrameOutset, &ret); - ret += 2; + switch (d->aquaSizeConstrain(opt, widget)) { + default: + ret += 2; + break; + case QAquaSizeMini: + ret += 1; + break; + } break; case PM_ButtonShiftHorizontal: case PM_ButtonShiftVertical: @@ -5017,11 +5023,10 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex bdi.kind = kThemeIncDecButton; break; case QAquaSizeMini: + bdi.kind = kThemeIncDecButtonMini; + break; case QAquaSizeSmall: - if (aquaSize == QAquaSizeMini) - bdi.kind = kThemeIncDecButtonMini; - else - bdi.kind = kThemeIncDecButtonSmall; + bdi.kind = kThemeIncDecButtonSmall; break; } if (!(sb->stepEnabled & (QAbstractSpinBox::StepUpEnabled @@ -5041,8 +5046,8 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex bdi.value = kThemeButtonOff; bdi.adornment = kThemeAdornmentNone; - QRect updown = subControlRect(CC_SpinBox, sb, SC_SpinBoxUp, - widget); + QRect updown = subControlRect(CC_SpinBox, sb, SC_SpinBoxUp, widget); + updown |= subControlRect(CC_SpinBox, sb, SC_SpinBoxDown, widget); HIRect newRect = qt_hirectForQRect(updown); QRect off_rct; @@ -5053,15 +5058,6 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex int(outRect.size.width - newRect.size.width), int(outRect.size.height - newRect.size.height)); - // HIThemeGetButtonBackgroundBounds offsets non-focused normal sized - // buttons by one in de y direction, account for that here. - if (bdi.adornment == kThemeAdornmentNone && bdi.kind == kThemeIncDecButton) - off_rct.adjust(0, 1, 0, 0); - - // Adjust the rect for small buttos also. - if (bdi.adornment == kThemeAdornmentFocus && bdi.kind == kThemeIncDecButtonSmall) - off_rct.adjust(0, 0, 0, -1); - newRect = qt_hirectForQRect(updown, off_rct); HIThemeDrawButton(&newRect, &bdi, cg, kHIThemeOrientationNormal, 0); } @@ -5726,39 +5722,61 @@ QRect QMacStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *op break; case CC_SpinBox: if (const QStyleOptionSpinBox *spin = qstyleoption_cast(opt)) { - const int spinner_w = 14, - fw = pixelMetric(PM_SpinBoxFrameWidth, spin, widget); + QAquaWidgetSize aquaSize = d->aquaSizeConstrain(spin, widget); + int spinner_w; + int spinBoxSep; + int fw = pixelMetric(PM_SpinBoxFrameWidth, spin, widget); + switch (aquaSize) { + default: + case QAquaSizeUnknown: + case QAquaSizeLarge: + spinner_w = 14; + spinBoxSep = 2; + break; + case QAquaSizeSmall: + spinner_w = 12; + spinBoxSep = 2; + break; + case QAquaSizeMini: + spinner_w = 10; + spinBoxSep = 1; + break; + } + switch (sc) { case SC_SpinBoxUp: case SC_SpinBoxDown: { if (spin->buttonSymbols == QAbstractSpinBox::NoButtons) break; - const int frameWidth = pixelMetric(PM_SpinBoxFrameWidth, spin, widget); - const int spinner_w = 18; - const int y = frameWidth; - const int x = spin->rect.width() - spinner_w + frameWidth; + + const int y = fw; + const int x = spin->rect.width() - spinner_w; ret.setRect(x + spin->rect.x(), y + spin->rect.y(), spinner_w, spin->rect.height() - y * 2); HIThemeButtonDrawInfo bdi; bdi.version = qt_mac_hitheme_version; bdi.kind = kThemeIncDecButton; - QAquaWidgetSize aquaSize = d->aquaSizeConstrain(opt, widget); + int hackTranslateX; switch (aquaSize) { - case QAquaSizeUnknown: - case QAquaSizeLarge: - bdi.kind = kThemeIncDecButton; - break; - case QAquaSizeMini: - case QAquaSizeSmall: - if (aquaSize == QAquaSizeMini) - bdi.kind = kThemeIncDecButtonMini; - else - bdi.kind = kThemeIncDecButtonSmall; - break; + default: + case QAquaSizeUnknown: + case QAquaSizeLarge: + bdi.kind = kThemeIncDecButton; + hackTranslateX = 0; + break; + case QAquaSizeSmall: + bdi.kind = kThemeIncDecButtonSmall; + hackTranslateX = -2; + break; + case QAquaSizeMini: + bdi.kind = kThemeIncDecButtonMini; + hackTranslateX = -1; + break; } bdi.state = kThemeStateActive; bdi.value = kThemeButtonOff; bdi.adornment = kThemeAdornmentNone; HIRect hirect = qt_hirectForQRect(ret); + HIRect outRect; HIThemeGetButtonBackgroundBounds(&hirect, &bdi, &outRect); ret = qt_qrectForHIRect(outRect); @@ -5773,13 +5791,13 @@ QRect QMacStyle::subControlRect(ComplexControl cc, const QStyleOptionComplex *op Q_ASSERT(0); break; } - ret.translate(-1, -2); // hack: position the buttons correctly (weird that we need this) + ret.translate(hackTranslateX, 0); // hack: position the buttons correctly (weird that we need this) ret = visualRect(spin->direction, spin->rect, ret); break; } case SC_SpinBoxEditField: ret.setRect(fw, fw, - spin->rect.width() - spinner_w - fw * 2 - macSpinBoxSep + 1, + spin->rect.width() - spinner_w - fw * 2 - spinBoxSep, spin->rect.height() - fw * 2); ret = visualRect(spin->direction, spin->rect, ret); break; @@ -5811,8 +5829,8 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, switch (ct) { case QStyle::CT_SpinBox: - sz.setWidth(sz.width() + macSpinBoxSep); - sz.setHeight(sz.height() - 3); // hack to work around horrible sizeHint() code in QAbstractSpinBox + // hack to work around horrible sizeHint() code in QAbstractSpinBox + sz.setHeight(sz.height() - 3); break; case QStyle::CT_TabBarTab: if (const QStyleOptionTabV3 *tab = qstyleoption_cast(opt)) { -- cgit v0.12 From b67a06392ce4e6ad844db857210e502044e94c18 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Thu, 7 May 2009 13:07:25 +0200 Subject: qdoc: Moved platform-specific qdoc comments to common .cpp file. When building docs for the mac, qdoc comments for functions defined in the .h file were not found in any of the .cpp files in the mac package because they were in the x11 or windows .cpp file. So I moved them to a .cpp file that is in all the packages. Task-number: 252496 252492 --- src/gui/kernel/qapplication.cpp | 131 ++++++++++++++++++ src/gui/kernel/qapplication_qws.cpp | 69 ---------- src/gui/kernel/qapplication_win.cpp | 8 -- src/gui/kernel/qapplication_x11.cpp | 42 ------ src/gui/painting/qpaintdevice_qws.cpp | 3 - src/gui/painting/qpaintdevice_win.cpp | 5 - src/gui/painting/qpaintdevice_x11.cpp | 216 ----------------------------- src/gui/painting/qpainter.cpp | 248 ++++++++++++++++++++++++++++++++++ 8 files changed, 379 insertions(+), 343 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index d0b1790..f3bd57b 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -4998,6 +4998,137 @@ bool QApplicationPrivate::shouldSetFocus(QWidget *w, Qt::FocusPolicy policy) return true; } +/*! \fn QDecoration &QApplication::qwsDecoration() + Return the QWSDecoration used for decorating windows. + + \warning This method is non-portable. It is only available in + Qt for Embedded Linux. + + \sa QDecoration +*/ + +/*! + \fn void QApplication::qwsSetDecoration(QDecoration *decoration) + + Sets the QDecoration derived class to use for decorating the + windows used by Qt for Embedded Linux to the \a decoration + specified. + + This method is non-portable. It is only available in Qt for Embedded Linux. + + \sa QDecoration +*/ + +/*! \fn QDecoration* QApplication::qwsSetDecoration(const QString &decoration) + \overload + + Requests a QDecoration object for \a decoration from the QDecorationFactory. + + The string must be one of the QDecorationFactory::keys(). Keys are + case insensitive. + + A later call to the QApplication constructor will override the + requested style when a "-style" option is passed in as a commandline + parameter. + + Returns 0 if an unknown \a decoration is passed, otherwise the QStyle object + returned is set as the application's GUI style. +*/ + +/*! + \fn bool QApplication::qwsEventFilter(QWSEvent *event) + + This virtual function is only implemented under Qt for Embedded Linux. + + If you create an application that inherits QApplication and + reimplement this function, you get direct access to all QWS (Q + Window System) events that the are received from the QWS master + process. The events are passed in the \a event parameter. + + Return true if you want to stop the event from being processed. + Return false for normal event dispatching. The default + implementation returns false. +*/ + +/*! \fn void QApplication::qwsSetCustomColors(QRgb *colorTable, int start, int numColors) + Set Qt for Embedded Linux custom color table. + + Qt for Embedded Linux on 8-bpp displays allocates a standard 216 color cube. + The remaining 40 colors may be used by setting a custom color + table in the QWS master process before any clients connect. + + \a colorTable is an array of up to 40 custom colors. \a start is + the starting index (0-39) and \a numColors is the number of colors + to be set (1-40). + + This method is non-portable. It is available \e only in + Qt for Embedded Linux. + + \note The custom colors will not be used by the default screen + driver. To make use of the new colors, implement a custom screen + driver, or use QDirectPainter. +*/ + +/*! \fn int QApplication::qwsProcessEvent(QWSEvent* event) + \internal +*/ + +/*! \fn int QApplication::x11ClientMessage(QWidget* w, XEvent* event, bool passive_only) + \internal +*/ + +/*! \fn int QApplication::x11ProcessEvent(XEvent* event) + This function does the core processing of individual X + \a{event}s, normally by dispatching Qt events to the right + destination. + + It returns 1 if the event was consumed by special handling, 0 if + the \a event was consumed by normal handling, and -1 if the \a + event was for an unrecognized widget. + + \sa x11EventFilter() +*/ + +/*! + \fn bool QApplication::x11EventFilter(XEvent *event) + + \warning This virtual function is only implemented under X11. + + If you create an application that inherits QApplication and + reimplement this function, you get direct access to all X events + that the are received from the X server. The events are passed in + the \a event parameter. + + Return true if you want to stop the event from being processed. + Return false for normal event dispatching. The default + implementation returns false. + + It is only the directly addressed messages that are filtered. + You must install an event filter directly on the event + dispatcher, which is returned by + QAbstractEventDispatcher::instance(), to handle system wide + messages. + + \sa x11ProcessEvent() +*/ + +/*! \fn void QApplication::winFocus(QWidget *widget, bool gotFocus) + \internal + \since 4.1 + + If \a gotFocus is true, \a widget will become the active window. + Otherwise the active window is reset to 0. +*/ + +/*! \fn void QApplication::winMouseButtonUp() + \internal + */ + +/*! \fn void QApplication::syncX() + Synchronizes with the X server in the X11 implementation. + This normally takes some time. Does nothing on other platforms. +*/ + QT_END_NAMESPACE #include "moc_qapplication.cpp" diff --git a/src/gui/kernel/qapplication_qws.cpp b/src/gui/kernel/qapplication_qws.cpp index 2deda8e..018440f 100644 --- a/src/gui/kernel/qapplication_qws.cpp +++ b/src/gui/kernel/qapplication_qws.cpp @@ -2675,9 +2675,6 @@ void QApplication::alert(QWidget *, int) { } -/*! - \internal -*/ int QApplication::qwsProcessEvent(QWSEvent* event) { Q_D(QApplication); @@ -3056,43 +3053,11 @@ int QApplication::qwsProcessEvent(QWSEvent* event) return 0; } -/*! - \fn bool QApplication::qwsEventFilter(QWSEvent *event) - - This virtual function is only implemented under Qt for Embedded Linux. - - If you create an application that inherits QApplication and - reimplement this function, you get direct access to all QWS (Q - Window System) events that the are received from the QWS master - process. The events are passed in the \a event parameter. - - Return true if you want to stop the event from being processed. - Return false for normal event dispatching. The default - implementation returns false. -*/ bool QApplication::qwsEventFilter(QWSEvent *) { return false; } -/*! - Set Qt for Embedded Linux custom color table. - - Qt for Embedded Linux on 8-bpp displays allocates a standard 216 color cube. - The remaining 40 colors may be used by setting a custom color - table in the QWS master process before any clients connect. - - \a colorTable is an array of up to 40 custom colors. \a start is - the starting index (0-39) and \a numColors is the number of colors - to be set (1-40). - - This method is non-portable. It is available \e only in - Qt for Embedded Linux. - - \note The custom colors will not be used by the default screen - driver. To make use of the new colors, implement a custom screen - driver, or use QDirectPainter. -*/ void QApplication::qwsSetCustomColors(QRgb *colorTable, int start, int numColors) { if (start < 0 || start > 39) { @@ -3111,30 +3076,11 @@ void QApplication::qwsSetCustomColors(QRgb *colorTable, int start, int numColors } #ifndef QT_NO_QWS_MANAGER -/*! - Return the QWSDecoration used for decorating windows. - - \warning This method is non-portable. It is only available in - Qt for Embedded Linux. - - \sa QDecoration -*/ QDecoration &QApplication::qwsDecoration() { return *qws_decoration; } -/*! - \fn void QApplication::qwsSetDecoration(QDecoration *decoration) - - Sets the QDecoration derived class to use for decorating the - windows used by Qt for Embedded Linux to the \a decoration - specified. - - This method is non-portable. It is only available in Qt for Embedded Linux. - - \sa QDecoration -*/ void QApplication::qwsSetDecoration(QDecoration *dec) { if (dec) { @@ -3153,21 +3099,6 @@ void QApplication::qwsSetDecoration(QDecoration *dec) } } -/*! - \overload - - Requests a QDecoration object for \a decoration from the QDecorationFactory. - - The string must be one of the QDecorationFactory::keys(). Keys are - case insensitive. - - A later call to the QApplication constructor will override the - requested style when a "-style" option is passed in as a commandline - parameter. - - Returns 0 if an unknown \a decoration is passed, otherwise the QStyle object - returned is set as the application's GUI style. -*/ QDecoration* QApplication::qwsSetDecoration(const QString &decoration) { QDecoration *decore = QDecorationFactory::create(decoration); diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index bc32c14..065e7ff 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -1371,13 +1371,6 @@ QString QApplicationPrivate::appName() const extern uint qGlobalPostedEventsCount(); -/*! - \internal - \since 4.1 - - If \a gotFocus is true, \a widget will become the active window. - Otherwise the active window is reset to 0. -*/ void QApplication::winFocus(QWidget *widget, bool gotFocus) { if (d_func()->inPopupMode()) // some delayed focus event to ignore @@ -2921,7 +2914,6 @@ void qt_win_eatMouseMove() // In DnD, the mouse release event never appears, so the // mouse button state machine must be manually reset -/*! \internal */ void QApplication::winMouseButtonUp() { qt_button_down = 0; diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp index 15149a5..a3c9406 100644 --- a/src/gui/kernel/qapplication_x11.cpp +++ b/src/gui/kernel/qapplication_x11.cpp @@ -2976,11 +2976,6 @@ QWidget *QApplication::topLevelAt(const QPoint &p) #endif } -/*! - Synchronizes with the X server in the X11 implementation. This - normally takes some time. Does nothing on other platforms. -*/ - void QApplication::syncX() { if (X11->display) @@ -3086,9 +3081,6 @@ static QETWidget *qPRFindWidget(Window oldwin) return wPRmapper ? (QETWidget*)wPRmapper->value((int)oldwin, 0) : 0; } -/*! - \internal -*/ int QApplication::x11ClientMessage(QWidget* w, XEvent* event, bool passive_only) { if (w && !w->internalWinId()) @@ -3151,17 +3143,6 @@ int QApplication::x11ClientMessage(QWidget* w, XEvent* event, bool passive_only) return 0; } -/*! - This function does the core processing of individual X - \a{event}s, normally by dispatching Qt events to the right - destination. - - It returns 1 if the event was consumed by special handling, 0 if - the \a event was consumed by normal handling, and -1 if the \a - event was for an unrecognized widget. - - \sa x11EventFilter() -*/ int QApplication::x11ProcessEvent(XEvent* event) { Q_D(QApplication); @@ -3843,29 +3824,6 @@ int QApplication::x11ProcessEvent(XEvent* event) return 0; } -/*! - \fn bool QApplication::x11EventFilter(XEvent *event) - - \warning This virtual function is only implemented under X11. - - If you create an application that inherits QApplication and - reimplement this function, you get direct access to all X events - that the are received from the X server. The events are passed in - the \a event parameter. - - Return true if you want to stop the event from being processed. - Return false for normal event dispatching. The default - implementation returns false. - - It is only the directly addressed messages that are filtered. - You must install an event filter directly on the event - dispatcher, which is returned by - QAbstractEventDispatcher::instance(), to handle system wide - messages. - - \sa x11ProcessEvent() -*/ - bool QApplication::x11EventFilter(XEvent *) { return false; diff --git a/src/gui/painting/qpaintdevice_qws.cpp b/src/gui/painting/qpaintdevice_qws.cpp index 6a68d28..c67be86 100644 --- a/src/gui/painting/qpaintdevice_qws.cpp +++ b/src/gui/painting/qpaintdevice_qws.cpp @@ -81,9 +81,6 @@ int QPaintDevice::metric(PaintDeviceMetric m) const } } -/*! - \internal -*/ QWSDisplay *QPaintDevice::qwsDisplay() { return qt_fbdpy; diff --git a/src/gui/painting/qpaintdevice_win.cpp b/src/gui/painting/qpaintdevice_win.cpp index 6cae744..7cd3392 100644 --- a/src/gui/painting/qpaintdevice_win.cpp +++ b/src/gui/painting/qpaintdevice_win.cpp @@ -71,16 +71,11 @@ int QPaintDevice::metric(PaintDeviceMetric) const return 0; } - -/*! \internal -*/ HDC QPaintDevice::getDC() const { return 0; } -/*! \internal -*/ void QPaintDevice::releaseDC(HDC) const { } diff --git a/src/gui/painting/qpaintdevice_x11.cpp b/src/gui/painting/qpaintdevice_x11.cpp index 4ea9f57..95cb115 100644 --- a/src/gui/painting/qpaintdevice_x11.cpp +++ b/src/gui/painting/qpaintdevice_x11.cpp @@ -106,33 +106,11 @@ int QPaintDevice::metric(PaintDeviceMetric) const #ifdef QT3_SUPPORT -/*! - Use QX11Info::display() instead. - - \oldcode - Display *display = widget->x11Display(); - \newcode - Display *display = QX11Info::display(); - \endcode - - \sa QWidget::x11Info(), QX11Info::display() -*/ Display *QPaintDevice::x11Display() const { return X11->display; } -/*! - Use QX11Info::screen() instead. - - \oldcode - int screen = widget->x11Screen(); - \newcode - int screen = widget->x11Info().screen(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ int QPaintDevice::x11Screen() const { const QX11Info *info = qt_x11Info(this); @@ -141,17 +119,6 @@ int QPaintDevice::x11Screen() const return QX11Info::appScreen(); } -/*! - Use QX11Info::visual() instead. - - \oldcode - void *visual = widget->x11Visual(); - \newcode - void *visual = widget->x11Info().visual(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ void *QPaintDevice::x11Visual() const { const QX11Info *info = qt_x11Info(this); @@ -160,17 +127,6 @@ void *QPaintDevice::x11Visual() const return QX11Info::appVisual(); } -/*! - Use QX11Info::depth() instead. - - \oldcode - int depth = widget->x11Depth(); - \newcode - int depth = widget->x11Info().depth(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ int QPaintDevice::x11Depth() const { const QX11Info *info = qt_x11Info(this); @@ -179,17 +135,6 @@ int QPaintDevice::x11Depth() const return QX11Info::appDepth(); } -/*! - Use QX11Info::cells() instead. - - \oldcode - int cells = widget->x11Cells(); - \newcode - int cells = widget->x11Info().cells(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ int QPaintDevice::x11Cells() const { const QX11Info *info = qt_x11Info(this); @@ -198,17 +143,6 @@ int QPaintDevice::x11Cells() const return QX11Info::appCells(); } -/*! - Use QX11Info::colormap() instead. - - \oldcode - unsigned long screen = widget->x11Colormap(); - \newcode - unsigned long screen = widget->x11Info().colormap(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ Qt::HANDLE QPaintDevice::x11Colormap() const { const QX11Info *info = qt_x11Info(this); @@ -217,17 +151,6 @@ Qt::HANDLE QPaintDevice::x11Colormap() const return QX11Info::appColormap(); } -/*! - Use QX11Info::defaultColormap() instead. - - \oldcode - bool isDefault = widget->x11DefaultColormap(); - \newcode - bool isDefault = widget->x11Info().defaultColormap(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ bool QPaintDevice::x11DefaultColormap() const { const QX11Info *info = qt_x11Info(this); @@ -236,17 +159,6 @@ bool QPaintDevice::x11DefaultColormap() const return QX11Info::appDefaultColormap(); } -/*! - Use QX11Info::defaultVisual() instead. - - \oldcode - bool isDefault = widget->x11DefaultVisual(); - \newcode - bool isDefault = widget->x11Info().defaultVisual(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ bool QPaintDevice::x11DefaultVisual() const { const QX11Info *info = qt_x11Info(this); @@ -255,176 +167,48 @@ bool QPaintDevice::x11DefaultVisual() const return QX11Info::appDefaultVisual(); } -/*! - Use QX11Info::visual() instead. - - \oldcode - void *visual = QPaintDevice::x11AppVisual(screen); - \newcode - void *visual = qApp->x11Info(screen).visual(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ void *QPaintDevice::x11AppVisual(int screen) { return QX11Info::appVisual(screen); } -/*! - Use QX11Info::colormap() instead. - - \oldcode - unsigned long colormap = QPaintDevice::x11AppColormap(screen); - \newcode - unsigned long colormap = qApp->x11Info(screen).colormap(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ Qt::HANDLE QPaintDevice::x11AppColormap(int screen) { return QX11Info::appColormap(screen); } -/*! - Use QX11Info::display() instead. - - \oldcode - Display *display = QPaintDevice::x11AppDisplay(); - \newcode - Display *display = qApp->x11Info().display(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ Display *QPaintDevice::x11AppDisplay() { return QX11Info::display(); } -/*! - Use QX11Info::screen() instead. - - \oldcode - int screen = QPaintDevice::x11AppScreen(); - \newcode - int screen = qApp->x11Info().screen(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ int QPaintDevice::x11AppScreen() { return QX11Info::appScreen(); } -/*! - Use QX11Info::depth() instead. - - \oldcode - int depth = QPaintDevice::x11AppDepth(screen); - \newcode - int depth = qApp->x11Info(screen).depth(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ int QPaintDevice::x11AppDepth(int screen) { return QX11Info::appDepth(screen); } -/*! - Use QX11Info::cells() instead. - - \oldcode - int cells = QPaintDevice::x11AppCells(screen); - \newcode - int cells = qApp->x11Info(screen).cells(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ int QPaintDevice::x11AppCells(int screen) { return QX11Info::appCells(screen); } -/*! - Use QX11Info::appRootWindow() instead. - - \oldcode - unsigned long window = QPaintDevice::x11AppRootWindow(screen); - \newcode - unsigned long window = qApp->x11Info(screen).appRootWindow(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ Qt::HANDLE QPaintDevice::x11AppRootWindow(int screen) { return QX11Info::appRootWindow(screen); } -/*! - Use QX11Info::defaultColormap() instead. - - \oldcode - bool isDefault = QPaintDevice::x11AppDefaultColormap(screen); - \newcode - bool isDefault = qApp->x11Info(screen).defaultColormap(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ bool QPaintDevice::x11AppDefaultColormap(int screen) { return QX11Info::appDefaultColormap(screen); } -/*! - Use QX11Info::defaultVisual() instead. - - \oldcode - bool isDefault = QPaintDevice::x11AppDefaultVisual(screen); - \newcode - bool isDefault = qApp->x11Info(screen).defaultVisual(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ bool QPaintDevice::x11AppDefaultVisual(int screen) { return QX11Info::appDefaultVisual(screen); } -/*! - Use QX11Info::setAppDpiX() instead. -*/ void QPaintDevice::x11SetAppDpiX(int dpi, int screen) { QX11Info::setAppDpiX(dpi, screen); } -/*! - Use QX11Info::setAppDpiY() instead. -*/ void QPaintDevice::x11SetAppDpiY(int dpi, int screen) { QX11Info::setAppDpiY(dpi, screen); } - -/*! - Use QX11Info::appDpiX() instead. - - \oldcode - bool isDefault = QPaintDevice::x11AppDpiX(screen); - \newcode - bool isDefault = qApp->x11Info(screen).appDpiX(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ int QPaintDevice::x11AppDpiX(int screen) { return QX11Info::appDpiX(screen); } -/*! - Use QX11Info::appDpiY() instead. - - \oldcode - bool isDefault = QPaintDevice::x11AppDpiY(screen); - \newcode - bool isDefault = qApp->x11Info(screen).appDpiY(); - \endcode - - \sa QWidget::x11Info(), QPixmap::x11Info() -*/ int QPaintDevice::x11AppDpiY(int screen) { return QX11Info::appDpiY(screen); diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index afc4211..baa9ce3 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -8571,4 +8571,252 @@ void qt_draw_helper(QPainterPrivate *p, const QPainterPath &path, QPainterPrivat p->draw_helper(path, operation); } +/*! \fn Display *QPaintDevice::x11Display() const + Use QX11Info::display() instead. + + \oldcode + Display *display = widget->x11Display(); + \newcode + Display *display = QX11Info::display(); + \endcode + + \sa QWidget::x11Info(), QX11Info::display() +*/ + +/*! \fn int QPaintDevice::x11Screen() const + Use QX11Info::screen() instead. + + \oldcode + int screen = widget->x11Screen(); + \newcode + int screen = widget->x11Info().screen(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn void *QPaintDevice::x11Visual() const + Use QX11Info::visual() instead. + + \oldcode + void *visual = widget->x11Visual(); + \newcode + void *visual = widget->x11Info().visual(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn int QPaintDevice::x11Depth() const + Use QX11Info::depth() instead. + + \oldcode + int depth = widget->x11Depth(); + \newcode + int depth = widget->x11Info().depth(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn int QPaintDevice::x11Cells() const + Use QX11Info::cells() instead. + + \oldcode + int cells = widget->x11Cells(); + \newcode + int cells = widget->x11Info().cells(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn Qt::HANDLE QPaintDevice::x11Colormap() const + Use QX11Info::colormap() instead. + + \oldcode + unsigned long screen = widget->x11Colormap(); + \newcode + unsigned long screen = widget->x11Info().colormap(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn bool QPaintDevice::x11DefaultColormap() const + Use QX11Info::defaultColormap() instead. + + \oldcode + bool isDefault = widget->x11DefaultColormap(); + \newcode + bool isDefault = widget->x11Info().defaultColormap(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn bool QPaintDevice::x11DefaultVisual() const + Use QX11Info::defaultVisual() instead. + + \oldcode + bool isDefault = widget->x11DefaultVisual(); + \newcode + bool isDefault = widget->x11Info().defaultVisual(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn void *QPaintDevice::x11AppVisual(int screen) + Use QX11Info::visual() instead. + + \oldcode + void *visual = QPaintDevice::x11AppVisual(screen); + \newcode + void *visual = qApp->x11Info(screen).visual(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn Qt::HANDLE QPaintDevice::x11AppColormap(int screen) + Use QX11Info::colormap() instead. + + \oldcode + unsigned long colormap = QPaintDevice::x11AppColormap(screen); + \newcode + unsigned long colormap = qApp->x11Info(screen).colormap(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn Display *QPaintDevice::x11AppDisplay() + Use QX11Info::display() instead. + + \oldcode + Display *display = QPaintDevice::x11AppDisplay(); + \newcode + Display *display = qApp->x11Info().display(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn int QPaintDevice::x11AppScreen() + Use QX11Info::screen() instead. + + \oldcode + int screen = QPaintDevice::x11AppScreen(); + \newcode + int screen = qApp->x11Info().screen(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn int QPaintDevice::x11AppDepth(int screen) + Use QX11Info::depth() instead. + + \oldcode + int depth = QPaintDevice::x11AppDepth(screen); + \newcode + int depth = qApp->x11Info(screen).depth(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn int QPaintDevice::x11AppCells(int screen) + Use QX11Info::cells() instead. + + \oldcode + int cells = QPaintDevice::x11AppCells(screen); + \newcode + int cells = qApp->x11Info(screen).cells(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn Qt::HANDLE QPaintDevice::x11AppRootWindow(int screen) + Use QX11Info::appRootWindow() instead. + + \oldcode + unsigned long window = QPaintDevice::x11AppRootWindow(screen); + \newcode + unsigned long window = qApp->x11Info(screen).appRootWindow(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn bool QPaintDevice::x11AppDefaultColormap(int screen) + Use QX11Info::defaultColormap() instead. + + \oldcode + bool isDefault = QPaintDevice::x11AppDefaultColormap(screen); + \newcode + bool isDefault = qApp->x11Info(screen).defaultColormap(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn bool QPaintDevice::x11AppDefaultVisual(int screen) + Use QX11Info::defaultVisual() instead. + + \oldcode + bool isDefault = QPaintDevice::x11AppDefaultVisual(screen); + \newcode + bool isDefault = qApp->x11Info(screen).defaultVisual(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn void QPaintDevice::x11SetAppDpiX(int dpi, int screen) + Use QX11Info::setAppDpiX() instead. +*/ + +/*! \fn void QPaintDevice::x11SetAppDpiY(int dpi, int screen) + Use QX11Info::setAppDpiY() instead. +*/ + +/*! \fn int QPaintDevice::x11AppDpiX(int screen) + Use QX11Info::appDpiX() instead. + + \oldcode + bool isDefault = QPaintDevice::x11AppDpiX(screen); + \newcode + bool isDefault = qApp->x11Info(screen).appDpiX(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn int QPaintDevice::x11AppDpiY(int screen) + Use QX11Info::appDpiY() instead. + + \oldcode + bool isDefault = QPaintDevice::x11AppDpiY(screen); + \newcode + bool isDefault = qApp->x11Info(screen).appDpiY(); + \endcode + + \sa QWidget::x11Info(), QPixmap::x11Info() +*/ + +/*! \fn HDC QPaintDevice::getDC() const + \internal +*/ + +/*! \fn void QPaintDevice::releaseDC(HDC) const + \internal +*/ + +/*! \fn QWSDisplay *QPaintDevice::qwsDisplay() + \internal +*/ + QT_END_NAMESPACE -- cgit v0.12 From 2841ac47dbd646539cc863a030be4a0ac6a077f4 Mon Sep 17 00:00:00 2001 From: Bjoern Erik Nilsen Date: Thu, 7 May 2009 13:08:45 +0200 Subject: Win: QLineEdit not updating correctly when embedded in Graphics View Updates triggered by the line edit itself, i.e. cursor blinking, are not processed after the top-level is resized. This is yet another problem caused by the event dispatcher on Windows (Qt posted events are not sent during top-level resize, task 146849). We added a work-around for that particular case by posting an event via Windows, but the widget is not visible on the screen (hidden from Windows' POV) so it'll never be posted. And of course then we'll never receive it and the backing store is not synced. This work-around is therefore useless for widgets that are not visible on the screen. However, not receiving update requests while resizing the top-level (in this case QGraphicsView), is not a problem for embedded widgets because all items and hence the proxied widgets are repainted by graphics view anyways. Task-number: 252400 Reviewed-by: Olivier --- src/gui/painting/qbackingstore.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/painting/qbackingstore.cpp b/src/gui/painting/qbackingstore.cpp index 8fb7a12..0a3a8dd 100644 --- a/src/gui/painting/qbackingstore.cpp +++ b/src/gui/painting/qbackingstore.cpp @@ -492,7 +492,8 @@ static inline void sendUpdateRequest(QWidget *widget, bool updateImmediately) return; #if defined(Q_WS_WIN) && !defined(Q_OS_WINCE) - if (QApplicationPrivate::inSizeMove && widget->internalWinId() && !updateImmediately) { + if (QApplicationPrivate::inSizeMove && widget->internalWinId() && !updateImmediately + && !widget->testAttribute(Qt::WA_DontShowOnScreen)) { // Tell Windows to send us a paint event if we're in WM_SIZE/WM_MOVE; posted events // are blocked until the mouse button is released. See task 146849. const QRegion rgn(qt_dirtyRegion(widget)); -- cgit v0.12 From 27aae6a5bb4858897547f2f436bc1cdf2e8bfbd4 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 7 May 2009 13:15:27 +0200 Subject: fix parsing cookies in multiple lines original patch by Benjamin Meyer. Handle multiple cookies split by new lines in a cleaner way. Parsing the combined string was error prone. Splitting them and sending each line through our header parser is more robust, and has more obvious code paths. Tested by logging into wordpress.com, facebook.com etc. Reviewed-by: Thiago Task-number: 251959 --- src/network/access/qnetworkcookie.cpp | 33 ++++++++++++++++----------------- src/network/access/qnetworkcookie_p.h | 1 + 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/network/access/qnetworkcookie.cpp b/src/network/access/qnetworkcookie.cpp index 82c9344..67df526 100644 --- a/src/network/access/qnetworkcookie.cpp +++ b/src/network/access/qnetworkcookie.cpp @@ -913,6 +913,17 @@ static QDateTime parseDateString(const QByteArray &dateString) */ QList QNetworkCookie::parseCookies(const QByteArray &cookieString) { + // cookieString can be a number of set-cookie header strings joined together + // by \n, parse each line separately. + QList cookies; + QList list = cookieString.split('\n'); + for (int a = 0; a < list.size(); a++) + cookies += QNetworkCookiePrivate::parseSetCookieHeaderLine(list.at(a)); + return cookies; +} + +QList QNetworkCookiePrivate::parseSetCookieHeaderLine(const QByteArray &cookieString) +{ // According to http://wp.netscape.com/newsref/std/cookie_spec.html,< // the Set-Cookie response header is of the format: // @@ -930,12 +941,6 @@ QList QNetworkCookie::parseCookies(const QByteArray &cookieStrin while (position < length) { QNetworkCookie cookie; - // When there are multiple SetCookie headers they are join with a new line - // \n will always be the start of a new cookie - int endOfSetCookie = cookieString.indexOf('\n', position); - if (endOfSetCookie == -1) - endOfSetCookie = length; - // The first part is always the "NAME=VALUE" part QPair field = nextField(cookieString, position); if (field.first.isEmpty() || field.second.isNull()) @@ -946,7 +951,7 @@ QList QNetworkCookie::parseCookies(const QByteArray &cookieStrin position = nextNonWhitespace(cookieString, position); bool endOfCookie = false; - while (!endOfCookie && position < endOfSetCookie) + while (!endOfCookie && position < length) { switch (cookieString.at(position++)) { case ',': // end of the cookie @@ -969,9 +974,7 @@ QList QNetworkCookie::parseCookies(const QByteArray &cookieStrin position = end; QDateTime dt = parseDateString(dateString.toLower()); if (!dt.isValid()) { - cookie = QNetworkCookie(); - endOfCookie = true; - continue; + return result; } cookie.setExpirationDate(dt); } else if (field.first == "domain") { @@ -988,8 +991,7 @@ QList QNetworkCookie::parseCookies(const QByteArray &cookieStrin bool ok = false; int secs = field.second.toInt(&ok); if (!ok) - // invalid cookie string - return QList(); + return result; cookie.setExpirationDate(now.addSecs(secs)); } else if (field.first == "path") { QString path = QUrl::fromPercentEncoding(field.second); @@ -1003,9 +1005,7 @@ QList QNetworkCookie::parseCookies(const QByteArray &cookieStrin } else if (field.first == "version") { if (field.second != "1") { // oops, we don't know how to handle this cookie - cookie = QNetworkCookie(); - endOfCookie = true; - continue; + return result; } } else { // got an unknown field in the cookie @@ -1013,9 +1013,8 @@ QList QNetworkCookie::parseCookies(const QByteArray &cookieStrin } position = nextNonWhitespace(cookieString, position); - if (position > endOfSetCookie) - endOfCookie = true; } + } if (!cookie.name().isEmpty()) result += cookie; diff --git a/src/network/access/qnetworkcookie_p.h b/src/network/access/qnetworkcookie_p.h index 83ef14a..0c41322 100644 --- a/src/network/access/qnetworkcookie_p.h +++ b/src/network/access/qnetworkcookie_p.h @@ -61,6 +61,7 @@ class QNetworkCookiePrivate: public QSharedData { public: inline QNetworkCookiePrivate() : secure(false), httpOnly(false) { } + static QList parseSetCookieHeaderLine(const QByteArray &cookieString); QDateTime expirationDate; QString domain; -- cgit v0.12 From 20d88b4d390e2e11079f62ab9f472c30f7c5b11d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Thu, 7 May 2009 13:12:39 +0200 Subject: Fixed some inconsistencies for image drawing on non-integer coords. The fix for 1x1 source rect image drawing in change ffbb3c1a2aee4134dce80cd144a26bf32865b698 was incorrect for transforms with type >= TxScale. The aliased coordinate delta needs to be applied in device coordinates, not in logical coordinates. Also specialize the non-antialiased TxScale case by simply calling fillRect_normalized directly, avoiding having to scan convert the rectangle manually. Task-number: 251561 Reviewed-by: Trond --- src/gui/painting/qpaintengine_raster.cpp | 19 ++++++++++++++++--- tests/arthur/data/qps/borderimage.qps | 19 +++++++++++++++++-- tests/arthur/data/qps/borderimage_qps.png | Bin 90704 -> 91838 bytes 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index cbfd5e3..847904b 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -2575,9 +2575,10 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe if (!aa && sr.size() == QSize(1, 1)) { // as fillRect will apply the aliased coordinate delta we need to // subtract it here as we don't use it for image drawing - const QRectF targetRect = r.translated(-aliasedCoordinateDelta, - -aliasedCoordinateDelta); - fillRect(targetRect, QColor::fromRgba(img.pixel(sr.x(), sr.y()))); + QTransform old = s->matrix; + s->matrix = s->matrix * QTransform::fromTranslate(-aliasedCoordinateDelta, -aliasedCoordinateDelta); + fillRect(r, QColor::fromRgba(img.pixel(sr.x(), sr.y()))); + s->matrix = old; return; } @@ -2611,6 +2612,18 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe return; d->image_filler_xform.setupMatrix(copy, s->flags.bilinear); + if (!aa && s->matrix.type() == QTransform::TxScale) { + QRectF rr = s->matrix.mapRect(r); + + const int x1 = qRound(rr.x()); + const int y1 = qRound(rr.y()); + const int x2 = qRound(rr.right()); + const int y2 = qRound(rr.bottom()); + + fillRect_normalized(QRect(x1, y1, x2-x1, y2-y1), &d->image_filler_xform, d); + return; + } + #ifdef QT_FAST_SPANS ensureState(); if (s->flags.tx_noshear || s->matrix.type() == QTransform::TxScale) { diff --git a/tests/arthur/data/qps/borderimage.qps b/tests/arthur/data/qps/borderimage.qps index 14073fe..8d2e54b 100644 --- a/tests/arthur/data/qps/borderimage.qps +++ b/tests/arthur/data/qps/borderimage.qps @@ -123,6 +123,21 @@ end_block one_pixel_border resetMatrix +translate 205.1 626.1 +scale 0.4 0.4 + +repeat_block one_pixel_border + +resetMatrix + +translate 255.1 624.1 +scale 0.4 0.4 +rotate 10 + +repeat_block one_pixel_border + +resetMatrix + setPen red drawRect 0 0 70 680 @@ -145,5 +160,5 @@ drawText 174 114 "smoothpixmaptransform off" drawRect 164 128 224 134 drawText 174 252 "smoothpixmaptransform on" -drawRect 200 520 97 128 -drawText 210 638 "1x1 edges" +drawRect 200 520 97 188 +drawText 210 698 "1x1 edges" diff --git a/tests/arthur/data/qps/borderimage_qps.png b/tests/arthur/data/qps/borderimage_qps.png index a4ec6cb..ed51d5f 100644 Binary files a/tests/arthur/data/qps/borderimage_qps.png and b/tests/arthur/data/qps/borderimage_qps.png differ -- cgit v0.12 From f2fc8979cbeb732fe4799ec43d6d376aba0a87c9 Mon Sep 17 00:00:00 2001 From: kh Date: Thu, 7 May 2009 14:19:04 +0200 Subject: Make the error dialogs less annoying. Show only one instead of many. --- .../tools/assistant/preferencesdialog.cpp | 48 +++++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/tools/assistant/tools/assistant/preferencesdialog.cpp b/tools/assistant/tools/assistant/preferencesdialog.cpp index 233f44a..74f7ba8 100644 --- a/tools/assistant/tools/assistant/preferencesdialog.cpp +++ b/tools/assistant/tools/assistant/preferencesdialog.cpp @@ -44,6 +44,7 @@ #include "installdialog.h" #include "fontpanel.h" #include "centralwidget.h" +#include "aboutdialog.h" #include @@ -52,6 +53,8 @@ #include #include #include +#include +#include #include @@ -254,25 +257,48 @@ void PreferencesDialog::addDocumentationLocal() if (fileNames.isEmpty()) return; + QStringList invalidFiles; + QStringList alreadyRegistered; foreach (const QString &fileName, fileNames) { - const QString ns = QHelpEngineCore::namespaceName(fileName); - if (ns.isEmpty()) { - QMessageBox::warning(this, tr("Add Documentation"), - tr("The specified file is not a valid Qt Help File!")); + const QString nameSpace = QHelpEngineCore::namespaceName(fileName); + if (nameSpace.isEmpty()) { + invalidFiles.append(fileName); continue; } - if (m_ui.registeredDocsListWidget->findItems(ns, Qt::MatchFixedString).count()) { - QMessageBox::warning(this, tr("Add Documentation"), - tr("The namespace %1 is already registered!").arg(ns)); - continue; + if (m_ui.registeredDocsListWidget->findItems(nameSpace, + Qt::MatchFixedString).count()) { + alreadyRegistered.append(nameSpace); + continue; } m_helpEngine->registerDocumentation(fileName); - m_ui.registeredDocsListWidget->addItem(ns); - m_regDocs.append(ns); - m_unregDocs.removeAll(ns); + m_ui.registeredDocsListWidget->addItem(nameSpace); + m_regDocs.append(nameSpace); + m_unregDocs.removeAll(nameSpace); + } + + if (!invalidFiles.isEmpty() || !alreadyRegistered.isEmpty()) { + QString message; + if (!alreadyRegistered.isEmpty()) { + foreach (const QString &ns, alreadyRegistered) { + message += tr("The namespace %1 is already registered!") + .arg(QString("%1").arg(ns)) + QLatin1String("
"); + } + if (!invalidFiles.isEmpty()) + message.append(QLatin1String("
")); + } + + if (!invalidFiles.isEmpty()) { + message += tr("The specified file is not a valid Qt Help File!"); + message.append(QLatin1String("
    ")); + foreach (const QString &file, invalidFiles) + message += QLatin1String("
  • ") + file + QLatin1String("
  • "); + message.append(QLatin1String("
")); + } + QMessageBox::warning(this, tr("Add Documentation"), message); } + updateFilterPage(); } -- cgit v0.12 From 12348ea833bf731a0a977cd201d6804c6f3af221 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 7 May 2009 14:54:05 +0200 Subject: handle the back soft key on Windows mobile SmartPhones We must tell the system that we want to intercept the back key on Windows mobile. Each toplevel widget that needs correct back key behaviour needs to have a menu bar. Why? Ask Microsoft... Task-number: 248846 Reviewed-by: thartman --- src/gui/kernel/qapplication_win.cpp | 15 +++++++++++++++ src/gui/widgets/qmenu_wince.cpp | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qapplication_win.cpp b/src/gui/kernel/qapplication_win.cpp index 065e7ff..f14ad6f 100644 --- a/src/gui/kernel/qapplication_win.cpp +++ b/src/gui/kernel/qapplication_win.cpp @@ -1725,6 +1725,21 @@ LRESULT CALLBACK QtWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam // fall-through intended case WM_KEYUP: case WM_SYSKEYUP: +#if Q_OS_WINCE_WM + case WM_HOTKEY: + if(HIWORD(msg.lParam) == VK_TBACK) { + const bool hotKeyDown = !(LOWORD(msg.lParam) & MOD_KEYUP); + msg.lParam = 0x69 << 16; + msg.wParam = VK_BACK; + if (hotKeyDown) { + msg.message = WM_KEYDOWN; + qt_keymapper_private()->updateKeyMap(msg); + } else { + msg.message = WM_KEYUP; + } + } + // fall-through intended +#endif case WM_IME_CHAR: case WM_IME_KEYDOWN: case WM_CHAR: { diff --git a/src/gui/widgets/qmenu_wince.cpp b/src/gui/widgets/qmenu_wince.cpp index ea58d46..847a623 100644 --- a/src/gui/widgets/qmenu_wince.cpp +++ b/src/gui/widgets/qmenu_wince.cpp @@ -58,6 +58,9 @@ #include #include +#if Q_OS_WINCE_WM +# include +#endif #include "qguifunctions_wince.h" @@ -71,6 +74,12 @@ #define SHCMBM_GETSUBMENU (WM_USER + 401) #endif +#ifdef Q_OS_WINCE_WM +# define SHMBOF_NODEFAULT 0x00000001 +# define SHMBOF_NOTIFY 0x00000002 +# define SHCMBM_OVERRIDEKEY (WM_USER + 0x193) +#endif + extern bool qt_wince_is_smartphone();//defined in qguifunctions_wce.cpp extern bool qt_wince_is_pocket_pc(); //defined in qguifunctions_wce.cpp @@ -204,8 +213,13 @@ static HWND qt_wce_create_menubar(HWND parentHandle, HINSTANCE resourceHandle, i mbi.dwFlags = flags; mbi.nToolBarId = toolbarID; - if (ptrCreateMenuBar(&mbi)) + if (ptrCreateMenuBar(&mbi)) { + // Tell the menu bar that we want to override hot key behaviour. + LPARAM lparam = MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, + SHMBOF_NODEFAULT | SHMBOF_NOTIFY); + SendMessage(mbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TBACK, lparam); return mbi.hwndMB; + } } return 0; } -- cgit v0.12 From afa7788e27ca388987993844f72a8182edbab70f Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Thu, 7 May 2009 15:43:24 +0200 Subject: Added types to the list. Added two missing types to the list. Task-number: 252274 --- doc/src/datastreamformat.qdoc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/src/datastreamformat.qdoc b/doc/src/datastreamformat.qdoc index 3c651fb..67a3794 100644 --- a/doc/src/datastreamformat.qdoc +++ b/doc/src/datastreamformat.qdoc @@ -69,6 +69,10 @@ the application happens to be running on. \table + \row \o bool + \o \list + \o boolean + \endlist \row \o qint8 \o \list \o signed byte @@ -297,6 +301,12 @@ \o \list \o Milliseconds since midnight (quint32) \endlist + + \row \o QUrl + \o \list + \o Holds an URL (QString) + \endlist + \row \o QVariant \o \list \o The type of the data (quint32) -- cgit v0.12 From 6b715bc38fc2699c2fd03d18262c236061b9d22d Mon Sep 17 00:00:00 2001 From: Bjoern Erik Nilsen Date: Thu, 7 May 2009 14:58:30 +0200 Subject: Compiler warnings (Mac/Carbon) Reviewed-by: nrc --- src/gui/graphicsview/qgraphicsitem.cpp | 4 ++-- src/gui/painting/qdrawhelper.cpp | 3 +-- src/gui/painting/qwindowsurface_raster.cpp | 4 ++-- src/gui/text/qfont.cpp | 2 +- src/opengl/qglpixelbuffer_mac.mm | 3 +-- src/sql/drivers/odbc/qsql_odbc.cpp | 1 - src/xmlpatterns/expr/qapplytemplate.cpp | 3 +-- src/xmlpatterns/functions/qsequencefns.cpp | 3 +-- tools/assistant/tools/assistant/centralwidget.cpp | 2 +- 9 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index 93cd7d9..30c15bc 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -1225,8 +1225,8 @@ void QGraphicsItem::setFlags(GraphicsItemFlags flags) return; // Flags that alter the geometry of the item (or its children). - int geomChangeFlagsMask = (ItemClipsChildrenToShape | ItemClipsToShape | ItemIgnoresTransformations); - bool fullUpdate = (flags & geomChangeFlagsMask) != (d_ptr->flags & geomChangeFlagsMask); + const quint32 geomChangeFlagsMask = (ItemClipsChildrenToShape | ItemClipsToShape | ItemIgnoresTransformations); + bool fullUpdate = (quint32(flags) & geomChangeFlagsMask) != (d_ptr->flags & geomChangeFlagsMask); if (fullUpdate) d_ptr->fullUpdateHelper(false, true); diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index c11837a..9f2831d 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -2400,8 +2400,7 @@ static inline int color_burn_op(int dst, int src, int da, int sa) if (src == 0 || src_da + dst_sa <= sa_da) return qt_div_255(temp); - else - return qt_div_255(sa * (src_da + dst_sa - sa_da) / src + temp); + return qt_div_255(sa * (src_da + dst_sa - sa_da) / src + temp); } template diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp index 7a74fe0..110ba2f 100644 --- a/src/gui/painting/qwindowsurface_raster.cpp +++ b/src/gui/painting/qwindowsurface_raster.cpp @@ -142,8 +142,7 @@ void QRasterWindowSurface::beginPaint(const QRegion &rgn) p.fillRect(*it, blank); } } -#endif -#if defined(Q_OS_WINCE) +#else Q_UNUSED(rgn); #endif } @@ -250,6 +249,7 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi // d->image->image.save("flush.png"); + Q_UNUSED(offset); // Get a context for the widget. #ifndef QT_MAC_USE_COCOA CGContextRef context; diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp index 24ff10b..f73ffb5 100644 --- a/src/gui/text/qfont.cpp +++ b/src/gui/text/qfont.cpp @@ -913,7 +913,7 @@ void QFont::setPointSize(int pointSize) void QFont::setPointSizeF(qreal pointSize) { if (pointSize <= 0) { - qWarning("QFont::setPointSizeF: Point size <= 0 (%d), must be greater than 0", pointSize); + qWarning("QFont::setPointSizeF: Point size <= 0 (%f), must be greater than 0", pointSize); return; } diff --git a/src/opengl/qglpixelbuffer_mac.mm b/src/opengl/qglpixelbuffer_mac.mm index 9a679b1..e95e36b 100644 --- a/src/opengl/qglpixelbuffer_mac.mm +++ b/src/opengl/qglpixelbuffer_mac.mm @@ -299,9 +299,8 @@ void QGLPixelBuffer::releaseFromDynamicTexture() GLuint QGLPixelBuffer::generateDynamicTexture() const { - Q_D(const QGLPixelBuffer); - #ifdef QT_MAC_USE_COCOA + Q_D(const QGLPixelBuffer); NSOpenGLContext *oldContext = [NSOpenGLContext currentContext]; if (d->share_ctx != oldContext) [static_cast(d->share_ctx) makeCurrentContext]; diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index 9932463..ee500a0 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -563,7 +563,6 @@ QChar QODBCDriverPrivate::quoteChar() const static QChar quote = QChar::fromLatin1('"'); if (!isQuoteInitialized) { char driverResponse[4]; - SQLUSMALLINT casing; SQLSMALLINT length; int r = SQLGetInfo(hDbc, SQL_IDENTIFIER_QUOTE_CHAR, diff --git a/src/xmlpatterns/expr/qapplytemplate.cpp b/src/xmlpatterns/expr/qapplytemplate.cpp index 95f4fdf..b91c2f0 100644 --- a/src/xmlpatterns/expr/qapplytemplate.cpp +++ b/src/xmlpatterns/expr/qapplytemplate.cpp @@ -160,8 +160,7 @@ Item::Iterator::Ptr ApplyTemplate::evaluateSequence(const DynamicContext::Ptr &c focus->setFocusIterator(focusIterator); return makeSequenceMappingIterator(ConstPtr(this), focusIterator, focus); } - else - return CommonValues::emptyIterator; + return CommonValues::emptyIterator; } } diff --git a/src/xmlpatterns/functions/qsequencefns.cpp b/src/xmlpatterns/functions/qsequencefns.cpp index f6d5391..faa787e 100644 --- a/src/xmlpatterns/functions/qsequencefns.cpp +++ b/src/xmlpatterns/functions/qsequencefns.cpp @@ -246,8 +246,7 @@ Item::Iterator::Ptr SubsequenceFN::evaluateSequence(const DynamicContext::Ptr &c if(length < 1 && length != -1) return CommonValues::emptyIterator; - else - return Item::Iterator::Ptr(new SubsequenceIterator(it, startingLoc, length)); + return Item::Iterator::Ptr(new SubsequenceIterator(it, startingLoc, length)); } Item SubsequenceFN::evaluateSingleton(const DynamicContext::Ptr &context) const diff --git a/tools/assistant/tools/assistant/centralwidget.cpp b/tools/assistant/tools/assistant/centralwidget.cpp index ec54d0c..b78f346 100644 --- a/tools/assistant/tools/assistant/centralwidget.cpp +++ b/tools/assistant/tools/assistant/centralwidget.cpp @@ -810,7 +810,7 @@ bool CentralWidget::eventFilter(QObject *object, QEvent *e) } } - if (QTabBar *tabBar = qobject_cast(object)) { + if (qobject_cast(object)) { const bool dblClick = e->type() == QEvent::MouseButtonDblClick; if ((e->type() == QEvent::MouseButtonRelease) || dblClick) { QMouseEvent *mouseEvent = static_cast(e); -- cgit v0.12 From a90daef6d4c3e0f0025c7c3ca4e4628c5776a389 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Thu, 7 May 2009 08:16:14 -0700 Subject: Whitespace fix Reviewed-by: TrustMe --- src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp index 8c64293..cd8796b 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp @@ -332,7 +332,7 @@ inline bool isWidgetOpaque(const QWidget *w) return false; } void QDirectFBWindowSurface::flush(QWidget *widget, const QRegion ®ion, - const QPoint &offset) + const QPoint &offset) { Q_UNUSED(widget); #ifdef QT_NO_DIRECTFB_WM -- cgit v0.12 From 90a65aa6611eb33229cdc00ffe6c22012944ba1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Thu, 7 May 2009 15:49:27 +0200 Subject: Fixed a problem that caused QPrintDialog to invalidate QPrinter. When passing a printer that is set up to print to a PDF file into QPrintDialog, the print dialog could invalidate the printer and not update the validity of it in a proper manner. Task-number: 252873 Reviewed-by: Samuel --- src/gui/painting/qprinter.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gui/painting/qprinter.cpp b/src/gui/painting/qprinter.cpp index 4f3e71c..6cecf2c 100644 --- a/src/gui/painting/qprinter.cpp +++ b/src/gui/painting/qprinter.cpp @@ -284,8 +284,8 @@ void QPrinterPrivate::addToManualSetList(QPrintEngine::PrintEnginePropertyKey ke to send PostScript or PDF output to the printer. As an alternative, the printProgram() function can be used to specify the command or utility to use instead of the system default. - - Note that setting parameters like paper size and resolution on an + + Note that setting parameters like paper size and resolution on an invalid printer is undefined. You can use QPrinter::isValid() to verify this before changing any parameters. @@ -744,7 +744,7 @@ void QPrinter::setOutputFormat(OutputFormat format) #ifndef QT_NO_PDF Q_D(QPrinter); - if (d->outputFormat == format) + if (d->validPrinter && d->outputFormat == format) return; d->outputFormat = format; @@ -773,8 +773,8 @@ void QPrinter::setOutputFormat(OutputFormat format) if (def_engine) delete oldPrintEngine; - d->validPrinter = d->outputFormat == QPrinter::PdfFormat || d->outputFormat == QPrinter::PostScriptFormat; - + d->validPrinter = (d->outputFormat == QPrinter::PdfFormat + || d->outputFormat == QPrinter::PostScriptFormat); #else Q_UNUSED(format); #endif -- cgit v0.12 From 5a4b17a279aaa8a0196bd645fd9095639ccb7849 Mon Sep 17 00:00:00 2001 From: Bill King Date: Fri, 8 May 2009 09:37:44 +1000 Subject: Fixes QIBASE driver crashes on multiple execution of a prepared query Task-number: 246808 --- src/sql/drivers/ibase/qsql_ibase.cpp | 6 +++--- tests/auto/qsqldatabase/tst_qsqldatabase.cpp | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/sql/drivers/ibase/qsql_ibase.cpp b/src/sql/drivers/ibase/qsql_ibase.cpp index 9eeb41d..6834d9a 100644 --- a/src/sql/drivers/ibase/qsql_ibase.cpp +++ b/src/sql/drivers/ibase/qsql_ibase.cpp @@ -871,7 +871,7 @@ QIBaseResult::~QIBaseResult() bool QIBaseResult::prepare(const QString& query) { - //qDebug("prepare: %s\n", qPrintable(query)); +// qDebug("prepare: %s", qPrintable(query)); if (!driver() || !driver()->isOpen() || driver()->isOpenError()) return false; d->cleanup(); @@ -1025,7 +1025,7 @@ bool QIBaseResult::exec() } if (ok) { - if (colCount()) { + if (colCount() && d->queryType != isc_info_sql_stmt_exec_procedure) { isc_dsql_free_statement(d->status, &d->stmt, DSQL_close); if (d->isError(QT_TRANSLATE_NOOP("QIBaseResult", "Unable to close statement"))) return false; @@ -1039,7 +1039,7 @@ bool QIBaseResult::exec() return false; // Not all stored procedures necessarily return values. - if (d->queryType == isc_info_sql_stmt_exec_procedure && d->sqlda->sqld == 0) + if (d->queryType == isc_info_sql_stmt_exec_procedure && d->sqlda && d->sqlda->sqld == 0) delDA(d->sqlda); if (d->sqlda) diff --git a/tests/auto/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/qsqldatabase/tst_qsqldatabase.cpp index 8dede12..4fa3dc4 100644 --- a/tests/auto/qsqldatabase/tst_qsqldatabase.cpp +++ b/tests/auto/qsqldatabase/tst_qsqldatabase.cpp @@ -517,6 +517,8 @@ void tst_QSqlDatabase::tables() // MySQL doesn't give back anything when calling QSqlDatabase::tables() with QSql::Views // May be fixable by doing a select on informational_schema.views instead of using the client library api QEXPECT_FAIL("", "MySQL driver thinks that views are tables", Continue); + if(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)) + qDebug() << "failed to find" << qTableName("qtest_view") << "in" << tables; QVERIFY(tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)); } if (tempTables) @@ -1880,17 +1882,26 @@ void tst_QSqlDatabase::ibase_procWithReturnValues() "\nRESULT INTEGER)" "\nAS" "\nbegin" - "\nRESULT = 10;" + "\nRESULT = 10 * ABC;" "\nsuspend;" "\nend")); // Interbase procedures can be executed in two ways: EXECUTE PROCEDURE or SELECT QVERIFY_SQL(q, exec(QString("execute procedure %1(123)").arg(procName))); QVERIFY_SQL(q, next()); - QCOMPARE(q.value(0).toInt(), 10); + QCOMPARE(q.value(0).toInt(), 1230); QVERIFY_SQL(q, exec(QString("select result from %1(456)").arg(procName))); QVERIFY_SQL(q, next()); - QCOMPARE(q.value(0).toInt(), 10); + QCOMPARE(q.value(0).toInt(), 4560); + QVERIFY_SQL(q, prepare(QLatin1String("execute procedure ")+procName+QLatin1String("(?)"))); + q.bindValue(0, 123); + QVERIFY_SQL(q, exec()); + QVERIFY_SQL(q, next()); + QCOMPARE(q.value(0).toInt(), 1230); + q.bindValue(0, 456); + QVERIFY_SQL(q, exec()); + QVERIFY_SQL(q, next()); + QCOMPARE(q.value(0).toInt(), 4560); q.exec(QString("drop procedure %1").arg(procName)); } @@ -2276,7 +2287,7 @@ void tst_QSqlDatabase::db2_valueCacheUpdate() void tst_QSqlDatabase::sqlStatementUseIsNull_189093() { - // NULL = NULL is unknow, the sqlStatment must use IS NULL + // NULL = NULL is unknown, the sqlStatment must use IS NULL QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); -- cgit v0.12 From 2412b0410dcf97cf348ce703722a1b4f7ce623df Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Fri, 8 May 2009 09:02:55 +0200 Subject: qdoc: Moved platform-specific qdoc comments to common .cpp file. When building docs for the mac, qdoc comments for functions defined in the .h file were not found in any of the .cpp files in the mac package because they were in the x11 or windows .cpp file. So I moved them to a .cpp file that is in all the packages. Task-number: 252496 252492 --- src/gui/kernel/qwidget.cpp | 14 ++++++++++++++ src/gui/kernel/qwidget_x11.cpp | 13 ------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index b96d8b3..d911b48 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -11432,3 +11432,17 @@ void QWidget::clearMask() setMask(QRegion()); } +/*! \fn const QX11Info &QWidget::x11Info() const + Returns information about the configuration of the X display used to display + the widget. + + \warning This function is only available on X11. +*/ + +/*! \fn Qt::HANDLE QWidget::x11PictureHandle() const + Returns the X11 Picture handle of the widget for XRender + support. Use of this function is not portable. This function will + return 0 if XRender support is not compiled into Qt, if the + XRender extension is not supported on the X11 display, or if the + handle could not be created. +*/ diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp index 76734d4..6202b35 100644 --- a/src/gui/kernel/qwidget_x11.cpp +++ b/src/gui/kernel/qwidget_x11.cpp @@ -2747,12 +2747,6 @@ void QWidgetPrivate::setWindowOpacity_sys(qreal opacity) 32, PropModeReplace, (uchar*)&value, 1); } -/*! - Returns information about the configuration of the X display used to display - the widget. - - \warning This function is only available on X11. -*/ const QX11Info &QWidget::x11Info() const { Q_D(const QWidget); @@ -2789,13 +2783,6 @@ QWindowSurface *QWidgetPrivate::createDefaultWindowSurface_sys() return new QX11WindowSurface(q_func()); } -/*! - Returns the X11 Picture handle of the widget for XRender - support. Use of this function is not portable. This function will - return 0 if XRender support is not compiled into Qt, if the - XRender extension is not supported on the X11 display, or if the - handle could not be created. -*/ Qt::HANDLE QWidget::x11PictureHandle() const { #ifndef QT_NO_XRENDER -- cgit v0.12 From 9ffcf3737901c49acb1a1bc6b65572d195d78a5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20S=C3=B8rvig?= Date: Fri, 8 May 2009 09:51:15 +0200 Subject: Make the g++-42 mkspec use gcc-4.2 for linking as well. Forgot to override the linker, causing it to use gcc 4.0. Reviewed-by: Richard Moe Gustavsen --- mkspecs/macx-g++42/qmake.conf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mkspecs/macx-g++42/qmake.conf b/mkspecs/macx-g++42/qmake.conf index e6a3120..4c4f5c3 100644 --- a/mkspecs/macx-g++42/qmake.conf +++ b/mkspecs/macx-g++42/qmake.conf @@ -15,7 +15,11 @@ QMAKE_INCREMENTAL_STYLE = sublib include(../common/mac-g++.conf) -QMAKE_CC = gcc-4.2 -QMAKE_CXX = g++-4.2 +QMAKE_CC = gcc-4.2 +QMAKE_CXX = g++-4.2 +QMAKE_LINK = g++-4.2 +QMAKE_LINK_SHLIB = g++-4.2 +QMAKE_LINK_C = gcc-4.2 +QMAKE_LINK_C_SHLIB = gcc-4.2 load(qt_config) -- cgit v0.12 From 184e36cfb62a50bba74d2563ca3284e64b610d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Fri, 8 May 2009 10:20:27 +0200 Subject: Fixed a problem with QPrinter::NativeFormat printers not being valid. It's obvious that not only PDF and PS printers are valid.. Task-number: related to 252873 Reviewed-by: Samuel --- src/gui/painting/qprinter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/painting/qprinter.cpp b/src/gui/painting/qprinter.cpp index 6cecf2c..5090b3a 100644 --- a/src/gui/painting/qprinter.cpp +++ b/src/gui/painting/qprinter.cpp @@ -773,8 +773,8 @@ void QPrinter::setOutputFormat(OutputFormat format) if (def_engine) delete oldPrintEngine; - d->validPrinter = (d->outputFormat == QPrinter::PdfFormat - || d->outputFormat == QPrinter::PostScriptFormat); + if (d->outputFormat == QPrinter::PdfFormat || d->outputFormat == QPrinter::PostScriptFormat) + d->validPrinter = true; #else Q_UNUSED(format); #endif -- cgit v0.12 From a26e4a2e103608151c63cc11a2d7578cf1d080a3 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Fri, 8 May 2009 10:43:42 +0200 Subject: Revert "Added comment to QTextStream - clarification of the documentation" This reverts commit da1416cef6b1d24156739ded101df895ee4e80d9. --- src/corelib/io/qtextstream.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp index 2010008..ed9d0aa 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -67,8 +67,7 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384; \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 1 Note that you cannot use QTextStream::atEnd(), which returns true when you - have reached the end of the data stream, with stdin because as long as the - application is running, stdin has no end. + have reached the end of the data stream, with stdin. Besides using QTextStream's constructors, you can also set the device or string QTextStream operates on by calling setDevice() or -- cgit v0.12 From d1889402eff75b8dabf67e80c16e3e3316d187e8 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Fri, 8 May 2009 10:44:24 +0200 Subject: Correcting typo Removing linebreaks in the document --- doc/src/datastreamformat.qdoc | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/src/datastreamformat.qdoc b/doc/src/datastreamformat.qdoc index 67a3794..15ac062 100644 --- a/doc/src/datastreamformat.qdoc +++ b/doc/src/datastreamformat.qdoc @@ -301,12 +301,10 @@ \o \list \o Milliseconds since midnight (quint32) \endlist - \row \o QUrl \o \list \o Holds an URL (QString) \endlist - \row \o QVariant \o \list \o The type of the data (quint32) -- cgit v0.12 From 3e7fc907e5cc1937fb98bf4581cee960fe3d4e7a Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 7 May 2009 21:42:02 +0200 Subject: Fixes QDir not reentrant qt_cmp_si_sort_flags could be read and written from different threads. Use qStableSort with functor instead of libc's quicksort. Found with helgrind on kdevelop Reviewed-by: Marius Storm-Olsen --- src/corelib/io/qdir.cpp | 47 ++++++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 6d75c59..b7861ba 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -50,6 +50,7 @@ #include "qstring.h" #include "qregexp.h" #include "qvector.h" +#include "qalgorithms.h" #ifdef QT_BUILD_CORE_LIB # include "qresource.h" #endif @@ -190,32 +191,28 @@ QDirPrivate::~QDirPrivate() /* For sorting */ struct QDirSortItem { - QString filename_cache; - QString suffix_cache; + mutable QString filename_cache; + mutable QString suffix_cache; QFileInfo item; }; -static int qt_cmp_si_sort_flags; -#if defined(Q_C_CALLBACKS) -extern "C" { -#endif -#ifdef Q_OS_WINCE -static int __cdecl qt_cmp_si(const void *n1, const void *n2) -#else -static int qt_cmp_si(const void *n1, const void *n2) -#endif -{ - if (!n1 || !n2) - return 0; +class QDirSortItemComparator { + int qt_cmp_si_sort_flags; +public: + QDirSortItemComparator(int flags) : qt_cmp_si_sort_flags(flags) {} + bool operator()(const QDirSortItem &, const QDirSortItem &); +}; - QDirSortItem* f1 = (QDirSortItem*)n1; - QDirSortItem* f2 = (QDirSortItem*)n2; +bool QDirSortItemComparator::operator()(const QDirSortItem &n1, const QDirSortItem &n2) +{ + const QDirSortItem* f1 = &n1; + const QDirSortItem* f2 = &n2; if ((qt_cmp_si_sort_flags & QDir::DirsFirst) && (f1->item.isDir() != f2->item.isDir())) - return f1->item.isDir() ? -1 : 1; + return f1->item.isDir(); if ((qt_cmp_si_sort_flags & QDir::DirsLast) && (f1->item.isDir() != f2->item.isDir())) - return f1->item.isDir() ? 1 : -1; + return !f1->item.isDir(); int r = 0; int sortBy = (qt_cmp_si_sort_flags & QDir::SortByMask) @@ -264,18 +261,11 @@ static int qt_cmp_si(const void *n1, const void *n2) : f1->filename_cache.compare(f2->filename_cache); } - if (r == 0) // Enforce an order - the order the items appear in the array - r = (char*)n1 - (char*)n2; - if (qt_cmp_si_sort_flags & QDir::Reversed) - return -r; - return r; + return r > 0; + return r < 0; } -#if defined(Q_C_CALLBACKS) -} -#endif - inline void QDirPrivate::sortFileList(QDir::SortFlags sort, QStringList &l, QStringList *names, QFileInfoList *infos) const { @@ -292,9 +282,8 @@ inline void QDirPrivate::sortFileList(QDir::SortFlags sort, QStringList &l, path += QLatin1Char('/'); si[i].item = QFileInfo(path + l.at(i)); } - qt_cmp_si_sort_flags = sort; if ((sort & QDir::SortByMask) != QDir::Unsorted) - qsort(si, i, sizeof(si[0]), qt_cmp_si); + qStableSort(si, si+i, QDirSortItemComparator(sort)); // put them back in the list(s) for (int j = 0; j Date: Thu, 7 May 2009 22:53:24 +0200 Subject: Fix reentrancy of QVector and QString The d->capacity could be modified even if ref was more than 1 Reviewed-by: Marius Storm-Olsen --- src/corelib/tools/qstring.h | 2 +- src/corelib/tools/qvector.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index 1493dce..b25881f 100644 --- a/src/corelib/tools/qstring.h +++ b/src/corelib/tools/qstring.h @@ -113,7 +113,7 @@ public: int capacity() const; inline void reserve(int size); - inline void squeeze() { if (d->size < d->alloc) realloc(); d->capacity = 0;} + inline void squeeze() { if (d->size < d->alloc || ref != 1) realloc(); d->capacity = 0;} inline const QChar *unicode() const; inline QChar *data(); diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 3fd52ee..1f047b8 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -315,7 +315,7 @@ void QVector::detach_helper() { realloc(d->size, d->alloc); } template void QVector::reserve(int asize) -{ if (asize > d->alloc) realloc(d->size, asize); d->capacity = 1; } +{ if (asize > d->alloc || d->ref != 1) realloc(d->size, asize); d->capacity = 1; } template void QVector::resize(int asize) { realloc(asize, (asize > d->alloc || (!d->capacity && asize < d->size && asize < (d->alloc >> 1))) ? -- cgit v0.12 From 4f1f40791ed7e6aec845752680c525efbcb9be84 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 8 May 2009 12:50:01 +0200 Subject: Fix reentrency of the QCSS engine. QTextDocument which is suposed to be reentrant may use the CSS Parser in different threads. The way the indexOfId was computed is not thread safe. Insert the pre-computed value instead Reviewed-by: Thierry --- src/gui/text/qcssparser.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/gui/text/qcssparser.cpp b/src/gui/text/qcssparser.cpp index db1e781..8214e54 100644 --- a/src/gui/text/qcssparser.cpp +++ b/src/gui/text/qcssparser.cpp @@ -278,19 +278,15 @@ static const QCssKnownValue values[NumKnownValues - 1] = { { "xx-large", Value_XXLarge } }; +//Map id to strings as they appears in the 'values' array above +static const int indexOfId[NumKnownValues] = { 0, 40, 47, 41, 48, 53, 34, 26, 68, 69, 25, 42, 5, 62, 46, + 29, 57, 58, 27, 50, 60, 6, 10, 38, 55, 19, 13, 17, 18, 20, 21, 49, 24, 45, 65, 36, 3, 2, 39, 61, 16, + 11, 56, 14, 32, 63, 54, 64, 33, 67, 8, 28, 37, 12, 35, 59, 7, 9, 4, 66, 52, 22, 23, 30, 31, 1, 15, 0, + 51, 44, 43 }; + QString Value::toString() const { - static int indexOfId[NumKnownValues - 1]; - static bool hasCachedIndexes = false; - if (type == KnownIdentifier) { - if (!hasCachedIndexes) { - for (int i = 0; i < NumKnownValues - 1; ++i) - indexOfId[values[i].id] = i; - - hasCachedIndexes = true; - } - return QLatin1String(values[indexOfId[variant.toInt()]].name); } else { return variant.toString(); -- cgit v0.12 From fafd6f5a43d72e91bc511b9738eae6f087eb8073 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Fri, 8 May 2009 13:02:01 +0200 Subject: Added further explanation on the note about stdin and QTextsStream::atEnd() Explained why you cannot use stdin and atEnd() together. Task-number:251171 Rev-by: Andreas Aardal Hanssen --- src/corelib/io/qtextstream.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp index ed9d0aa..1167671 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -67,8 +67,10 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384; \snippet doc/src/snippets/code/src_corelib_io_qtextstream.cpp 1 Note that you cannot use QTextStream::atEnd(), which returns true when you - have reached the end of the data stream, with stdin. - + have reached the end of the data stream, with stdin. The reason for this is + that as long as stdin doesn't give any input to the QTextStream, \c atEnd() + will return true even if the stdin is open and waiting for more characters. + Besides using QTextStream's constructors, you can also set the device or string QTextStream operates on by calling setDevice() or setString(). You can seek to a position by calling seek(), and -- cgit v0.12 From f64bcba9338928107bb4bfc1282b94aa2f696557 Mon Sep 17 00:00:00 2001 From: Harald Fernengel Date: Fri, 8 May 2009 13:25:58 +0200 Subject: compile? --- src/corelib/tools/qstring.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index b25881f..69c4f2f 100644 --- a/src/corelib/tools/qstring.h +++ b/src/corelib/tools/qstring.h @@ -113,7 +113,7 @@ public: int capacity() const; inline void reserve(int size); - inline void squeeze() { if (d->size < d->alloc || ref != 1) realloc(); d->capacity = 0;} + inline void squeeze() { if (d->size < d->alloc || d->ref != 1) realloc(); d->capacity = 0;} inline const QChar *unicode() const; inline QChar *data(); -- cgit v0.12 From 42e2070925d012845db9cf85e597a17851a0dcb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Wed, 6 May 2009 16:12:57 +0200 Subject: Fix leak of file descriptors in QTemporaryFile Using setFileName in QFile::copy (introduced recently) has a nasty side-effect of leaking file descriptors in QTemporaryFile. This happens because the code assumes the file has been closed. In QTemporaryFile, we need to explicitly call native file engine close. Test case by Thiago. Bug report from Arora developers. Reviewed-by: thiago --- src/corelib/io/qtemporaryfile.cpp | 9 +++++ tests/auto/qtemporaryfile/qtemporaryfile.pro | 3 +- tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp | 45 ++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index 4856353..6a9125c 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -294,6 +294,8 @@ public: QTemporaryFileEngine(const QString &file) : QFSFileEngine(file) { } ~QTemporaryFileEngine(); + void setFileName(const QString &file); + bool open(QIODevice::OpenMode flags); bool remove(); bool close(); @@ -304,6 +306,13 @@ QTemporaryFileEngine::~QTemporaryFileEngine() QFSFileEngine::close(); } +void QTemporaryFileEngine::setFileName(const QString &file) +{ + // Really close the file, so we don't leak + QFSFileEngine::close(); + QFSFileEngine::setFileName(file); +} + bool QTemporaryFileEngine::open(QIODevice::OpenMode openMode) { Q_D(QFSFileEngine); diff --git a/tests/auto/qtemporaryfile/qtemporaryfile.pro b/tests/auto/qtemporaryfile/qtemporaryfile.pro index 0c90994..bde990a 100644 --- a/tests/auto/qtemporaryfile/qtemporaryfile.pro +++ b/tests/auto/qtemporaryfile/qtemporaryfile.pro @@ -2,5 +2,4 @@ load(qttest_p4) SOURCES += tst_qtemporaryfile.cpp QT = core - - +DEFINES += SRCDIR=\\\"$$PWD/\\\" diff --git a/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp index f5155ae..2daa0f6 100644 --- a/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/qtemporaryfile/tst_qtemporaryfile.cpp @@ -51,6 +51,13 @@ #if defined(Q_OS_WIN) # include #endif +#if defined(Q_OS_UNIX) +# include +# include +# include +# include // open(2) +# include // close(2) +#endif //TESTED_CLASS= //TESTED_FILES= @@ -78,6 +85,7 @@ private slots: void openOnRootDrives(); void stressTest(); void rename(); + void renameFdLeak(); public: }; @@ -356,5 +364,42 @@ void tst_QTemporaryFile::rename() QVERIFY(!dir.exists("temporary-file.txt")); } +void tst_QTemporaryFile::renameFdLeak() +{ +#ifdef Q_OS_UNIX + // Test this on Unix only + + // Open a bunch of files to force the fd count to go up + static const int count = 10; + int bunch_of_files[count]; + for (int i = 0; i < count; ++i) { + bunch_of_files[i] = ::open(SRCDIR "tst_qtemporaryfile.cpp", O_RDONLY); + QVERIFY(bunch_of_files[i] != -1); + } + + int fd; + { + QTemporaryFile file; + file.setAutoRemove(false); + QVERIFY(file.open()); + + // close the bunch of files + for (int i = 0; i < count; ++i) + ::close(bunch_of_files[i]); + + // save the file descriptor for later + fd = file.handle(); + + // rename the file to something + QString newPath = QDir::tempPath() + "/tst_qtemporaryfile-renameFdLeak-" + QString::number(getpid()); + file.rename(newPath); + QFile::remove(newPath); + } + + // check if QTemporaryFile closed the file + QVERIFY(::close(fd) == -1 && errno == EBADF); +#endif +} + QTEST_MAIN(tst_QTemporaryFile) #include "tst_qtemporaryfile.moc" -- cgit v0.12 From 813835f67a1053561eba67bf958eb39c0f4eedfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Thu, 7 May 2009 20:45:35 +0200 Subject: Fix QCompleter with UnfilteredPopupCompletion Fixes regression introduced in a794ded85f74516239a08cf848e6b4f8b6dcac6a. When using UnfilteredPopupCompletion the matchCount is always zero and completion was being skipped. By adding the check for showAll we still avoid the assert but retain correct behavior. Task-number: 253125 Reviewed-by: jasplin --- src/gui/util/qcompleter.cpp | 2 +- tests/auto/qcompleter/tst_qcompleter.cpp | 46 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/gui/util/qcompleter.cpp b/src/gui/util/qcompleter.cpp index a622385..faa4e7b 100644 --- a/src/gui/util/qcompleter.cpp +++ b/src/gui/util/qcompleter.cpp @@ -824,7 +824,7 @@ void QCompleterPrivate::_q_complete(QModelIndex index, bool highlighted) Q_Q(QCompleter); QString completion; - if (!index.isValid() || (index.row() >= proxy->engine->matchCount())) { + if (!index.isValid() || (!proxy->showAll && (index.row() >= proxy->engine->matchCount()))) { completion = prefix; } else { QModelIndex si = proxy->mapToSource(index); diff --git a/tests/auto/qcompleter/tst_qcompleter.cpp b/tests/auto/qcompleter/tst_qcompleter.cpp index 656995a..b71cdc6 100644 --- a/tests/auto/qcompleter/tst_qcompleter.cpp +++ b/tests/auto/qcompleter/tst_qcompleter.cpp @@ -143,6 +143,9 @@ private slots: void task246056_setCompletionPrefix(); void task250064_lostFocus(); + void task253125_lineEditCompletion_data(); + void task253125_lineEditCompletion(); + private: void filter(); void testRowCount(); @@ -1184,5 +1187,48 @@ void tst_QCompleter::task250064_lostFocus() QCOMPARE(textEdit->focusPolicy(), origPolicy); } +void tst_QCompleter::task253125_lineEditCompletion_data() +{ + QTest::addColumn("list"); + QTest::addColumn("completionMode"); + + QStringList list = QStringList() + << "alpha" << "beta" << "gamma" << "delta" << "epsilon" << "zeta" + << "eta" << "theta" << "iota" << "kappa" << "lambda" << "mu" + << "nu" << "xi" << "omicron" << "pi" << "rho" << "sigma" + << "tau" << "upsilon" << "phi" << "chi" << "psi" << "omega"; + + QTest::newRow("Inline") << list << (int)QCompleter::InlineCompletion; + QTest::newRow("Filtered") << list << (int)QCompleter::PopupCompletion; + QTest::newRow("Unfiltered") << list << (int)QCompleter::UnfilteredPopupCompletion; +} + +void tst_QCompleter::task253125_lineEditCompletion() +{ + QFETCH(QStringList, list); + QFETCH(int, completionMode); + + QStringListModel *model = new QStringListModel; + model->setStringList(list); + + QCompleter *completer = new QCompleter(list); + completer->setModel(model); + completer->setCompletionMode((QCompleter::CompletionMode)completionMode); + + QLineEdit edit; + edit.setCompleter(completer); + edit.show(); + edit.setFocus(); + + QTest::qWait(100); + + QTest::keyClick(&edit, 'i'); + QCOMPARE(edit.completer()->currentCompletion(), QString("iota")); + QTest::keyClick(edit.completer()->popup(), Qt::Key_Down); + QTest::keyClick(edit.completer()->popup(), Qt::Key_Enter); + + QCOMPARE(edit.text(), QString("iota")); +} + QTEST_MAIN(tst_QCompleter) #include "tst_qcompleter.moc" -- cgit v0.12 From 42b5bc2e21cbed70b64fcd1f1bcf9282444206dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Thu, 7 May 2009 20:53:22 +0200 Subject: Fixes a crash in QPrinterDialog with relative filenames It's better to set the sourceModel in the constructor for QFSCompletor, as requiring that it be set separately is error prone. Surprisingly, the printer dialog crash only appears to happen when using relative filenames. Task-number: 253135 Reviewed-by: alexis --- src/gui/dialogs/qfiledialog.cpp | 1 - src/gui/dialogs/qfiledialog_p.h | 2 +- tests/auto/qprinter/tst_qprinter.cpp | 18 ++++++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp index 2f524cb..eeb2743 100644 --- a/src/gui/dialogs/qfiledialog.cpp +++ b/src/gui/dialogs/qfiledialog.cpp @@ -2142,7 +2142,6 @@ void QFileDialogPrivate::createWidgets() #ifndef QT_NO_COMPLETER completer = new QFSCompletor(model, q); qFileDialogUi->fileNameEdit->setCompleter(completer); - completer->sourceModel = model; QObject::connect(qFileDialogUi->fileNameEdit, SIGNAL(textChanged(QString)), q, SLOT(_q_autoCompleteFileName(QString))); #endif // QT_NO_COMPLETER diff --git a/src/gui/dialogs/qfiledialog_p.h b/src/gui/dialogs/qfiledialog_p.h index dc24390..ab4199e 100644 --- a/src/gui/dialogs/qfiledialog_p.h +++ b/src/gui/dialogs/qfiledialog_p.h @@ -97,7 +97,7 @@ class Ui_QFileDialog; */ class QFSCompletor : public QCompleter { public: - QFSCompletor(QAbstractItemModel *model, QObject *parent = 0) : QCompleter(model, parent), proxyModel(0), sourceModel(0) + QFSCompletor(QFileSystemModel *model, QObject *parent = 0) : QCompleter(model, parent), proxyModel(0), sourceModel(model) { #ifdef Q_OS_WIN setCaseSensitivity(Qt::CaseInsensitive); diff --git a/tests/auto/qprinter/tst_qprinter.cpp b/tests/auto/qprinter/tst_qprinter.cpp index a598bfc..cde4ae5 100644 --- a/tests/auto/qprinter/tst_qprinter.cpp +++ b/tests/auto/qprinter/tst_qprinter.cpp @@ -103,6 +103,7 @@ private slots: void valuePreservation(); void errorReporting(); void testCustomPageSizes(); + void printDialogCompleter(); private: }; @@ -940,5 +941,22 @@ void tst_QPrinter::testCustomPageSizes() QCOMPARE(paperSize, customSize); } +void tst_QPrinter::printDialogCompleter() +{ +#if defined(QT_NO_COMPLETER) || defined(QT_NO_FILEDIALOG) + QSKIP("QT_NO_COMPLETER || QT_NO_FILEDIALOG: Auto-complete turned off in QPrinterDialog.", QTest::SkipAll); +#else + QPrintDialog dialog; + dialog.printer()->setOutputFileName("file.pdf"); + dialog.setEnabledOptions(QAbstractPrintDialog::PrintToFile); + dialog.show(); + + QTest::qWait(100); + + QTest::keyClick(0, Qt::Key_Tab); + QTest::keyClick(0, 'P'); +#endif +} + QTEST_MAIN(tst_QPrinter) #include "tst_qprinter.moc" -- cgit v0.12 From b5adcbd322d9ae34b54ccde5a4d5835a2078f7db Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Fri, 8 May 2009 13:22:34 +0200 Subject: QDataStream: Small doc error Task-number: 253179 Reviewed-by: TrustMe --- src/corelib/io/qdatastream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp index 9990696..b203899 100644 --- a/src/corelib/io/qdatastream.cpp +++ b/src/corelib/io/qdatastream.cpp @@ -514,7 +514,7 @@ void QDataStream::setByteOrder(ByteOrder bo) \value Qt_4_2 Version 8 (Qt 4.2) \value Qt_4_3 Version 9 (Qt 4.3) \value Qt_4_4 Version 10 (Qt 4.4) - \value Qt_4_5 Version 10 (Qt 4.5) + \value Qt_4_5 Version 11 (Qt 4.5) \omitvalue Qt_4_6 \sa setVersion(), version() -- cgit v0.12 From 6f1946e92e01582cdfb5712ccb9ee734f9af7743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Wed, 6 May 2009 18:17:12 +0200 Subject: macx-g++42 spec linker was gcc instead of gcc-4.2 Better alternative to 9ffcf3737901c49acb1a1bc6b65572d195d78a5d Task-number: 253052 Reviewed-by: Norwegian Rock Cat Reviewed-by: MortenS --- mkspecs/common/mac-g++.conf | 8 ++++---- mkspecs/macx-g++/qmake.conf | 4 ++-- mkspecs/macx-g++42/qmake.conf | 11 +++-------- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/mkspecs/common/mac-g++.conf b/mkspecs/common/mac-g++.conf index b764b26..eaae1aa 100644 --- a/mkspecs/common/mac-g++.conf +++ b/mkspecs/common/mac-g++.conf @@ -46,10 +46,10 @@ QMAKE_CXXFLAGS_DWARF2 += $$QMAKE_CFLAGS_DWARF2 QMAKE_CXXFLAGS_PRECOMPILE += -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT} QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE -QMAKE_LINK = g++ -QMAKE_LINK_SHLIB = g++ -QMAKE_LINK_C = gcc -QMAKE_LINK_C_SHLIB = gcc +QMAKE_LINK = $$QMAKE_CXX +QMAKE_LINK_SHLIB = $$QMAKE_CXX +QMAKE_LINK_C = $$QMAKE_CC +QMAKE_LINK_C_SHLIB = $$QMAKE_CC QMAKE_LFLAGS += -headerpad_max_install_names QMAKE_LFLAGS_RELEASE += QMAKE_LFLAGS_DEBUG += diff --git a/mkspecs/macx-g++/qmake.conf b/mkspecs/macx-g++/qmake.conf index 64ef801..4355073 100644 --- a/mkspecs/macx-g++/qmake.conf +++ b/mkspecs/macx-g++/qmake.conf @@ -12,9 +12,9 @@ CONFIG += qt warn_on release app_bundle incremental global_init_link_order lib QT += core gui QMAKE_INCREMENTAL_STYLE = sublib -include(../common/mac-g++.conf) - QMAKE_CC = gcc QMAKE_CXX = g++ +include(../common/mac-g++.conf) + load(qt_config) diff --git a/mkspecs/macx-g++42/qmake.conf b/mkspecs/macx-g++42/qmake.conf index 4c4f5c3..06bbdcb 100644 --- a/mkspecs/macx-g++42/qmake.conf +++ b/mkspecs/macx-g++42/qmake.conf @@ -12,14 +12,9 @@ CONFIG += qt warn_on release app_bundle incremental global_init_link_order lib QT += core gui QMAKE_INCREMENTAL_STYLE = sublib -include(../common/mac-g++.conf) - +QMAKE_CC = gcc-4.2 +QMAKE_CXX = g++-4.2 -QMAKE_CC = gcc-4.2 -QMAKE_CXX = g++-4.2 -QMAKE_LINK = g++-4.2 -QMAKE_LINK_SHLIB = g++-4.2 -QMAKE_LINK_C = gcc-4.2 -QMAKE_LINK_C_SHLIB = gcc-4.2 +include(../common/mac-g++.conf) load(qt_config) -- cgit v0.12 From 0ba839d4587a40a8af31c8233213da216002706e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 8 May 2009 13:38:23 +0200 Subject: Fixing hellogl_es2 for Windows CE We hardcode the lib names for 4.5 Reviewed-by: Maurice --- examples/opengl/hellogl_es2/hellogl_es2.pro | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/opengl/hellogl_es2/hellogl_es2.pro b/examples/opengl/hellogl_es2/hellogl_es2.pro index 92b4224..d5ad4b8 100644 --- a/examples/opengl/hellogl_es2/hellogl_es2.pro +++ b/examples/opengl/hellogl_es2/hellogl_es2.pro @@ -25,3 +25,9 @@ target.path = $$[QT_INSTALL_EXAMPLES]/opengl/hellogl_es2 sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS hellogl_es2.pro sources.path = $$[QT_INSTALL_EXAMPLES]/opengl/hellogl_es2 INSTALLS += target sources + + +wince*: { + QMAKE_LIBS += "libGLESv2.lib" + +} \ No newline at end of file -- cgit v0.12 From b21210d646f4aaa639fa480ddf1c8e5fcd9b0572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Thu, 7 May 2009 16:07:47 +0200 Subject: Prevented asynchronous access to non-thread safe libfontconfig API. We need to protect calls to FcCharSetHasChar with the font database mutex. Task-number: 241361 Reviewed-by: Simon Hausmann --- src/gui/text/qfontengine_ft.cpp | 43 ++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index de03a3c..7a236fd 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -1521,6 +1521,11 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs return false; } +#if !defined(QT_NO_FONTCONFIG) + extern QMutex *qt_fontdatabase_mutex(); + QMutex *mtx = 0; +#endif + bool mirrored = flags & QTextEngine::RightToLeft; int glyph_pos = 0; if (freetype->symbol_map) { @@ -1533,6 +1538,11 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs if ( !glyphs->glyphs[glyph_pos] ) { glyph_t glyph; #if !defined(QT_NO_FONTCONFIG) + if (!mtx) { + mtx = qt_fontdatabase_mutex(); + mtx->lock(); + } + if (FcCharSetHasChar(freetype->charset, uc)) { #else if (false) { @@ -1561,20 +1571,26 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs if (mirrored) uc = QChar::mirroredChar(uc); glyphs->glyphs[glyph_pos] = uc < QFreetypeFace::cmapCacheSize ? freetype->cmapCache[uc] : 0; - if (!glyphs->glyphs[glyph_pos] + if (!glyphs->glyphs[glyph_pos]) { #if !defined(QT_NO_FONTCONFIG) - && FcCharSetHasChar(freetype->charset, uc) + if (!mtx) { + mtx = qt_fontdatabase_mutex(); + mtx->lock(); + } + + if (FcCharSetHasChar(freetype->charset, uc)) #endif - ) { - redo: - glyph_t glyph = FT_Get_Char_Index(face, uc); - if (!glyph && (uc == 0xa0 || uc == 0x9)) { - uc = 0x20; - goto redo; + { + redo: + glyph_t glyph = FT_Get_Char_Index(face, uc); + if (!glyph && (uc == 0xa0 || uc == 0x9)) { + uc = 0x20; + goto redo; + } + glyphs->glyphs[glyph_pos] = glyph; + if (uc < QFreetypeFace::cmapCacheSize) + freetype->cmapCache[uc] = glyph; } - glyphs->glyphs[glyph_pos] = glyph; - if (uc < QFreetypeFace::cmapCacheSize) - freetype->cmapCache[uc] = glyph; } ++glyph_pos; } @@ -1583,6 +1599,11 @@ bool QFontEngineFT::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs *nglyphs = glyph_pos; glyphs->numGlyphs = glyph_pos; +#if !defined(QT_NO_FONTCONFIG) + if (mtx) + mtx->unlock(); +#endif + if (flags & QTextEngine::GlyphIndicesOnly) return true; -- cgit v0.12 From 842ba1b3878c2973b24936b18a7ee55bdd980be6 Mon Sep 17 00:00:00 2001 From: Rohan McGovern Date: Mon, 11 May 2009 14:28:43 +1000 Subject: Fixes qt3support unit tests generating compile failures when Qt is not configured with qt3support. The build system knows when qt3support was turned off, so let's just skip these tests in that case. That makes more sense than individually configuring each autotest machine to skip these tests when the configuration is known to turn off qt3support, which is what's done previously. Reviewed-by: Lincoln Ramsay --- tests/auto/q3accel/q3accel.pro | 1 + tests/auto/q3action/q3action.pro | 1 + tests/auto/q3actiongroup/q3actiongroup.pro | 1 + tests/auto/q3buttongroup/clickLock/clickLock.pro | 3 ++- tests/auto/q3buttongroup/tst_q3buttongroup.pro | 1 + tests/auto/q3canvas/q3canvas.pro | 1 + tests/auto/q3checklistitem/q3checklistitem.pro | 1 + tests/auto/q3combobox/q3combobox.pro | 1 + tests/auto/q3cstring/q3cstring.pro | 1 + tests/auto/q3databrowser/q3databrowser.pro | 1 + tests/auto/q3dateedit/q3dateedit.pro | 1 + tests/auto/q3datetimeedit/q3datetimeedit.pro | 1 + tests/auto/q3deepcopy/q3deepcopy.pro | 1 + tests/auto/q3dict/q3dict.pro | 1 + tests/auto/q3dns/q3dns.pro | 1 + tests/auto/q3dockwindow/q3dockwindow.pro | 1 + tests/auto/q3filedialog/q3filedialog.pro | 1 + tests/auto/q3frame/q3frame.pro | 1 + tests/auto/q3groupbox/q3groupbox.pro | 1 + tests/auto/q3hbox/q3hbox.pro | 1 + tests/auto/q3header/q3header.pro | 1 + tests/auto/q3iconview/q3iconview.pro | 1 + tests/auto/q3listbox/q3listbox.pro | 3 ++- tests/auto/q3listview/q3listview.pro | 1 + tests/auto/q3listviewitemiterator/q3listviewitemiterator.pro | 1 + tests/auto/q3mainwindow/q3mainwindow.pro | 1 + tests/auto/q3popupmenu/q3popupmenu.pro | 1 + tests/auto/q3process/q3process.pro | 1 + tests/auto/q3process/tst/tst.pro | 3 ++- tests/auto/q3progressbar/q3progressbar.pro | 1 + tests/auto/q3progressdialog/q3progressdialog.pro | 1 + tests/auto/q3ptrlist/q3ptrlist.pro | 1 + tests/auto/q3richtext/q3richtext.pro | 1 + tests/auto/q3scrollview/q3scrollview.pro | 3 ++- tests/auto/q3semaphore/q3semaphore.pro | 1 + tests/auto/q3serversocket/q3serversocket.pro | 1 + tests/auto/q3socket/q3socket.pro | 1 + tests/auto/q3socketdevice/q3socketdevice.pro | 1 + tests/auto/q3sqlcursor/q3sqlcursor.pro | 1 + tests/auto/q3sqlselectcursor/q3sqlselectcursor.pro | 1 + tests/auto/q3stylesheet/q3stylesheet.pro | 1 + tests/auto/q3tabdialog/q3tabdialog.pro | 1 + tests/auto/q3table/q3table.pro | 1 + tests/auto/q3textbrowser/q3textbrowser.pro | 1 + tests/auto/q3textedit/q3textedit.pro | 1 + tests/auto/q3textstream/q3textstream.pro | 1 + tests/auto/q3timeedit/q3timeedit.pro | 1 + tests/auto/q3toolbar/q3toolbar.pro | 1 + tests/auto/q3uridrag/q3uridrag.pro | 3 ++- tests/auto/q3urloperator/q3urloperator.pro | 3 ++- tests/auto/q3valuelist/q3valuelist.pro | 3 ++- tests/auto/q3valuevector/q3valuevector.pro | 3 ++- tests/auto/q3widgetstack/q3widgetstack.pro | 3 ++- 53 files changed, 62 insertions(+), 9 deletions(-) diff --git a/tests/auto/q3accel/q3accel.pro b/tests/auto/q3accel/q3accel.pro index 002033f..61d4f38 100644 --- a/tests/auto/q3accel/q3accel.pro +++ b/tests/auto/q3accel/q3accel.pro @@ -3,6 +3,7 @@ HEADERS += SOURCES += tst_q3accel.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3action/q3action.pro b/tests/auto/q3action/q3action.pro index ee5d780..c85a158 100644 --- a/tests/auto/q3action/q3action.pro +++ b/tests/auto/q3action/q3action.pro @@ -1,3 +1,4 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3action.cpp diff --git a/tests/auto/q3actiongroup/q3actiongroup.pro b/tests/auto/q3actiongroup/q3actiongroup.pro index bfe1f68..139e48c 100644 --- a/tests/auto/q3actiongroup/q3actiongroup.pro +++ b/tests/auto/q3actiongroup/q3actiongroup.pro @@ -1,5 +1,6 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3actiongroup.cpp diff --git a/tests/auto/q3buttongroup/clickLock/clickLock.pro b/tests/auto/q3buttongroup/clickLock/clickLock.pro index 68f5ed2..a1aa105 100644 --- a/tests/auto/q3buttongroup/clickLock/clickLock.pro +++ b/tests/auto/q3buttongroup/clickLock/clickLock.pro @@ -3,7 +3,8 @@ TEMPLATE = app win32:TARGET = ../clickLock !win32:TARGET = clickLock -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) DEPENDPATH += . INCLUDEPATH += . CONFIG -= app_bundle diff --git a/tests/auto/q3buttongroup/tst_q3buttongroup.pro b/tests/auto/q3buttongroup/tst_q3buttongroup.pro index 8ec25d0..9f1f090 100644 --- a/tests/auto/q3buttongroup/tst_q3buttongroup.pro +++ b/tests/auto/q3buttongroup/tst_q3buttongroup.pro @@ -1,5 +1,6 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) # Input SOURCES += tst_q3buttongroup.cpp diff --git a/tests/auto/q3canvas/q3canvas.pro b/tests/auto/q3canvas/q3canvas.pro index cac538d..70e9b88 100644 --- a/tests/auto/q3canvas/q3canvas.pro +++ b/tests/auto/q3canvas/q3canvas.pro @@ -3,5 +3,6 @@ SOURCES += tst_q3canvas.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3checklistitem/q3checklistitem.pro b/tests/auto/q3checklistitem/q3checklistitem.pro index 77d96e8..9ae9c55 100644 --- a/tests/auto/q3checklistitem/q3checklistitem.pro +++ b/tests/auto/q3checklistitem/q3checklistitem.pro @@ -3,5 +3,6 @@ SOURCES += tst_q3checklistitem.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3combobox/q3combobox.pro b/tests/auto/q3combobox/q3combobox.pro index 2391f6c..7dcde2b 100644 --- a/tests/auto/q3combobox/q3combobox.pro +++ b/tests/auto/q3combobox/q3combobox.pro @@ -1,3 +1,4 @@ load(qttest_p4) SOURCES += tst_q3combobox.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3cstring/q3cstring.pro b/tests/auto/q3cstring/q3cstring.pro index 78077b8..1171093 100644 --- a/tests/auto/q3cstring/q3cstring.pro +++ b/tests/auto/q3cstring/q3cstring.pro @@ -3,5 +3,6 @@ SOURCES += tst_q3cstring.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3databrowser/q3databrowser.pro b/tests/auto/q3databrowser/q3databrowser.pro index 09c16b7..d65a5ef 100644 --- a/tests/auto/q3databrowser/q3databrowser.pro +++ b/tests/auto/q3databrowser/q3databrowser.pro @@ -2,5 +2,6 @@ load(qttest_p4) SOURCES += tst_q3databrowser.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3dateedit/q3dateedit.pro b/tests/auto/q3dateedit/q3dateedit.pro index ba585ce..85e0ebf 100644 --- a/tests/auto/q3dateedit/q3dateedit.pro +++ b/tests/auto/q3dateedit/q3dateedit.pro @@ -1,6 +1,7 @@ load(qttest_p4) SOURCES += tst_q3dateedit.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3datetimeedit/q3datetimeedit.pro b/tests/auto/q3datetimeedit/q3datetimeedit.pro index f2c0097..9c980be 100644 --- a/tests/auto/q3datetimeedit/q3datetimeedit.pro +++ b/tests/auto/q3datetimeedit/q3datetimeedit.pro @@ -4,6 +4,7 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3datetimeedit.cpp diff --git a/tests/auto/q3deepcopy/q3deepcopy.pro b/tests/auto/q3deepcopy/q3deepcopy.pro index 04e0690..9ac1a10 100644 --- a/tests/auto/q3deepcopy/q3deepcopy.pro +++ b/tests/auto/q3deepcopy/q3deepcopy.pro @@ -3,5 +3,6 @@ SOURCES += tst_q3deepcopy.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3dict/q3dict.pro b/tests/auto/q3dict/q3dict.pro index 5ccd875..7bbea61 100644 --- a/tests/auto/q3dict/q3dict.pro +++ b/tests/auto/q3dict/q3dict.pro @@ -3,5 +3,6 @@ SOURCES += tst_q3dict.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3dns/q3dns.pro b/tests/auto/q3dns/q3dns.pro index 10c24e5..7fd2e4c 100644 --- a/tests/auto/q3dns/q3dns.pro +++ b/tests/auto/q3dns/q3dns.pro @@ -3,5 +3,6 @@ SOURCES += tst_q3dns.cpp QT += network qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3dockwindow/q3dockwindow.pro b/tests/auto/q3dockwindow/q3dockwindow.pro index 5f23c40..1352123 100644 --- a/tests/auto/q3dockwindow/q3dockwindow.pro +++ b/tests/auto/q3dockwindow/q3dockwindow.pro @@ -3,6 +3,7 @@ HEADERS += SOURCES += tst_q3dockwindow.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3filedialog/q3filedialog.pro b/tests/auto/q3filedialog/q3filedialog.pro index 2394111..f57f9c0 100644 --- a/tests/auto/q3filedialog/q3filedialog.pro +++ b/tests/auto/q3filedialog/q3filedialog.pro @@ -4,6 +4,7 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3filedialog.cpp diff --git a/tests/auto/q3frame/q3frame.pro b/tests/auto/q3frame/q3frame.pro index 7f0d24f..1d1f5a7 100644 --- a/tests/auto/q3frame/q3frame.pro +++ b/tests/auto/q3frame/q3frame.pro @@ -1,4 +1,5 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3frame.cpp diff --git a/tests/auto/q3groupbox/q3groupbox.pro b/tests/auto/q3groupbox/q3groupbox.pro index 5153a25..fd4cced 100644 --- a/tests/auto/q3groupbox/q3groupbox.pro +++ b/tests/auto/q3groupbox/q3groupbox.pro @@ -1,5 +1,6 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) # Input SOURCES += tst_q3groupbox.cpp diff --git a/tests/auto/q3hbox/q3hbox.pro b/tests/auto/q3hbox/q3hbox.pro index d5b7c65..bbd7f5b 100644 --- a/tests/auto/q3hbox/q3hbox.pro +++ b/tests/auto/q3hbox/q3hbox.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3hbox.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3header/q3header.pro b/tests/auto/q3header/q3header.pro index 64ffb0f..d1a913a 100644 --- a/tests/auto/q3header/q3header.pro +++ b/tests/auto/q3header/q3header.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3header.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3iconview/q3iconview.pro b/tests/auto/q3iconview/q3iconview.pro index 37a138b..9416c08 100644 --- a/tests/auto/q3iconview/q3iconview.pro +++ b/tests/auto/q3iconview/q3iconview.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3iconview.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3listbox/q3listbox.pro b/tests/auto/q3listbox/q3listbox.pro index d193ace..dc2d197 100644 --- a/tests/auto/q3listbox/q3listbox.pro +++ b/tests/auto/q3listbox/q3listbox.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_qlistbox.cpp -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3listview/q3listview.pro b/tests/auto/q3listview/q3listview.pro index 56c62d1..5d72ea6 100644 --- a/tests/auto/q3listview/q3listview.pro +++ b/tests/auto/q3listview/q3listview.pro @@ -2,4 +2,5 @@ load(qttest_p4) SOURCES += tst_q3listview.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3listviewitemiterator/q3listviewitemiterator.pro b/tests/auto/q3listviewitemiterator/q3listviewitemiterator.pro index 143e0c0..b50d012 100644 --- a/tests/auto/q3listviewitemiterator/q3listviewitemiterator.pro +++ b/tests/auto/q3listviewitemiterator/q3listviewitemiterator.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3listviewitemiterator.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3mainwindow/q3mainwindow.pro b/tests/auto/q3mainwindow/q3mainwindow.pro index 7a198d1..c4cb7c4 100644 --- a/tests/auto/q3mainwindow/q3mainwindow.pro +++ b/tests/auto/q3mainwindow/q3mainwindow.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3mainwindow.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) CONFIG += console diff --git a/tests/auto/q3popupmenu/q3popupmenu.pro b/tests/auto/q3popupmenu/q3popupmenu.pro index c9c0dd5..216722b 100644 --- a/tests/auto/q3popupmenu/q3popupmenu.pro +++ b/tests/auto/q3popupmenu/q3popupmenu.pro @@ -4,5 +4,6 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3popupmenu.cpp diff --git a/tests/auto/q3process/q3process.pro b/tests/auto/q3process/q3process.pro index 8dc3541..a665c2b 100644 --- a/tests/auto/q3process/q3process.pro +++ b/tests/auto/q3process/q3process.pro @@ -5,6 +5,7 @@ SUBDIRS = cat \ tst TARGET = tst_q3process QT += qt3support +requires(contains(QT_CONFIG,qt3support)) #no install rule for subdir INSTALLS = diff --git a/tests/auto/q3process/tst/tst.pro b/tests/auto/q3process/tst/tst.pro index 090d76b..359148b 100644 --- a/tests/auto/q3process/tst/tst.pro +++ b/tests/auto/q3process/tst/tst.pro @@ -11,6 +11,7 @@ win32 { } } -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3progressbar/q3progressbar.pro b/tests/auto/q3progressbar/q3progressbar.pro index b3c8864..582c39e 100644 --- a/tests/auto/q3progressbar/q3progressbar.pro +++ b/tests/auto/q3progressbar/q3progressbar.pro @@ -4,6 +4,7 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3progressbar.cpp diff --git a/tests/auto/q3progressdialog/q3progressdialog.pro b/tests/auto/q3progressdialog/q3progressdialog.pro index 65e24ed..08528db 100644 --- a/tests/auto/q3progressdialog/q3progressdialog.pro +++ b/tests/auto/q3progressdialog/q3progressdialog.pro @@ -4,6 +4,7 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3progressdialog.cpp diff --git a/tests/auto/q3ptrlist/q3ptrlist.pro b/tests/auto/q3ptrlist/q3ptrlist.pro index 186a707..d7431f4 100644 --- a/tests/auto/q3ptrlist/q3ptrlist.pro +++ b/tests/auto/q3ptrlist/q3ptrlist.pro @@ -2,5 +2,6 @@ load(qttest_p4) SOURCES += tst_q3ptrlist.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3richtext/q3richtext.pro b/tests/auto/q3richtext/q3richtext.pro index 2d4fc5a..e22fa37 100644 --- a/tests/auto/q3richtext/q3richtext.pro +++ b/tests/auto/q3richtext/q3richtext.pro @@ -3,6 +3,7 @@ HEADERS += SOURCES += tst_q3richtext.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3scrollview/q3scrollview.pro b/tests/auto/q3scrollview/q3scrollview.pro index 1750e8b..d98d234 100644 --- a/tests/auto/q3scrollview/q3scrollview.pro +++ b/tests/auto/q3scrollview/q3scrollview.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_qscrollview.cpp -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3semaphore/q3semaphore.pro b/tests/auto/q3semaphore/q3semaphore.pro index ad8c154..935917d 100644 --- a/tests/auto/q3semaphore/q3semaphore.pro +++ b/tests/auto/q3semaphore/q3semaphore.pro @@ -1,5 +1,6 @@ load(qttest_p4) SOURCES += tst_q3semaphore.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3serversocket/q3serversocket.pro b/tests/auto/q3serversocket/q3serversocket.pro index 4fa9dce..4e5e364 100644 --- a/tests/auto/q3serversocket/q3serversocket.pro +++ b/tests/auto/q3serversocket/q3serversocket.pro @@ -3,5 +3,6 @@ SOURCES += tst_q3serversocket.cpp QT += network qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3socket/q3socket.pro b/tests/auto/q3socket/q3socket.pro index a9bf0c0..a8324e9 100644 --- a/tests/auto/q3socket/q3socket.pro +++ b/tests/auto/q3socket/q3socket.pro @@ -2,5 +2,6 @@ load(qttest_p4) SOURCES += tst_qsocket.cpp QT += network qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3socketdevice/q3socketdevice.pro b/tests/auto/q3socketdevice/q3socketdevice.pro index c6e9e93..d2cbfb2 100644 --- a/tests/auto/q3socketdevice/q3socketdevice.pro +++ b/tests/auto/q3socketdevice/q3socketdevice.pro @@ -2,5 +2,6 @@ load(qttest_p4) SOURCES += tst_q3socketdevice.cpp QT += network qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3sqlcursor/q3sqlcursor.pro b/tests/auto/q3sqlcursor/q3sqlcursor.pro index 2844540..2d316fb 100644 --- a/tests/auto/q3sqlcursor/q3sqlcursor.pro +++ b/tests/auto/q3sqlcursor/q3sqlcursor.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3sqlcursor.cpp QT += sql qt3support +requires(contains(QT_CONFIG,qt3support)) win32:LIBS += -lws2_32 diff --git a/tests/auto/q3sqlselectcursor/q3sqlselectcursor.pro b/tests/auto/q3sqlselectcursor/q3sqlselectcursor.pro index 21e311f..59448eb 100644 --- a/tests/auto/q3sqlselectcursor/q3sqlselectcursor.pro +++ b/tests/auto/q3sqlselectcursor/q3sqlselectcursor.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3sqlselectcursor.cpp QT += sql qt3support +requires(contains(QT_CONFIG,qt3support)) win32:LIBS += -lws2_32 diff --git a/tests/auto/q3stylesheet/q3stylesheet.pro b/tests/auto/q3stylesheet/q3stylesheet.pro index a5e8438..f0fcd8b 100644 --- a/tests/auto/q3stylesheet/q3stylesheet.pro +++ b/tests/auto/q3stylesheet/q3stylesheet.pro @@ -4,6 +4,7 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3stylesheet.cpp diff --git a/tests/auto/q3tabdialog/q3tabdialog.pro b/tests/auto/q3tabdialog/q3tabdialog.pro index 1ba72f9..815510d 100644 --- a/tests/auto/q3tabdialog/q3tabdialog.pro +++ b/tests/auto/q3tabdialog/q3tabdialog.pro @@ -4,6 +4,7 @@ load(qttest_p4) QT += qt3support +requires(contains(QT_CONFIG,qt3support)) SOURCES += tst_q3tabdialog.cpp diff --git a/tests/auto/q3table/q3table.pro b/tests/auto/q3table/q3table.pro index 6d96a4e..bdda8ba 100644 --- a/tests/auto/q3table/q3table.pro +++ b/tests/auto/q3table/q3table.pro @@ -2,5 +2,6 @@ load(qttest_p4) SOURCES += tst_q3table.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3textbrowser/q3textbrowser.pro b/tests/auto/q3textbrowser/q3textbrowser.pro index 8ddeaba..4dfd12e 100644 --- a/tests/auto/q3textbrowser/q3textbrowser.pro +++ b/tests/auto/q3textbrowser/q3textbrowser.pro @@ -3,6 +3,7 @@ HEADERS += SOURCES += tst_q3textbrowser.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3textedit/q3textedit.pro b/tests/auto/q3textedit/q3textedit.pro index a4b24a9..ff90c4a 100644 --- a/tests/auto/q3textedit/q3textedit.pro +++ b/tests/auto/q3textedit/q3textedit.pro @@ -4,5 +4,6 @@ SOURCES += tst_q3textedit.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3textstream/q3textstream.pro b/tests/auto/q3textstream/q3textstream.pro index 7c80af7..bf2584a 100644 --- a/tests/auto/q3textstream/q3textstream.pro +++ b/tests/auto/q3textstream/q3textstream.pro @@ -1,6 +1,7 @@ load(qttest_p4) SOURCES += tst_q3textstream.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) MOC_DIR=tmp diff --git a/tests/auto/q3timeedit/q3timeedit.pro b/tests/auto/q3timeedit/q3timeedit.pro index 17b4a84..0f231df 100644 --- a/tests/auto/q3timeedit/q3timeedit.pro +++ b/tests/auto/q3timeedit/q3timeedit.pro @@ -1,6 +1,7 @@ load(qttest_p4) SOURCES += tst_q3timeedit.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3toolbar/q3toolbar.pro b/tests/auto/q3toolbar/q3toolbar.pro index 8fcab99..974f14f 100644 --- a/tests/auto/q3toolbar/q3toolbar.pro +++ b/tests/auto/q3toolbar/q3toolbar.pro @@ -1,6 +1,7 @@ load(qttest_p4) SOURCES += tst_q3toolbar.cpp QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3uridrag/q3uridrag.pro b/tests/auto/q3uridrag/q3uridrag.pro index 526623e..b6e77fc 100644 --- a/tests/auto/q3uridrag/q3uridrag.pro +++ b/tests/auto/q3uridrag/q3uridrag.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3uridrag.cpp -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3urloperator/q3urloperator.pro b/tests/auto/q3urloperator/q3urloperator.pro index 3364dac..29282eb 100644 --- a/tests/auto/q3urloperator/q3urloperator.pro +++ b/tests/auto/q3urloperator/q3urloperator.pro @@ -2,7 +2,8 @@ load(qttest_p4) SOURCES += tst_q3urloperator.cpp -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) QT += network diff --git a/tests/auto/q3valuelist/q3valuelist.pro b/tests/auto/q3valuelist/q3valuelist.pro index ab82d31..d359779 100644 --- a/tests/auto/q3valuelist/q3valuelist.pro +++ b/tests/auto/q3valuelist/q3valuelist.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3valuelist.cpp -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3valuevector/q3valuevector.pro b/tests/auto/q3valuevector/q3valuevector.pro index 883fda2..55956cb 100644 --- a/tests/auto/q3valuevector/q3valuevector.pro +++ b/tests/auto/q3valuevector/q3valuevector.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3valuevector.cpp -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) diff --git a/tests/auto/q3widgetstack/q3widgetstack.pro b/tests/auto/q3widgetstack/q3widgetstack.pro index 9783f58..1bd6a89 100644 --- a/tests/auto/q3widgetstack/q3widgetstack.pro +++ b/tests/auto/q3widgetstack/q3widgetstack.pro @@ -2,6 +2,7 @@ load(qttest_p4) SOURCES += tst_q3widgetstack.cpp -contains(QT_CONFIG, qt3support): QT += qt3support +QT += qt3support +requires(contains(QT_CONFIG,qt3support)) -- cgit v0.12 From 74b19ac00c70a32f0cfe25893ac2e32750e527dd Mon Sep 17 00:00:00 2001 From: Tom Cooksey Date: Mon, 11 May 2009 10:15:22 +0200 Subject: Only link against opengles .LIB files if on WinCE Task-number: 251685 Reviewed-by: mauricek --- examples/opengl/hellogl_es/hellogl_es.pro | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/examples/opengl/hellogl_es/hellogl_es.pro b/examples/opengl/hellogl_es/hellogl_es.pro index 7459456..3168743 100644 --- a/examples/opengl/hellogl_es/hellogl_es.pro +++ b/examples/opengl/hellogl_es/hellogl_es.pro @@ -20,11 +20,13 @@ HEADERS += bubble.h RESOURCES += texture.qrc QT += opengl -contains(QT_CONFIG,opengles1) { - QMAKE_LIBS += "libGLES_CM.lib" -} -contains(QT_CONFIG,opengles1cl) { - QMAKE_LIBS += "libGLES_CL.lib" +wince*:{ + contains(QT_CONFIG,opengles1) { + QMAKE_LIBS += "libGLES_CM.lib" + } + contains(QT_CONFIG,opengles1cl) { + QMAKE_LIBS += "libGLES_CL.lib" + } } # install -- cgit v0.12 From 2120b410752d6777430c33807548022722c5a9ad Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 11 May 2009 11:31:42 +0200 Subject: Add a license file for the XML Conformance Testsuite. The source of the license text is http://www.w3.org/Consortium/Legal/copyright-software-19980720 Reviewed-by: Trust Me --- tests/auto/qxmlstream/XML-Test-Suite-LICENSE.txt | 59 ++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 tests/auto/qxmlstream/XML-Test-Suite-LICENSE.txt diff --git a/tests/auto/qxmlstream/XML-Test-Suite-LICENSE.txt b/tests/auto/qxmlstream/XML-Test-Suite-LICENSE.txt new file mode 100644 index 0000000..bd84fae --- /dev/null +++ b/tests/auto/qxmlstream/XML-Test-Suite-LICENSE.txt @@ -0,0 +1,59 @@ +The XML testsuite available here is a copy of the Extensible Markup +Language (XML) Conformance Test Suites provided by W3C. Please see +http://www.w3.org/XML/Test/ for updates and other information. + +These files are licensed under the W3C Software License (19980720), +reproduced below: + +--- +W3C® SOFTWARE NOTICE AND LICENSE + +Copyright © 1994-2002 World Wide Web Consortium, (Massachusetts +Institute of Technology, Institut National de Recherche en +Informatique et en Automatique, Keio University). All Rights +Reserved. http://www.w3.org/Consortium/Legal/ + +This W3C work (including software, documents, or other related items) +is being provided by the copyright holders under the following +license. By obtaining, using and/or copying this work, you (the +licensee) agree that you have read, understood, and will comply with +the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its +documentation, with or without modification, for any purpose and +without fee or royalty is hereby granted, provided that you include +the following on ALL copies of the software and documentation or +portions thereof, including modifications, that you make: + + 1. The full text of this NOTICE in a location viewable to users of + the redistributed or derivative work. + + 2. Any pre-existing intellectual property disclaimers, notices, or + terms and conditions. If none exist, a short notice of the + following form (hypertext is preferred, text is permitted) should + be used within the body of any redistributed or derivative code: + "Copyright © [$date-of-software] World Wide Web Consortium, + (Massachusetts Institute of Technology, Institut National de + Recherche en Informatique et en Automatique, Keio University). All + Rights Reserved. http://www.w3.org/Consortium/Legal/" + + 3. Notice of any changes or modifications to the W3C files, including + the date changes were made. (We recommend you provide URIs to the + location from which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT +HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR +DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, +TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL +OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR +DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in +advertising or publicity pertaining to the software without specific, +written prior permission. Title to copyright in this software and any +associated documentation will at all times remain with copyright +holders. -- cgit v0.12 From 5299240db14579960358edeebfc72fcef905af13 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 11 May 2009 11:34:10 +0200 Subject: Make sure syncqt creates the Phonon/Global file. The standard Phonon package has this file and it points to phononnamespace.h --- src/3rdparty/phonon/phonon/phononnamespace.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/3rdparty/phonon/phonon/phononnamespace.h b/src/3rdparty/phonon/phonon/phononnamespace.h index 0bbf4f4..2492ee6 100644 --- a/src/3rdparty/phonon/phonon/phononnamespace.h +++ b/src/3rdparty/phonon/phonon/phononnamespace.h @@ -25,6 +25,11 @@ #include "phonon_export.h" +#ifdef __QT_SYNCQT__ +// Tell syncqt to create a "Global" header here +#pragma qt_class(Phonon::Global) +#endif + /** * Helper macro that can be used like * \code -- cgit v0.12 From 887b6074e149d5302316eb57b908c051955fa4f6 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 11 May 2009 13:18:27 +0200 Subject: Clean up old Qt 3 stuff. Reviewed-By: TrustMe --- util/install/archive/archive.pro | 9 - util/install/archive/qarchive.cpp | 471 ----- util/install/archive/qarchive.h | 138 -- util/install/configure_installer.cache | 30 - util/install/install.pro | 9 - util/install/keygen/keygen.pro | 13 - util/install/keygen/keyinfo.cpp | 164 -- util/install/keygen/keyinfo.h | 123 -- util/install/keygen/main.cpp | 250 --- util/install/mac/licensedlg.ui | 134 -- util/install/mac/licensedlgimpl.cpp | 65 - util/install/mac/licensedlgimpl.h | 55 - util/install/mac/mac.pro | 11 - util/install/mac/main.cpp | 117 -- util/install/mac/unpackage.icns | Bin 29372 -> 0 bytes util/install/mac/unpackdlg.ui | 330 --- util/install/mac/unpackdlgimpl.cpp | 200 -- util/install/mac/unpackdlgimpl.h | 63 - util/install/package/main.cpp | 397 ---- util/install/package/package.pro | 25 - util/install/win/archive.cpp | 115 -- util/install/win/archive.h | 49 - util/install/win/dialogs/folderdlg.ui | 184 -- util/install/win/dialogs/folderdlgimpl.cpp | 119 -- util/install/win/dialogs/folderdlgimpl.h | 65 - util/install/win/environment.cpp | 362 ---- util/install/win/environment.h | 73 - util/install/win/globalinformation.cpp | 168 -- util/install/win/globalinformation.h | 93 - util/install/win/install-edu.rc | 3 - util/install/win/install-eval.rc | 3 - util/install/win/install-noncommercial.rc | 4 - util/install/win/install-qsa.rc | 5 - util/install/win/install.ico | Bin 2998 -> 0 bytes util/install/win/install.rc | 4 - util/install/win/main.cpp | 100 - util/install/win/pages/buildpage.ui | 92 - util/install/win/pages/configpage.ui | 474 ----- util/install/win/pages/finishpage.ui | 63 - util/install/win/pages/folderspage.ui | 259 --- util/install/win/pages/licenseagreementpage.ui | 202 -- util/install/win/pages/licensepage.ui | 264 --- util/install/win/pages/optionspage.ui | 503 ----- util/install/win/pages/pages.cpp | 349 ---- util/install/win/pages/pages.h | 226 --- util/install/win/pages/progresspage.ui | 78 - util/install/win/pages/sidedecoration.ui | 108 - util/install/win/pages/sidedecorationimpl.cpp | 205 -- util/install/win/pages/sidedecorationimpl.h | 70 - util/install/win/pages/winintropage.ui | 39 - util/install/win/qt.arq | 3 - util/install/win/resource.cpp | 162 -- util/install/win/resource.h | 77 - util/install/win/setupwizardimpl.cpp | 2571 ------------------------ util/install/win/setupwizardimpl.h | 276 --- util/install/win/setupwizardimpl_config.cpp | 1564 -------------- util/install/win/shell.cpp | 472 ----- util/install/win/shell.h | 87 - util/install/win/uninstaller/quninstall.pro | 7 - util/install/win/uninstaller/uninstall.ui | 167 -- util/install/win/uninstaller/uninstaller.cpp | 142 -- util/install/win/uninstaller/uninstallimpl.cpp | 75 - util/install/win/uninstaller/uninstallimpl.h | 54 - util/install/win/win.pro | 136 -- 64 files changed, 12676 deletions(-) delete mode 100644 util/install/archive/archive.pro delete mode 100644 util/install/archive/qarchive.cpp delete mode 100644 util/install/archive/qarchive.h delete mode 100644 util/install/configure_installer.cache delete mode 100644 util/install/install.pro delete mode 100644 util/install/keygen/keygen.pro delete mode 100644 util/install/keygen/keyinfo.cpp delete mode 100644 util/install/keygen/keyinfo.h delete mode 100644 util/install/keygen/main.cpp delete mode 100644 util/install/mac/licensedlg.ui delete mode 100644 util/install/mac/licensedlgimpl.cpp delete mode 100644 util/install/mac/licensedlgimpl.h delete mode 100644 util/install/mac/mac.pro delete mode 100644 util/install/mac/main.cpp delete mode 100644 util/install/mac/unpackage.icns delete mode 100644 util/install/mac/unpackdlg.ui delete mode 100644 util/install/mac/unpackdlgimpl.cpp delete mode 100644 util/install/mac/unpackdlgimpl.h delete mode 100644 util/install/package/main.cpp delete mode 100644 util/install/package/package.pro delete mode 100644 util/install/win/archive.cpp delete mode 100644 util/install/win/archive.h delete mode 100644 util/install/win/dialogs/folderdlg.ui delete mode 100644 util/install/win/dialogs/folderdlgimpl.cpp delete mode 100644 util/install/win/dialogs/folderdlgimpl.h delete mode 100644 util/install/win/environment.cpp delete mode 100644 util/install/win/environment.h delete mode 100644 util/install/win/globalinformation.cpp delete mode 100644 util/install/win/globalinformation.h delete mode 100644 util/install/win/install-edu.rc delete mode 100644 util/install/win/install-eval.rc delete mode 100644 util/install/win/install-noncommercial.rc delete mode 100644 util/install/win/install-qsa.rc delete mode 100644 util/install/win/install.ico delete mode 100644 util/install/win/install.rc delete mode 100644 util/install/win/main.cpp delete mode 100644 util/install/win/pages/buildpage.ui delete mode 100644 util/install/win/pages/configpage.ui delete mode 100644 util/install/win/pages/finishpage.ui delete mode 100644 util/install/win/pages/folderspage.ui delete mode 100644 util/install/win/pages/licenseagreementpage.ui delete mode 100644 util/install/win/pages/licensepage.ui delete mode 100644 util/install/win/pages/optionspage.ui delete mode 100644 util/install/win/pages/pages.cpp delete mode 100644 util/install/win/pages/pages.h delete mode 100644 util/install/win/pages/progresspage.ui delete mode 100644 util/install/win/pages/sidedecoration.ui delete mode 100644 util/install/win/pages/sidedecorationimpl.cpp delete mode 100644 util/install/win/pages/sidedecorationimpl.h delete mode 100644 util/install/win/pages/winintropage.ui delete mode 100644 util/install/win/qt.arq delete mode 100644 util/install/win/resource.cpp delete mode 100644 util/install/win/resource.h delete mode 100644 util/install/win/setupwizardimpl.cpp delete mode 100644 util/install/win/setupwizardimpl.h delete mode 100644 util/install/win/setupwizardimpl_config.cpp delete mode 100644 util/install/win/shell.cpp delete mode 100644 util/install/win/shell.h delete mode 100644 util/install/win/uninstaller/quninstall.pro delete mode 100644 util/install/win/uninstaller/uninstall.ui delete mode 100644 util/install/win/uninstaller/uninstaller.cpp delete mode 100644 util/install/win/uninstaller/uninstallimpl.cpp delete mode 100644 util/install/win/uninstaller/uninstallimpl.h delete mode 100644 util/install/win/win.pro diff --git a/util/install/archive/archive.pro b/util/install/archive/archive.pro deleted file mode 100644 index e313a4a..0000000 --- a/util/install/archive/archive.pro +++ /dev/null @@ -1,9 +0,0 @@ -TEMPLATE = lib -CONFIG += staticlib -CONFIG += qt x11 -CONFIG -= dll -TARGET = arq - -SOURCES += qarchive.cpp ../keygen/keyinfo.cpp -HEADERS += qarchive.h -!zlib:unix:LIBS += -lz diff --git a/util/install/archive/qarchive.cpp b/util/install/archive/qarchive.cpp deleted file mode 100644 index dd51c65..0000000 --- a/util/install/archive/qarchive.cpp +++ /dev/null @@ -1,471 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "qarchive.h" -#include -#include -#include -#include -#include "../../../src/3rdparty/zlib/zlib.h" -#include "../keygen/keyinfo.h" -#ifdef Q_OS_UNIX -# include -# include -# include -# include -#endif - -enum ChunkType { - ChunkDirectory = 0, - ChunkFile = 1, - ChunkSymlink = 2, - ChunkBeginHeader = 3, - ChunkEndHeader = 4 -}; - -static bool createDir( const QString& fullPath ) -{ - QStringList hierarchy = QStringList::split( QDir::separator(), fullPath ); - QString pathComponent, tmpPath; - QDir dirTmp; -#ifdef Q_OS_UNIX - dirTmp = "/"; -#endif - - for( QStringList::Iterator it = hierarchy.begin(); it != hierarchy.end(); ++it ) { - pathComponent = *it + QDir::separator(); - tmpPath += pathComponent; - if (!dirTmp.exists(tmpPath) && !dirTmp.mkdir(tmpPath)) - return false; - } - return true; -} - -QArchive::QArchive( const QString& archivePath ) -{ - setPath( archivePath ); - - bufferSize = 512 * 1024; -} - -QArchive::~QArchive() -{ -} - -void QArchive::setPath( const QString& archivePath ) -{ - QString fullName = archivePath; - if( fullName.right( 4 ) != ".arq" ) - fullName += ".arq"; - arcFile.setName( fullName ); -} - -bool QArchive::open( int mode ) -{ - switch( mode ) { - case IO_ReadOnly: - // Fallthrough intentional - case IO_WriteOnly: - if( arcFile.open( mode ) ) - return true; - break; - } - return false; -} - -void QArchive::close() -{ - if( arcFile.isOpen() ) - arcFile.close(); -} - -bool QArchive::writeFile( const QString& fileName, const QString& localPath ) -{ - if( arcFile.isOpen() ) { - QDataStream outStream( &arcFile ); - QFileInfo fi( fileName ); - - QFile inFile( fi.absFilePath() ); - QByteArray inBuffer; - QByteArray outBuffer( bufferSize ); - z_stream ztream; - bool continueCompressing; - - if(symbolicLinks() && fi.isSymLink()) { - outStream << (int)ChunkSymlink; - outStream << fi.fileName().latin1(); - outStream << fi.readLink().latin1(); - } else if( inFile.open( IO_ReadOnly ) ) { - if( inBuffer.resize( fi.size() ) ) { - outStream << (int)ChunkFile; - outStream << fi.fileName().latin1(); - outStream << fi.lastModified(); - { - int perm = -1; -#ifdef Q_OS_UNIX - struct stat st; - if(!::stat(fi.filePath().latin1(), &st)) - perm = (int)st.st_mode; -#endif - outStream << perm; - } - if( verbosityMode & Source ) - emit operationFeedback( "Deflating " + fi.absFilePath() + "..." ); - else if( verbosityMode & Destination ) - emit operationFeedback( "Deflating " + localPath + "/" + fi.fileName() + "..." ); - ztream.next_in = (unsigned char*)inBuffer.data(); - ztream.avail_in = inBuffer.size(); - ztream.total_in = 0; - ztream.next_out = (unsigned char*)outBuffer.data(); - ztream.avail_out = outBuffer.size(); - ztream.total_out = 0; - ztream.msg = NULL; - ztream.zalloc = (alloc_func)NULL; - ztream.zfree = (free_func)NULL; - ztream.opaque = (voidpf)NULL; - ztream.data_type = Z_BINARY; - deflateInit( &ztream, 9 ); - if ( inBuffer.data() ) - inFile.readBlock( inBuffer.data(), inBuffer.size() ); - - continueCompressing = true; - while( continueCompressing ) { - if(qApp) - qApp->processEvents(); - continueCompressing = ( deflate( &ztream, Z_FINISH ) == Z_OK ); - if( !ztream.avail_out ) { - if( !outBuffer.resize( outBuffer.size() + bufferSize ) ) - qFatal( "Could not allocate compression buffer!" ); - ztream.next_out = (unsigned char*)&outBuffer.data()[ ztream.total_out ]; - ztream.avail_out = bufferSize; - } - } - - emit operationFeedback( QString( "done. %1 => %2 (%3%)\n" ) - .arg( ztream.total_in ) - .arg( ztream.total_out ) - .arg( int( - double( ztream.total_out ) / double( ztream.total_in ) * 100 ) ) ); - deflateEnd( &ztream ); - // Now write the compressed data to the output - outStream << ztream.total_out; - outStream.writeRawBytes( outBuffer.data(), ztream.total_out ); - } - inFile.close(); - return true; - } else { - return false; - } - } - return false; -} - -bool QArchive::setDirectory( const QString& dirName ) -{ - if( arcFile.isOpen() ) { - QString fullName = dirName; - QDataStream outStream( &arcFile ); - if( fullName.right( 1 ) != "/" ) - fullName += "/"; - outStream << (int)ChunkDirectory; - outStream << fullName.latin1(); - return true; - } - return false; -} - -bool QArchive::writeHeader( const QArchiveHeader header ) -{ - if( arcFile.isOpen() ) { - QDataStream outStream( &arcFile ); - outStream << (int)ChunkBeginHeader; - outStream << header.mayorVersion(); - outStream << header.minorVersion(); - outStream << header.features(); - outStream << header.description(); - outStream << header.extraData; - outStream << (int)ChunkEndHeader; - return true; - } - return false; -} - -bool QArchive::writeDir( const QString &dirName1, bool includeLastComponent, const QString &localPath1 ) -{ - if( arcFile.isOpen() ) { - QString localPath = localPath1, dirName = dirName1; - if(localPath.right(1) == "/") - localPath.truncate(localPath.length()-1); - if(dirName.right(1) == "/") - dirName.truncate(dirName.length()-1); - - QFileInfo fi( dirName ); - - if( includeLastComponent ) - setDirectory( fi.fileName() ); - QDir dir( dirName ); - const QFileInfoList* dirEntries = dir.entryInfoList(); - QFileInfoListIterator dirIter( *dirEntries ); - QDataStream outStream( &arcFile ); - QFileInfo* pFi; - - dirIter.toLast(); - while( ( pFi = dirIter.current() ) ) { - if( pFi->fileName() != "." && pFi->fileName() != ".." ) { - if( pFi->isDir() ) - writeDir( pFi->absFilePath(), true, localPath + "/" + - pFi->fileName() ); // Subdirs should always get its name in the archive. - else - writeFile( pFi->absFilePath(), localPath ); - } - --dirIter; - } - setDirectory( ".." ); - return true; - } - return false; -} - -bool QArchive::writeFileList( const QStringList fileList ) -{ - for( QStringList::ConstIterator it = fileList.begin(); it != fileList.end(); ++it ) { - if( !writeFile( (*it) ) ) - return false; - } - return true; -} - -bool QArchive::writeDirList( const QStringList dirList, bool includeLastComponent ) -{ - for( QStringList::ConstIterator it = dirList.begin(); it != dirList.end(); ++it ) { - QString lastComponent = (*it).mid( (*it).findRev( "/" ) + 1 ); - if( !writeDir( (*it), includeLastComponent, lastComponent ) ) - return false; - } - return true; -} - -void QArchive::setVerbosity( int verbosity ) -{ - verbosityMode = verbosity; -} - -QArchiveHeader* QArchive::readArchiveHeader() -{ - QDataStream inStream( &arcFile ); - return readArchiveHeader( &inStream ); -} - -/* - Reads the archive header and returns it on success. If an error occurs, it - returns 0. The caller has to delete the object. -*/ -QArchiveHeader* QArchive::readArchiveHeader( QDataStream *inStream ) -{ - int chunktype; - QArchiveHeader *header = new QArchiveHeader; - - *inStream >> chunktype; - if( chunktype == ChunkBeginHeader ) { - *inStream >> header->_mayorVersion; - *inStream >> header->_minorVersion; - if ( header->mayorVersion()!=1 || header->minorVersion()!=0 ) { - emit operationFeedback( "Incompatible package version" ); - delete header; - return 0; - } - *inStream >> header->_features; - *inStream >> header->_description; - *inStream >> header->extraData; - *inStream >> chunktype; - if ( chunktype != ChunkEndHeader ) { - emit operationFeedback( "Invalid package header" ); - delete header; - return 0; - } - } else { - emit operationFeedback( "No package header found." ); - delete header; - return 0; - } - return header; -} - -bool QArchive::readArchive( const QString &outpath, const QString &key ) -{ - QDataStream inStream( &arcFile ); - return readArchive( &inStream, outpath, key ); -} - -bool QArchive::readArchive( QDataStream *inStream, const QString &outpath, const QString &key ) -{ - QDataStream outStream; - QFile outFile; - QDir outDir; - QByteArray inBuffer; - QByteArray outBuffer( bufferSize ); - z_stream ztream; - bool continueDeCompressing; - QString entryName, dirName, symName; - int entryLength, chunktype; - - //get the key - QArchiveHeader *header = readArchiveHeader( inStream ); - if ( header == 0 ) - return false; - uint infeatures = featuresForKey( key ); - if( (header->features() & infeatures) != header->features()) { - emit operationFeedback( "Invalid key" ); - return false; - } - - // Set up the initial directory. - // If the dir does not exist, try to create it - dirName = QDir::toNativeSeparators( outpath ); - outDir.setPath( dirName ); - if( !outDir.exists( dirName ) && !createDir( dirName ) ) - return false; - outDir.cd( dirName ); - - while( !inStream->atEnd() ) { - //get our type - *inStream >> chunktype; - if(chunktype == ChunkDirectory) { - *inStream >> entryLength; - inBuffer.resize( entryLength ); - inStream->readRawBytes( inBuffer.data(), entryLength ); - entryName = inBuffer.data(); - - if( verbosityMode & Source ) - emit operationFeedback( "Directory " + entryName + "... " ); - if( entryName == "../" ) { - outDir.cdUp(); - } else { - dirName = QDir::toNativeSeparators( outDir.absPath() + - QString( "/" ) + entryName.left( entryName.length() - 1 ) ); - if( verbosityMode & Destination ) - emit operationFeedback( "Directory " + dirName + "... " ); - - if( !outDir.exists( dirName ) && !createDir( dirName ) ) { - emit operationFeedback( "Cannot create directory: " + dirName ); - return false; - } - outDir.cd( dirName ); - } - } else if(chunktype == ChunkFile) { - *inStream >> entryLength; - inBuffer.resize( entryLength ); - inStream->readRawBytes( inBuffer.data(), entryLength ); - entryName = inBuffer.data(); - - int filePerm; - QDateTime timeStamp; - QString fileName = QDir::toNativeSeparators( outDir.absPath() + QString( "/" ) + entryName ); - outFile.setName( fileName ); - if( outFile.open( IO_WriteOnly ) ) { - *inStream >> timeStamp; // Get timestamp from the archive - *inStream >> filePerm; - outStream.setDevice( &outFile ); - *inStream >> entryLength; - if( verbosityMode & Source ) - emit operationFeedback( "Expanding " + entryName + "..." ); - else if( verbosityMode & Destination ) - emit operationFeedback( "Expanding " + fileName + "..." ); - inBuffer.resize( entryLength ); - inStream->readRawBytes( inBuffer.data(), entryLength ); - ztream.next_in = (unsigned char*)inBuffer.data(); - ztream.avail_in = entryLength; - ztream.total_in = 0; - ztream.msg = NULL; - ztream.zalloc = (alloc_func)0; - ztream.zfree = (free_func)0; - ztream.opaque = (voidpf)0; - ztream.data_type = Z_BINARY; - inflateInit( &ztream ); - continueDeCompressing = true; - while( continueDeCompressing ) { - ztream.next_out = (unsigned char*)outBuffer.data(); - ztream.avail_out = outBuffer.size(); - ztream.total_out = 0; - continueDeCompressing = ( inflate( &ztream, Z_NO_FLUSH ) == Z_OK ); - outStream.writeRawBytes( outBuffer.data(), ztream.total_out ); - } - inflateEnd( &ztream ); - outFile.close(); -#ifdef Q_OS_UNIX - QDateTime t; t.setTime_t(0); //epoch - struct utimbuf tb; - tb.actime = tb.modtime = t.secsTo(timeStamp); - utime(fileName.local8Bit(), &tb); - if(filePerm != -1) - chmod(fileName.local8Bit(), (mode_t)filePerm); -#endif - } else { - emit operationFeedback( "Cannot open: " + fileName ); - return false; - } - } else if(chunktype == ChunkSymlink) { - *inStream >> entryLength; - inBuffer.resize( entryLength ); - inStream->readRawBytes( inBuffer.data(), entryLength ); - entryName = inBuffer.data(); - QString fileName = QDir::toNativeSeparators( outDir.absPath() + QString( "/" ) + entryName ); - - *inStream >> entryLength; - inBuffer.resize( entryLength ); - inStream->readRawBytes( inBuffer.data(), entryLength ); - symName = inBuffer.data(); - if( verbosityMode & Source ) - emit operationFeedback( "Linking " + symName + "... " ); - else if( verbosityMode & Destination ) - emit operationFeedback( "Linking " + fileName + "... " ); -#ifdef Q_OS_UNIX - symlink( symName.local8Bit(), fileName.local8Bit() ); -#endif - } else { - if( verbosityMode & Source ) - emit operationFeedback( QString("Unknown chunk: %d") .arg(chunktype) ); - } - if( verbosityMode & Progress ) - emit operationFeedback( inStream->device()->at() ); - } - return true; -} - diff --git a/util/install/archive/qarchive.h b/util/install/archive/qarchive.h deleted file mode 100644 index 351a48b..0000000 --- a/util/install/archive/qarchive.h +++ /dev/null @@ -1,138 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef QARCHIVE_H -#define QARCHIVE_H - -#include -#include -#include -#include - -class QArchiveHeader -{ -public: - QArchiveHeader( uint feat, const QString& desc=QString(), uchar mayorVer = 1, uchar minorVer = 0 ) - : _features(feat), _description(desc), _mayorVersion(mayorVer), _minorVersion(minorVer) - {} - - uint features() const - { return _features; } - - QString description() const - { return _description; } - - uchar mayorVersion() const - { return _mayorVersion; } - - uchar minorVersion() const - { return _minorVersion; } - - void addExtraData( const QString& key, const QString& value ) - { extraData.insert( key, value ); } - - QString findExtraData( const QString& key ) const - { return extraData[key]; } - -private: - QArchiveHeader() - {} - - uint _features; - QString _description; - uchar _mayorVersion; - uchar _minorVersion; - QMap extraData; - - friend class QArchive; -}; - -class QArchive : public QObject -{ - Q_OBJECT -public: - QArchive( const QString& archivePath = QString() ); - ~QArchive(); - - void setPath( const QString& archivePath ); - void setVerbosity( int verbosity ); - - bool symbolicLinks() const { return doSyms; } - void setSymbolicLinks(bool b) { doSyms = b; } - - bool open( int mode ); - void close(); - bool isOpen() { return arcFile.isOpen(); } - - bool writeHeader( const QArchiveHeader header ); - bool writeFile( const QString& fileName, const QString& localPath = QString() ); - bool writeFileList( const QStringList fileList ); - bool writeDir( const QString& dirName, bool includeLastComponent = false, - const QString& localPath = QString() ); - bool writeDirList( const QStringList dirList, bool includeLastComponent = true ); - - QArchiveHeader* readArchiveHeader(); - QArchiveHeader* readArchiveHeader( QDataStream *inStream ); - - bool readArchive( const QString &outpath, const QString &key = QString() ); - bool readArchive( QDataStream *inStream, const QString &outpath, const QString &key = QString() ); -private: - QFile arcFile; - - int bufferSize; - int verbosityMode; - uint doSyms : 1; - bool setDirectory( const QString& dirName ); -signals: - void operationFeedback( const QString& ); - void operationFeedback( int ); - -public: - enum { - NoFeedback = 0x00, - OnlyNames = 0x01, - Verbose = 0x02, - Source = 0x10, - Destination = 0x20, - Progress = 0x40 - }; -}; - -#endif diff --git a/util/install/configure_installer.cache b/util/install/configure_installer.cache deleted file mode 100644 index 9427b74..0000000 --- a/util/install/configure_installer.cache +++ /dev/null @@ -1,30 +0,0 @@ --disable-table --disable-iconview --disable-workspace --disable-xml --disable-network --disable-canvas --disable-opengl --disable-sql --release --static --lean --no-dsp --no-thread --no-accessibility --qt-style-windowsxp --no-style-motif --no-style-cde --no-style-sgi --no-style-motifplus --no-style-platinum --no-big-codecs --no-jpeg --no-png --spec win32-msvc --saveconfig installer --D QT_NO_COLORNAMES --D QT_NO_BEZIER --D QT_NO_EFFECTS --D QT_NO_DIRECTPAINTER --D QT_NO_SVG diff --git a/util/install/install.pro b/util/install/install.pro deleted file mode 100644 index 4106453..0000000 --- a/util/install/install.pro +++ /dev/null @@ -1,9 +0,0 @@ -TEMPLATE = subdirs -CONFIG += ordered - -SUBDIRS += archive \ - package \ - keygen - -win32:SUBDIRS += win -mac:SUBDIRS += mac diff --git a/util/install/keygen/keygen.pro b/util/install/keygen/keygen.pro deleted file mode 100644 index 59daf75..0000000 --- a/util/install/keygen/keygen.pro +++ /dev/null @@ -1,13 +0,0 @@ -CONFIG += qt console -SOURCES += keyinfo.cpp -keychk { - TEMPLATE = lib - TARGET = keychk - DESTDIR = ../../../lib/ - CONFIG -= shared dll - CONFIG += staticlib -} else { - TEMPLATE = app - TARGET = keygen - SOURCES += main.cpp -} \ No newline at end of file diff --git a/util/install/keygen/keyinfo.cpp b/util/install/keygen/keyinfo.cpp deleted file mode 100644 index 9ad5404..0000000 --- a/util/install/keygen/keyinfo.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include "keyinfo.h" - -// Magic values -enum { - ProductMagic = 0xB292, - PlatformMagic = 0x5C7E, - LicenseSchemaMagic = 0xE3B, - LicenseIDMagic = 0xCE57, - FeatureMagic = 0x4D5 -}; - -static const char Xalphabet[] = "WX9MUEC7AJH3KS6DB4YFG2L5PQRT8VNZ"; -static const int XAlphabetSize = sizeof(Xalphabet) - 1; - -static QString encodeBaseX(uint k) -{ - QString str; - do { - str += QChar(Xalphabet[ k % XAlphabetSize ]); - k /= XAlphabetSize; - } while (k > 0u); - return str; -} - -static uint decodeBaseX(const QString &str) -{ - uint k = 0; - int i = str.length(); - while (i > 0) { - i--; - const char *p = strchr(Xalphabet, str[i].unicode()); - if (p == 0) { - return 0; - } else { - k = (k * XAlphabetSize) + (p - Xalphabet); - } - } - return k; -} - -static const QDate StartDate(2001, 1, 1); -static const uint MaxDays = 4000; - -static QString encodedExpiryDate(const QDate &date) -{ - uint days = StartDate.daysTo(date); - if (days >= MaxDays) - days = MaxDays - 1; - uint x = (days << 7) ^ days; - return encodeBaseX(x ^ 0x0000beef); -} - -static QDate decodedExpiryDate(const QString &encodedDate) -{ - QDate date; - uint y = decodeBaseX(encodedDate); - uint x = y ^ 0x0000beef; - uint days = ( (x >> 7) ^ x ) >> 7; - if (days >= MaxDays) - return QDate(); - date = StartDate.addDays( days ); - if (encodedExpiryDate(date) != encodedDate) - return QDate(); - return date; -} - -bool decodeLicenseKey(const QString &licenseKey, - uint *products, - uint *platforms, - uint *licenseSchema, - uint *licenseFeatures, - uint *licenseID, - QDate *expiryDate) -{ - QStringList licenseParts; - int dash = -1; - do { - int start = dash + 1; - dash = licenseKey.indexOf('-', start); - licenseParts.append(licenseKey.mid(start, dash - start)); - } while (dash != -1); - - // license keys have 7 fields - if (licenseParts.size() != 7) { - // invalid key - return false; - } - QString productPart = licenseParts.at(0); - QString platformPart = licenseParts.at(1); - QString licenseSchemaPart = licenseParts.at(2); - QString licenseFeaturesPart = licenseParts.at(3); - QString licenseIDPart = licenseParts.at(4); - QString expiryDatePart = licenseParts.at(5); - QString checksumPart = licenseParts.at(6); - QString keyPart = productPart - + '-' + platformPart - + '-' + licenseSchemaPart - + '-' + licenseFeaturesPart - + '-' + licenseIDPart - + '-' + expiryDatePart; - - // verify the crc - QByteArray ba = keyPart.toLatin1(); - int crc = qChecksum(ba.constData(), ba.size()); - QString checksumVerification = QString("%1%2") - .arg((crc & 0xff),2,16,QChar('0')) - .arg((crc >> 8 & 0xff),2,16,QChar('0')) - .toUpper(); - if (checksumPart != checksumVerification) { - // invalid checksum - return false; - } - - *products = decodeBaseX(productPart) ^ ProductMagic; - *platforms = decodeBaseX(platformPart) ^ PlatformMagic; - *licenseSchema = decodeBaseX(licenseSchemaPart) ^ LicenseSchemaMagic; - *licenseFeatures = decodeBaseX(licenseFeaturesPart) ^ FeatureMagic; - *licenseID = decodeBaseX(licenseIDPart) ^ LicenseIDMagic; - *expiryDate = decodedExpiryDate(expiryDatePart); - return true; -} diff --git a/util/install/keygen/keyinfo.h b/util/install/keygen/keyinfo.h deleted file mode 100644 index 9b3687a..0000000 --- a/util/install/keygen/keyinfo.h +++ /dev/null @@ -1,123 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef KEYINFO_H -#define KEYINFO_H - -// Products -enum { - // the first 10 bits are reserved for Qt editions - QtUniversal = 0x00000001, - QtDesktop = 0x00000002, - QtDesktopLight = 0x00000004, - QtConsole = 0x00000008, - QtDesignerOnly = 0x00000010, - QtReserved1 = 0x00000020, - QtReserved2 = 0x00000040, - QtReserved3 = 0x00000080, - QtReserved4 = 0x00000100, - QtReserved5 = 0x00000200, - QtProductMask = 0x000003ff, - - // the next 10 bits are reserved for Qtopia editions - QtopiaPDA = 0x00000400, - QtopiaPhone = 0x00000800, - QtopiaRefboard = 0x00001000, - QtopiaReserved1 = 0x00002000, - QtopiaReserved2 = 0x00004000, - QtopiaReserved3 = 0x00008000, - QtopiaReserved4 = 0x00010000, - QtopiaReserved5 = 0x00020000, - QtopiaReserved6 = 0x00040000, - QtopiaReserved7 = 0x00080000, - - // other products get the upper 12 bits - Teambuilder = 0x00100000, - Solutions = 0x00200000, - QSA = 0x00400000, - OtherReserved1 = 0x00800000, - OtherReserved2 = 0x01000000, - OtherReserved3 = 0x02000000, - OtherReserved4 = 0x04000000, - OtherReserved5 = 0x08000000, - OtherReserved6 = 0x10000000, - OtherReserved7 = 0x20000000, - OtherReserved8 = 0x40000000, - OtherReserved9 = 0x80000000, -}; - -// Platforms -enum { - PlatformX11 = 0x01, - PlatformEmbedded = 0x02, - PlatformWindows = 0x04, - PlatformMac = 0x08 -}; - -// LicenseSchema -enum { - SupportedEvaluation = 0x01, - UnsupportedEvaluation = 0x02, - FullSourceEvaluation = 0x04, - FullCommercial = 0x08 -}; - -// LicenseFeatures -enum { - USCustomer = 0x01 -}; - -#include -#include - -/* - Decodes the \a licenseKey. This function returns true if 1) decoding - was successful and 2) the checksum matches, otherwise it returns false. -*/ -bool decodeLicenseKey(const QString &licenseKey, - uint *products, - uint *platforms, - uint *licenseSchema, - uint *licenseFeatures, - uint *licenseID, - QDate *expiryDate); - -#endif diff --git a/util/install/keygen/main.cpp b/util/install/keygen/main.cpp deleted file mode 100644 index b6eee41..0000000 --- a/util/install/keygen/main.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include -#include - -#include "keyinfo.h" - -static void printNewKey( uint features, const QDate& expiryDate ) -{ - QFile in; - QFile out; - QString fn; - char block[10]; - - fn.sprintf( "next.%.2x", features ); - in.setFileName( fn ); - if ( !in.open(QFile::ReadOnly) ) - return; - int ent = QString( in.readAll() ).toInt(); - in.close(); - - fn.sprintf( "table.%.2x", features ); - in.setFileName( fn ); - if ( !in.open(QFile::ReadOnly) ) - return; - in.seek( ent * 10 ); - in.read( block, 9 ); - block[9] = '\0'; - in.close(); - - ent++; - if ( ent == (1 << NumRandomBits) ) - ent = 1; // skip first entry - - fn.sprintf( "next.%.2x", features ); - out.setFileName( fn ); - if ( !out.open(QFile::WriteOnly) ) - return; - QString s = QString::number( ent ) + QChar( '\n' ); - out.write( s.toLocal8Bit(), s.length() ); - out.close(); - - if ( strlen(block) == 9 && block[4] == '-' ) - printf( "%s%s\n", block, qPrintable(encodedExpiryDate(expiryDate)) ); -} - -static QString textForFeatures( uint features ) -{ - QString text; - - if ( (features & Feature_US) != 0 ) - text += QString( " -us" ); - if ( (features & Feature_Enterprise) != 0 ) - text += QString( " -enterprise" ); - if ( (features & Feature_Unix) != 0 ) - text += QString( " -unix" ); - if ( (features & Feature_Windows) != 0 ) - text += QString( " -windows" ); - if ( (features & Feature_Mac) != 0 ) - text += QString( " -mac" ); - if ( (features & Feature_Embedded) != 0 ) - text += QString( " -embedded" ); - if ( (features & Feature_Extra1) != 0 ) - text += QString( " -extra1" ); - if ( (features & Feature_Extra2) != 0 ) - text += QString( " -extra2" ); - - text = text.trimmed(); - if ( text.isEmpty() ) - text = QString( "invalid key" ); - return text; -} - -static QString textForDate( const QDate& date ) -{ - if ( date.isValid() ) { - return date.toString( Qt::ISODate ); - } else { - return QString( "invalid date" ); - } -} - -static void reset() -{ - for ( uint features = 0; features < (1 << NumFeatures); features++ ) { - printf( "Resetting 'table.%.2x' and 'next.%.2x' (%s)\n", features, - features, qPrintable(textForFeatures(features)) ); - - QFile out; - QString fn; - - fn.sprintf( "table.%.2x", features ); - out.setFileName( fn ); - if ( !out.open(QFile::WriteOnly) ) { - fprintf( stderr, "Cannot open '%s' for writing\n", qPrintable(fn) ); - exit( EXIT_FAILURE ); - } - - for ( uint bits = 0; bits < (1 << NumRandomBits); bits++ ) { - QString k = keyForFeatures( features, bits ) + QChar( '\n' ); - out.write( k.toLatin1(), k.length() ); - - /* - We check that the generated keys give access to the - correct feature sets. This accounts for most of the - processing time of the function. - */ -#if 1 - if ( featuresForKey(k) != features ) { - fprintf( stderr, "Internal error in featuresForKey(\"%s\")\n", - qPrintable(k.trimmed()) ); - exit( EXIT_FAILURE ); - } - if ( (features & ~(Feature_US | Feature_Enterprise | - Feature_Unix)) == 0 ) { - if ( featuresForKeyOnUnix(k) != features ) { - fprintf( stderr, - "Internal error in featuresForKeyOnUnix(\"%s\")\n", - qPrintable(k.trimmed()) ); - exit( EXIT_FAILURE ); - } - } -#endif - } - out.close(); - - fn.sprintf( "next.%.2x", features ); - out.setFileName( fn ); - if ( !out.open(QFile::WriteOnly) ) { - fprintf( stderr, "Cannot open '%s' for writing\n", qPrintable(fn) ); - exit( EXIT_FAILURE ); - } - out.write( "1\n", 2 ); // skip first key - out.close(); - } -} - -int main( int argc, char **argv ) -{ - if ( argc == 1 || (strcmp(argv[1], "check") != 0 && - strcmp(argv[1], "new") != 0 && - strcmp(argv[1], "reset") != 0) ) { - fprintf( stderr, "Usage:\n" - " keygen check \n" - " keygen new YYYY-MM-DD [-us] [-enterprise] [-unix]\n" - " [-windows] [-mac] [-embedded] [-extra1] [-extra2]\n" - " keygen reset\n" ); - exit( EXIT_FAILURE ); - } - - if ( strcmp(argv[1], "check") == 0 ) { - if ( argc != 3 ) { - fprintf( stderr, "Usage:\n" - " mkcode check \n" ); - exit( EXIT_FAILURE ); - } - - QString key( argv[2] ); - - printf("Unix check: %s\n", - qPrintable(textForFeatures(featuresForKeyOnUnix(QString(argv[2]))))); - printf("Full check: %s\n", - qPrintable(textForFeatures(featuresForKey(QString(argv[2]))))); - if ( featuresForKey(QString(argv[2])) != 0 ) - printf("Expiry date: %s\n", - qPrintable(textForDate(decodedExpiryDate(key.mid(9))))); - } else if ( strcmp(argv[1], "new") == 0 ) { - uint features = 0; - - if ( argc < 3 ) { - fprintf( stderr, "Usage:\n" - " mkcode new YYYY-MM-DD [features]\n" ); - exit( EXIT_FAILURE ); - } - - QDate expiryDate = QDate::fromString( QString(argv[2]), Qt::ISODate ); - if ( !expiryDate.isValid() ) { - fprintf( stderr, "Date '%s' not in YYYY-MM-DD format\n", argv[2] ); - exit( EXIT_FAILURE ); - } - - for ( int i = 3; i < argc; i++ ) { - if ( strcmp(argv[i], "-us") == 0 ) { - features |= Feature_US; - } else if ( strcmp(argv[i], "-enterprise") == 0 ) { - features |= Feature_Enterprise; - } else if ( strcmp(argv[i], "-unix") == 0 ) { - features |= Feature_Unix; - } else if ( strcmp(argv[i], "-windows") == 0 ) { - features |= Feature_Windows; - } else if ( strcmp(argv[i], "-mac") == 0 ) { - features |= Feature_Mac; - } else if ( strcmp(argv[i], "-embedded") == 0 ) { - features |= Feature_Embedded; - } else if ( strcmp(argv[i], "-extra1") == 0 ) { - features |= Feature_Extra1; - } else if ( strcmp(argv[i], "-extra2") == 0 ) { - features |= Feature_Extra2; - } else { - fprintf( stderr, "Unknown flag '%s'\n", argv[i] ); - exit( EXIT_FAILURE ); - } - } - printNewKey( features, expiryDate ); - } else { - reset(); - } - return 0; -} diff --git a/util/install/mac/licensedlg.ui b/util/install/mac/licensedlg.ui deleted file mode 100644 index a20bd44..0000000 --- a/util/install/mac/licensedlg.ui +++ /dev/null @@ -1,134 +0,0 @@ - -LicenseDialog - - - LicenseDialog - - - - 0 - 0 - 582 - 531 - - - - - 5 - 5 - 0 - 0 - - - - License Agreement - - - true - - - - unnamed - - - 11 - - - 6 - - - - licenseText - - - License text goes here - - - - - Layout1 - - - - unnamed - - - 0 - - - 6 - - - - Horizontal Spacing2 - - - Horizontal - - - Expanding - - - - 20 - 20 - - - - - - buttonReject - - - Reject - - - 0 - - - true - - - true - - - - - buttonAccept - - - Accept - - - 0 - - - true - - - - - - - - - buttonReject - pressed() - LicenseDialog - reject() - - - buttonAccept - clicked() - LicenseDialog - reject() - - - buttonAccept - pressed() - LicenseDialog - accept() - - - - diff --git a/util/install/mac/licensedlgimpl.cpp b/util/install/mac/licensedlgimpl.cpp deleted file mode 100644 index ed2998a..0000000 --- a/util/install/mac/licensedlgimpl.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "licensedlgimpl.h" -#include -#include - -LicenseDialogImpl::LicenseDialogImpl( QWidget *parent ) - : LicenseDialog( parent ) -{ -} - -bool LicenseDialogImpl::showLicense( bool licenseUs ) -{ - QFile f; - QString path = "qt-mac-commercial-3.0.0.app/Contents/Qt/LICENSE"; - if (licenseUs) - path.append( "-US" ); - f.setName( path ); - if ( !f.open( IO_ReadOnly ) ) - return false; - - QTextStream ts( &f ); - licenseText->setText( ts.read() ); - return true; -} - - diff --git a/util/install/mac/licensedlgimpl.h b/util/install/mac/licensedlgimpl.h deleted file mode 100644 index 90f8809..0000000 --- a/util/install/mac/licensedlgimpl.h +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef __LICENSEDLGIMPL_H__ -#define __LICENSEDLGIMPL_H__ - -#include "licensedlg.h" - -class LicenseDialogImpl : public LicenseDialog -{ - Q_OBJECT - -public: - LicenseDialogImpl( QWidget* parent = 0 ); - bool showLicense( bool licenseUs ); -}; - -#endif /* __LICENSEDLGIMPL_H__ */ diff --git a/util/install/mac/mac.pro b/util/install/mac/mac.pro deleted file mode 100644 index ad13bea..0000000 --- a/util/install/mac/mac.pro +++ /dev/null @@ -1,11 +0,0 @@ -TEMPLATE = app -TARGET = unpackage -mac:TARGET = qt-mac-commercial-3.0.0 -mac:RC_FILE = unpackage.icns -HEADERS = unpackdlgimpl.h licensedlgimpl.h -SOURCES = main.cpp unpackdlgimpl.cpp licensedlgimpl.cpp -INTERFACES += unpackdlg.ui licensedlg.ui -INCLUDEPATH += ../archive ../keygen -CONFIG += qt -unix:LIBS += -L$$QT_BUILD_TREE/util/install/archive -larq - diff --git a/util/install/mac/main.cpp b/util/install/mac/main.cpp deleted file mode 100644 index ede85a6..0000000 --- a/util/install/mac/main.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "unpackdlgimpl.h" -#include "qarchive.h" -#include -#include -#include - -class ConsoleOutput : public QObject -{ - Q_OBJECT -public: - ConsoleOutput() : QObject() { } - ~ConsoleOutput() { } -public slots: - void updateProgress( const QString& str) { qDebug("%s", str.latin1()); } -}; -#include "main.moc" - -static int usage(const char *argv0, const char *un=NULL) { - if(un) - fprintf(stderr, "Unknown command: %s\n", un); - else - fprintf(stderr, "Usage:\n"); - fprintf(stderr, "%s [options] files...\n", argv0); - - fprintf(stderr, "\nOptions:\n"); - fprintf(stderr, " -k [k] : Use k as the key to open provided files\n"); - fprintf(stderr, " -s : Quiet mode, will not output process\n"); - fprintf(stderr, " -h : This help\n"); - return 665; -} - -int main( int argc, char** argv ) -{ - QString key; - bool output = true; - QStringList files; - QApplication app( argc, argv ); - for(int i = 1; i < argc; i++) { - //options - if(!strcmp(argv[i], "-s")) - output = false; - else if(!strcmp(argv[i], "-k")) - key = argv[++i]; - else if(!strcmp(argv[i], "-h")) - return usage(argv[0]); - //files - else if(*(argv[i]) != '-') - files.append(argv[i]); - //unknown - else - return usage(argv[0], argv[i]); - } - if(!files.isEmpty()) { - QArchive archive; - ConsoleOutput out; - QObject::connect( &archive, SIGNAL( operationFeedback( const QString& ) ), - &out, SLOT( updateProgress( const QString& ) ) ); - if(output) - archive.setVerbosity( QArchive::Destination | QArchive::Verbose ); - for(QStringList::Iterator it = files.begin(); it != files.end(); ++it) { - archive.setPath( (*it) ); - if( !archive.open( IO_ReadOnly ) ) { - qDebug("Failed to open input %s", (*it).latin1()); - continue; - } - if(!archive.readArchive( QDir::currentDirPath(), key )) - qDebug("Failed to unpack %s", (*it).latin1()); - archive.close(); - } - } else { - UnpackDlgImpl dlg(key); - dlg.exec(); - } - return 0; -} - diff --git a/util/install/mac/unpackage.icns b/util/install/mac/unpackage.icns deleted file mode 100644 index 20139b9..0000000 Binary files a/util/install/mac/unpackage.icns and /dev/null differ diff --git a/util/install/mac/unpackdlg.ui b/util/install/mac/unpackdlg.ui deleted file mode 100644 index ba4898e..0000000 --- a/util/install/mac/unpackdlg.ui +++ /dev/null @@ -1,330 +0,0 @@ - -UnpackDlg - - - UnpackDlg - - - - 0 - 0 - 678 - 337 - - - - Install unpacking tool - - - - unnamed - - - 11 - - - 6 - - - - Layout24 - - - - unnamed - - - 0 - - - 6 - - - - pixmapLabel - - - image0 - - - false - - - AlignAuto|AlignTop - - - - - Layout23 - - - - unnamed - - - 0 - - - 6 - - - - headerLabel - - - - 1 - - - - Open Qt/CD Package - - - - - Layout22 - - - - unnamed - - - 0 - - - 6 - - - - Layout21 - - - - unnamed - - - 0 - - - 6 - - - - Layout19 - - - - unnamed - - - 0 - - - 6 - - - - destLabel - - - Destination path: - - - - - Spacer12 - - - Horizontal - - - Fixed - - - - 1 - 20 - - - - - - destPath - - - - - destButton - - - - - - image1 - - - - - - - Layout20 - - - - unnamed - - - 0 - - - 6 - - - - TextLabel1 - - - License Key: - - - - - Spacer13 - - - Horizontal - - - Fixed - - - - 24 - 20 - - - - - - srcKey - - - - - - - - - logOutput - - - - - Layout4 - - - - unnamed - - - 0 - - - 6 - - - - Spacer1 - - - Horizontal - - - Expanding - - - - 20 - 20 - - - - - - unpackButton - - - Unpack - - - - - cancelButton - - - Cancel - - - - - Spacer2 - - - Horizontal - - - Expanding - - - - 20 - 20 - - - - - - - - - - - - - - - - 789cdd7c594f23cbb6e6fbf9155b27de8e5a716d8c01abd50f600633786286abfb105366da608cb10dc657fddf7bc51ac269a04e517b975abbbb5096fd919991b1e62122f98f7ffd71db6bfff1affff8c774666603f7872bcccb1ffff2f3d1e8fd3fffeb7ffdf73ffe59ad54fe88c7d646e58f8d7ffe8f7ffc53cdff707fa80afe43dc4f782762a30457f1bc394b18cfab19e34dbebf9730ddff2e98eeb72b4cf74f19efd0fdd6248ce77d5730df5f3076747d6811aef2fc3d3fbfcaf3b123c43b429f794a98e6f72898c7cf12a6f97519f378669430ddaf05f3fd2a61babfc398e9332661ba7f2998ef6f244cf4df0bdea0f33963a6df0e13a6f17605d378be92309ecf64fe8ec653fc3ce15fe8264ce38d198b7c5f18333de18cb1cce736e26a925fa831e6f3d95ec278de6ac134df704f58e6935f0ba6f3ee2561baff5c30d1631e18f37cf384f9fe5dc63c7f25f7f3fc4c9bf0063fdf0e180bfd743ed16b4e09cbf5ca3296eb0d63799e62ccf717680f1b69fcbc9730c9eb5630db5f83318f97df244cfab2c758e4b1245c93f9bd32e6e76533c63c9ea7f934d2f58eb15c7f9f30e9478db1e8f73963b14f7a5e6393c7731b11d7aae9fa2163996f3f611aff96b0dcaf7cc278de7519cbfc91dfb586dcef2784e5fe2c4b18cf177b8299bf0bc64caf9b264cf67c2698ae57323e3fdf2d13a6f9cbf8c28f9384c93e503f37abc25ff3cc58c6d38465bce25030db4b9b318faf2e1226fa2f05b37fb9215c677ee846c244df1be33af3eb4130dd5ff0fcea0dd63ff4a79b46e6af34639e8fa3f99a3af3d7e78cebec8f9a8c793c95254cf2ed0866fb1d11deaa32fde8bfeb1b222f7b40b8eed97eee046f3470fea784b7aa3cfebd60a66f91309d7f124cfea5088c991fe199313f2f3f466c923ce8fa447f7e4578ab5aabe2f88e318f674e12a6f17605d3f39d67ccfc513b8299bf4a305d9f3f32e6f915fb82f9fa8b84495f3a82f9fe82f036f3c7d884c9fff604d3f5d99c31cfdf22ffb622bf895f0709d3f3d279a6f79031df1f3619376a28bf7cc998e71b2e05f3f3657c4fd79b09e134df8560be7e85f1fac0e36fb33cec3861badf0a667d183166fdcd0682999f7dc1cc4f94d7569257a810deaed27cb30ee33acd27ef0a267db1778c797cbd2d98c6f7af09d3787dc1747fd64d18cfab0563d607fb9030f1775f308d1f2e12267eed08e6f15b8477449efb82597ff1feed9ae89f191016f9e81dc6cc6fffc058ec792998edf55130c7ff3bc2f2bc6012c6f9fa53c1345fb3c198e5998784897fcf82f9fa2663e66f2ef7337f3deacbb615f9e409f3f89631cfd70f09efb07db93bc1ac9f26619acf89e04d7c5ede66ccf32d0ac63c1fbbcb58f8f396305eef2682e9fa624ab8c1f2c85e04d3f5f655305d1fd0de776a22ff901396f9fbbb8489ff4782999f3b8c99ff99dccffcf655c144af4dd76f1a9caf8cc7fc0e0973be7c4138cdff50308f7fc258ec6b9f31cb571582f97c3761a207ed6fc726fadf0927fd538c79fcec5430d1137a09233de1867183ce671b09e3f9ec9c31dba7ca05337d6f82e97e759a30deef7705d7b1fecb1e090b3f4c9f31d39b6f3266fad43861d2b71661c3fc35178299bf3709d3f58e31f3a358264cfc467b83f4899f5f78c6a2af81b03ccfdf32167db109133f268299dfe709233f6c87b161792e04d3f9fc8471e0e769c1747d1809a6f1dd3161bbc1f16e2298ed7f85e9fe5dc1ccdf47c65b9ccf5e274cfe50c6dfe27c82e76f0d3f6f2b61b2df84e9fa8cf8e7c41ecc0d63d68f6c4ad8883fda13ccf6dc14ccfabe4818c7d35b82693c2798e3697ecf98f96d3a8c997f393f5ff851d88469fcba60f607b384c91f9c31667e8553c11c2f2682891e7d2198e7e304b3fd1c3166fe9aed84299f7a124ce3eb56c2943fee0be6e79d0ba6e7b903c681f3f1b784291e2e05f3f8bb09537d91eee7f8ba9d308d5f25ec581ff553c2347e5330d733370913ffe47ad647779d30c5b7b960be5f9e27fa87f1c26c8abf7433c2a23ff65930f9a3d04998ecafce98edd96f3236ac2f2f8c597fc21be1646f23c12ccf9384493f9560f687d78c591fc28660badf5f254cfe54c6dfa2fb2dcf4ff4c1e582391e68c1accf321ed3139a09533c180ae6f9ed30667df13e61f20f9960ce2f5dc224cf3bc13c9f743fe98bee09667e0f0433fd8709e3fc4c9570d2af79c2a45f23c1acbfd384e9fc9160b68f76c2c4ff743dfbf715a6f3db82997f45c2383f2df363fdd579c2f47c2598e7e712a6f30bc1ccaf9784499fdf0573bc64fe3bf617fa24611a6f28989f374998e2f9bd60ce876a8c59deea3661b2bf9660d6b746c2647f581f1927f1d1927c92ffcc170993bd9d0b26fb53ef8c99beec4a30eb7f4d305def041b8e0fb70953fc6f0b66fdae0a66fd3e4b98e27385b1c487ad84e9f9424fa0fb0be27ff267619630f1e34830e7871b09533ebf2d98e3f1306192f75830ebdb0ad37cde04d37c8ccc87f5cdbd0a6679bd254cf2ac08e67cbd9e30c5a7749ee6a7bb0953feb414ccf9c8ad609a8f67fe893eaa03c1ac8f0f09537ce909e67e712b61f217f78259bf9a09d37cae04d37cf44dc2649fc78cc57f05c1cc9fab8469be323ff657f99e60eea76c264cfac6fcf6ec8f544530c7e71bc19cdfa17ddb941f1686b0f87ff79830e97b8f31d3afb61326ff742598ef3f12ccfafe9630f9537ebef85f35104cd7ab4dc2e25fb34230fb9f61c2c41f2f98f3a5c098fda1bd4a98f44f09e67cad9630e53b5dc1dcff90e7b1feb9b9608e17fb09933dcb7cc43f1e244cf2d910ccfab897303d7f2c98fd914b98eca32598f9bdc224af07c1ccffe384e97c9db1c4d7f384c91e847fac9fc52c61ea0f3d0ae678b69130f1c70ae67a2b4f98e63f15ccfeee2c61cacf593e9ee36d3e4898e6772598e3e546c2d43f60fa3cfb138ffec27ad14f7bcd38b03e1e0bde227eed124efef34530fbc346c2144faa82d93f7704d378f96dc2e43feb8c59ffb271c294bf5c0be6783c4898fc515f30e7579782b99e3e14ccf9da5430cd47a5eb693ec51b63d657b59f30d99f16ccfdac79c2a40f35c1eccf3705b37c9b0993fe9d32967ae03561ca1f841f520fbc244ce7df05b3fe9d254cfe2017ccfeba2598f3efc38449fe5b8445df7425617a9e17ccf30909933def09e6fa649130e9df8e60f65f078c255f2b12a6e76582b9de68264cfe4b0b667f83f1c9d545dfb21bc6e2bf2f05b33e9a84c9deb61973bcb32782b93e550993bf7e12cccf3f12ccfa9f274cfa95c6a3e7bb016396afad274cf1aa10ccf1789430c59b3dc1ec5f2e1326fb9f08667b6f274cf27e15ccf9cb7dc234df343fe65743f0760dcfcf098bbeb8938469fe6782595f6cc224df8160b697a384c97fb60573fed34998ecfd5030e71bd70993bc8d60a24f6f0a66fd784f98e8ed31667d34d709d37c653cd6c7fe2c613aff2898eb519730e9d3a960b6c7b384c95ed378ec5fb384293fdf124cf4e4321efb2bdf4e98e6b32f98eda796309d7f16ccfe238dc7fd50a19ff53d7f154cf32b8e0573be72c798f5d9cc1226ff89fec3adfc4f5f30cbc3264cf181f897fc85ad264cfa9109667fdf10ccf5c4b6601e7f9830c9fb4030e973088c25ffd182b93eab08e678db4a98e623e38bfc6cc2444f2198edad9b30c9f75830cdd79f254cfe49e89778b32798ede730619acfb360b69fbb8429fff082397f6a264cf97a4d30d713070913ff7605733c95e74b3edf4f98f46d2698fb8b8d8469be3b82d9bfcaf8e2bfb612267e907ec3edecefb0bfe7933fc813a6f986bae01d9477fece98e553bc0866fa9a82595f1e0493be646dc13b16714f706313e77bcc58facb7dc12cff4230f1cfba8469bee97e7a5efe96303e4f093decfffd4c30dbc366c224cf5bc1f47c5711ccf6f64c38883fde17ccfafb2898f5f14930cf4fee97fa09f3691f84defc5270c321be232ce3db4bc17cfd91601abf3fd34a1badfeeca7b6dac1f1f1f36707dd5b3afeea3c50164afbdf7c846f1cf1ba4ce770fca6e7525cfccb3cc94b47fa3d9eb33f91e96f9249fcfc2d72c97581fc2d1ff4fbdf2def9fcae577f024c9c17c3ecae759562bbb1968f73b9eff1bede5a31df84f32fad1f5ae74cfdfc15e4abee947b2e1e3935dfdedece56b1ff599df24a7e2837dfdddec65283e0b3e1ff4236ace28da027eb7681378c4dfc3e7283e9d3f1ffe66f6e2f5931ec3cca22ce4f311a87ad613b689917e81c3027ed6d3f81da90e7ceddfc75e6630434fb3433cd673b48348e1ab7ec3dfd1aca3df5ac031d5ef48d192a9fa3bd98b476d899a3644cba6dfcd35c598b7282bd4b017bdabf79092056b6213cefd8dec05789feb7da022cefa000ecec970f616671ced66a10ff51150d142b944998cf1bee3dfe5cb7e8b5c4e60462738a338eb5398f1996eeb8eeec2ec7bbaafcfe1b8d097fa4a5feb1b7d0bbfbfd3f72897785fe577f9b2df622ffbba0a335260d51bba0633ddd475bda5b7f58e6e28ad9432cac26194535e0595a95c156aa086fa4e81f5abc7ffabf18562b7c4ef726c9798f1aa976aa4bbea498dd5b39ac0ac5fd454cdf098a979e988bf9bc2d957f5a616ea5d2dd5ae3e52d186c287677cf46f3ff577dfb11778c2091c43d564dda71c6aa4f6d5813a54477aac5aea589da85375a6da30db0ece79a6bafcd9537d38e678ac288ac7b9bad0dbea525da96b75a35fd5adbad34f30f654eda97ba0700972ab94ea2255ce2dfe84bd60ac56d5c833a1466d002535fda636e1b3aeb6d4b6da01593460f6f338b85130fb3eccba7cccf1137fe07ccf18a42ad2a38c35ce78bd3001bcb8070fff883ecf81d62a93e9efe414dfb517960b5343779a181b4c6e0a5d370333340f2403a4e4118e11ccb49b6413bfa34ccc53a4847fb4c8c88ccdb399981733057b6b452a805371c631875896e5f117ed252bd90b1d2706ee34733534afe6cd2c505f70e6c86b91c3ec8b036563de8916f8a6cdc82ccd2e52f462f64c13e4b36f0ed05bc7383506591dfe8a1ffb99bd4459c801387ad13773645ae6d89c9853a06004735ac2ff239e6dd4b4b25cc45e84a2a865ac89789c01654b944f5bef988ee9aa163c1ba85107fad1f47e947bffb9f892342b03ef5ba82373a896a6af1b668c1cc5d9e00c4dc96fad66bfb29fd5b9deca76e02752f30ebf07eb31e7e6c25c9a2b98e113cc70887941f69dbcfa3bf6122d5e6462aee1730094dc80ad47ddea1a93ac7d8e728832e927bbd125fb50289fbed9859f25caa7079f4857f4064cfdd4dc9a3b736f2a603773736daa5fd53c7fd25ec47f88dd0c74d76c40f48b966cd8024630ab51b215f155fd0f3f2b5bead12752326759aeec6c666a60399ba60e165f355b9f7a09f9a7f97d3fbe440f1933156fb6cd11c864c734924f026aac260aac688b42ea66e2bb30de4cd9cf81fb055b5fd1d7b3265d471c204fddb6d63ad5b21ef3b5396a9bd14f36fc457b89f12466816f68271bca20254bd479b48028934883cdc04769f9ad9adadc16aa61dacada0148f25c35387ac28f1db2cdf430d64ca3ada1762ae4d05439fb602eeda32ddb6d8d8ebf908f3d42461f7d4ad4ae1ba6e4294a0564429ad5b3620fa8253607ffe6ec931ddb673bb12fc6d9a99dd9b97db56f76616a4015c9a967dfc9ee8d66fbd1384e0fa95dda5d885f475cd5c5fae74162cc47dff66d7b79b37bb12eb44dbb0f163fa3d89e62f99cf88bf612e7d780391cd8437b645bf6580ded896e8307afdb537d6fcf74d7b66dc7766dcff6416630963d8f1187c763ef069862e8d05ed84ba02670f6142bba55bd937f96cbcfecc55ec108efa662afed0df033ca44a34c6e55274615e0e4083406754a4dec9dbdb7155bb51bb666376d5d3f002762351cabe8784ced9699da6d90d70ee46fe7e4b36d2346a8e401a2d67560b4a903057706a889d967ac8106a6f7b117fd4bf632b457ceea6be7209ecc536c8fb1503c30ccc216a611d7df5ce67257c08ceb7ae40668b5944f57b0ff7282f8c51cb8a17b708f6e14a36d1c0dc6eda16f331c69e7400b48d93db9b17bc67a7481f9f473c977adf5dfbe155f208b50c76e824fed925f8a76021683f6e25ee273ddd4cddcdc1e47db72affd191eb1c68cd573dea75ecd10e354cced82ba710bf76e5ba6e3966e173517e502f18af30763306b38777bfade35dd3ed4a447585d7fd187fb81bdace7a040b73b5075c82c16e82b3bc94ae66c231da4e4d01db996adb96377e20edca99ebb33d4ed68b1f3943bc4fa3e56d219c6f337d554f7ae0dd474d0766664779441a36f1c459fe8baae67725b03d9bc60b5fdb1b6ca3fdb0b1e94933eb87e9c01f8ae421dd8ba3b77179839aeb214e05ab49b2813c87227ee522df5a17b5bd365a93b629efdecae8092a1de77d7b15ae8cfb8fb3a7637a0bdb7ee2e5203f9c03bc7a6197be8c7c84177ef2a2013b07ae0d0c3daf8d917f6427ac7311ecfbee293ab1021eb6adb6dc47c9e231965f0e2c71ac6ba9adb3447d88d7883fb3efa981357d74f989d6ec0358faae5b6dcb6dbd1bbaae91afa006475e68171187d7a6b791be70bde78eb9df7baa20e809a3c1e31eeadd5a25fc9c521f67aae6a3ee8579f9942ed407d12a3631fe36017eb14f2c01d9fdba9db744db04abfaec3c9de6af0f43ec8057c982ffcc00fcdb97fd057ba03b50a7a5875e31ffdc83fb1a6f5487b25af032ddbf56337078f32f2cfd47beb539f54f2c4757b59e95d406b7d420d83ac01f85dc7a8d2659e75390644ad9efa897ff150d1629f0b3b4bcc89728f1fb20f5581dfeffa999ffb57ec059c5bebdfa0d66fd93d770df71de96bbf70cb186739cef456725133ffee97906d0e40c324beacf2c47f2317b86292f0a369f95d947e47ea77ce8b418ffd9e6ffa7d7dc8bd2eeef2f178abdc76df1d80262dfc813ff4471851a217797177eec1b7fcb1aef80079560b6473e2f7906b7db61b3c50171afed49f41b63976afe5f59b28971fd80bd1dbc4fe6306b20990ddb521a249cdd8e17ae5318e0f1ab1035eb806a3beeadcb7c1b65eb93f1c3ef4f35fc13676fd9befc48a2766291e46f43ddfd757ae0d9ca8b8aa3f572d90cd05663752ddb06ca2c7f197fe0a28bfc67cccb2adacf56b3eca85fdcb84fac2a607fa7d13bd3f669233ae4f204d8cb49885bfd5b7661be24995ebcd917e4e7139875a872263ec9dd56026775126d6f87ba0a50299c254195f051fd65637a0655011fb0d5f3398aba1ec4729e644cfd6f69ba02375b47ea2866a5e27f9d95a7c117b71c8570ffc3a055b78c6917bab5e0a771d1af6ce0d21b69ff82d8ce9867b282f3c56116b501ef35d5ff96db013a024d53694dbbfd80568da0e7021cab6114015b87f20754e4fea9a604015dd9a0ffb54bf7c8aa3312fae20ed6dbda926907529e9ad48561eadd1de071fc2aaee13df82b5fabe3e8e72018d7021b39590636cefa53c9fabaea8a9ee2e146e07e45bd10f611086e101ad739ee2ff0873804e78f4fb9019e51885b98e11b994ec25acc518879960fc7e1646d187a56cbe97783a855cb8e20ab0c44ac967d138735d094f668becc7b5c3d82ed0e2a977b694aa2cc65ea4c886e710d76580dfe1c56c3acc2ab99f26fd9b1ed6002f7aea4e308f18fd582ea2e3bcb2e0c8a785a9de420fba92c923ca680e75dfa1ad8659085fac41eeebaa6f433d089484cc8dc31c2999c6f824b5096792317e4c6d115ec31b64afc04de3752f2c4c1b3d739f7d18710146b1d16752a6bada37f0d15e42d2f1f87d17b48c74b2e3fba8bdc29f3e575c51c38eec86b6ee15f5777d0df2186af413ec06dec1ccded1a3a74a9a7361c98d63e6d50ecbb0abcf30568cc25e68725f64955bcca94b13f621c68c29bf13fb4e3d22918bec4f21dec61a215e39801c6b0746eda69e17c9e509463d0887e08d69edd1acc513f202d10b6f8571a078b2aa4b34e5c258ffe8c8f3d0b26ffa1c72805dd4fb03530fc75827cd52a48cf97f23d20279d9d0676cfdd223fa185f5672c9d15e9e5d5c8570fa309cacf5ea492e9017db853d0ea7509f288ec3ebebf96390ed9d3f349370861e76c4d9e8aada22cb9e9953bbf0037b165ef400b21cef6277af65261fe4d2a72810da6e6ce6b4729b8eec47f60287c3fa3aae750d744fe9558715e3f163d4319b878e1b834f99637d62573a8bf6f6a8a721f383701429095dee6f18d632d219ccb3cc69e8f937a89e15f790632c72c0fb138ca95ce5518f07fe9f9a5ae8bbc8ede8cbe479c32fea9750f663c09f0cb2c53e752a520f92e5a21ae1dc9eb8377706b9ebf843fc0dfa28ecf9c37011bd46e8a2adcf57f2e0efd12f15e112b470007695e926f67ab0e60cd370156351eaf3cc531c005b0ad72897951ffbaaae74124bd977cff500bed8d298e2913ba66d8e751beaf89c471baa1a64a2b462a7205778f347d89f8db5dbaa53f4245dc068296e37dc845bb0b9f8ec26e8fd84c601ca0ef59569f3733b29fb47efed2ec31dead000e79a7faa5f441ed3241bf2110b7d6907eb7acb5e32ae971c81740bc871e15a7f4ef527d62eefb692e2c988fd955af531639f42f5c37da884aaadc62e2bd635919a3713ab35d050b389b4248fac648dc0860d35c28a2ce6e68a7de75772615a396b8ffb262e14adf890a58a5c80163b05ef48757cd4f327904b0572e1a52ff455c8a91f917afd7d96498f7a9d51f7432d6c86ba83fc0ae49f61a536d1e3b015edc61c85ed923ecc1225605fe638468275b9acd98be4612297b8badd8c7a6f5fd85ee66b7201fee8d8ef7a028d8add8809d4ed077165cef8b01176205b99829dee52fe51f65da9d3ba5473b76b17a1117ca6dd75a6dcb5012b06b92cd51ef8b44b940bd9a9746823771aba0e7975e4f49473f12fea17c9a522addce574516fb10a5bb37efc3cb7737d1f7d9dd4ed99864aebc0bf6506b36a8331fec92ce3ac4526b246063876d267e6c12e329b454f53852a3aae50417e0eb1edda76504729779ba57c3946e829cbc5fec05ec4ffb8642f16f7af1c41ede2d7ec85bec7dee4ab3d83da9ef28421e8fbd4ec43a5c573b0641bd2fbef97ee979e7e0fbd024497ccab56d452b2393d527ba69285d0c23ae99db8881519dc9d65901390bda8926d7f968b4bb4e2dea1e0f4bb7b5081abafa7922f03bd8358dd056f7c021a36027e36a3efcaf2e849e37a0c75c8b9472c3e6cae646d997cfb082bbb76b8cc0a15fbc5b1eb01f9023cb7930d62af9cf3a555be305517d990fc5869cdeeabfa6525972718d9417cddd5b7d90366aca9eec6181cabbc8e6deb26f820a01c7cd93344c60baab4b86fdfe3da6396a2c3aabfd251abd5898e2dcc4656e87bf44b316f18b8b1da89fd25be66657553d7710f1c5fcaf5d65775a54d7e6c14d75c60f46ef6489911d65f31f3884f889588331dd7a44a1a34e4de0f5126ef19d5e71df263e493b15b2c729aa7be1755da5dccc8c6d91368d61862d4abe9857eacfa639f9a7433c5ff69f69c4df451796fed0fea7d5fb21792d1d29e652f54a1336f7b69d5e5458d6d136b4888d9d934c3d5225ecb33680b86b57cce1e6dc9155869ed2c5597e7d91c624aecb32ccd912a40c273a99295746566669cbd8266bfa3bdacf5f3d6e3cb87ded824f62ea1deaf676f7609baab793dbec73d32f0b9d9227b87ba33a0576e674bf0a253dff515f23d7668a81ad6e4b1c23df2b7875c794c3d96b9f428d5b9996443d0835d37771750d38c582fbbc88579b617bd58d8f04558ed39a73ecc677b29d7d04ddc21528b39ab9f664deebeaed61fe77185c2f6ed04eafddd787d063eccda2841388319b1352c8ba853e350c90e541b65d043cdfab0fe8ff9e73968da21d84303fb4a587db15ce2d51de0df5bb0196958d956febd5ce27e87107517e47397b5386b2f5113addf1676273b768bd879028a3aee363b092d8c92185da43e518dec343bcbda5927eecd40aee8b49eb9ea81c61d3f8dac9bf5b27e94a1ea82bd3c81749eb8dee982269c6717e0911e925c065ff4c7a4672972910a0b6a18d5ca2ed38a0279d7a5e4b9ea2cbb72efd8bb0fba65b7dc83b5907b507f4b6ac653d0c56b5b75adec06b2b4f65ac495b57ed65ad0a4dbec2ebb4fde4e5610694de6d4df6615b39d5591eb71be94937d5cafcccb7d798e3539d4ec55fde2c6fe926c99b30feca5609d77ee46b615ed4ac5cab565cf20d3bfc1fc784e76a26cb611c6b1fef475bb9159a4a6c375ea6a5502e41c3f2daf21dbf89dd7a171ad3a7eeff84bbb1d3b4aa02f2bb92c3ef593cbbde4d551c96a66cb5f679b5907fd8ae1ce03ae609977177d703be647591db2ca273dcbb6eca9bb858ab340df14b5700111745b2b739ded649048678d70b956a74aff6b1ebd0266d0144f9e56392073a5611739a457b1f64c75ac43b97c692f5fadd1c2f7766ec01aa7e099240e477fcbeb24666167fa1ad74162edd2f43bee36b77600740c2037b8ca1ddb2079d0fbdce741d68dd2ea395394728bd5aa2e69d83b543b4bdbd135ea11c5fe9bb9ce33ac81eda7fed8bfdb0bb3e7e6507f377005ff4cc9ea1b652173f3e03a61accf621755dd466af2dc1fe64578cd0b7de176f4301f60cd18f3ad984fdce7431b57fa67f9431c09d76ce71f7e66bc262d786a8bfc517720371ee37e67de97f355dcffc97aa5f3ad7c943fc59eb239438f3ac79c8b346266f37c6c3bfe512f6c8027eceb51fe9c4ff2977c9acf207b1fc7da249f47bd066a9af9ab6de66f26faef6959db64f6a55ee58c8fe819cff385b9d2afae1afba0e5b5b75fdc0f6383cbdff325ae26d18e84954fa3194cf35d3f024ddbc5950bf035fa31df833a6317f78a7bcc748690819e00356f20e7f7bc692631b67247efa35c5639f99cc7dfb7d15756f3038c00e26fffc4fa3e2866dd2f9d46be3d96e2367a68dcfb31ce0ffd223f522d3d7655ebb16e1f415d72e5fa9cad56f29699e1ea858218719f0d7d1fb3a325f6db3ec946aaebf89bfc383ff10d57cd4fb117baaa5dfec4fabedf32f3fc2c6fa7ae9d64f39c57c55cd316609daffadae4b8feeeb1e68c4f8b1d9f937c90774026201f57c59a27f65a1a7937ef7177f58b1fee6dcea0fe9ce833983dad1b0cd7d6773ed52f3f5bdf071b98e7fdec5aeff09a56bfbc36127d90c5d565bfe73bf979d0612fee61716fdaab235ac1cd5b489d41b9c41ed8c86ce617f9657e8571eb0b7b419b8433f9757e93df86a95404257bc97fdd5edc993b7067603377f9bda9513ce6b58719c750ac35719744ecc6297f05b54d17eabf297618e23a7e8d570e21f7d683bc12776ee5d5bccb31fe4b4b61aaa05acb376c3b4cf31aae70ad7a969fde79fae67efe870c94df17f9a69f8864d866651db3c73a1ebd9376f7793ddfb2ceb55c966fd37b30aa15ac6dbaa16965d6f4f31dbf0779d78c7a66dca3e5ff45e6c96e629c6ca865cc1fb06f67535cc9b11a34dfb7173d2d347c8ef34aa1cc5d5ce9a748873b2464ef7479271b3c5d5933b437766c0f0b53d8b8a73ff7852b7c5e140122efb9dc93fce267c994f69a9b36d4b147660a5ee309bc89f48c547acfe9dbf1450fb2a3108a4c5b0741ab2828a78abb7153964879f43b579f1df4b610e1a0fe7d80cc14324e13a93bc5a88254f07e1aea03947b2df33599509c891c3bcf16c5c0e4295f5cbdff97ff4a7cc92b51ba50cb8174a192857cd7d3feaeceaa5faf569dc08f3d97d52751bd4499aa5437764be70c57f6eb72e96176709e0db289e9adadef97d7bfbfb7df12ac1577509df9cccc8b61f1503cc60c4d7520475baed6e1d3a1a973b1c220b1f7555d2c14a34c70df56c956cc67b9c40a0f57fd4c3102aeaef6c39472c8efda4bf1640edd1ba4a5afd8d7b7c5389bd85d3354ab370f64cd57e423bb3ffac98ed6f6c2727642f5c957d1fed39e73c84741678be762f2e3f72fbe135fc02bbfe94198e18ade89aeda601f8b177b01c1f701ede691a36757a5fdc93273a89687f0437d8c1eea3ef668d25adb135fc7ab4df9f5ca76d6fa01408d392fa621d3cbd27af52fc7976266afccb68dd1ead5548b79f15abc4134bcb5b3624135e79a5c64c5a4b4237e8dc7e2f7a45b245dc0598cf1c53bbe75f2c18f41ec2fecd2765d139ebbeae5add6e3be6f2feb07af69066f5e6dc5edb92e76034b3ba4d63cacac3ab0ccb8e2ed49bdc2fe2feee19de6c77692df1605afdca4ddbfe0e121532e96c56eecfbb8abd2bcd6d6afbff9bed8873ddbd8c11ee823b793efe5c322147bf8ce08e51dbd354ad67a2ed8555a96282699a1fee4fbf9893e0bdeb66d0f3ba043eccecca21f377be602df9c1bf3be832fdf77feeefb626bc718fb9a0bc82a5aa0bfdda2e9ad1fbb0d7e07866a68b8d036e0476a51a62cfe1e7e4cb60776d3c1cca7e196c57ebeb04ddf88556f981607be1375379e233afd4d7e84fbfb2771cfc5c7daf717e2cbea28d70bf89661dc03696b7925abb87161fc6b71684eb19335fb20978fbe8adf1b330d7f691750fd76a0d28a6ba49043e73575658f7c07f7484c43cb2efd8d3e044af64a7bc6bf7a9fecdbef579679c1fb8da75071c5aea9cba02cd01093ad0bd5bcee5fc3a35de2cef0cf6fbf51be36552fa696358ba3a265b78b634dbbb6a03e811a3ed30fb666a6c5897d500a65728276f2cefb6c3cf661d6de49ff95f8f28907f8562eee9d7cc1b7d30edc89f7902bb57dcbb4f2bedfb72f763fec17a7a16d6a10552de62f0dbf9765eac27582c95ec3866b9a695681fc5bc55c1a2aad83ac1673ab980b63b5362946104fa6d177018e32996325365e9b4fbe2e979fda4be96f8cd0de08de0bfe8c3dc4d81f3bf0cff6d1d68b335ff719e408d3a8156ea896a15fb4dd65d8283af9c84ef3ad6ce81eec76dc091fee62050db1eb153e1f78a6588fe2f717bd28ba6e1fbd70c03d0443f23af4fed89fb4972ffe860856c0633d51b8a21d77a7d13a7ffc1ebd2444d4b8b30d321e9787eb70a74676c3b5ed861a853b5b8bab54402d7720788d4bdebec6bd9eb8a3788cbb8097f15335b1371af7342fb97bbfeecbbe1f5f3efcfd971ffa384b33e3fd2ab2cf6b547a3772fdefc394df975cffbdfba0176bf7fd689ebf602f3ffefb2eb8a383726afc8cbc9d970ea1eed367ead9afafa5acf759fedddfc658c3bff43ef217b259eb8508ef429a256910bdb35fbeaf1caf655fe62aa7b069afc1577f0ba8ac2b097f3bbee45fcac77f88bbab73eb7f2b21603f7efae93e1977d5835cf556567b3ecbfb6cdc9a4e7c8a31dfccc7f28fb25993cb0ffe46d257f1794d8683d55e8f8fcff918db4a357e19af8dfb4db9145ff0bf2cb3affe3eccc7fb0b5d5e4f7022aff535948fbee9836d7c96c9afd5fbf1f3447f5ea359f1245b7b3756d610e327fdd588d21bc072be7c7cf25bf4bc75b9969e9be402d7153decf7ff8abdacf3f48b7764b42af9a2c873c76fedacbfcffc950c3ffba7b2dd7c96fd4a4e701d50b22697efe6c8bf92b77dd4f9ef9effd1f3beb4a1b2effb7e7cf97fe2f84d7f7fec6ff1f9ff955cfef7fffcc7ff011f3a1368 - - - 789c5dd0cd6ee2301000e03b4f11911b5ad1189290a8da0324a5e90f29941e2aadf6e0d84ea10d1020849ad5befb7a3cceaa29e2e06f663c33ce55cf7a9dcfacde55e758d16acd2cb6a207abc74f9b8dfcf5fbe79f4e97f896fabb8145ba3f3addbec5ac74b715704ed5d9769c01cb73e0423368f80224c190e53e70091c389e83d98366e83942679f0c43cc7e0087c4f3307b63c8b1d559337459c6810f48df137aab49436c750f748917320f78418e4cf65993fa04b33572c4313b067a039f333de80e39e238680ff4d5d2581c69d2c0c3ad8e0db1f30619127cd1dcd00c7a4452824c80a321359d73cd8c129c1b1b0acc726030a414b31299f9989d1952a4d0ccc23073819f861c973c2133d3b904aacf6ceeda9a8c12bc5b219929de21f9005900a99bf9f8e9a8a159728a5477f5d77847367719305373b1788b14668d4c9337d95b2437ef5d03b9c84df10a28fc866fc05c9522fbf0b369c6b8d0c7ffb1fc6db57effb0bfc68acd7657ee0fedba63599dea73d18a7dca525ec6ed3aa16293a81d2bf232beb1bfc578d58a416731ad641da95381b1e3f496ca939432c9f3bb7b8c450f8fb39994b18c93493a36fda2a7b9aa8ae3e4b278b69b192aa822499dc2d6cddc68b94ff697f46c7fdd255ad6f5e2dbdbfac7c3cbd8ecf7f7baf30f538f0154 - - - - - cancelButton - clicked() - UnpackDlg - reject() - - - destButton - clicked() - UnpackDlg - clickedDestButton() - - - unpackButton - clicked() - UnpackDlg - clickedUnpack() - - - - clickedDestButton() - clickedUnpack() - destroy() - init() - - - diff --git a/util/install/mac/unpackdlgimpl.cpp b/util/install/mac/unpackdlgimpl.cpp deleted file mode 100644 index 5538f4d..0000000 --- a/util/install/mac/unpackdlgimpl.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "unpackdlgimpl.h" -#include "licensedlgimpl.h" -#include "keyinfo.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -UnpackDlgImpl::UnpackDlgImpl( QString key, QWidget* pParent, const char* pName, WindowFlags f ) : - UnpackDlg( pParent, pName, f ) -{ - destPath->setText( QDir::currentDirPath() ); - if(!key.isNull()) { - srcKey->setText(key); - } else if(QFile::exists( QDir::homeDirPath() + "/.qt-license")) { - QFile lic( QDir::homeDirPath() + "/.qt-license"); - if( lic.open( IO_ReadOnly ) ) { - QString buffer; - while( lic.readLine( buffer, 1024 ) != -1 ) { - if( buffer[ 0 ] != '#' ) { - QStringList components = QStringList::split( '=', buffer ); - QStringList::Iterator it = components.begin(); - QString key = (*it++).stripWhiteSpace().replace( QRegExp( QString( "\"" ) ), QString() ); - if(key.upper() == "LICENSEKEY") { - QString value = (*it++).stripWhiteSpace().replace( QRegExp( QString( "\"" ) ), QString() ); - srcKey->setText(value); - } - } - } - lic.close(); - } - } - connect( srcKey, SIGNAL( textChanged( const QString& ) ), this, SLOT( licenseKeyChanged() ) ); - licenseKeyChanged(); - logOutput->setWordWrap( QTextView::WidgetWidth ); - logOutput->setWrapPolicy( QTextView::Anywhere ); -} - -void UnpackDlgImpl::clickedDestButton() -{ - QString dest = QFileDialog::getExistingDirectory( destPath->text(), this, NULL, "Select destination directory" ); - if (!dest.isNull()) - destPath->setText( dest ); -} - -void UnpackDlgImpl::clickedUnpack() -{ - QArchive archive; - connect( &archive, SIGNAL( operationFeedback( const QString& ) ), this, SLOT( updateProgress( const QString& ) ) ); - connect( &archive, SIGNAL( operationFeedback( int ) ), this, SLOT( updateProgress( int ) ) ); - - archive.setVerbosity( QArchive::Destination | QArchive::Verbose | QArchive::Progress ); - - QString dest = destPath->text(), src="qt-mac-commercial-3.0.0.app/Contents/Qt/qtmac.arq"; - if(!dest.isEmpty() && dest.right(1) != "/") - dest += "/"; - archive.setPath( src ); - if( !archive.open( IO_ReadOnly ) ) { - QMessageBox::critical( NULL, "Failure", "Failed to open input " + src); - return; - } else if(!QFile::exists(dest) ) { - QDir d; - if(!d.mkdir(dest)) { - QMessageBox::critical( NULL, "Failure", "Failed to open directory " + dest); - return; - } - } - unpackButton->setDisabled( true ); - srcKey->setDisabled( true ); - destPath->setDisabled( true ); - destButton->setDisabled( true ); - LicenseDialogImpl licenseDialog( this ); - if((!licenseDialog.showLicense( featuresForKeyOnUnix( srcKey->text() ) & Feature_US )) || - (!licenseDialog.exec())) { - QMessageBox::critical( NULL, "Failure", "The license agreement was rejected." ); - updateProgress( "License rejected" ); - unpackButton->setDisabled( false ); - srcKey->setDisabled( false ); - destPath->setDisabled( false ); - destButton->setDisabled( false ); - return; - } - - QString srcName = "qt-mac-commercial-3.0.0.app/Contents/Qt/LICENSE"; - QString destName = "/qt-mac-commercial-3.0.0/.LICENSE"; - QString srcName2 = srcName; - if ( featuresForKeyOnUnix( srcKey->text() ) & Feature_US ) - srcName2 = srcName2 + "-US"; - if((!archive.readArchive( dest, srcKey->text() )) || - (!copyFile( srcName, dest + destName )) || - (!copyFile( srcName + "-US", dest + destName + "-US" )) || - (!copyFile( srcName2, dest + "/qt-mac-commercial-3.0.0/LICENSE" ))) - { - QMessageBox::critical( NULL, "Failure", "Failed to unpack " + src); - archive.close(); - } - else { - QMessageBox::information( NULL, "Archive unpacked", "Qt has been " - "extracted to " + dest + "qt-mac-commerical-3.0.0\nPlease read " - "the INSTALL.macosx file for installation instructions." ); - cancelButton->setText( "Quit" ); - } -} - -bool UnpackDlgImpl::copyFile( const QString& src, const QString& dest ) -{ - int len; - const int buflen = 4096; - char buf[buflen]; - QFileInfo info( src ); - QFile srcFile( src ), destFile( dest ); - if (!srcFile.open( IO_ReadOnly )) - return false; - destFile.remove(); - if (!destFile.open( IO_WriteOnly )) { - srcFile.close(); - return false; - } - while (!srcFile.atEnd()) { - len = srcFile.readBlock( buf, buflen ); - if (len <= 0) - break; - if (destFile.writeBlock( buf, len ) != len) - return false; - } - destFile.flush(); - return true; -} - -void UnpackDlgImpl::updateProgress( const QString& message ) -{ - logOutput->append( message ); -} - -void UnpackDlgImpl::updateProgress( int ) -{ - qApp->processEvents(); -} - -void UnpackDlgImpl::licenseKeyChanged() -{ - QRegExp keyExpr("^....-....-...."); - if ((keyExpr.search( srcKey->text() ) != -1) && - (featuresForKey( srcKey->text() ) & Feature_Mac)) - unpackButton->setEnabled( true ); - else - unpackButton->setEnabled( false ); -} - -void UnpackDlgImpl::reject() -{ - exit( 0 ); -} diff --git a/util/install/mac/unpackdlgimpl.h b/util/install/mac/unpackdlgimpl.h deleted file mode 100644 index 11585d7..0000000 --- a/util/install/mac/unpackdlgimpl.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef UNPACKDLGIMPL_H -#define UNPACKDLGIMPL_H - -#include "unpackdlg.h" - -class UnpackDlgImpl : public UnpackDlg -{ - Q_OBJECT; -public: - UnpackDlgImpl( QString key = QString(), - QWidget* pParent = NULL, const char* pName = NULL, WindowFlags f = 0 ); - - virtual void clickedDestButton(); - virtual void clickedUnpack(); - virtual bool copyFile( const QString& src, const QString& dest ); -public slots: - virtual void updateProgress( const QString& ); - virtual void updateProgress( int ); - virtual void licenseKeyChanged(); - virtual void reject(); -}; - -#endif diff --git a/util/install/package/main.cpp b/util/install/package/main.cpp deleted file mode 100644 index 39c71db..0000000 --- a/util/install/package/main.cpp +++ /dev/null @@ -1,397 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "qarchive.h" -#include -#include -#include "keyinfo.h" -#if defined(Q_OS_WIN32) -#include -#endif - -class ConsoleOutput : public QObject -{ - Q_OBJECT -public: - ConsoleOutput() : QObject() { } - ~ConsoleOutput() { } -public slots: - void updateProgress( const QString& str) { qDebug("%s", str.latin1()); } -}; - -static int usage(const char *argv0, const char *un=NULL) { - if(un) - fprintf(stderr, "Unknown command: %s\n", un); - else - fprintf(stderr, "Usage:\n"); - fprintf(stderr, "%s [options] [keyinfo] files...\n", argv0); - - fprintf(stderr, "\nOptions:\n"); - fprintf(stderr, " -o file : Outputs archive to file\n"); - fprintf(stderr, " -n : Follow symbolic links, do not archive the link\n"); - fprintf(stderr, " -s : Quiet mode, will not output process\n"); - fprintf(stderr, " -desc text : Add the description text to the archive (e.g. \"Qt 3.0.0\")\n"); - fprintf(stderr, " -extra k v : Adds the extra value v with the key k to the archive\n"); - fprintf(stderr, " -h : This help\n"); - - fprintf(stderr, "\nKey Info:\n"); - fprintf(stderr, " -win : Windows Archive\n"); - fprintf(stderr, " -unix : Unix Archive\n"); - fprintf(stderr, " -mac : Mac OS X Archive\n"); - fprintf(stderr, " -embedded : Embedded Archive\n"); - - fprintf(stderr, "\nThe following options are not for packaging and can't be\n" ); - fprintf(stderr, "combined with the options above or any other option:\n\n" ); - fprintf(stderr, " -unpack file : Unpack the archive file to the current directory\n"); - fprintf(stderr, " -getdesc file : Print the description text of the archive file\n"); - fprintf(stderr, " -getextra k file : Print the extra value for the key k of the archive file\n"); -#if defined(Q_OS_WIN32) - fprintf(stderr, " -res file1 file2 : Add the archive file1 as the binary resource\n"); - fprintf(stderr, " QT_ARQ to the excutable file2\n"); - fprintf(stderr, " -getres file : Get the binary resource QT_ARQ from the executable\n" ); - fprintf(stderr, " file and store it under qt.arq\n"); - fprintf(stderr, " -namedres RES_NAME file1 file2:\n"); - fprintf(stderr, " Add the file1 as the binary resource\n"); - fprintf(stderr, " RES_NAME to the excutable file2\n"); - fprintf(stderr, " -license LICENSE file2:\n"); - fprintf(stderr, " Add the license LICENSE as the binary resource\n"); - fprintf(stderr, " LICENSE to the excutable file2\n"); - fprintf(stderr, " -license-us LICENSE-US file2:\n"); - fprintf(stderr, " Add the license LICENSE-US as the binary resource\n"); - fprintf(stderr, " LICENSE-US to the excutable file2\n"); -#endif - return 665; -} - -static int unpack( const char *filename, bool verbose ) -{ - QArchive arq( filename ); - ConsoleOutput output; - if ( verbose ) - output.connect( &arq, SIGNAL(operationFeedback(const QString&)), SLOT(updateProgress(const QString&)) ); - if ( !arq.open( IO_ReadOnly ) ) { - fprintf(stderr, "Can't open the archive %s file to unpack", filename); - return 42; - } - if ( !arq.readArchive( ".", "G87A-QJFE-DQF9" ) ) { - fprintf(stderr, "Couldn't unpack the archive %s", filename); - return 42; - } - return 0; -} - -static int getdesc( const char *filename ) -{ - QArchive arq( filename ); - ConsoleOutput output; - output.connect( &arq, SIGNAL(operationFeedback(const QString&)), SLOT(updateProgress(const QString&)) ); - if ( !arq.open( IO_ReadOnly ) ) { - fprintf(stderr, "Can't open the archive %s file to get description", filename); - return 42; - } - QArchiveHeader *header = arq.readArchiveHeader(); - if ( !header ) { - fprintf(stderr, "Can't find the header in the archive %s file", filename); - return 42; - } - if ( !header->description().isNull() ) { - fprintf(stdout, header->description().latin1() ); - } - return 0; -} - -static int getextra( const char *key, const char *filename ) -{ - QArchive arq( filename ); - ConsoleOutput output; - output.connect( &arq, SIGNAL(operationFeedback(const QString&)), SLOT(updateProgress(const QString&)) ); - if ( !arq.open( IO_ReadOnly ) ) { - fprintf(stderr, "Can't open the archive %s file to get description", filename); - return 42; - } - QArchiveHeader *header = arq.readArchiveHeader(); - if ( !header ) { - fprintf(stderr, "Can't find the header in the archive %s file", filename); - return 42; - } - QString extraData = header->findExtraData(key); - if ( !extraData.isNull() ) { - fprintf(stdout, extraData.latin1() ); - } - return 0; -} - - -int main( int argc, char** argv ) -{ - uint features = 0; - bool output = true, doSyms = true; - QString desc; - QString dest; - QMap extra; -#if defined(Q_OS_WIN32) - QString arq, exe; - QString resName; - bool doRes = false; - bool doLicense = false; - bool doLicenseUs = false; - bool getRes = false; -#endif - QStringList files; - int i; - for( i = 1; i < argc; i++ ) { - //options - if(!strcmp(argv[i], "-o")) { - if ( ++i < argc ) - dest = argv[i]; - else - return usage(argv[0]); - } else if(!strcmp(argv[i], "-n")) { - doSyms = false; - } else if(!strcmp(argv[i], "-s")) { - output = false; - } else if(!strcmp(argv[i], "-desc")) { - if ( ++i < argc ) - desc = argv[i]; - else - return usage(argv[0]); - } else if(!strcmp(argv[i], "-extra")) { - QString key, value; - if ( ++i < argc ) - key = argv[i]; - else - return usage(argv[0]); - if ( ++i < argc ) - value = argv[i]; - else - return usage(argv[0]); - extra.insert( key, value ); - } else if(!strcmp(argv[i], "-h")) { - return usage(argv[0]); - //keyinfo - } else if(!strcmp(argv[i], "-unix")) { - features |= Feature_Unix; - } else if(!strcmp(argv[i], "-win")) { - features |= Feature_Windows; - } else if(!strcmp(argv[i], "-mac")) { - features |= Feature_Mac; - } else if(!strcmp(argv[i], "-embedded")) { - features |= Feature_Embedded; - //unpack - } else if(!strcmp(argv[i], "-unpack")) { - if ( ++i < argc ) - return unpack( argv[i], output ); - //getdesc - } else if(!strcmp(argv[i], "-getdesc")) { - if ( ++i < argc ) - return getdesc( argv[i] ); - //getextra - } else if(!strcmp(argv[i], "-getextra")) { - if ( ++i < argc ) { - if ( ++i < argc ) - return getextra( argv[i-1], argv[i] ); - } -#if defined(Q_OS_WIN32) - //res (Windows only) - } else if(!strcmp(argv[i], "-res")) { - doRes = true; - if ( ++i < argc ) - arq = argv[i]; - if ( ++i < argc ) - exe = argv[i]; - //getres (Windows only) - } else if(!strcmp(argv[i], "-getres")) { - getRes = true; - if ( ++i < argc ) - exe = argv[i]; - //res (Windows only) - } else if(!strcmp(argv[i], "-namedres")) { - doRes = true; - if ( ++i < argc ) - resName = argv[i]; - if ( ++i < argc ) - arq = argv[i]; - if ( ++i < argc ) - exe = argv[i]; - //license (Windows only) - } else if(!strcmp(argv[i], "-license")) { - doLicense = true; - if ( ++i < argc ) - arq = argv[i]; - if ( ++i < argc ) - exe = argv[i]; - //licenseUs (Windows only) - } else if(!strcmp(argv[i], "-license-us")) { - doLicenseUs = true; - if ( ++i < argc ) - arq = argv[i]; - if ( ++i < argc ) - exe = argv[i]; -#endif - //files - } else if(*(argv[i]) != '-') { - files.append(argv[i]); - //unknown - } else { - return usage(argv[0], argv[i]); - } - } -#if defined(Q_OS_WIN32) - if ( doRes || doLicense || doLicenseUs ) { - if ( arq.isEmpty() || exe.isEmpty() ) - return usage(argv[0], argv[i]); - QFile fArq( arq ); - if ( !fArq.open( IO_ReadOnly ) ) { - if ( doRes ) { - fprintf(stderr, "Could not open archive %s", arq.latin1() ); - } else { - fprintf(stderr, "Could not open license %s", arq.latin1() ); - } - return -1; - } - QByteArray ba = fArq.readAll(); - // ignore wide character versions (this is for internal use only) - HANDLE hExe = BeginUpdateResourceA( exe.latin1(), false ); - if ( hExe == 0 ) { - fprintf(stderr, "Could not load executable %s\n", exe.latin1() ); - qSystemWarning( "" ); - return -1; - } - if ( resName.isEmpty() ) { - if ( doRes ) { - resName = "QT_ARQ"; - } else if ( doLicense ){ - resName = "LICENSE"; - } else { - resName = "LICENSE-US"; - } - } - if ( !UpdateResourceA(hExe,RT_RCDATA,resName.latin1(),0,ba.data(),ba.count()) ) { - EndUpdateResource( hExe, true ); - fprintf(stderr, "Could not update executable %s\n", exe.latin1() ); - qSystemWarning( "" ); - return -1; - } - if ( !EndUpdateResource(hExe,false) ) { - fprintf(stderr, "Could not update executable %s\n", exe.latin1() ); - qSystemWarning( "" ); - return -1; - } - return 0; - } - if ( getRes ) { - if ( exe.isEmpty() ) - return usage(argv[0], argv[i]); - arq = "qt.arq"; - QFile fArq( arq ); - if ( !fArq.open( IO_WriteOnly ) ) { - fprintf(stderr, "Could not open archive %s\n", arq.latin1() ); - return -1; - } - // ignore wide character versions (this is for internal use only) - HMODULE hExe = LoadLibraryA( exe.latin1() ); - if ( hExe == NULL ) { - fprintf(stderr, "Could not load executable %s\n", exe.latin1() ); - qSystemWarning( "" ); - return -1; - } - HRSRC resource = FindResource( hExe, "QT_ARQ", RT_RCDATA ); - HGLOBAL hglobal = LoadResource( hExe, resource ); - int arSize = SizeofResource( hExe, resource ); - if ( arSize == 0 ) { - fprintf(stderr, "Could not get size of resource\n" ); - qSystemWarning( "" ); - return -1; - } - char *arData = (char*)LockResource( hglobal ); - if ( arData == 0 ) { - fprintf(stderr, "Could not lock resource\n" ); - qSystemWarning( "" ); - return -1; - } - fArq.writeBlock( arData, arSize ); - FreeLibrary( hExe ); - return 0; - } -#endif - if(!files.isEmpty()) { - if(dest.isEmpty()) { - qDebug("Please specify an output package"); - return 666; - } - - QArchive archive; - ConsoleOutput out; - if(output) { - QObject::connect( &archive, SIGNAL( operationFeedback( const QString& ) ), - &out, SLOT( updateProgress( const QString& ) ) ); - archive.setVerbosity( QArchive::Destination | QArchive::Verbose ); - } - archive.setSymbolicLinks(doSyms); - archive.setPath( dest ); - if( !archive.open( IO_WriteOnly ) ) { - qDebug("Failed to open output %s", dest.latin1()); - return 666; - } - QArchiveHeader header( features, desc ); - QMap::Iterator exIt; - for ( exIt = extra.begin(); exIt != extra.end(); ++exIt ) { - header.addExtraData( exIt.key(), exIt.data() ); - } - archive.writeHeader( header ); - for(QStringList::Iterator it = files.begin(); it != files.end(); ++it) { - QFileInfo f((*it)); - if(!f.exists()) { - qDebug("Failed to open %s", (*it).latin1()); - continue; - } - if(f.isDir()) - archive.writeDir( (*it), true, (*it) ); - else - archive.writeFile( (*it), (*it) ); - } - archive.close(); - } else { - return usage(argv[0]); - } - return 0; -} - -#include "main.moc" diff --git a/util/install/package/package.pro b/util/install/package/package.pro deleted file mode 100644 index 4edc96e..0000000 --- a/util/install/package/package.pro +++ /dev/null @@ -1,25 +0,0 @@ -TEMPLATE = app -SOURCES = main.cpp -INCLUDEPATH += ../archive $$QT_SOURCE_TREE/include ../keygen -CONFIG += qt console -TARGET = package -win32:DESTDIR = ../../../bin -unix:LIBS += -L$$QT_BUILD_TREE/util/install/archive -larq -win32:LIBS += ../archive/arq.lib -DEFINES -= UNICODE - -win32:!shared:SOURCES += \ - ../../../src/3rdparty/zlib/adler32.c \ - ../../../src/3rdparty/zlib/compress.c \ - ../../../src/3rdparty/zlib/crc32.c \ - ../../../src/3rdparty/zlib/deflate.c \ - ../../../src/3rdparty/zlib/gzio.c \ - ../../../src/3rdparty/zlib/infblock.c \ - ../../../src/3rdparty/zlib/infcodes.c \ - ../../../src/3rdparty/zlib/inffast.c \ - ../../../src/3rdparty/zlib/inflate.c \ - ../../../src/3rdparty/zlib/inftrees.c \ - ../../../src/3rdparty/zlib/infutil.c \ - ../../../src/3rdparty/zlib/trees.c \ - ../../../src/3rdparty/zlib/uncompr.c \ - ../../../src/3rdparty/zlib/zutil.c diff --git a/util/install/win/archive.cpp b/util/install/win/archive.cpp deleted file mode 100644 index 81f8e53..0000000 --- a/util/install/win/archive.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "archive.h" -#include "resource.h" -#include -#include -#include - -bool addArchive( const QString& name ) -{ - QByteArray ba ; - - // Copy the install.exe first, since we can't update our own application - char aName[512]; - if ( GetModuleFileNameA( 0, aName, 512 ) == 0 ) { // we don't need wide character versions - QMessageBox::critical( 0, - "Could not add archive", - QString( "Could not add archive %1.\n" - "Could not get the name of the application.").arg(name) - ); - return false; - } - QFile fromFile( aName ); - if ( !fromFile.open( IO_ReadOnly ) ) { - QMessageBox::critical( 0, - "Could not add archive", - QString("Could not copy executable %1.\n").arg(aName) - ); - return false; - } - QString destinationName = name; - if ( destinationName.right(4) == ".arq" ) { - destinationName =destinationName.left( destinationName.length()-4 ); - } - destinationName += ".exe"; - QFile toFile( destinationName ); - if ( !toFile.open( IO_WriteOnly ) ) { - QMessageBox::critical( 0, - "Could not add archive", - QString("Could not copy executable %1 to %2.\n").arg(aName).arg(destinationName) - ); - return false; - } - ba = fromFile.readAll(); - toFile.writeBlock( ba ); - toFile.close(); - - // load the .arq file - QFile fArq( name ); - if ( !fArq.open( IO_ReadOnly ) ) { - QMessageBox::critical( 0, - "Could not add archive", - QString("Could not open archive %1.\n").arg(name) - ); - return false; - } - ba = fArq.readAll(); - - // update the binary res - ResourceSaver res( destinationName ); - QString errorMsg; - if ( !res.setData( "QT_ARQ", ba, &errorMsg ) ) { - QMessageBox::critical( 0, - "Could not add archive", - QString("Could not add archive %1.\n").arg(name) + errorMsg - ); - return false; - } - -#if 0 - QMessageBox::information( 0, - "Archive added", - QString("Added the archive %1.\n").arg(name) + errorMsg - ); -#endif - return true; -} diff --git a/util/install/win/archive.h b/util/install/win/archive.h deleted file mode 100644 index d470a27..0000000 --- a/util/install/win/archive.h +++ /dev/null @@ -1,49 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef ARCHIVE_H -#define ARCHIVE_H - -#include -#include "resource.h" - -bool addArchive( const QString &name ); - -#endif diff --git a/util/install/win/dialogs/folderdlg.ui b/util/install/win/dialogs/folderdlg.ui deleted file mode 100644 index c5427e2..0000000 --- a/util/install/win/dialogs/folderdlg.ui +++ /dev/null @@ -1,184 +0,0 @@ - -FolderDlg - - - FolderDlg - - - - 0 - 0 - 323 - 369 - - - - Select installation folder - - - - unnamed - - - 11 - - - 6 - - - - - Start menu folder tree - - - true - - - true - - - - folderTree - - - - - Layout2 - - - - unnamed - - - 0 - - - 6 - - - - nameLabel - - - Folder name - - - - - folderName - - - - - - - Layout1 - - - - unnamed - - - 0 - - - 6 - - - - Spacer1 - - - Horizontal - - - Expanding - - - - 20 - 20 - - - - - - okButton - - - Ok - - - - - cancelButton - - - Cancel - - - - - Spacer2 - - - Horizontal - - - Expanding - - - - 20 - 20 - - - - - - - - - - okButton - clicked() - FolderDlg - accept() - - - cancelButton - clicked() - FolderDlg - reject() - - - folderTree - expanded(QListViewItem*) - FolderDlg - expandedDir(QListViewItem*) - - - folderTree - collapsed(QListViewItem*) - FolderDlg - collapsedDir(QListViewItem*) - - - folderTree - selectionChanged(QListViewItem*) - FolderDlg - selectedDir(QListViewItem*) - - collapsedDir( QListViewItem* ) - destroy() - expandedDir( QListViewItem* ) - selectedDir( QListViewItem* ) - init() - - - folderTree - folderName - okButton - cancelButton - - diff --git a/util/install/win/dialogs/folderdlgimpl.cpp b/util/install/win/dialogs/folderdlgimpl.cpp deleted file mode 100644 index 8c3c27f..0000000 --- a/util/install/win/dialogs/folderdlgimpl.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "folderdlgimpl.h" -#include "../shell.h" -#include -#include -#include -#include - -FolderDlgImpl::FolderDlgImpl( QWidget* parent, const char* name, bool modal, WindowFlags f ) : - FolderDlg( parent, name, modal, f ) -{ -} - -void FolderDlgImpl::setup( QString programsFolder, QString folder ) -{ - folderName->setText( folder ); - if( programsFolder.length() ) { - QString topLevel = programsFolder.mid( programsFolder.findRev( '\\' ) + 1 ); - QListViewItem* topItem = new QListViewItem( folderTree, topLevel ); - topItem->setOpen( true ); - topItem->setPixmap( 0, *WinShell::getOpenFolderImage() ); - - ScanFolder( programsFolder, topItem ); - - } -} - -void FolderDlgImpl::ScanFolder( QString folderPath, QListViewItem* parent ) -{ - QDir folderDir( folderPath ); - folderDir.setFilter( QDir::Dirs ); - folderDir.setSorting( QDir::Name | QDir::IgnoreCase ); - const QFileInfoList* fiList = folderDir.entryInfoList(); - QFileInfoListIterator it( *fiList ); - QFileInfo* fi; - - while( ( fi = it.current() ) ) { - if( fi->fileName()[0] != '.' ) { // Exclude dot-dirs - QListViewItem* item = new QListViewItem( parent, fi->fileName() ); - item->setOpen( false ); - item->setPixmap( 0, *WinShell::getClosedFolderImage() ); - ScanFolder( fi->absFilePath(), item ); - } - ++it; - } -} - -void FolderDlgImpl::expandedDir( QListViewItem* item ) -{ - item->setPixmap( 0, *WinShell::getOpenFolderImage() ); -} - -void FolderDlgImpl::collapsedDir( QListViewItem* item ) -{ - item->setPixmap( 0, *WinShell::getClosedFolderImage() ); -} - -QString FolderDlgImpl::getFolderName() -{ - return folderName->text(); -} - -/* -** This will replace the contents of the folderName lineedit widget. -** -** The algoritm will traverse the item tree until it gets to the toplevel -** item, prepending each name to the folder name as it goes -*/ -void FolderDlgImpl::selectedDir( QListViewItem* item ) -{ - QListViewItem* currentItem = item; - QString newFolder; - - while( currentItem->parent() ) { - newFolder = currentItem->text( 0 ) + QString( "\\" ) + newFolder; - currentItem = currentItem->parent(); - } - newFolder.truncate( newFolder.length() - 1 ); - folderName->setText( newFolder ); -} diff --git a/util/install/win/dialogs/folderdlgimpl.h b/util/install/win/dialogs/folderdlgimpl.h deleted file mode 100644 index 25e13b5..0000000 --- a/util/install/win/dialogs/folderdlgimpl.h +++ /dev/null @@ -1,65 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef FOLDERDLGIMPL_H -#define FOLDERDLGIMPL_H - -#include "folderdlg.h" - -class WinShell; - -class FolderDlgImpl : public FolderDlg -{ - Q_OBJECT -public: - FolderDlgImpl( QWidget* parent = NULL, const char* name = NULL, bool modal = false, WindowFlags f = 0 ); - - void setup( QString, QString ); - - virtual void expandedDir( QListViewItem* ); - virtual void collapsedDir( QListViewItem* ); - virtual void selectedDir( QListViewItem* ); - - QString getFolderName(); -private: - void ScanFolder( QString folderPath, QListViewItem* parent ); -}; - -#endif // FOLDERDLGIMPL_H diff --git a/util/install/win/environment.cpp b/util/install/win/environment.cpp deleted file mode 100644 index bbf5719..0000000 --- a/util/install/win/environment.cpp +++ /dev/null @@ -1,362 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "environment.h" -#include -#include -#include -#include -#include -#include -#if defined(Q_OS_WIN32) -#include -#endif -#include -#include -#include - -QString QEnvironment::getEnv( const QString &varName, int envBlock ) -{ -#if defined(Q_OS_WIN32) - OSVERSIONINFOA osvi; - HKEY hkKey; - bool isWinMe = false; - - if( envBlock & GlobalEnv ) - hkKey = HKEY_LOCAL_MACHINE; - else - hkKey = HKEY_CURRENT_USER; - - osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFOA ); - GetVersionExA( &osvi ); - if( int( qWinVersion() ) & int( Qt::WV_98 ) ) { - if( osvi.dwMinorVersion == 90 ) - isWinMe = true; - } - - if( envBlock & PersistentEnv ) { - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - HKEY env; - QByteArray buffer; - DWORD size( 0 ); - QString value; - - if( RegOpenKeyExW( hkKey, L"Environment", 0, KEY_READ, &env ) == ERROR_SUCCESS ) { - RegQueryValueExW( env, (const wchar_t*) varName.ucs2(), 0, NULL, NULL, &size ); - buffer.resize( size ); - RegQueryValueExW( env, (const wchar_t*) varName.ucs2(), 0, NULL, (unsigned char*)buffer.data(), &size ); - for( int i = 0; i < ( int )buffer.size(); i += 2 ) { - QChar c( buffer[ i ], buffer[ i + 1 ] ); - if( !c.isNull() ) - value += c; - } - RegCloseKey( env ); - return value; - } - else { - return QString(); - } - } - else { // Win 9x - // Persistent environment on Windows 9x is not fully supported yet. - return QString( getenv( varName ) ); - } - } - if( envBlock & LocalEnv ) { - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - int size = GetEnvironmentVariableW( (TCHAR*)varName.ucs2(), 0, 0 ); - if ( size == 0 ) - return QString(); - TCHAR *data = new TCHAR[ size ]; - GetEnvironmentVariableW( (TCHAR*)varName.ucs2(), data, size ); - QString ret = QString::fromUcs2( data ); - delete[] data; - return ret; - } else { - QCString varNameL = varName.local8Bit(); - int size = GetEnvironmentVariableA( varNameL.data(), 0, 0 ); - if ( size == 0 ) - return QString(); - char *data = new char[ size ]; - GetEnvironmentVariableA( varNameL.data(), data, size ); - QString ret = QString::fromLocal8Bit( data ); - delete[] data; - return ret; - } - } -#elif defined(Q_OS_UNIX) -// Persistent environment on Unix is not supported yet. - if( envBlock & LocalEnv ) { - return QString( getenv( varName ) ); - } -#endif - return QString(); -} - -void QEnvironment::putEnv( const QString &varName, const QString &varValue, int envBlock ) -{ -#if defined(Q_OS_WIN32) - OSVERSIONINFOA osvi; - HKEY hkKey; - bool isWinMe = false; - - if( envBlock & GlobalEnv ) - hkKey = HKEY_LOCAL_MACHINE; - else - hkKey = HKEY_CURRENT_USER; - - osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFOA ); - GetVersionExA( &osvi ); - if( int( qWinVersion() ) & int( Qt::WV_98 ) ) { - if( osvi.dwMinorVersion == 90 ) - isWinMe = true; - } - - if( envBlock & PersistentEnv ) { - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - - HKEY env; - QByteArray buffer; - - buffer.resize( varValue.length() * 2 + 2 ); - const QChar *data = varValue.unicode(); - int i; - for ( i = 0; i < (int)varValue.length(); ++i ) { - buffer[ 2*i ] = data[ i ].cell(); - buffer[ (2*i)+1 ] = data[ i ].row(); - } - buffer[ (2*i) ] = 0; - buffer[ (2*i)+1 ] = 0; - - if( RegOpenKeyExW( hkKey, L"Environment", 0, KEY_WRITE, &env ) == ERROR_SUCCESS ) { - RegSetValueExW( env, (const wchar_t*) varName.ucs2(), 0, REG_EXPAND_SZ, (const unsigned char*)buffer.data(), buffer.size() ); - RegCloseKey( env ); - } - DWORD res; - SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM("Environment"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 1, &res); - } - else { // Win 9x - QFile autoexec( "c:\\autoexec.bat" ); - QTextStream ostream( &autoexec ); - ostream.setEncoding( QTextStream::Locale ); - - if( autoexec.open( IO_Append | IO_ReadWrite | IO_Translate ) ) { - ostream << "set " << varName << "=" << varValue << endl; - autoexec.close(); - } - } - } - if( envBlock & LocalEnv ) { - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - SetEnvironmentVariableW( (TCHAR*)varName.ucs2(), (const wchar_t*) varValue.ucs2() ); - } else { - SetEnvironmentVariableA( varName.local8Bit(), varValue.local8Bit() ); - } - } -#else - if( envBlock & LocalEnv ) - setenv( varName, varValue, 1 ); -#endif -} - -void QEnvironment::removeEnv( const QString &varName, int envBlock ) -{ -#if defined(Q_OS_WIN32) - HKEY hkKey; - if( envBlock & GlobalEnv ) - hkKey = HKEY_LOCAL_MACHINE; - else - hkKey = HKEY_CURRENT_USER; - - if( envBlock & PersistentEnv ) { - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - HKEY env; - if( RegOpenKeyExW( hkKey, L"Environment", 0, KEY_WRITE, &env ) == ERROR_SUCCESS ) { - RegDeleteValue( env, (const wchar_t*) varName.ucs2() ); - RegCloseKey( env ); - } - } - else { // Win 9x - QFile autoexec( "c:\\autoexec.bat" ); - QTextStream ostream( &autoexec ); - ostream.setEncoding( QTextStream::Locale ); - - if( autoexec.open( IO_Append | IO_ReadWrite | IO_Translate ) ) { - ostream << "set " << varName << "=" << endl; - autoexec.close(); - } - } - } - - if( envBlock & LocalEnv ) { - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - SetEnvironmentVariableW( (TCHAR*)varName.ucs2(), 0 ); - } else { - SetEnvironmentVariableA( varName.local8Bit(), 0 ); - } - } -#endif -} - -#if defined(Q_OS_WIN32) -void QEnvironment::recordUninstall( const QString &displayName, const QString &cmdString ) -{ - QSettings settings; - settings.insertSearchPath(QSettings::Windows, "/Microsoft/Windows/CurrentVersion/Uninstall"); - settings.beginGroup("/" + displayName); - settings.writeEntry("/DisplayName", displayName); - settings.writeEntry("/Publisher", "Nokia Corporation and/or its subsidiary(-ies)"); - settings.writeEntry("/URLInfoAbout", "http://qtsoftware.com"); - settings.writeEntry("/HelpLink", "http://qtsoftware.com/support"); - settings.writeEntry("/UninstallString", cmdString); - settings.endGroup(); -} - -void QEnvironment::removeUninstall( const QString &displayName ) -{ - QSettings settings; - settings.insertSearchPath(QSettings::Windows, "/Microsoft/Windows/CurrentVersion/Uninstall"); - settings.beginGroup("/" + displayName); - settings.removeEntry("/DisplayName"); - settings.removeEntry("/Publisher"); - settings.removeEntry("/URLInfoAbout"); - settings.removeEntry("/DisplayVersion"); - settings.removeEntry("/HelpLink"); - settings.removeEntry("/UninstallString"); - settings.removeEntry("/."); - settings.endGroup(); -} - -QString QEnvironment::getRegistryString( const QString &keyName, const QString &valueName, int scope ) -{ - QString value; - HKEY scopeKeys[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }; - HKEY key; - DWORD valueSize( 0 ); - QByteArray buffer, expBuffer; - - if( int( qWinVersion() ) & int(Qt::WV_NT_based) ) { - if( RegOpenKeyExW( scopeKeys[ scope ], (const wchar_t*) keyName.ucs2(), 0, KEY_READ, &key ) == ERROR_SUCCESS ) { - if( RegQueryValueExW( key, (const wchar_t*) valueName.ucs2(), NULL, NULL, NULL, &valueSize ) == ERROR_SUCCESS ) { - buffer.resize( valueSize ); - if( RegQueryValueExW( key, (const wchar_t*) valueName.ucs2(), NULL, NULL, (unsigned char*)buffer.data(), &valueSize ) == ERROR_SUCCESS ) { - valueSize = ExpandEnvironmentStringsW( (WCHAR*)buffer.data(), NULL, 0 ); - expBuffer.resize( valueSize * 2 ); - ExpandEnvironmentStringsW( (WCHAR*)buffer.data(), (WCHAR*)expBuffer.data(), valueSize ); - for( int i = 0; i < ( int )expBuffer.size(); i += 2 ) { - QChar c( expBuffer[ i ], expBuffer[ i + 1 ] ); - if ( !c.isNull() ) - value += c; - } - } - } - RegCloseKey( key ); - } - } - else { - if( RegOpenKeyExA( scopeKeys[ scope ], keyName.local8Bit(), 0, KEY_READ, &key ) == ERROR_SUCCESS ) { - if( RegQueryValueExA( key, valueName.local8Bit(), NULL, NULL, NULL, &valueSize ) == ERROR_SUCCESS ) { - buffer.resize( valueSize ); - if( RegQueryValueExA( key, valueName.local8Bit(), NULL, NULL, (unsigned char*)buffer.data(), &valueSize ) == ERROR_SUCCESS ) { - valueSize = ExpandEnvironmentStringsA( buffer.data(), NULL, 0 ); - expBuffer.resize( valueSize ); - ExpandEnvironmentStringsA( buffer.data(), expBuffer.data(), valueSize ); - value = expBuffer.data(); - } - } - RegCloseKey( key ); - } - } - return value; -} -#endif - -QString QEnvironment::getTempPath() -{ -#if defined(Q_OS_WIN32) - DWORD tmpSize; - QByteArray tmp; - QString tmpPath; - - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - tmpSize = GetTempPathW( 0, NULL ); - tmp.resize( tmpSize * 2 ); - GetTempPathW( tmpSize, (WCHAR*)tmp.data() ); - for( int i = 0; i < ( int )tmp.size(); i += 2 ) { - QChar c( tmp[ i ], tmp[ i + 1 ] ); - if( !c.isNull() ) - tmpPath += c; - } - } - else { - tmpSize = GetTempPathA( 0, NULL ); - tmp.resize( tmpSize * 2 ); - GetTempPathA( tmpSize, tmp.data() ); - tmpPath = tmp.data(); - } -#elif defined(Q_OS_UNIX) - QString tmpPath = "/tmp"; -#endif - return tmpPath; -} - -QString QEnvironment::getLastError() -{ - return strerror( errno ); -} - -QString QEnvironment::getFSFileName( const QString& fileName ) -{ -#if defined(Q_OS_WIN32) - QByteArray buffer( MAX_PATH ); - QString tmp( fileName ); - - GetVolumeInformationA( fileName.left( fileName.find( '\\' ) + 1 ).local8Bit(), NULL, NULL, NULL, NULL, NULL, buffer.data(), buffer.size() ); - if( QString( buffer.data() ) != "NTFS" ) { - DWORD dw; - dw = GetShortPathNameA( fileName.local8Bit(), (char*)buffer.data(), buffer.size() ); - if( dw > 0 ) - tmp = buffer.data(); - } -#elif defined(Q_OS_UNIX) - QString tmp( fileName ); -#endif - return tmp; -} diff --git a/util/install/win/environment.h b/util/install/win/environment.h deleted file mode 100644 index d0f45e4..0000000 --- a/util/install/win/environment.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef ENVIRONMENT_H -#define ENVIRONMENT_H - -#include - -class QEnvironment -{ -public: - static QString getEnv( const QString &varName, int envBlock = LocalEnv ); - static void putEnv( const QString &varName, const QString &varValue, int envBlock = LocalEnv ); - static void removeEnv( const QString &varName, int envBlock = LocalEnv ); -#if defined(Q_OS_WIN32) - static QString getRegistryString( const QString &keyName, const QString &valueName, int scope = CurrentUser ); - static void recordUninstall( const QString &displayName, const QString &cmdString ); - static void removeUninstall( const QString &displayName ); -#endif - static QString getTempPath(); - static QString getLastError(); - static QString getFSFileName( const QString& fileName ); - - enum { - LocalEnv = 1, - PersistentEnv = 2, - GlobalEnv = 4 - }; - - enum { - CurrentUser = 0, - LocalMachine = 1 - }; -}; - -#endif diff --git a/util/install/win/globalinformation.cpp b/util/install/win/globalinformation.cpp deleted file mode 100644 index a05db1e..0000000 --- a/util/install/win/globalinformation.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "globalinformation.h" - -GlobalInformation::GlobalInformation() : - _qtVersionStr( QT_VERSION_STR ), - _reconfig( false ) -{ -#if defined(Q_OS_WIN32) - _sysId = Other; -#elif defined(Q_OS_MACX) - _sysId = MACX; -#else - _sysId = MingW32; -#endif -} - -GlobalInformation::~GlobalInformation() -{ -} - -void GlobalInformation::setReconfig( bool r ) -{ - _reconfig = r; -} - -bool GlobalInformation::reconfig() const -{ - return _reconfig; -} - -void GlobalInformation::setQtVersionStr( const QString& qvs ) -{ - _qtVersionStr = qvs; -} - -QString GlobalInformation::qtVersionStr() const -{ - return _qtVersionStr; -} - -#if defined(QSA) -void GlobalInformation::setQsaVersionStr( const QString& qvs ) -{ - _qsaVersionStr = qvs; -} - -QString GlobalInformation::qsaVersionStr() const -{ - return _qsaVersionStr; -} -#endif - -void GlobalInformation::setSysId( SysId s ) -{ - _sysId = s; -} - -GlobalInformation::SysId GlobalInformation::sysId() const -{ - return _sysId; -} - -QString GlobalInformation::text(Text t) const -{ - QString str; - - switch (_sysId) { - case MSVC: - if (t == IDE) - str = "Microsoft Visual Studio 6.0"; - else if (t == Mkspec) - str = "win32-msvc"; - else if (t == MakeTool) - str = "nmake.exe"; - break; - case MSVCNET: - if (t == IDE) - str = "Microsoft Visual Studio .NET"; - else if (t == Mkspec) - str = "win32-msvc.net"; - else if (t == MakeTool) - str = "nmake.exe"; - break; - case Watcom: - if (t == Mkspec) - str = "win32-watcom"; - else if (t == MakeTool) - str = "wmake.exe"; - break; - case Intel: - if (t == Mkspec) - str = "win32-icc"; - else if (t == MakeTool) - str = "nmake.exe"; - break; - case GCC: - if (t == Mkspec) - str = "win32-g++"; - else if (t == MakeTool) - str = "gmake.exe"; - break; - case MACX: - if (t == Mkspec) - str = "mac-g++"; - else if (t == MakeTool) - str = "make"; - break; - case MinGW: - if (t == Mkspec) - str = "win32-g++"; - else if (t == MakeTool) - str = "mingw32-make.exe"; - break; - case Borland: - if (t == Mkspec) - str = "win32-borland"; - else if (t == MakeTool) - str = "make.exe"; - break; - default: - if (t == Mkspec) - str = "Custom"; - else if (t == MakeTool) - str = "make.exe"; - break; - } - - return str; -} diff --git a/util/install/win/globalinformation.h b/util/install/win/globalinformation.h deleted file mode 100644 index 843dac6..0000000 --- a/util/install/win/globalinformation.h +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef GLOBALINFORMATION_H -#define GLOBALINFORMATION_H -#include - -class GlobalInformation -{ -public: - GlobalInformation(); - ~GlobalInformation(); - - void setReconfig( bool ); - bool reconfig() const; - void setQtVersionStr( const QString& ); - QString qtVersionStr() const; -#if defined(QSA) - void setQsaVersionStr( const QString& ); - QString qsaVersionStr() const; -#endif - - enum SysId { - MSVCNET = 0, - MSVC = 1, - Borland = 2, - MinGW = 3, - Other = 4, - Watcom = 5, - Intel = 6, - GCC = 7, - MACX = 8 - }; - void setSysId( SysId ); - SysId sysId() const; - - enum Text { - MakeTool, - IDE, - Mkspec - }; - - QString text(Text t) const; - -private: - bool _reconfig; - QString _qtVersionStr; -#if defined(QSA) - QString _qsaVersionStr; -#endif - SysId _sysId; -}; - -extern GlobalInformation globalInformation; - -#endif // GLOBALINFORMATION_H diff --git a/util/install/win/install-edu.rc b/util/install/win/install-edu.rc deleted file mode 100644 index 3e50c1c..0000000 --- a/util/install/win/install-edu.rc +++ /dev/null @@ -1,3 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "install.ico" -LICENSE RCDATA "../../../dist/edu/LICENSE" -QT_ARQ RCDATA "qt.arq" diff --git a/util/install/win/install-eval.rc b/util/install/win/install-eval.rc deleted file mode 100644 index 78f0477..0000000 --- a/util/install/win/install-eval.rc +++ /dev/null @@ -1,3 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "install.ico" -LICENSE RCDATA "../../../dist/trial/LICENSE" -QT_ARQ RCDATA "qt.arq" diff --git a/util/install/win/install-noncommercial.rc b/util/install/win/install-noncommercial.rc deleted file mode 100644 index b7d5b7c..0000000 --- a/util/install/win/install-noncommercial.rc +++ /dev/null @@ -1,4 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "install.ico" -LICENSE RCDATA "../../../dist/noncommercial/LICENSE" -LICENSE-US RCDATA "../../../dist/noncommercial/LICENSE-US" -QT_ARQ RCDATA "qt.arq" diff --git a/util/install/win/install-qsa.rc b/util/install/win/install-qsa.rc deleted file mode 100644 index f971c3f..0000000 --- a/util/install/win/install-qsa.rc +++ /dev/null @@ -1,5 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "install.ico" -LICENSE RCDATA "../../../dist/trial/LICENSE" -LICENSE_QSA RCDATA "../../../../qsa/dist/eval/LICENSE.EVAL" -QT_ARQ RCDATA "qt.arq" -QSA_ARQ RCDATA "qt.arq" diff --git a/util/install/win/install.ico b/util/install/win/install.ico deleted file mode 100644 index b996fb7..0000000 Binary files a/util/install/win/install.ico and /dev/null differ diff --git a/util/install/win/install.rc b/util/install/win/install.rc deleted file mode 100644 index 321c245..0000000 --- a/util/install/win/install.rc +++ /dev/null @@ -1,4 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "install.ico" -LICENSE RCDATA "../../../dist/commercial/LICENSE" -LICENSE-US RCDATA "../../../dist/commercial/LICENSE-US" -QT_ARQ RCDATA "qt.arq" diff --git a/util/install/win/main.cpp b/util/install/win/main.cpp deleted file mode 100644 index 0c21523..0000000 --- a/util/install/win/main.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include -#include -#include "setupwizardimpl.h" -#include "resource.h" -#include "globalinformation.h" -#include "environment.h" - -#if defined Q_OS_WIN32 -#include "archive.h" -#endif - -GlobalInformation globalInformation; -SetupWizardImpl *wizard = 0; - -int main( int argc, char** argv ) -{ - QApplication app( argc, argv ); - int res( -1 ); - - for( int i = 0; i < app.argc(); i++ ) { - if( QString( app.argv()[i] ) == "-reconfig" ) { - globalInformation.setReconfig( true ); - - QString qmakespec = QEnvironment::getEnv( "QMAKESPEC" ); - for (int mks = 0; mks <= GlobalInformation::MACX; ++mks) { - if (globalInformation.text(GlobalInformation::Mkspec) == qmakespec) { - globalInformation.setSysId((GlobalInformation::SysId)mks); - break; - } - } - - if ( ++i < app.argc() ) { - globalInformation.setQtVersionStr( app.argv()[i] ); - } - break; -#if defined(Q_OS_WIN32) - } else if ( QString( app.argv()[i] ) == "-add-archive" ) { - // -add-archive is an internal option to add the - // binary resource QT_ARQ - if ( ++i < app.argc() ) { - if ( addArchive( app.argv()[i] ) ) - return 0; - } - return res; -#endif - } - } - - wizard = new SetupWizardImpl( 0, 0, false, Qt::WStyle_NormalBorder | Qt::WStyle_Customize | Qt::WStyle_MinMax | Qt::WStyle_SysMenu | Qt::WStyle_Title ); - wizard->show(); - - app.setMainWidget( wizard ); - res = app.exec(); - - wizard->stopProcesses(); - - //### memory leak - - return res; -} diff --git a/util/install/win/pages/buildpage.ui b/util/install/win/pages/buildpage.ui deleted file mode 100644 index 0ab4965..0000000 --- a/util/install/win/pages/buildpage.ui +++ /dev/null @@ -1,92 +0,0 @@ - -BuildPage - - - BuildPage - - - - 0 - 0 - 462 - 276 - - - - Form11 - - - - unnamed - - - 11 - - - 6 - - - - layout13 - - - - unnamed - - - - outputDisplay - - - - Courier - - - - AlwaysOn - - - AlwaysOn - - - LogText - - - NoWrap - - - AutoNone - - - - - layout12 - - - - unnamed - - - - compileProgress - - - false - - - - - restartBuild - - - <Replace> - - - - - - - - - - diff --git a/util/install/win/pages/configpage.ui b/util/install/win/pages/configpage.ui deleted file mode 100644 index 8223d8e..0000000 --- a/util/install/win/pages/configpage.ui +++ /dev/null @@ -1,474 +0,0 @@ - -ConfigPage - - - ConfigPage - - - - 0 - 0 - 460 - 284 - - - - Form9 - - - - unnamed - - - 11 - - - 6 - - - - Layout3 - - - - unnamed - - - 0 - - - 6 - - - - rebuildInstallation - - - Rebuild Qt after reconfiguration - - - true - - - - - explainOption - - - - 5 - 5 - 0 - 0 - - - - - 200 - 0 - - - - - - - 0 - 0 - 0 - - - 212 - 208 - 200 - - - 255 - 255 - 255 - - - 233 - 231 - 227 - - - 106 - 104 - 100 - - - 141 - 138 - 133 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 212 - 208 - 200 - - - 212 - 208 - 200 - - - 0 - 0 - 0 - - - 10 - 36 - 106 - - - 255 - 255 - 255 - - - 0 - 0 - 255 - - - 255 - 0 - 255 - - - - - 128 - 128 - 128 - - - 212 - 208 - 200 - - - 255 - 255 - 255 - - - 243 - 239 - 230 - - - 106 - 104 - 100 - - - 141 - 138 - 133 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 128 - 128 - 128 - - - 212 - 208 - 200 - - - 212 - 208 - 200 - - - 0 - 0 - 0 - - - 10 - 36 - 106 - - - 255 - 255 - 255 - - - 0 - 0 - 255 - - - 255 - 0 - 255 - - - - - 0 - 0 - 0 - - - 212 - 208 - 200 - - - 255 - 255 - 255 - - - 243 - 239 - 230 - - - 106 - 104 - 100 - - - 141 - 138 - 133 - - - 0 - 0 - 0 - - - 255 - 255 - 255 - - - 0 - 0 - 0 - - - 212 - 208 - 200 - - - 212 - 208 - 200 - - - 0 - 0 - 0 - - - 10 - 36 - 106 - - - 255 - 255 - 255 - - - 0 - 0 - 255 - - - 255 - 0 - 255 - - - - - - - - currentInstLabel - - - Active Qt installation - - - - - currentInstallation - - - - 7 - 1 - 0 - 0 - - - - StyledPanel - - - Sunken - - - - - - - - configTabs - - - - installTab - - - Install - - - - unnamed - - - 11 - - - 6 - - - - - Installation options - - - true - - - false - - - - installList - - - - - - - generalTab - - - General - - - - unnamed - - - 11 - - - 6 - - - - - Qt Library configuration - - - true - - - false - - - - configList - - - - - - - advancedTab - - - Advanced - - - - unnamed - - - 11 - - - 6 - - - - - Advanced options - - - true - - - true - - - - advancedList - - - - - - - - - - - configTabs - configList - explainOption - rebuildInstallation - advancedList - - - diff --git a/util/install/win/pages/finishpage.ui b/util/install/win/pages/finishpage.ui deleted file mode 100644 index de6b5f7..0000000 --- a/util/install/win/pages/finishpage.ui +++ /dev/null @@ -1,63 +0,0 @@ - -FinishPage - - - FinishPage - - - - 0 - 0 - 444 - 284 - - - - Form12 - - - - unnamed - - - 11 - - - 6 - - - - Layout1 - - - - unnamed - - - 0 - - - 6 - - - - finishText - - - - - showReadmeCheck - - - Show README file - - - true - - - - - - - - diff --git a/util/install/win/pages/folderspage.ui b/util/install/win/pages/folderspage.ui deleted file mode 100644 index ada15f7..0000000 --- a/util/install/win/pages/folderspage.ui +++ /dev/null @@ -1,259 +0,0 @@ - -FoldersPage - - - FoldersPage - - - - 0 - 0 - 443 - 284 - - - - Form8 - - - - unnamed - - - 11 - - - 6 - - - - Layout15 - - - - unnamed - - - 0 - - - 6 - - - - folderBox - - - Folders and paths - - - - unnamed - - - 11 - - - 6 - - - - folderLabel - - - Program &folder - - - folderPath - - - - - Layout2 - - - - unnamed - - - 0 - - - 6 - - - - folderPath - - - StyledPanel - - - Sunken - - - - - folderPathButton - - - - - - image0 - - - - - - - qtDirLabel - - - Set &QTDIR - - - qtDirCheck - - - - - devSysLabel - - - - 5 - 1 - 0 - 0 - - - - &Path - - - devSysPath - - - - - Layout3 - - - - unnamed - - - 0 - - - 6 - - - - devSysPath - - - - - devSysPathButton - - - - - - image0 - - - - - - - groupLabel - - - Folder &group - - - folderGroups - - - - - folderGroups - - - - 7 - 0 - 0 - 0 - - - - - - qtDirCheck - - - - - - true - - - - - Spacer8 - - - Horizontal - - - Expanding - - - - 20 - 20 - - - - - - - - Spacer2 - - - Vertical - - - Expanding - - - - 20 - 20 - - - - - - - - - - 789c5d8ecb0a02310c45f7fd8ad0ec069907f531207e82e252101769b5388b51d07121e2bf6b1f195b6f28cd3d24b7ad0ad86dd75054e23ed0d0193067ba41717cf4fd737f58bd846ce6d028984123274296606073bd9c5c8fdf1eeba92b678db36dddaa60c959abec2258cdd62a9fc3424477a50cfdc18cc5d9c0e20eaffbbf90260c2a390f35c54a1823fa9bc39fc63cc3429e4b51cccb5060398a6c5478f7bd141fb90a5251 - - - - folderPath - folderPathButton - qtDirCheck - devSysPath - devSysPathButton - folderGroups - - - diff --git a/util/install/win/pages/licenseagreementpage.ui b/util/install/win/pages/licenseagreementpage.ui deleted file mode 100644 index 5349e1f..0000000 --- a/util/install/win/pages/licenseagreementpage.ui +++ /dev/null @@ -1,202 +0,0 @@ - -LicenseAgreementPage - - - LicenseAgreementPage - - - - 0 - 0 - 440 - 284 - - - - Form3 - - - - unnamed - - - 11 - - - 6 - - - - layout4 - - - - unnamed - - - - countryLayout - - - - unnamed - - - - spacer4 - - - Horizontal - - - Expanding - - - - 31 - 21 - - - - - - countryLabel - - - Please choose your region: - - - - - - North or South America - - - - - Anywhere outside North and South America - - - - countryCombo - - - - - spacer3 - - - Horizontal - - - Expanding - - - - 51 - 21 - - - - - - - - introText - - - The license could not be found in the package. The package might be corrupted. -Please contact support@trolltech.com to resolve the problem. - - - - - Layout3 - - - - unnamed - - - 0 - - - 6 - - - - Spacer1_3 - - - Horizontal - - - Expanding - - - - 156 - 20 - - - - - - licenceButtons - - - NoFrame - - - - - - - unnamed - - - - acceptLicense - - - I agree - - - - - rejectLicense - - - I disagree - - - true - - - - - - - Spacer3 - - - Horizontal - - - Expanding - - - - 155 - 20 - - - - - - - - - - - diff --git a/util/install/win/pages/licensepage.ui b/util/install/win/pages/licensepage.ui deleted file mode 100644 index 9c7b98c..0000000 --- a/util/install/win/pages/licensepage.ui +++ /dev/null @@ -1,264 +0,0 @@ - -LicensePage - - - LicensePage - - - - 0 - 0 - 445 - 284 - - - - Form2 - - - - unnamed - - - 11 - - - 6 - - - - Layout6 - - - - unnamed - - - 0 - - - 6 - - - - licenseeLabel - - - Licensee - - - - - expiryLabel - - - Support and upgrade expiry - - - - - expiryDate - - - - 7 - 0 - 0 - 0 - - - - - - licenseID - - - - 7 - 0 - 0 - 0 - - - - - - customerIDLabel - - - Customer ID - - - - - key - - - - 7 - 0 - 0 - 0 - - - - - - productsLabel - - - Products - - - productsString - - - - - licenseeName - - - - 7 - 0 - 0 - 0 - - - - - - licenseInfoHeader - - - - 7 - 1 - 0 - 0 - - - - Enter the supplied license information here, all fields except Licensee are mandatory. -Alternatively, the installation wizard may read them from a license file. - - - WordBreak|AlignVCenter - - - - - - qt-professional - - - - - qt-enterprise - - - - productsString - - - - - Spacer7 - - - Vertical - - - Expanding - - - - - licenseIDLabel - - - License ID - - - - - Layout5 - - - - unnamed - - - 0 - - - 6 - - - - Spacer5 - - - Horizontal - - - Expanding - - - - - readLicenseButton - - - Read from file... - - - - - Spacer6 - - - Horizontal - - - Expanding - - - - - - - customerID - - - - 7 - 0 - 0 - 0 - - - - - - keyLabel - - - Product key - - - - - - - - customerID - licenseID - licenseeName - productsString - expiryDate - key - readLicenseButton - - - diff --git a/util/install/win/pages/optionspage.ui b/util/install/win/pages/optionspage.ui deleted file mode 100644 index 01033d2..0000000 --- a/util/install/win/pages/optionspage.ui +++ /dev/null @@ -1,503 +0,0 @@ - -OptionsPage - - - OptionsPage - - - - 0 - 0 - 413 - 372 - - - - Form7 - - - - unnamed - - - 11 - - - 6 - - - - layout8 - - - - unnamed - - - - optionsGroup - - - Installation options - - - - unnamed - - - 11 - - - 6 - - - - pathLabel - - - Destination &path (appr. 1Gb free space required) - - - installPath - - - - - pathLayout - - - - unnamed - - - 0 - - - 6 - - - - installPath - - - LineEditPanel - - - Sunken - - - - - installPathButton - - - - - - image0 - - - - - - - installExamples - - - Build &Examples - - - Alt+E - - - true - - - - - installTools - - - Build &Tools - - - true - - - - - installExtensions - - - Build E&xtensions - - - true - - - - - installTutorials - - - Build T&utorials - - - Alt+U - - - true - - - - - skipBuild - - - &Skip Build Step - - - Alt+S - - - - - installDocs - - - Install &documentation - - - Alt+D - - - true - - - - - - - sysGroup - - - Compiler options - - - - unnamed - - - 11 - - - 6 - - - - layout13 - - - - unnamed - - - - installIDEIntegration - - - false - - - &Integrate with IDE - - - - - - true - - - 99 - - - - - spacer7_2 - - - Vertical - - - Expanding - - - - 40 - 40 - - - - - - - - layout21 - - - - unnamed - - - - layout20 - - - - unnamed - - - - sysOther - - - - 0 - 0 - 0 - 0 - - - - Other - - - 4 - - - - - - win32-watcom - - - - sysOtherCombo - - - false - - - - 5 - 0 - 0 - 0 - - - - false - - - - - spacer9 - - - Horizontal - - - Expanding - - - - 121 - 21 - - - - - - - - noteLabel - - - Note: The compilers specified in the 'Other' section are not officially supported. - - - - - - - layout7 - - - - unnamed - - - - sysMsvcNet - - - Microsoft Visual C++ .&NET - - - Alt+N - - - 0 - - - - - sysMsvc - - - Microsoft &Visual C++ - - - Alt+V - - - 1 - - - - - sysBorland - - - &Borland C++ - - - Alt+V - - - 2 - - - - - sysMinGW - - - MinGW32 - - - 3 - - - - - sysIntel - - - Intel C++ - - - 6 - - - - - - - - - - spacer6 - - - Vertical - - - Expanding - - - - 20 - 64 - - - - - - - - - - 789c5d8ec10ac2300c86ef7d8ad0dc8a6cad4e3b101f41f1288887b43ae6610a3a0f22bebb766de6e65f4af27f247f9b2bd86dd7a072716fa93d7bf035dd401d1f4df3dc1f562f21cd02cc0ce660e444c80c3c6cae9753e8f1dba3d6bad03a581f6c5994d36829d8ca56365ac7b6b25d0e0b11431932ec2e8e589a8d2cedf07af71772845119e7a1a374068c11fdcde14f7d9e6721cf0d51ca1ba1c8c628b15ef1ddf7527c00b6995250 - - - - - sysOther - toggled(bool) - sysOtherCombo - setEnabled(bool) - - - sysBorland - toggled(bool) - installIDEIntegration - setDisabled(bool) - - - sysMsvcNet - toggled(bool) - installIDEIntegration - setEnabled(bool) - - - sysMsvc - toggled(bool) - installIDEIntegration - setEnabled(bool) - - - sysOther - toggled(bool) - installIDEIntegration - setDisabled(bool) - - - sysMinGW - toggled(bool) - installIDEIntegration - setDisabled(bool) - - - sysIntel - toggled(bool) - installIDEIntegration - setEnabled(bool) - - - skipBuild - toggled(bool) - installTools - setDisabled(bool) - - - skipBuild - toggled(bool) - installTutorials - setDisabled(bool) - - - skipBuild - toggled(bool) - installExtensions - setDisabled(bool) - - - skipBuild - toggled(bool) - installExamples - setDisabled(bool) - - - - diff --git a/util/install/win/pages/pages.cpp b/util/install/win/pages/pages.cpp deleted file mode 100644 index 3ee4093..0000000 --- a/util/install/win/pages/pages.cpp +++ /dev/null @@ -1,349 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "pages.h" -#include "resource.h" -#include "../environment.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(Q_OS_WIN32) -#include -#endif - -extern SetupWizardImpl *wizard; - -BuildPageImpl::BuildPageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : BuildPage( parent, name, fl ) -{ -} - -ConfigPageImpl::ConfigPageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : ConfigPage( parent, name, fl ) -{ - if( globalInformation.reconfig() ) { - currentInstLabel->show(); - currentInstallation->show(); -#if defined(Q_OS_WIN32) - // Makes no sense to have the rebuild installation option on DOS based - // Windows - if ( qWinVersion() & WV_NT_based ) -#endif - rebuildInstallation->show(); -#if defined(Q_OS_WIN32) - else { - rebuildInstallation->setChecked( false ); - rebuildInstallation->hide(); - } -#endif - } else { - currentInstLabel->hide(); - currentInstallation->hide(); - rebuildInstallation->hide(); - } -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - // ### these pages should probably be included but all options should be - // disabled so that the evaluation customer can see how he can configure Qt - configTabs->removePage( generalTab ); - configTabs->removePage( advancedTab ); -#else - configTabs->removePage( installTab ); -#endif -} - -FinishPageImpl::FinishPageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : FinishPage( parent, name, fl ) -{ -#if !defined(Q_OS_WIN32) - showReadmeCheck->hide(); -#endif -} - -FoldersPageImpl::FoldersPageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : FoldersPage( parent, name, fl ) -{ -#if defined(Q_OS_WIN32) - QByteArray buffer( 256 ); - unsigned long buffSize( buffer.size() ); - GetUserNameA( buffer.data(), &buffSize ); - folderGroups->insertItem( "Anyone who uses this computer (all users)" ); - folderGroups->insertItem( QString( "Only for me (" ) + QString( buffer.data() ) + ")" ); -#if defined(QSA) - folderPath->setText( QString( "QSA " ) + globalInformation.qsaVersionStr() ); -#else - folderPath->setText( QString( "Qt " ) + globalInformation.qtVersionStr() ); -#endif - if( qWinVersion() & Qt::WV_NT_based ) // On NT we also have a common folder - folderGroups->setEnabled( true ); - else - folderGroups->setDisabled( true ); -#elif defined(Q_OS_UNIX) - folderGroups->setDisabled( true ); -#endif -} - -LicenseAgreementPageImpl::LicenseAgreementPageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : LicenseAgreementPage( parent, name, fl ), - titleStr("License agreement") -{ -#if !defined(NON_COMMERCIAL) - countryLabel->hide(); - countryCombo->hide(); - delete countryLayout; -#else - connect( countryCombo, SIGNAL(activated(int)), SLOT(countryChanged(int)) ); -#endif - connect( licenceButtons, SIGNAL(clicked(int)), SLOT(licenseAction(int))); -} - -void LicenseAgreementPageImpl::licenseAction(int act) -{ - if( act ) - wizard->setNextEnabled( this, false ); - else - wizard->setNextEnabled( this, true ); -} - -void LicenseAgreementPageImpl::countryChanged(int index) -{ - ResourceLoader *rcLoader; - if ( index == 0 ) - rcLoader = new ResourceLoader( "LICENSE-US" ); - else - rcLoader = new ResourceLoader( "LICENSE" ); - - if ( rcLoader->isValid() ) { - introText->setText( rcLoader->data() ); - } else { - QMessageBox::critical( this, tr("Package corrupted"), - tr("Could not find the LICENSE file in the package.\nThe package might be corrupted.") ); - } -} - -LicensePageImpl::LicensePageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : LicensePage( parent, name, fl ) -{ -#if defined(Q_OS_MAC) - // StyledPanel style looks very windowsish - customerID->setFrameShape( QFrame::LineEditPanel ); -#endif - customerID->setFocus(); -#if defined(EVAL) - // ### improve text -# if defined(QSA) - licenseInfoHeader->setText( tr("Thank you for your interest in QSA.\n" - "Please enter the license information you got for this evaluation version of QSA.") ); -# else - licenseInfoHeader->setText( tr("Thank you for your interest in Qt.\n" - "Please enter the license information you got for this evaluation version of Qt.") ); -# endif - - customerIDLabel->setText( tr("Name") ); - licenseIDLabel->setText( tr("Company name") ); - licenseeLabel->setText( tr("Serial number") ); - evalName = customerID; - evalCompany = licenseID; - serialNumber = licenseeName; - - expiryLabel->hide(); - expiryDate->hide(); - productsLabel->hide(); - productsString->hide(); - keyLabel->hide(); - key->hide(); - readLicenseButton->hide(); -#elif defined(EDU) - licenseInfoHeader->setText( tr("Please enter the license information for the educational edition of Qt.") ); - - customerIDLabel->setText( tr("Educational institution") ); - licenseeLabel->setText( tr("Serial number") ); - university = customerID; - serialNumber = licenseeName; - - licenseIDLabel->hide(); - licenseID->hide(); - expiryLabel->hide(); - expiryDate->hide(); - productsLabel->hide(); - productsString->hide(); - keyLabel->hide(); - key->hide(); - readLicenseButton->hide(); -#else - licenseID->setValidator( new QIntValidator( -1, 9999999, licenseID ) ); - - // expiryDate and productsString comes from the license key - expiryDate->setEnabled( false ); - productsString->setEnabled( false ); - keyLabel->setText( tr("License key") ); - licenseInfoHeader->setText( tr("Please enter your license information.\n" - "The License key is required to be able to proceed with the installation process.") ); -#endif -} - -QValidator::State InstallPathValidator::validate( QString& input, int& ) const -{ - if ( ( globalInformation.sysId() == GlobalInformation::MSVC || - globalInformation.sysId() == GlobalInformation::MSVCNET ) - && input.contains( QRegExp("\\s") ) ) { - QMessageBox::warning( 0, "Invalid directory", "No whitespace is allowed in the directory name due to a limitation with MSVC" ); - return Intermediate; - } else if ( globalInformation.sysId() == GlobalInformation::Borland && input.contains( "-" ) ) { - QMessageBox::warning( 0, "Invalid directory", "No '-' characters are allowed in the directory name due to a limitation in the " - "Borland linker" ); - return Intermediate; - } - return Acceptable; -} - -OptionsPageImpl::OptionsPageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : OptionsPage( parent, name, fl ), - titleStr("Options"), - shortTitleStr("Choose options") -{ - connect( installPathButton, SIGNAL(clicked()), SLOT(choosePath())); - sysGroup->setButton(globalInformation.sysId()); -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - sysOther->hide(); - sysOtherCombo->hide(); - noteLabel->hide(); -#endif -#if defined(Q_OS_WIN32) - installPath->setText( - QString( "C:\\Qt\\" ) + - QString( globalInformation.qtVersionStr() ).replace( QRegExp("\\s"), "" ).replace( QRegExp("-"), "" ) - ); - installPath->setValidator( new InstallPathValidator( this ) ); -#elif defined(Q_OS_MAC) - // ### the replace for Windows is done because qmake has problems with - // spaces and Borland has problems with "-" in the filenames -- I don't - // think that there is a need for this on Mac (rms) - QString base("QtMac-"); - base = QDir::homeDirPath() + QDir::separator() + base; -#if defined(EVAL) - base += "Eval-"; -#elif defined(EDU) - base += "Edu-"; -#endif - installPath->setText(base + QString( globalInformation.qtVersionStr() ).replace( QRegExp("\\s"), "" )); - sysGroup->hide(); -#endif -} - -void OptionsPageImpl::choosePath() -{ - QDir dir( installPath->text() ); - -#if defined(Q_OS_WIN32) - if( !dir.exists() ) { -# if defined(QSA) - dir.setPath( "C:\\Qt_QSA" ); -# else - dir.setPath( "C:\\Qt" ); -#endif - } - - QString dest = QFileDialog::getExistingDirectory( installPath->text(), this, NULL, "Select installation directory" ); - if ( dest.isNull() ) { -# if defined(QSA) - dest = "C:\\Qt_QSA"; -# else - dest = "C:\\Qt"; -# endif - } - if ( dest.right(1) == "\\" ) { -# if defined(QSA) - dest += "Qt_QSA"; -# else - dest += "Qt"; -# endif - } - if ( dest.contains( QRegExp( "\\s" ) ) && !sysBorland->isChecked() ) - QMessageBox::warning( 0, "Invalid directory", "No whitespace is allowed in the directory name due to a limitation with MSVC" ); - else if ( dest.contains( "-" ) && sysBorland->isChecked() ) - QMessageBox::warning( 0, "Invalid directory", "No '-' characters are allowed in the directory name due to a limitation with the Borland linker" ); - else { - dir.setPath( dest ); - installPath->setText( QDir::toNativeSeparators(dir.absPath()) ); - } -#elif defined(Q_OS_MAC) - if( !dir.exists() ) - dir.setPath( "/" ); - - QString dest = QFileDialog::getExistingDirectory( installPath->text(), this, NULL, "Select installation directory" ); - if (!dest.isNull()) - installPath->setText( dest ); -#endif -} - -ProgressPageImpl::ProgressPageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : ProgressPage( parent, name, fl ) -{ - // ######### At the moment, we show only one line when unpacking. So the - // horizontal scrollbar is never shown for now to avoid flickering. - filesDisplay->setHScrollBarMode( QScrollView::AlwaysOff ); -} - -#if defined(Q_OS_WIN32) -WinIntroPageImpl::WinIntroPageImpl( QWidget* parent, const char* name, WindowFlags fl ) - : WinIntroPage( parent, name, fl ) -{ -#if defined(QSA) - textBrowser->setText( "

This program installs Qt and QSA.

" + textBrowser->text() ); -#else - textBrowser->setText( "

This program installs Qt.

" + textBrowser->text() ); -#endif -} -#endif diff --git a/util/install/win/pages/pages.h b/util/install/win/pages/pages.h deleted file mode 100644 index 8108f42..0000000 --- a/util/install/win/pages/pages.h +++ /dev/null @@ -1,226 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef PAGES_H -#define PAGES_H - -#include - -#include "buildpage.h" -#include "configpage.h" -#include "finishpage.h" -#include "folderspage.h" -#include "licenseagreementpage.h" -#include "licensepage.h" -#include "optionspage.h" -#include "progresspage.h" -#include "winintropage.h" -#include "../globalinformation.h" - -class Page -{ -public: - virtual QString title() const = 0; - virtual QString shortTitle() const = 0; -}; - -class BuildPageImpl : public BuildPage, public Page -{ - Q_OBJECT -public: - BuildPageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~BuildPageImpl() {} - QString title() const - { -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - return "Building Qt Examples and Tutorial"; -#else - return "Building Qt"; -#endif - } - QString shortTitle() const - { -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - return "Build Qt Examples"; -#else - return "Build Qt"; -#endif - } -}; - -class ConfigPageImpl : public ConfigPage, public Page -{ - Q_OBJECT -public: - ConfigPageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~ConfigPageImpl() {} - QString title() const - { - if( globalInformation.reconfig() ) - return "Reconfigure Qt"; - else - return "Configuration"; - } - QString shortTitle() const - { return "Configure Qt"; } -}; - -class FinishPageImpl : public FinishPage, public Page -{ - Q_OBJECT -public: - FinishPageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~FinishPageImpl() {} - QString title() const - { return "Finished"; } - QString shortTitle() const - { return "Finish"; } -}; - -class FoldersPageImpl : public FoldersPage, public Page -{ - Q_OBJECT -public: - FoldersPageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~FoldersPageImpl() {} - QString title() const - { return "Folders"; } - QString shortTitle() const - { return "Choose folders"; } -}; - -class LicenseAgreementPageImpl : public LicenseAgreementPage, public Page -{ - Q_OBJECT -public: - LicenseAgreementPageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~LicenseAgreementPageImpl() {} - QString title() const - { return titleStr; } - QString shortTitle() const - { return titleStr; } - -private slots: - void licenseAction(int); - void countryChanged(int); - -public: - QString titleStr; -}; - -class LicensePageImpl : public LicensePage, public Page -{ - Q_OBJECT -public: - LicensePageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~LicensePageImpl() {} - QString title() const - { -#if defined(QSA) - return QString("License Information to Install QSA %1").arg(globalInformation.qsaVersionStr()); -#else - return QString("License Information to Install Qt %1").arg(globalInformation.qtVersionStr()); -#endif - } - QString shortTitle() const - { return "License information"; } - -#if defined(EVAL) - QLineEdit* evalName; - QLineEdit* evalCompany; - QLineEdit* serialNumber; -#elif defined(EDU) - QLineEdit* university; - QLineEdit* serialNumber; -#endif -}; - -class InstallPathValidator : public QValidator -{ -public: - InstallPathValidator( QObject* parent = 0, const char* name = 0 ) : QValidator( parent, name ) {} - ~InstallPathValidator() {} - QValidator::State validate( QString& input, int& ) const; -}; - -class OptionsPageImpl : public OptionsPage, public Page -{ - Q_OBJECT -public: - OptionsPageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~OptionsPageImpl() {} - QString title() const - { return titleStr; } - QString shortTitle() const - { return shortTitleStr; } - -private slots: - void choosePath(); - -public: - QString titleStr; - QString shortTitleStr; -}; - -class ProgressPageImpl : public ProgressPage, public Page -{ - Q_OBJECT -public: - ProgressPageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~ProgressPageImpl() {} - QString title() const - { return "Installing"; } - QString shortTitle() const - { return "Install files"; } -}; - -class WinIntroPageImpl : public WinIntroPage, public Page -{ - Q_OBJECT -public: - WinIntroPageImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~WinIntroPageImpl() {} - QString title() const - { return "Introduction"; } - QString shortTitle() const - { return "Introduction"; } -}; - -#endif // PAGES_H diff --git a/util/install/win/pages/progresspage.ui b/util/install/win/pages/progresspage.ui deleted file mode 100644 index 927d975..0000000 --- a/util/install/win/pages/progresspage.ui +++ /dev/null @@ -1,78 +0,0 @@ - -ProgressPage - - - ProgressPage - - - - 0 - 0 - 440 - 286 - - - - Form10 - - - - unnamed - - - 11 - - - 6 - - - - layout2 - - - - unnamed - - - - filesDisplay - - - AlwaysOn - - - AlwaysOff - - - LogText - - - false - - - NoWrap - - - 0 - - - AutoNone - - - - - operationProgress - - - false - - - false - - - - - - - - diff --git a/util/install/win/pages/sidedecoration.ui b/util/install/win/pages/sidedecoration.ui deleted file mode 100644 index 1ea5761..0000000 --- a/util/install/win/pages/sidedecoration.ui +++ /dev/null @@ -1,108 +0,0 @@ - -SideDecoration - - - SideDecoration - - - - 0 - 0 - 122 - 156 - - - - Form1 - - - - unnamed - - - 11 - - - 6 - - - - logoPixmap - - - - 0 - 0 - 0 - 0 - - - - image0 - - - false - - - AlignTop - - - - - - - Layout1 - - - - unnamed - - - 0 - - - 0 - - - - versionLabel - - - - 1 - 0 - 0 - 0 - - - - Installing Qt - - - - - editionLabel - - - - 1 - 0 - 0 - 0 - - - - (Clear me) - - - - - - - - - 789cccbd47b7eb38b2ef397f9fa2d6e5ecae5e7cf266d0035266cb6da7ed77af1ed07b2f1aa9bf7c83883f704c56d5cd7c75bb5f95d6c9ca5f8a22114044202200f0fccffffcdbe7d3fddffef37ffe8fea625c02eb6f966f947ffb4fbb4e92ebfff57fff9fffcffff88fe160f0b7fecf68389bfe6df41fffc7fff80febf96fd6df9401ff5fcff64232ffde36244f7a762ac953fefd56f29cf35cf2a267f3072ff9f733c906e7836493f35eb2c59fd74ab6797b1f243bfcfb46b2cb7fef0a1e72799c5af2907f7f94cce5732cc963fefd483297cf3a8387d43f992999ffde0c25f3dfb79a64de5f662099dfcfe924cf386f24f3fe4a44ff0fd17e5b327f9e772799dfcfb8078fa87d662499cbebbb9249de6fc9bcbd9d2f99dab795ccc7b31a48e6e3b71a4ae6e315ed25f3f1b04f82a93f0dc1636a9ff32999daf32599f757a54ae6fde17e48e6fae23892b97e78a2bd63ea1f438cef849e97e892f9f7652b99b76f3d91cce53763f0947e6f08fd9c1137b664de5e43c83fc7f53bf0022cf475499c8be719c4f113d824de5cc01671fd0eb6895dbaff50d8ab174ae6f2ad3ac9a47f63c924df4832d73f732a99f777f324998fb73993ccfb5f7f96ccc7df3a49e6e3514592b9bd3aa664ae1fd6bd646eaf9a2b98f4ddf52573fdb58e60d89f6d49e6df9b13c97c3c1d45326fbf634826ffb2934cfee40086fdf88164de7ff65232d9eb9b646e1fa607867e9bbe641a8f816092cf14f2423f4d070c7d8b9f25f3e7bbaf60e89fb791ccfb3b15df43ffe22f30f42f13f240ffea1b18fab716bf877ee967b043dc92bf1f0ea16fdd9af3a8f740bc3dbe64f2f70bc9bcbfcd2fc9bcbfbd4432f90b4730f5cff55e3297bfc9c0187f732899f4772099c6e35b321f7f6b0fc6f8daa6649aff7692f9f3724d32d7f7cb4932ef6ffb4e32e9b302c6f86723c9dcdefc50326f9ff32e99f7975382a10fd75c32d7e795906742fdd3bd49e6df67a2bdd09ff20886beb89164fefcd54932ef9ffa2c98fca72bda0b7d6a9f25f3feb0c4f842bf9a07b0d02fd13fd0afe2090cffd6c660e85b24ae87be05a40f63e1df8277c9bc7debab643e5e575732efef6e2799cb1bfcf89ecbdbed2573fd5cfd781e1fcf952d98fa3b91cf277f74cd24f3fe0f3ec08807ba8d64ae9fc54232e98f27993faff9f13df787ae680ff4d57995cce57103c95c7fac3bc97c7c7c5f308d67b8028bf9f72299cbd3dc49e6f2981f92797fd69664de5f7e2499dbb33b92ccdb6f2dc1d067772099fca72e99b7ff6a49a6f946f437f4b9bd48267934b0d0ef77c9bc7dad68df9cee9fee25f3fe69447fcc31df88f1843eaf6e92f9f3da89649a0fee25f3f1cb85be41ff0331bed07f5f8ca7f0a7d43f13a1df9d2a99f777f32899dfffea80111faeae92b93cee41f090f7effa0c463ce77f48a6f9ee51321fafeb4930f547bb01433fecb164fe7cff5b321f2f2f92ccfb3f93d793bd745b30f421ae2593bfd94be6fd1b2692b93cde4e32b79fda164ced8ddec1d017e74332f9dbb564de5e772899e299140c7dcaa692b93db8df92797fe61d18fe3117e303fd59b792e979b164de3f8918ff05f5cf46f40ff4c715e301fdb9bd80e13f57f792797fad4a30fce906bf17f3f51ae331c4fc19a13d43f89780e693a9f0a7ed028cebfd4e321fafe6198c7cc00b2473f9bc77c95cdf4a4ff0908fc75a5c8f78bfb52553fcf02999ebbfdf08a6f10e5ec1c2bfdc49a6f97c2b99e6ff27c9642f3fbee7fab416f2407fc299643efe912f99ec692099cbd3b492b9bc9ab8ff94c63711fd0bfdb2a792c93e2ac9140f689229df5125f3feed5660e85ffd2a99fce34432efdfee00867e5e14c9941f8ec0d0bfcc904cf9572a99b7a76e25f3fe73c760a1afaa646ebf99e85fe86f2ec61bfaea0b79e11f0ba12f2eda8bfb4b7d267b98897c64dd81a1cfeb503297afbd934cf1d45e30fc93f81ef363b896ccefbf3a4a26793dc1149fae7d30f247ff2a99ea1d3fbee7fed68b05a31eb1924cf9c2083ca5f6076bc9542fd948e6fa900e2473fdbbbc09463d630246be1a6692f9f84481643edef95532b73f5df01cfd7993ccdb7be92453beb5924cf3c14432efbf5cfc7e01fffa2999e6bfb1646e5f9b022ce2cba364de3e37114cfec132c0d047f74d32f9e37b30f26b2f05431f5763c9bc7f42c1d04797e6cf99d0c71be41fc21fa52a18fe24207d9f0bfd5a1d04d3f8570fe009d573dca3642e7fbb054f697ca237c1246f3a944cf53a5b32c5a72f60f81bd796ccaf4f2bc994af2d2593be6f2453bea682e7345eed4e32d5ff14c9bcbf2f57c95cff7dd15ef8a35097ccdb93cd25537e2bfa6b3124fffd055ec2bfcc24537c548045fe518331decda7647ebd2eda6ba37fc478c01f6d44ffb8d43e1ded17e3af3960cc97f5022cf481e257a6dd149fd96bf08cc6ffe64aa6f92604c35eec4032b7efab2799e2375b30e94b2aae5f50ff58aa642e6fe148a67ce1065e927fb80d2553bd2494cc9fdf3e49a6fc45c863c07e1dc97cfcd3a3606a5f7d05633e887682497faf4bb08df8e2030cfb2bc9de17a2ff4bf49f886762f4cf10f666bd80618f3e8dff92f5177f5e914be6ed2f36e005c91b5f24533cf22598ecafeec04be467ae64f28757b041bfaf5f040f29fe68c0268d9726da63917e14a2bdd0c7f424998f5f44fdb314fd91bf83a18f8105467fdc4660e86783e789fee94a30e215e3118c78a3a0f9dc60fd45fa34072f491fc329d8a0f685a964aae7dfc0265d5f2f05537f568f60d86bb091ccfbe36248e6fad988dfbba85f8e24533e48f66f88fe892b30fa67634ba6f97508467f6d1cb0a827435ed11f35fa6388f9c9a7f8c814f157fd065e92fe5f6e6083e42f5cb0897ac417d8227dca3fc036f55fb305431fba77c1747f3b02bba4df3ad9ab29e42f669229df46fb647fe460d8d3aa0243fecd2758d4bbefc0a21eb403a33f2a8a772c263f6fff35055ba827d1f85aa2bf2f1a58f4f70a8cfb252a18febdf1c0f02701f58f2dda7f5d48a6fe9b8071fff21d2cfc83603caf51c1b87fb106433f4b1a1f87fd17eebf1b17ec903efbd43e46b0f71a0c79cb2d58c4e72d18cf2f1bb078be0dc6f3339abf5cd11f8906c6f5de1a8cf846e3f6c1cbe724df068cf6548964ae3f1b130c7f9096608c7f7603a3bde90e8ce7bb2f60b4d77e00c39f075c9f98f639e47fa34832d7e7f84c2c9eb7ba80216ffb08c6f3cc042cd64f1a30e42f9760d88fe382d19e1ced19c11e42aebf0cf17cd306435ecb04a33d610e16f20b16f1470a16ed3981457cf9443c82bdae2660e19f79bc341c8be7d70e18cfd71ec022df8ac178feaa05e379d72bf108e3df70ff369cc8fe1d8345bc9c81d1fe60452cfaeb7a03c3be74ba7e2adbd382f1fbcb3b18e3910dc1689f4df24e657fd4603cafb2c168bffb0cc6f32b1ebf0c67e2fe01e9d34cdcef1283e12faa6f30ee67f860e1ffe660a1efdc7f0ee7e2fed58c58b6e70cc6ef8d002cd6173db0a83f2dc0d0b78edbf77021e5bd078bf6aec1f87d41fabd14f2155bb0f8fd108cdfeb2330da93de83f1fc8ac6d310f2ac1a309ed772ff3734c5fdb48d64ee0fb72e58d4e75ec0f87d7202a33f0d713df4a5237bb7e4782a60b11ee681d15eed112cee1782a1cf158f4f86b6b8bf6581c5fa2af5a733823f762d30eed7d2efdd11f2efcd1d18d76bdc5e468311f2a3c007e379f5082cea75f760e8fbfa8d782cf49dfba3d150fcbebc030b7bdc83a17f099faf472371ffe64c2ceed73460e883cefb6b3416f7ab4fc463e10f2c30e46b8927e279b94b2cee6f6cc1d087ec092cec4930c6f342f24f85fc46442caef75660e8cf85fb93d18cfd9ec783f1162ceaa37cfe19cdc5fd3ceabfb990d79d80d13eeb152cd64fe9fa85f8de7c05a33df9188cf66cbec0d0c7f50d0c7df3b8ff1f2d85bcce002ce227078ceb1d0f2cfca54e3c41fb6f74bd21ef5780f17c5d058bf53beeaf46e618ebd77a2299c77f5bba9f25c6b7f4c1c2bfbd80d19eeb07f104fda1933cb678de2603e37eba01c6ef6f57b0a8ff71ff3d72c6a8b7e8d47faee88fb507c6effd188cdf3bdc1ec67d38c739e2e3c5a63393e21723269e60fde4f22c99d677b93e307577285eb7b8fd8f27ecfe9cf50e0c7d8a79ff8ca7ec7bfefb6b412cc627db81c57e823730ead9eb1158d43fb8bce399b8fe7a0716eb5d7330c663c3fb733c67eda1fa484d2cc6c39a83a11fed193ca57a651282b13e16f3f96ebc9860bdc8d880c5fe810c2cf21bae8fe3e544d4cb23c93c5ed30a30ea071b170cff92d0f81813d443d71730eaed9a07c6f53eb7b7b1c9bee7fa117c49a6f5024b30c5b3760cb6b19ec9e3adb13331e8face93ccfbaf3883f13c23013ba8a72e05d3fd0d1b8c7c734df23b53d8df86facf9da03e7e1b80f1fc82f7e76430813e6d63e229fa3be5e333194e4cd40b52b04ded31b8fe4e4653110ff2fa0a73a736f28d9a788afd67fa180cfd6a1db0588fe3fe7f32610accfb77c3f59721f2c77c493cc5fe0aaf00e37eb731788afa4e059ed1f8361f60d48f6dde1f93d914ebc7460a46bd2fe4fd37994fc7940f6cbec1e89f98cf5f93a578def5013c433d86da6f4c51bf09b9bd4dcce982f2b39cebcbc49a22fff6b83e4dec29ea15d95932adb704c433acffebf43c776ad1fd039d7886f5d315bf3f5356f09acf77d3d1d4a5fa65734f3cc3fe035d134cf7372c30ec355b824dc413dc3fb0e9906574dcdf79c4e2f74501c6fa5b74104cdfb73c3e9d4ea6d6887f7fdb10b3e791bef1f9940ddf1ceb078fe005f5b7c5e7e3e96c86f58f8d0246fd3a76c1f311f9b377b043e31bf07c693a9fa1de19df816dec07f804bb584fa3fe5accc47a86069e517b82002cd6f775b043f39bc6e3dde9923d8eeb7332035bd47f3705ec60ff824d3cc7fecf84ebefd498c19e2faf609bfa2be6f9f0d49c2d51cff5c016e5fb2b176c8f78fb8b15d8a5fa99c9e7d7a93543fdab1b831dfafde6287844f5d10e8cf1af49bfac39c63bff024f499e98ee6fb3fb937f7d023bd4fed407bb435aafb124d37e2d5d30b53f03cf87d43eeb0d8cf5dd7803c67cb7e1f63d75587f707df1e9fece7c30a2fd5d7b30f6b3469f9269fdc792cce5594dc1587fba52ffb84c1edebecd5e326f7f41faebceb19f2cda8271bfa6133ca2e727e0118d4fb2164cfa9c2892f978af4c30eca1f1c19321d7bf2bff7e3660e34ff5e53bb043cfaf5dc174bf6c0076a97fdb929805acfcfb6d0446bdbee4ed9f0d857eddd660f89b6e2298da5f05c4ac3f687e6bc0c311ad87e07a263f9f0fda77f094da537f8067245fc5f569369a1963d29f2b31eb5fdabfe20ba6e7a777e0d188ff3eb9815906c29fa78227d04f053ca3f6b65c3f6663260fd553a93d2cfca4fec91bc95cfeea041e517f5fb8fece2662fcdd023c86ff33c1d31167cd06cf21cf5c308d679d8017d41f0df72fb3e9cc1ef3ebab14ec8c69bfc05432ed47d38885fe5d4cc9b4fe37028fc8fecb37c9649f25784cf6ebbf82e7f47dbc042fe87e05f5cf4ce8936b82e7f4fb36113ca6f17a002fe8f986b8de80fe8bef4dd28fc292cce52fa68269fc4d1effb0db2f49decd0c0c7fdc92fe2ce6131a3f6d2d98fcb7bf02cf49bf370330d68fea5a30fdde38831dfabea3fe59b2fea178b0009bd41e4f03db23aeff37713decb5f00593fc2df5a7c1ee47eb6f2330eadd17156c8ea87ff7609bfc45590b267f78d5c02e714bfa6ab2f1207ff80136c87ef22918f34dfe06c67cd186c48b018dafcee3cd99c5ee47faa48217647f99609bf4c7a0f1b2160392afa3f6da6cfc68bcd69279ff949f6093daef4ec1f067f5817831a4e76de8f70ebb9ece177c806d6abfb3235ec0dfba2bc9b4df9bc6d7ed1376ae5f5c3fe703263f6f4f520a1e53fc99102f66d4be8cf7cf7cc8e4e3d7673e784c7cdd82a7d4de5a03c3fe751e9f3265c2fca09be009d94fc2e397394b87c99f186bf08cfa4fe3fd3b9fb0e7717dacc792e97c0b8f5f58f8bb20d6793d613e5f2cc7b49fc5005bd49e35b56fb1c4fcecf1fe9e2fd9f7743dfdde582ca83f8267b049ed59f3f9686eb2eb69fd782699d62fa83de67244f67de1fa3eb79643b237ef2698f4ab9e8347d4feb0008fc99e1c6a8fbd70d05f4762261e6f9f46e3e730a6f3160618fdbbe6f9c6dc5d0ea8bd0df5bf6b88f89aebdfa25f00a5f8ff4e32edd749c0636aff66019ee17939780e7de2f92a73f643e8bb031e537b7c133c237bf5dec073ba7f44f71f1a225ea3e78f447f79dfe011ddcfe3f22dc68c29feff06e379ba0e9ed2ef0b1effb1747d44f3b1fd0d5ed2f78d0236c65cdf367c7e5fb0009858bf07cfd15f7bf082f4a3492473f96f19d8257b6df8f82e66cb05f55fbe223630ff6f797cbc98b3f67079527afe82319d17e1f6b7581a03fafdc693ccc7d7a0fb194b97da7bbb111b63f2af1bae9f0bd31810eb7cbd61612d1dd2bf94da671943c8cfe7af856d8c69be6e0563be594f2573fdd7b8bd2c1c763ded0f53c01392c7bb4ae6fdd3717d5db8c684fa4bbb134cdfa767f094e28180fba3e5c080fff15fc0b309f5ef9764d24ff13dfc43cae7a3e5d0807d6cf8782d47acbdfcfeed0b783ea1fad50ebca0ef6f3ed82079a32f30f2c5644f6c627f5acce7df655fd0e1e3930460a662dc3f1cc14beaaf40133ca178a8069bf47cdf90ccc74ff3c10e8de78dfa676c8afd09b564daff5982b1ff36a6f64c58ffd2fed40b7836a1fac504bc9c50fd6101c6fc97abc426e2b3700fc67911f3018cf33ac99d643e1edd198cf3176e07463da4fa0063bf8826be47bd53e7fe773965e345fded806db217eb1d8c78f29612b3f6923ea9603cbffb0663bf4949d7b38083c663b3022f68fceb7bb043f6118682a9ff8c02ec92bfcbe9fe7dba49f5c30d18fb636c9e2f2ce7ecf7144f2a6097e4bbe5c4ecf7140fcdc0b0b734018bfde03a784af3c53504cfb15f47dc0ffb0bbb8160ecbffc002fa95e58edc1d8bf1a4dc1163d2f36c1a8575495609c5f1a4aa6f3a134febd83e2ed2f376093faafa3e72fcc01f1f50b3c217ddd5660ac37ad63f00cfe5407cf69beef5230ea35c6026c60bfe55532e55b39d8a4eb6f73b0d8df20ee6f637fe04a32cdff03b043fd757b904cf9d9168c7ae7ed2299ce7b3692697fc898d8c2f99ddb128cf3b317f49f85fa6348f75f1a06d9afb604c37ff817b04dfa1c0ec10ee9bb4ef22ecd015d7fdd8047345eb5079e907e598e60d2d7b40363ffe3762598e2d5750e16e703d692297ffc128cf35768af897afb36108cfaee5c32d56b0f9269fe2e24f3f61731d880ff5125d37ed80558ac974c25d37ec09d64de7fe64132f73fea27d8a2f15732c9b4bea008a6f655a23fb1dfb28c24d3fe470d8c7ae1ed5132e95b2099cf8fa6e82fd4e3c32fc9b4bee3125b38ef7723ff641816d99b7d03dbe48fc22bd8a1f9f95a825d9adf4af28706eb1ede5eaf060fe97aaf133ca1fc5605237e6d8ee009e5bbd5198cf58b4efc1efb6fb71730f67bae66e025c5df8a09c6fecae020998fafd248a6f3ba909fd93b6f4f71025bb0af52329ddf9849e6cf533fc036e993924ba6f96726993f2fcec00ef57ff12e99e2c34a32ed7f0cc1f017d5bb649aef7cc9bc3f22f13c97fa4fc3f859388f5a6d25f3f69443c1d86f3b06e37c4be54ae6edd354c9bc7dd791643aefdc4aa67acf2b18e7f134f13dced325a4ef26d3379affc95f9826e2cb952a99c6f7153ca57835fd0463ff691108267fb579028b78c2001b34dee14532bf7f62814df88b4832d52f2ab085f59d0118eba3752899ecff2699eae307c9b43fb405431f9454329d2fbb97ccdb938cc02ee95b2adaebd2f8b590dfc279e448974ce3f12998e67b4d30ce074713c934ff403e0be72d2dba9fc5e607defeca014fc85f5413f094e2313b954cfea0114cfe467901233fd41792a99e6a49a6f527c198afd71bc9549fb9822dea8fba944cf9502799dad782b17e6d7592c9be6782495fea42321fdff8c7f77cbcb477b043fa1deb9229ff4904e37cc697641a7f0decd27828aa647abfc45032ade7b982495f13b25fcbc2fb0c944032d9cb93606abf5949a6f314cf60bc4fc00a24f3f6b79960d29f5a914cf11dfa53d87bf82999d6df303e16ceb755a4cf369b3fc8ff7660ec3f57de04933ff0f760ac5f665bc114df2b67c1a44f57156c507f5f1cc9b49ff3198cfdc69bab60aac7ac4f601be7fd22c1781fc95132ddaf95ccdbabd492b93e794f60e883229e87fd9ef959326fbf3a964cf9e00318fe5d9d4be6fda192fed916ce83a92f92a93dbe64ca8fd11f229e4c6f92f9f3938164ca1f4f82b1fe994ae6df871f60acf79a6bc9bc7f62f49785f3b1b75230d95775914cf30bfacfc279b22df90f47c413a621995f9f7be011f99b6d2b98e2136d021e4f683d63059e4cb83e7ae2fa19dd4f3b83e734df943118f581f22099cba33c8397549f592dc026d69b8f9279fb6f9f60e453d6156c537f5a63c9644f8160aa47695330fc8dee0aa6e7c5b964f28791648a6fe692297e580aa6fa6628da8bf8c3bc974cf9642118fa38954cf58f89649acf1692e93c27e9936361ffbdd149e6df2b9e609c1f7d96ccf549ad24d37974e887d0676721998f8fba924cf1fa9364b247713df687754f92e9fc672399ea45a23d581f35af92f9f7b9f81eef13885ac1181f4b32d5dfa10f16f6a3044bc974dee9158cfd3f892399fcbb2d993fff26fa6786fd3ba23f711ef146d7bbcc7e283f7b944ce7995ec0639aafab25784af671db0a9e52feb200cfc9fe320f2cec650f5e52beae7d49a6f319e2fe4bd457766083f453bf80b11fa878154cf6b2adc1585f37c4fde0af235530f251717fc45b9e90d7c17ca848a67add5530ad1f74a160aa8f76e279c8e7c34630f97f3b174cf2379a645abf247fe35a781f90ff2818f3c1443297571d49a67cfd4930cd87da1b58e8ff5630ece74b32cd1fa564aaef7982697dc87900633f73694ae6faa0be4aa6fd789a648aa724637fd25a32ed3f79924ceb3d3330f6f325ad64de1fd98364927f2598facbd42553fd3594ccafcf311e16cecbdf22c95c5e652a99de7f267e8ff3c9e1bb641a6f4732bf3efb008bfd812f92297eb32473794b31bec87fa30a2ccea3ee0493ff30f79269bfe23718f53e6b2099ea0377609c7f34be2453fc7b914cf91c1f2f63c0e6478a0fb6e019d58be207c1538aff8fe039e503712b99e6eb5c3297a750c04b1afff22618fb1922c1347fc73bc9b47f4630f2f9eda360b2efab2e98fcd1ea158cfd83452598f47f6b48e6cf8feec1a8b7a40bc1f05f3bc9bcffb61918f596f85d32d5e3447fbaa48ff94030f6ffdc24737bf267c416f6a7ac3f2453fe580bc67e99122cceeb9c24533d6b2299f4ad108cfce30773fd500cc9341f7792a9fe6b0ba6f5da6b2399ce372ec1d85f1d9d25f3efd59b60f89f3bc9bc3fd4a364f22f6f60ec97543792797fa8a960d8c74d32f9932918f61ed49269ff832d99e44d24f3f61a23c1d43f96fc1ef1fe1c8cf763448e645a3f16cfc3fe3d632899e2955832cdafd01f0be7d5ad4a32ad9f3792b9fcc64030ced3d792b93e9723c9b41feb02c6fe67732b99f68b7c4aa6faa3180f9c17f6499ffa032dc46bf098ec5d8f24d3fe08133ca1f530ed049e527eb7f50593ffb83c48a6fd570a7846f7d36b30e6fff25b32d5ab73c1145f28ef82299ed1e660d473b64f92a9def92698fcdd5a3cdf46fd24914cfbcd74c9b43e21e445fda611f7437cb1fe124cf65edcc02edd3f7225d3fb001e05d3fc5ebd108b7879bb93ccfbc72f05937e66a9605abf538e92493f56e021d99f6249a6fa5b2b98fc9f72914cedc3785a789f52f12698e42943c964ef17c9e40fe792697e1849e6f2648e60ac470660bc9f243b4aa6fd3fa1647ebda20826f9d24c32ef0ff55e32d5d7447f60fe2f9f25933f5a4aa6f8e62c18f9502299f40ffa61e1fd4b4a2899f6279492495ed19e29e297028cf795048d64dedef05530e29137c9e47fe4efb19f740cc6fed152134ced0f55c9fcfb488c17dedf74b9934cf64dfa3c326754ffab0cc1643f510ac67a78ba04633e77466083ecb309c026cdffa921998f476582b19fa7ba0aa6f93e5e0ba6fca6188051bf4b447bb1bf4aff00237ff60f92e9fd41f792e9bc7d2599e6f717c1d8cf247e8f7a5d160ba6fecf23c1b4bf21a0f86264e13c72f82499f2fd57c1f06727c954bfcec098df755b30d9ef7a2e98ecdf78974cf54cb447d47b3d5330e2cb0fc9b4df47dc0ffbd12ea9647a9fec1e2cde07f92e99f60b1c05239e3e4ba6f9df974cf9d74932ed9ffff17b2e5f70014f90ef288261df8664b25f5332bd6f0ae36be1fc4ef92499f22d4b3297ff593c0fefb7525dc9e4df3c30de5fa53a9229feb12553bc2ec66f46f2565f92c97f37609ca7b4df25d37e825a32adff89fba39eaafb92293fea24f3ebb7627cb13ebbfd944cfbadbf2453fe37154cf287a664d257d15e715e80fa6fcce673f2af117846f94076075e503d2188c1d88f9a9b82c91f2457c954cf38832df2279ba9647adfe70a8cfaecf62098e2ef6e2699ce27ed04533cb2d5c0d8efaa3c09a6fa46f12199ec5d3c0feba51dcd9f63517f5dbd0886bd3f4be6d76f7f30d59b62c164afde5432d5271f2453bdf0118c7abd77124ced4f1ac914afae2553bd5edc0ff3b9f32498ec6d1308a6f66c55c9341fdd83313f9ba23da8ef46a564dabf664aa6fd21f27b8a37e291643abfe249a6f9ce174cfb13a2028cf78b25b9647a1fd4a364f20fdf92c97f0c25d37a512599d607a03f22bf375ac994ffa49229ff78944cf94a2618fe48fe1ef59e4632bd3f270163becf2ac994bf8beb71fe4b0d2453bd27964cf552d13fa807da2f9269ff612499e627d13ed40f424330b55f13d763bfc6ed4332c50f37c1f0f78a64daff3d964cfb43c578637daf7a138cfd39429f719e6745fa30314df21f590ec6fedd32134cfbb10c5d30f98bcb8b64da2f3c01dbd87fbc174cf5c92001e37c4d25eee760fff1b7605a0fc8b792e9fc81b8bf43f149740263ff68fe2a989eb722fb9c8878201849a6f75f9e25d3f37cc974fee15532bdaf752898ecdd0904d37a475080512faf7e30e9432e18e7f56e82914f5482c91e0bf13ce4ff7e2698c627fb924cebcfe2f7d8ff1b3e80719eaa934cfaee3992491e717ff80f6f2699f22ff13dcecfa753c9e4bf0e92293f394aa6fd139660b2cfc8904cf9df4230e68b4a32add78bf1c0feda740ec6fbebcab3648a8f2792c95fd492299e1848a67ccd164cf25b2d58f887ab64f2379d64de3fea4132bd6f4efc7e8e7827944cfb7f1e2553bd4f134cfa6c799269ffb6781eea8df14432b57f2718ebe591645a2f8b05231f15bfc77e0f652699e229f13cbc7faa9a4ba6f361427fb03f5013fa8cf5e2c495ccbfd73dc924af180fec0fd33e24737922f17c9c6f6cc91ea626f69b5e13f082fccfe64d32d547bfc0385f565ec0886fba1cecd07a663394ccfb237b05633d627b144cf6779949a6f75fd682c93f06349f4dc5fa433d154cfaace982697d721b4aa6f3c11918f585742299fce5bd64aa67958229be5ac560ac27ac12c178bfd79b64da0ff1e37b7adf95fc3dcef70592a95ebb174cfe3a10cf47fda01c08c67e1b5f32bdcfb0134cfde12a92493ed17f585fc81f25d378dc49a6f8e253308d57249e3f417c7a904cfbcd7e30c5d382b11e982592797f24df82b1de954ba67aa6907f4af69baec138af6c8d24533d692f99ea733bc1e4ff3c0b2cde37be944cfe712499f2b1b964b2675732c52bd0670bfb45d54832e58fba64da0fb301e3fd8d4a2499d67f857ee0fc72f82d99be5f81713e3e194aa6fd49e27e588fb89ec1884fae13c9d4ffa27fb0bff0229e67537fae481f66e612fb2d776083ec3debc026eaa53618f18a3b0323fe580f04d3f5c98b64da7f63825df217852e99ce77907c33113f6c4dc134df6f1f24d37c9982b17ee04f05537b9a77c9148f88dfa3deb07a92ccfb7f73168cf365778229be48bf25537d19f28bf501e55e309d4fc94f92c97fcec158cf2b12c1e41fbb4fc9b43e3d104cf3f7f6158cf87ebb170cffe448267942c1e47fba05187f1f455049a6f5614330f4ff0d8cf3b88ab83fde3770d94ba6fafc12bca0f6a557c1c80f6dc9644fb964aa7f1492a99eb1934cf3f718bc44fd632199f2ab67c914bfd782518f16e389f78346a23dd8bfa58c25d379ba4030c95b5f2453fc5c824deacfec2299f6eb6c25d37ae74630e2b94632ad170bf9b13fb87b964cf514713df61bd4aa643a9f0f7bb31cecbf10fa28f6e3f89269bd83e2adb9399f52bd33032fa6fcfef9086cd07e8d95f81eeb1b97a964b2bf0dd8a2f958ff02dbb41fbbbb825d9a3f2eb5608a3fe28560caafb6141fcd45fdb11a83b11e180f05d37e5c5f114cfe669d8051ef6f3dc1a40fab108cf3d9e55a30ce3b1a60d4d78bab649a5fe5f7645f978364dededbb360f247452899ea616730d6e7d6779269fdfb4330f9bbd4148cf8e7058cf5b8e44932bdffe25e30f6835c24d3f9d1b964b27f713decdd16ed9b937fd2f792a99ed2082679a247b0380f33964cf3ab18af05c52f57d1df381f5baf2453bcff0046fcacfe60daaf6a4aa6f9ed4b30ce7fce25d3fedd1918f65f8af1c37e6d4f954cf9cf5a32c927fa17fbede254326faf22aec77c1bd582a9fd971d58ecef3524d3fe5ea1bfd84f97d1f82ec47a83be124cf5c8ca07dba4efbab8de9df2dffba44f0b51afeb5cc1747d32154cf61eecc043ccf74f9269ffd3098cf7495c1e25d3f9c14a30ad9f281f92693de2001ee3bcf34430e94f71114cfe259883f17ef6b52599de2f36144cfaa23c4aa6fafd188cfa79d60a267de832c1345f1786649a3f7e30cd97a2bdc86ff55232c54fb9648a6fc4f367e44fbaa1649a5f669269ffb7f87e4ef6915f2453beaf4ba6f9443c1feb655a2c99e47b944cfb532493ff6bef25d3f86ec1e2bc532318ef1712fa82f3cdc55e32b5ff1b0c7b5acd25d3df9fa04ba67ac25e32bd0f44b4cfc0f95ad13f787f759c08c6fb8f34c9141f6e2453fee80b46fe22fac7c2fbafef24933f17fa8efdf9590dc6fb8d4a8a079626ceb3d513b04bfa5a527cb664f645eb65067848f359fd8369bfec063cc27ae45532d5e31f25f3f15c3d83315f5d12c9544f740553fe1e6592a93f3dc158bfb88127145ffb9560b2873a96cce5d75f25537ce90ba6fa62f283a95e2ae49bd2f82b0f82c93ef385645a6f17ed453d39984aa6fac04c32fdfd5607c1a42ff14a30cdb7b74232e5a76f60e483fe5132cdafb960c4fb5f60c4aba52218ebaf7b30d69fb6e27b9c1f0ceec1d82f962b92c95f1d24537da7148cf93d05239f534f92e9bc8bb81fcefb1547c9544fabc1383fe68af1c67e92f807d3fe43213ff6af7662fcb19fdaa37cc410f5ebfc5e30cd1f6b07ecd2f85a347e06332faa8f1cc0d0efdb17784cf6e91a82499ff44ff004eb318f92693fdebd649adf5f05937efa67c1347fe91618e7bb6e7782112faa60ac8736a1601a8fac00a31ee98c05e37d155bc1347ff8aa647a1fc009bca0f1f21682c99f9ae2fe0b6acf360763fd62bb168cfcb0148cf7790879f1be9ad4954cf53cd17fd8bfe49f24533db1164cfdbd7d07e33cd346fc1efb17b789643a4f300423bf303760bcdfec42f669b27885ee47f38169e1bc977e124cf18d3706e3fd11fa163c22fdda9482a7b43e7805c3ff058660ba9f2b9e87f364d14632d5fb4792e9ef37fe02e33cd926028bf364efe039c9b712f747fdd9ad24d3f58231fee58b601affdb9b648a6f7230dedfe12d25d3fa760a467d3817f218145fd99f9269bda1924cefdf93df23fe7e009b349f98623c2c1a5ffb2298ee97d8609c3f32e6609c3f8b2cc9646f0bc914cf3f4aa6786607c6fe958ee20f8bcdafb43f81e20b165e93fe5c3e25d37e30f13dea3ddd093cc27ede2d18f5983804e3fd1d9a25989ed7168269ff61fa089e223f9e8167d47f862699d6f39e25d3fe68152ce2b70318e7c9ec67c9f4fe12138cf70f252918f1932b9e67507caf08f9f1be9938069b648fc15e308dbf32108cf7df88e7637f627c150cff7a0163ff42f000c6f99c88ec9b4d37a867d1fc62b3f1a3fd3c743f5b8c5ff102463cb2da82117fb4df9269bde12498ec510f25d3fef01c8cfcb8b425d37eaa5232bd5f2506235ed85a9269bda4154ce31d89f6cef17ea8037841f76b447b17d84fb6012fa9fd6b211fea49978b608a4f0c156c423f3bc9b49f3602c31e6f7bc1d0bf4a32c50fe44f6c1bfb3be22918e7e93a6287d907adb70ec063eacfd51b784afdb3d1c0c85f8a5232cd97afe0398ddf652d99fcf75130e5879d09c67c961482c97eae7bb049f74b3ac9349e86649a4f2692b93cb978be8df749b88229be509660eca7f39f24d3f922713dd6afaedf8269bcd690c7c6f9d755001e52bc5b533ceb5a63d29fab2199ce63edc1139a9f82083c25f9f5068cf745dd2cf082c6238d25d3fb1d378229bf503ec178dfce6a0946fce9bd0aa6fe5ccf04e37d0af27aca77ac1bd8a2e747df9229fe2dc136f98ffc4530e9f34a934cf9f10fa6e78be739387f48fde9daa8f7273c3e310716f67b260f9269ffde1318efefb91e24537dcd06e3fd79f6156ca0deb1904cf6a080d1fe6a2199e67b5f303d4fbb801dd8fb0a8cf8f9a611db78ff5dac8211df745f60d413133e7e2c389be17ccc183c27ff97459279ffac4b30de27947e0826f94c4532bd7f5d032fa9fd6d2a784af58e21d8a0f9e1aa48a6f53f5b30d58ffd6730de5f94ad89ed01d9ef86eb2b0b2eb0feac6fc04b92af7525d3fbcd8f6093fccde64532d9cb4d30c57fe1128cfd33eb77c1a41feb028cf7355a1f82e9f9ee1cec62ffea9b60f227892918e785f0bd8dfdafe9b3601a4f270463fda81980f17ea59adbbf3966fd41ef472dc14bf2075b1b6c60fdec4132d50f0bc9944f1cc126c693dad7bf5e9ff2075c6f63bd6b45fd33b1e6549fb8adc0580fdc7682c97fdd5ab035a5f74309c67961e50bec523c1de2f736eaf7f11c3ca4feaba8bfa6d664467fffdc080c7f53b492a97e6f08a6f686776013fab4964cf69982717ed224ff30b5b15fe81608c6fbd3ce60c48b2d8dd78cdd8ff2eb5430c5839b5730f2dff60086be74a4af33d6ff148fdd8391ff6a74bf390b30693de808b6917f64c436ce8fdf1230f6bfb7345e0b6b3a27fbe9c0f319bdaf8bfcc782a5f7e43f0f60cc4705f99f256b3fedf71c826d92ef3625b627349f68dcdf9b2c9f9b927f237d3458ffd1fc5b8327f007241f530f1aaf6b00467cad51ffb2f8674efd41fed5b6711ed0e4fac192cf39b57733022fe97ecf977feda32abf7d8c9f3e26ffa7827fa74fcf0afb9da5daaac3fe58ff6a0be8f3df21cb2f72b9ecf3bb5c0afe9b90afff77f7df5116d62247f5d81ffad87ddba87590cbfd87bfb3f1f9779605f20899fa6be8cfffb79fff167b71e9f393743ffadc1663f4e33aa96fbdedf8eccf3f18b9ffff65e16dfbc90e6009240d1fa9bf2b3bc9439ee0df4d1661eb3f64f9313a3f24f3e4e717cbfa7791e5379fecfefa91d758f05a8e94457a8a7f2b590235542335561335553335570b364ea55aa917b5669f86e951ab76ec7365b2de544dd5d99f15ff9dc67eb1fe379365a3aed827652391a85bf6b963d2ecd43dfbec982c07464726dd91fdfb4e3da9f74cce7bf5817d0c76e53ff4daff5b6479e43dfdc446e699fddb597d515fb94ebda9efea87faa906ec9a9449f8c524f85607ea501da96375a24ed5993a67d2fc1bc9c25a7a5637ec9f91ba607f02d8fd92c9f2cafe6929aafaa4284cc7be15431d2ba662b18fad380af31a8aa7f8ff3d92fcf7cc954aa0844aa4c44aa2a44aa6e44ccf5ca63d2dfbf4b6622a059b45064aa954ca45a9954669954eb92a3745537465a5acffe8b5ff37cab251b6ca9db253cf8aa2ec95036bf1513929f7ca83f2a83c29cfca5979515e9537e55df9503e952ff6dfbf9581325446ca589928d37f23596c65a6cc9505d3b393b26413cd83f261288661b044c0b00dc7700dcff08dc0088dc8888dc4488dccc88dc2288dcab8a87746fddf23c99f9345b58ca6ff23a390df6677a3353ae36adc0ccdd08d95b13636c6d6b83376c69efd391847e364dcb3cf897d8e8c1fd8e7d178329e8db3f162bc1a6fc6bbf1c1b4b0cf02685e757f9b797f9aadfe999ff8af6561527c1a5feccfb7313086c6c818315fd4186363624c8d194b9916c6b2370ad3304dd3326de3683aa68b8fc73ebe19b04f684666c465eaa53a9a31936a6726666a66666e16666956e6c5accdc66ccdcebc9a375333757365aecdcd2f33b1f2eb1cfcd764311a736bde3169becd9db9e7b21ccc8379344fe6bdf9603e9a4fe6b379365fcc57f3cd7c373fcc4ff38b7dbecd8139c467648ed967c23e63736aceccb9b960992a3334e3de322cd3b22cdb722cd7f22cdf0aacd08aacd84aacd4caacdc2aac12b9dc2f91c5ffaa2c56655dac4b3f2e566d0cad5a3d5b8dd55a9d75b56e9666e9d6ca5a5b1bd6d3f7ccd96ead3bd6522689b5b3f61677bfd6019f2393666a9dac7beb817d1ead27ebd93ab351da592fd6abf566bd5b1fd6274b98bf5884b0601e3d61b3e9c0faeea3cf1fd1d1bfa2634cb31a8bfe82f001fff74a89aca135b2c6d6c49a5a336b6e2d7acdb196cc74fa4a9ed18f85b5b34d48f2439643bf4c614e6ddb766cd77ab03ddbb7033bb42326cfc178b4633bb1533bb37336abda766197ea935dd997de92fecce74fc932307756cdc6646055aa67d77663b776675fed9badd9ba71303fec95bdb6376c249ef9676fed9924625414662bcc5e602bf766681bf6d6beb377f6de3eb0cfde3eda27fb9e8debde7eb01fed27fbd93eb319d7b35fec57656fbfb1d1b07efffcafc9f27cb16a66274cb78cc6f8b4df992c1ff6a7fd657fdb037bc8faf3c47a7864bbe6dc1edb137b6a2db924bb7e64fab161ff9cb1f6ce85fd9b91bdb0972c485698ddcc1dc3311d662c8eed384cd2bde33a9ee33b8113b218f5dd89545df17fcdecfe155954d7183ab113333bb1edda499cd4c9ec2f27778a5e0ea7640ff0ed3d6b55653d3b17361acf4cc706cc6216dc6ed8ff3b356b6be3b44ca6b9d3998173756e8e66f7938feeac9cb5b3b1b7ecf78eb365d21c8d9d73e7ec9cbd73708ecec9b9771e7ec9107ecb7a7eb6a03f234b2f09f3c683fe7ecea3f3e43c3b67e7c58cadb33db1ced6b33d6656cc3ece2b6b5dc5dab5c0a7f765ec63cfe9e374f8bc39efbd24f6d20e9d0f66fd47e7d3f9ea7fe954ce379366dffff5f6cec8e9ff5acca933b3eb9fe4f8576599ab9db3b05f9c25fba1e21a6ce2b08c23f34accd3bab6ebb8aebd702a73e17ab66b1f5d9ff9a8931b981fccdacfaca5f76ec86c2ae673e6d18ddcd84d98bde0e3746e6a7acc73b02b594fbcd93336be67377373b7704bb7722f6e6d176e63356e6b358ae67656f3afe8987a70afaaeddeecd6d55cdd5db96b3626cfeec6dd9a43f7ceddb97b3622dbde86dd837bb4576e6031ed331df7e4debb0feea3fbe43e1b817b765fdc472195fbeabeb9efec5707f7c3f9703fdd2ff7db1db84377c474f1c0fe7dec4edca93b73e7eec25daabd2f6091b8a7aa81f70fbdda9f91c533d8f46d79b6e778ae937b9e71b2179eef055ec8e4601fdbf0222ff612e6030eb6d1eb8c977a99977b85577a9577f16aaff15aaff3aedecdd33cdd5b796b36e7c7c6c9db785befce7a70471ebb0b1b5d9dfd3ff36fde8e59cec1db7b07efe89dbc7bb5f01e58467af31ebcc71f5af5bb1ff853b23c79cfded97bf15ebd37a730637362dbde3bd32f2e099368cbe6f229b39ae7de76bd0fefd3fbf2bebd8137f446ded89b78536fe6cdbd85b76441d7a3aff8866ffa966ffb8e71f45ddfb31e7c9ff9e8ad6df8811ff663e547ee8069e4831ffb899ffa198bd6be51bffd523c9189fe75599e2f7eee177ee957fec5af0d6603e6d46f7a49fc967d3aff6acead27ffd6cf77bee6ebfeca5ffb1b7febdff93b7fef1ffca37f62f966a2bef8f78aea3ff88ffe93ffec9ffd17ffd57ff3df8da3bdf03ffc4fff8bf9f485bd30c74ee57ffb037fe88f8cbd3ff627fed49ff9737fa1382c27fd6679f70f597ea97dfc99d8d25f066aa004060b112da65f6aff97c0f7fae5b7811d38fe3570cd0fe31478811f04411844411c24411a64411e14411954c14509839a7d1afb3d68838ee59af3e06a3f07b7400bf460c5fc48ef0d9560ddeb99ad30d906f6c27a0e36ecaedbe02ed8057ba50e0e4a191c8353708f0af54f35ab3f2d8b1d3c048fc153f01c9ccdd829ad73f012bcf6da15bc05ef81137c049fccf38c83afe03b1804c360148c8309fb330d66c19c49b47016c1325443253442d3188416fbc39c71e8865ee88741188651c86cc73a8709f3cb4698f29881c50f61d6fbfc300f8bb00cabf012d661e32fd421d3b41fb2387f94e5e77af6cf63d25f1db661175ec39b19875aa8b3bbafac636f27e13a5c33795e8c7b2f0d37e136bc0b77e13e3c84c7f014de870fe163f8143e8767f52d7c095fc337ab08dfc38ff033fc62d2982c22f6d97ff90e07e1301c8563e3184ed82cb40dd6e1943d63e6ee99fd7c9b53f6dfe7e1225c466aa428456444e68fcacdaf5a46b288ff862c28f1d4c8525fd5d7c88e1c7f19b9e673e41987c8376751c02375a61351c8e2f7cf88e524511c25511a65c62dca8347ab65f369cafe3c4645f01895aa1255d125aaa3266a5910d345d7e8166966678ccc75d4467ab48ad6d126da4677c629da452c82f0039ef778d68ecdb40bf6bc7d74888ed129ba77d2e8217aecefcdabed866af4d1eeaff6f2932c068fb043b77516ca2e7a8a9ea373f4629ea357f6a437e6750d16a79ca37773c2e6e8aad7eae823fa8cbea2ef68a0ce153f1a2aea8f2a2c7f9e1b8da27134096d2b8ca6d1cc8aa379b48896b11a2b56111b319bac629b85166eccbc3d9f73962c7f93b29843e33ef6e3200ea3fb388ae3f081f554cadbcafc5a1f25fe2c0b7ff68f7131d4f8f9e22cd4f73889d3388bf3b888cbb86277bcb0f87111d7d6dedd5b4f7c2639b959dcc46ddcc557ff515dfdb4f662cb3bbaca5875e25bacc5ba3f8b57f13adec4dbf82edec57ba5890fea323ec6a7f83e7e881fe327e3143fb3d866c9bc7380b86e689de373fc120ce2d76011bfc5effd88736b3055a38fdeff992c0ad34726cb6b9cb8adba8a3f4c23fe649db7641ec6b09ee3da665ed3fc0c33f6dcaff83b1ec4c378a456eaca7e51ee94713c862c3c1eecff9dfdb7493c55f57816cfe345bc4c54e3c17e4894c448ccc44aecc449dcc44bfc24484263efde9b3e8bd8d887e7a42c3b65f3d6d17c4da2244e92244db2a84872b1baf07765b1c886f8155b36bbb2fe65914fa2b8499194e69b71f26fd69e8dc9d9b998dff6c13ad953e39054c925a99326d6d5f7beea9db4ccca52f40d55c1d97d95bb385332bb4abae49adc12cd38252ceb4956c93ad924dbe42eba26bb641f1c9243724cd82c657a8ec272014364d94c9b4b2f4dee9387e4d158264f09b34ab146d2e722ff4c96e499f5e198e50e2bf6efe7e4257935dfad3e3f3f276f56ff8afa7df26ece8dfb709c7c249fc957f29d0c143d192a8b64c4abe3bdc7b4fbac8dc9c264b2df93713231de9269324be6c63159d8c76469c6a99a2aa9919aa995daa9e3dfa76eeaa5bef1603a2cbfe1b2f45910cb54b769601cd3308dd2384dd294cbc2d76dfa7cc4180aaff6932c96b0fe3453466e6b97cc8e9d344f8bb4343fd22a4c98f75a5afdfe8687f4621becee75daa46ddaa5d7d451f4a04b6fa996ea91c9fd3f978549c3644957e93adda4dbf42eddb15fedd3837d4c8fe9c9d8a7f7e943fa18fae953642b7a344c9fd373fa92bed2c8902c2ca7db4681719fbea5efe947fa997ef5feb197a56f7f9f5bfd2acb8f91e17a78607dbb5412ff2139a7dfce9069eb673ae86da5f7c54ee5fa696f8f553a4ac7e9249da6b3a4b50b65c3f42c5177fe23ef31361a7d0edad724d379ba4897999a29c63163f971b4efb3e3ccecb3e2649559999d39ea57ea0475e6665ee66781e9fa81a3a06ab0eb675096e1c5599845599c25ce23b3172e8b6af5b9d52fb2889a9add3f99d14efd4a064ccf952c553eb2cc74cc2fe61b077dcecbf477613d982316e37efaeb2ccf8aaccc2a61e7e45b98b34db24b56678d5dc763f53b6bb32ebb662c62f343d6df6ff6c2fd66de9c652c99661ce3a74ccf56d93adb306bd3b36d76e74efa5999c53363a603cf76bfcd8445369691edb23d93e5901db313d31d85db7491ddff268bf28b2ca67a973d3032b24743c99eb82ccc37f67d642ebcc4661146f69c9db397ec357bcbde852c1855577d4bdaec23fb8c9e93419a655fd97736c8d8e866a36cec8eb24936355da7cc66d9bcf7ebacbf17d93257734509552b377233b7723b77d8377d3d6dc29edad74398b7cedddccbfdec900779a828ff4496be024a7dabf8bd36f63edacc23c330ee982cbd97efed70c024619219f7799c27fe364ff32c3c30597eac4172bf95e779919779a556f925aff3266f8d63dee5d75eb7dc613f1ef9cdfdeeb3e25cb316f153aee7ab7cad9eed32dfe4dbfcced67396c1b09879c8729a4bafd9feb7719f29f93e3fe4c73cc88e4c9b1392c52afe812cbd0f559209d332db2ed5263f1926f32baed05ca6678eed5877ecbfbce6f7fe5dfe104cf347a3fd690d92d97afe943f671725cecff94bfe9abfe5ef7dd4937ff49909af719cddaf6cca73628dcd8871fe997fe5dff9404d9cc833f3613ecac7f1579ff1997dbc4c51b4cfee30c9a7f92cc9988e1d59a699f47e377c0bdffe200bb75792259fab7b854d65ea77be302c63cfd2fb1dd5bc481673943bf9b2500b8545f5b3e8814547b6dcabc0575793b1fa919f0ba33059b7d9ac557d2cbfe8f312ebaeb7e4c2e96b1785cb62ad53e1157e111461112923d52ee22229d22233f67d5ec365611ac6aecdd98cb92f8aa22caa3c2459faf6b398f5f597f9e5375958c6b34f6fcc62be8b0b7be4ce74a97227646177ae8ba6688b2e288a6b714bf25f7684303d53fc645268855eac8ab5710835e7b597a5d8b06cabaf6a7ef4d5be60cd243916dbe2aed815fbe2a0d8c5317b284ec57df1503c16cc3efa1a279764614e0b268f7128cec54bf15abcfd248b1aaa7f57164fcab22bde59fe742a3ed894b5efa33c5420875c9645f1597c15dfc5a01806398ba2c90bffd8555114a3625c4c8a692f4931ebd72c989ea8c5bc8f467b5b6677e03163b12cd5ecbb544287c540d7d250c2d22cadd22e9dd2354ebc22c2ae36c7f6a1f498cdc6a55f06e1ae64290dd731f7efc822d654c40cf3adb665c472b053191b2ecbef852cfb5e16f3cb3a9749999659996749745f163f564a7824669465599597b22e9b5e92b2cd34661b565f3b6371dc985bb4e10ffaaca7ecca6b79b3be4acd0a4a9d8d67c4a45995eb72536e992cbabdeda326368e5bebbecf64cabb7257ee7b591425cd7a6d28b552fb45961fd13ef773ea8dcd103b75c56439183e1bebc81c5b7d3d2cb0674e63cfcb63792aefcb87f2b17c6271ce86e527a398c594ca9d5d97cfe5b97c295fcbb7f29d79d12eef32adafee9bb3bebec13f337b5f7eb079bc2c3fcbaff2bb1c985d392c47e5b89c94d3c42d67e5bc5c944be3c45c7d156a7c4c0f665f1939564a655466d06746a7e0d4ef2ab2aadf62fedefb3059d8b7663f36c8d834bbaa2c26cbbd19b2deec97483a264b6b06c6a1b22bc79bc5e3a00996e5c4dc562e538ba86236cfa29545e5574115329fca66bb3ea736471513d73a313946fd9a4515dbdb2aa9d22aabf2aaa84a2bacaaea52d55553b5556745c1b1ba062b362e5ba7a355b57ebda3aff254b74aabf42467b21c83a36ad9f51f641151a5cf6571d488e9e246bd315559556b264bc4662c268b193269f64c96a37bf65a6fae2e2387e9eb5bb5a9b6d55db5abf6cab53a54c7ea54f575e17be6c717d681c5d5233e26a3fe2ebd3d570f4c96c7eaa97af646d5b97ab1aaead5dc556fd57bf5517d565ff128afabef5e966ac07ac2e5f5cf678bddb11a56a36a9ce4ce23c6c5339adf627e4bca6270efba60d1ee539ac5a36a524db98e912c51af654c965335f33a8f656bca3c34ccae9a87af9eaac6ac3f17d5f2a26637f7f5a25cb81fb615f38349d17f26b406c3ee7570377d7e75312fd6c5be38e1cbc5bd78179f8d897f092e6134b8449798c9d2b91fccbadefb159cde673059946a7449823e47f6d9c7fea32ca859283c96225912f549bdbfa4ec9e593fc6fdfa9c6df523d4af3d18a774e75d2fb9925e8ad0c8eefbbcfd525eaacbe5525f9a4b6b9c2edde56a6fcdd1e5165f98bd93244764f10773e445d68e5da55df4cbeab2b6c2cbe6b2bddc5d7655a7b697fde57039ba2fbd2c173633b1d8cde27fd5d684fde2fef27079e4b2a0adfd5add3f95256071f24d29c2faf27479eeb585d61bfb95a07ecd81e9d8a377f35545b3df7975c88ca6feec72bebc5c5ecdc4383afae58daf136d8235f75dbd7e8db92c7c3d96f5f196c5dd5333bebc5f3e2e9f97afcb777cbcf06a13d388e16578195dc66c869ddb6c66cd466c967db5ee7adbbf4c2ed3cb8ccba2f0bcc2fe5d16392f4096545373b5cdcf97f9657159f6eb90bdcdb2d8b85fd50accc08d8c83a7298f8a1fb4c620fca8d55a49b6b5519bc98ac9f9565bb56def1cc38bfaf99ecd8d336ef74cc7b8341e9b3146e6dcdef82cdeac9ddaadbddaaf83484b46e9ad0eeba88eeb84e5ca9fcce3796c6e9db008f4c9dd32590e755a67756e325990875bfd0aeaeff9cbcfb2287eaa2b6e5dd4a5f25557c68149c0bc0fb3dfa8978569716cc69eee2b6aa9cc422bfc8caa9a4590ec7f0d6b5beb7eb84347cdaf2c63af9cd73063f67faa22f6ebdeaff7d27875c746f9cbfc626d5cd6d7fa566bb55eafea35d36ca77c8af27a536fcdd8b9b23cdceb6318d6239bdec2eabb7a57efcb3d932515759e3fe695d8112074cc55efd44370523ae5b13e184cb3597e7f6fdbbc12cfda581f599b4ff57dfde0b6a1556d13b77eac9fea67e3549feb17a65b8bfab59f159cd728b02d1691ceeb37bfb1b7fe376fd994b220ca89acbdfb5abfd71ff56738a8bfeaef7a500fcba01e992ed3c27db17077aec3f29881cb324b63578feb493de5b2507ef20f7264f6a797a59ffb13f6ff0d9bfda7f5ac9ed70b9657b2fc8bc52e5b7b592f9d779bcdc98dda288de13f5a35f3ca1f8dd958c64363db47f6d9374e3f438693be6ed3fbb2c665ff34a2d0def09a9af1cb1ae0d074eb5be3357e1334a1f3d4444ddc244dcafae291e54977eeaec9ac2dfb158b429bbc299ab2a9b8bdd09ca8f42b763fcb42732397c5e4b364aa8cd2cc99c77a7369eaa6316377c3eefb7039352d0b8359d6e186c6aee99a6b738badd0b48a466b74fbc18c9b557aecc7c57c6fd64cdfc76c2c3efa5cbdd9345bebdcdcb9dbbe8283d53fac9c9b5ebfb3a4d935fbe6604d9a63736aee9b0726c363f3d43c3799bbeb6be64c2fe3e6dcbc34afcd9b948559c51f65a1d95ecaa2f1959bb5faa138cd7bf3c1a22ac7ff609e89d973bfa6686f9b4fe3e0dbcd57f31dbae167ad3483669828d60b7bde283359ae356bc66c961b46611f41369366dacc9ab971b296eeb6e1e3815566167d9b9ed3354b63efad5bb5555aa3355bcbe8ebd581396efb15c45d9f2b87ba71689dd66dbdd6ef63181e7719aadfaf09ff365752a5cfa4bdc2fdfa937a8bc76de03dc65d1b1afd4afdb658703fbbed6dba8d8c531bb7499b865ef5de666d9e9fdaa22ddbcad8370fed85595585fce4beaddba66ddbaebd5e5876dfded8bcf3ddd70ee4eabfefed5aaddf1de36baddeaeda755bb35f6dda6df0dede056f5ec89eb7734a63d7eedb437b6c4f52163f38fd41161bd97abff39945bc2c951e313ddbe5b9a2b7f7ed43fbc8b4f7686ffa9d05b5d53ef55adf326fdf9edb97f6d518861f4e5c44ed5bb269df59ccb3cf3b7bc9645ef5f949fbd17eb65fed773b6887eda865b3068b697aed123b19f67e906bf6b69db0acf8d44edb593b6751cb397875ed76d12e3bb59fdbeace38754a67746667c571922779af472c8e39fe4116e75759d84c99a94967770e93e6dab99d67192cd770d89cb063be56ef7c7b5b9f7d3753baa00bbba8da767197746997b1b0b8e8ca7e6dc8db75157bfea5abbbc6df756dd775d7eed6699ddeadfaac8e723b5ec95b326b687b8fe2fb4e65dce75db7ee36eeaedb76776c02d875fbe6397aef0eddb13b75f7dd43f7f8ab2cbfc563b40fdae2fbb87b59fabdb76ef7d43de7cfddb97be95e6bc738b9ae7de8ff1a4166c38eb3eddeba77964f9cba8feeb3fbeabe9d85fad80dba6137eac6d19d195b0b33f6b56ed24dbb5937ef16ddf2aa5e95ab71358d9dfbca7763f9bd1ce6d00ffa99fd6ad97bc7bada4cbe73b7bb322bb18ee1cadd5d5deffdea3109dfaffe35b886d7280fa302b66ffe1d1d13eb0b72bf196a7fdcef5de36b52b2d65d53ebe19ab119ef6c9dddcf7eb5f79ab3ff5a5ccb6bc5e29897ebe55a5bfeb5b9b6d7ee7acd27d7db55bb321d5533b30bdf8da69c5c57d7f57573dde6937efe655aa8f4750ce623a2be06c6f7638dd87c74ecfd38d515ade7de5aaa8171bcde5d77d7bdda3847b5edab2c5993353c07367f9c07f8afd7f89ca7ebe17a8cd953afa7eb3d3dddbf998b6641d1eef5e1fa787dba3e5fcfd797eb6bad3069deaeefd78febe7f5ebfa5d75d74139bc0eafa3eb987d26d7e975769d7b6bd60b8bcccccceb92dba2f5f327f2dd7d73c7fc1c27ebcc52c3a79b7263f955348c4c36f3b9aa6dbf33591cbebef31764b99937eb66df1cd6379ecb66877edf8bad140b2fb9b139d0b8f7b51b0b346f8152ddc25b748bd5db2db9a5b7ec96df8a68d025e15755df4a7377ab6e97f0e3c626c65b5bac6e9db1ef772df0fd16d6af1f5eafb0d86cc4246aee7236b3dcaeb7db4d4bc6d133cb2d44fefb87ddf3ffb52ce6e34dbfad6eeb86c5860d1b0d663515f3f8ecff6d8fc5eecc9fe593dbe6b6bdddd5a5fa62d7cae2b65386b7fdeda0d4ea58dd869f55773bde4eb7fbcbddede1f6787bba3ddfce51623f180fb71733643e7af24759983454afa4fbbfdede54f7f67efb48068a226ac97f7d7d3f2a6e9fb7afdbf76dc02b565f2cb35c58776c86d89a73162f6d6e43e3741bddc6b7c96d9abab759eadce6f1241ef77bf56f8bc80a5fa2eab6d4d4a8d394a85202f5ac199aa9599aadb1b16e5acdedade4e78fbbef3396c82759cc58f3345f0bb4508bf242d1d20ce3f287d3597fc25e1eb5584bb454cbfad981dd7b617e7a119385f624cdedad96f733a75668a5566917ad564325615ed0b65fe289b25322add15aadd3aedacdf84c1dd573979aa6e9da4a5b6b1b7ba16da99af0ebc8b03f2a8bb1ad7667dada9db653bba0b9bddbef2c7f37642dcfa1f8f22fc8926a7beda01db59376af3db008efce9cfa1f2c3bda71eb6451633568f92e43ed517bd29eb5b3f6a2bd46b935d2de8c85f61e4fb40f36269f2c216e94246ccb2767e999da97f6ad0d3436a6edeeefd98bf5dcee2c35f2b59136d6260a8bd955d72eed525db37111f562ef2fcbf2a84db59936d716da52578d7da8318f79673d9993b86e6fecb363518056b6bac26c79a71bbad92a9dab5bc64db77527327457c97596ee844e7fe622ce597e32d4033dd4233dd6133dedc7e0d74f98f5b2447e2f95bbd7333dcfebb2d20bf6fbfe0c84266b797c86ff2b3a16157aa957fa45aff5466ff5aedf11c3f2de39af8f322fa45ffb798faffbfaa6ebbe66817ed3355dd757fa5adfe85bfdcef850bff59dbe77c6d5413fe847fda4dfeb0ffaa3fe14bd07aece722db28dde4ef86e0bf3e78fe9e8e764adbfe8af4aa36ead86cdca34abf4f6eff075c43fbd8724c9f537fdbdb8ea1ffaa7fea57febcc07588affed6ed3ca56a3f7beea637afd3a561f4733895c33d687fa888dd0589fe8537da6cff585be5ca92b6565accc95e5eddd3c7ded778d38d5ca5e39b6e1eec90f0b0ff68b2cae7170dc95bbf2567e3c535f56415f310a4e2cdeea57df6a5a7bfb73b2048fab701505b355bc4a56e92a5be5ed78555807166b6efa5ccb3afe248bc9b28265dee5ceed8565b4b755b9aa5697555dcd568d3e5ab5b1c7f7c23129dcddaaeb76abab395e752c5bbbe3f66e626ef955166f7533e3b261f9d270a5b1f178e335567efeafaf2afd9571311f57fa6ab55a6bb362b8daacb6abbbcbc76ad75767d2a05f79b0b67d0ecf64796372ec983c0adfc570cff7819ef85efea3d8cf6bdcbbdf76e87ff8cd6abf3aac8ead1d7cb84edffa7e9e679aa6b63b6627bfcae2af4eab7b9643ad570fcdfbea919fce727f3a052c4f69fca971795a3dafceab176db67ad5ebd5dbea7df5b1fa8cbff26ef595f615a31fbbddf98749f7c177bc0f9d57f6795b7daf06d17e35147b2cfbbdbccd9339ee7739b58bd5a8d72e173b9358e3acdf65b1ceab717d67ec5693d574355bcd51c3b7708ec1fdf3314c92af16abe55a5d2b6b439badcdb5b5b6d7ceda5d7bc69e45cffb1f7bdefb489eaffb32097a7b62b3105fc7e3fba9f9beea7e36627e6318266b7f1dacc3c0091cbecb91452c6431bd17f85d967e7473dbd8d7efeb681dab77e20c2d9745f9b16be9cff8b1f03198af933c5d5bc1789daeb375be2ed6e5ba5a5fd6b5b5b437741601fbf7fbd5b30fbe57a25f6bb15a16fc34ceba757416dfb3e83e9ce9d77ecd807df6ebceefd6cc62bc50c8d2eeb411f366bfd90bd7d26374b7beadb53573e4b2fee5fed5793f628aba5eaf37ebedfa6ebd5befd787f5717d5adfaf1fd68feba790c5fdd69eef5ac1b8b04fbf9ef76a7e704b3e584bbedb9f5950bffba8f7e2eb7e97fcb1df83b63eaf5f02d736cc28effa73246c8e1feb193f73d2e7373edfafe4b23c69bb7e5dbf35cafa7dfdc1e617c8f2f7f78ffdf38ff3283f69566595d196e7f5e7fa6bfdbd1eac87eb11d335bea38c568b980e4db0afbf8fa6c6acc7cffc04c6b2dfadd7cbe90f7a7bea77569a43967505d5e0a69a713e6171d79d36d1f3f5b8f776eb49bfa3b61f93cb389f38de7aba9eade7eabdd8d32b674be7afc8f2d3d9621ecf798f6a11dcaf179774bdcc5f36ea46d9181bb37faead164ebf368979c230a77db5439cb4602336661ab91436d3dc39174ba1fd0a2caa7f6511e4ae0f0b36569fdfacc6cce59f8ce3c6c9271b77e36dfc4d607da94f56f35b9bfed2b8fc7eb6381a2a9ee2da55972acd26dc449b78936cd24db6c9f9aa0bcb6eac27ffdbf68bbc782effdf76ae6549552488eee733a6f615fdba7dbb6356a899203e5a6db51f3b4444f0c14b1489987f9faa8202a4bd37b457331113b9d010943a661645669d93b6d9e37b5a6207f5ce54d90a7b630ee6244ed8f3c2d4532060d9afca32ad349d280e4d481246103617866ae8b10a11c3b2b36c86248e1fe983506f36cb7bd7f59cde1344592e9dd23decc91c0e90c0115250a0014d680104cf80a691efb672cf7c667bc1191af13a6a6c8d2ed758790ea8a041fba8a546ca6681e23a2c67047dffd9b4a1130fb9e20cbad0833e2ce34747a706bc2c0e85fef98baee722bfd4f4404187dc51957668dcd0c2d0b660004318c12b8c61025378f3347fb13bb0acbe5df0f8ab3a31cdd0e01d3ee0136ee036e9c2ddb1ed7437f7e95459c13d7169c0bcfd003fe0117eb2bb700a4ff08c94def1b9eef5e9337dca1557dfc052a8ea8aefae6ed98c216b9d45ef4ffa485524aebeeaa181333471eeaa5edbb7f71bff47100423b4421517519a70a1686ff7106f632dbe471b97ebe0a027b3a4874ec8a276354cdffc603e255ca59dee228325a4b8c2354b719e8d29bbca113774bcb961e319c8f15c1f6327bd3884873ca043ee1bdcda7dce35430f7d0c30740718e10e636fed2f7ddd7f0cc2861b3aa1161991827b3cecfa8d66ec6112bce2115354f693204dfadb96d559cd6ccab25f967cd21655d61b3627a2d61336b0892d72a03dc20e53978ef868d8fa229f5faee75a7fe935c07eb745b764495b08ec7d0311d5f514356ca3bffd70224ff774bfb3f1822818bb5ad8461d3bd8c5de6e837df6fe0507fb088787258ef015c7d68bd0fa1a7cc79ef3f0a8623d21573237714a0f6bb636061dba66de58d0211dac1b76bfe293ef6039b59ad281736c393795d713791dceebf80ee712f96e3009ddd07544a5d179e13613e6e4967d435ca3ec245389a0cad56bfd58aad7bf7aee9fc122ff178e852391e3f3ba9c7d9399eff23a234758aeb7d96b869def6fe7fb0f468e60216ac18678a2378b9890bd31a42ee18c42f1d27b720dcf09969c1fb0909d7904e76ec356026184f0baafc89d66956e3da5fecbf6f6f369d67545d6b5c5d924df135a7ec542cb5e26e49a7cbfc201afa191da8093df3604f79408ae9ab0ad576031ca9ca3caca1635c83935653d22cfb448ce3bcf6adc752c32e62a9eb9443352aa19aaaae7e288acea1ab4729f2cb50e052bf5d4871cf952b02732ae47d9db635ea9689b453c57bc2062244752ad5f5e84c592fcc3e1ee4c949995795bc152fdbea830d827ffc84c20e9088f91d2fb395e4b665b520152c3422492ebf27dce3a1163b10a2cc60916c11710bad85b6ed69a7320cdc09db863ceee0a1533e20c1ccef6c814cd995eb334f9fc9ecf4b7ebda988b5c23b67b1108e04dff03d63da7fc32f8b9a5f4caeec2fc7c9c7e6f5bc5e154b795ce2e596e3679fca7dd222b624e3bc58134fe3a1e0bbcd199677fcb81c4b3d6a7ea7d6aeb0fb7e71ceb9a3f5738b7cbeda2ba7de3ba79caf57e52fff15fb1fcbbfd3fefcfbaf3ffe0193cc32fd - - - - diff --git a/util/install/win/pages/sidedecorationimpl.cpp b/util/install/win/pages/sidedecorationimpl.cpp deleted file mode 100644 index aa25825..0000000 --- a/util/install/win/pages/sidedecorationimpl.cpp +++ /dev/null @@ -1,205 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "sidedecorationimpl.h" -#include -#include -#include -#include - -/* XPM */ -static char *check_data[] = { -/* width height num_colors chars_per_pixel */ -" 11 12 4 1", -/* colors */ -". c #939393", -"# c #dcdcdc", -"a c None", -"b c #191919", -/* pixels */ -"aaaaaaaaaa#", -"aaaaaaaaabb", -"aaaaaaaabba", -"aaaaaaabbaa", -"aaaaaabbaaa", -"a#aaabbaaaa", -"ab.a.b.aaaa", -"a#bbbbaaaaa", -"aabbbaaaaaa", -"aa#b.aaaaaa", -"aaa.aaaaaaa", -"aaaaaaaaaaa" -}; - -/* XPM */ -static char *arrow_data[] = { -/* width height num_colors chars_per_pixel */ -" 11 11 4 1", -/* colors */ -". c None", -"# c #b9b9b9", -"a c #8a8a8a", -"b c #0d0d0d", -/* pixels */ -"...##......", -"...ab#.....", -"...abb#....", -"...abbb#...", -"...abbbb#..", -"...abbbba..", -"...abbba...", -"...abba....", -"...aba.....", -"...aa......", -"..........." -}; - -/* XPM */ -static char *cross_data[] = { -/* width height num_colors chars_per_pixel */ -" 11 11 3 1", -/* colors */ -". c #cc0000", -"# c None", -"a c #fc3464", -/* pixels */ -"###########", -"###########", -"########a.#", -"##a####a.##", -"##a.###.###", -"###a...a###", -"####...####", -"####...a###", -"###.a##..##", -"##a.####aa#", -"##.########" -}; - - -SideDecorationImpl::SideDecorationImpl( QWidget* parent, const char* name, WindowFlags fl ) : - SideDecoration( parent, name, fl ), - checkPix( ( const char** ) check_data ), - arrowPix( ( const char** ) arrow_data ), - crossPix( ( const char** ) cross_data ), - activeBullet( -1 ) -{ - Q_ASSERT( layout() != 0 ); - if ( layout()->inherits("QBoxLayout") ) { - ((QBoxLayout*)layout())->setMargin( 0 ); - } - setSizePolicy( QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Expanding) ); - if ( globalInformation.reconfig() ) { - versionLabel->setText( "Reconfigure Qt " + globalInformation.qtVersionStr() ); - } else { -#if defined(QSA) - QString versionStr = globalInformation.qsaVersionStr(); - versionStr.replace( QRegExp(" Evaluation"), "" ); - versionLabel->setText( versionLabel->text().replace( "Qt", "QSA" ) + " " + versionStr ); -#elif defined(EVAL) - QString versionStr = globalInformation.qtVersionStr(); - versionStr.replace( QRegExp(" Evaluation"), "" ); - versionLabel->setText( versionLabel->text() + " " + versionStr ); -#elif defined(NON_COMMERCIAL) - QString versionStr = globalInformation.qtVersionStr(); - versionStr.replace( QRegExp(" Non-Commercial"), "" ); - versionLabel->setText( versionLabel->text() + " " + versionStr ); -#elif defined(EDU) - QString versionStr = globalInformation.qtVersionStr(); - versionStr.replace( QRegExp(" Educational"), "" ); - versionLabel->setText( versionLabel->text() + " " + versionStr ); -#else - versionLabel->setText( versionLabel->text() + " " + globalInformation.qtVersionStr() ); -#endif - } -#if defined(EVAL) - editionLabel->setText( "Evaluation Version" ); -#elif defined(NON_COMMERCIAL) - editionLabel->setText( "Non-Commercial Edition" ); -#elif defined(EDU) - editionLabel->setText( "Educational Edition" ); -#else - editionLabel->setText( "" ); -#endif -} - -SideDecorationImpl::~SideDecorationImpl() -{ -} - -void SideDecorationImpl::wizardPages( const QPtrList& li ) -{ - QBoxLayout *lay = 0; - Q_ASSERT( layout() != 0 ); - if ( layout()->inherits("QBoxLayout") ) { - lay = (QBoxLayout*)layout(); - } else { - return; - } - QPtrList list = li; - Page *page; - QGrid *grid = new QGrid( 2, this ); - grid->setSpacing( 2 ); - for ( page=list.first(); page; page=list.next() ) { - QLabel *l = new QLabel( grid ); - l->setSizePolicy( QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed) ); - bullets.append( l ); - l = new QLabel( page->shortTitle(), grid ); - } - lay->insertWidget( -1, grid ); - lay->insertStretch( -1 ); -} - -void SideDecorationImpl::wizardPageShowed( int a ) -{ - if ( activeBullet>=0 && (uint)activeBulletclear(); - else - bullets.at(activeBullet)->setPixmap( checkPix ); - } - bullets.at(a)->setPixmap( arrowPix ); - activeBullet = a; -} - -void SideDecorationImpl::wizardPageFailed( int a ) -{ - bullets.at(a)->setPixmap( crossPix ); -} diff --git a/util/install/win/pages/sidedecorationimpl.h b/util/install/win/pages/sidedecorationimpl.h deleted file mode 100644 index f39e204..0000000 --- a/util/install/win/pages/sidedecorationimpl.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef SIDEDECORATIONIMPL_H -#define SIDEDECORATIONIMPL_H - -#include "sidedecoration.h" -#include "pages.h" -#include -#include - -class SideDecorationImpl : public SideDecoration -{ - Q_OBJECT - -public: - SideDecorationImpl( QWidget* parent = 0, const char* name = 0, WindowFlags fl = 0 ); - ~SideDecorationImpl(); - -public slots: - void wizardPages( const QPtrList& ); - void wizardPageShowed( int ); - void wizardPageFailed( int ); - -private: - QPixmap checkPix; - QPixmap arrowPix; - QPixmap crossPix; - QPtrList bullets; - int activeBullet; -}; - -#endif // SIDEDECORATIONIMPL_H diff --git a/util/install/win/pages/winintropage.ui b/util/install/win/pages/winintropage.ui deleted file mode 100644 index ac2545b..0000000 --- a/util/install/win/pages/winintropage.ui +++ /dev/null @@ -1,39 +0,0 @@ - -WinIntroPage - - - WinIntroPage - - - - 0 - 0 - 387 - 228 - - - - Form1 - - - - unnamed - - - 11 - - - 6 - - - - textBrowser - - - <p>It is strongly recommended that you exit all Windows programs before running this install program.</p><p>Click <tt>Cancel</tt> to quit install and then close any programs you have running.</p><p>Click <tt>Next</tt> to continue with the setup program.</p> - - - - - - diff --git a/util/install/win/qt.arq b/util/install/win/qt.arq deleted file mode 100644 index f3f1ccc..0000000 --- a/util/install/win/qt.arq +++ /dev/null @@ -1,3 +0,0 @@ -This is just a dummy file. Use the package program to add the real qt.arq -file to the package. -This file must be smaller than 500 bytes. diff --git a/util/install/win/resource.cpp b/util/install/win/resource.cpp deleted file mode 100644 index 4ea0ad8..0000000 --- a/util/install/win/resource.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "resource.h" -#include -#include -#include - -#ifdef Q_OS_WIN32 -#include -#endif - -/* - Tries to load the binary resource \a resourceName. If the resource is - smaller than \a minimumSize, the resource is not loaded and isValid() - returns false. isValid() returns also false when the loading failed. - */ -ResourceLoader::ResourceLoader( char *resourceName, int minimumSize ) -{ -#if defined(Q_OS_WIN32) - valid = true; - - HMODULE hmodule = GetModuleHandle( 0 ); - // we don't need wide character versions - HRSRC resource = FindResourceA( hmodule, resourceName, MAKEINTRESOURCEA( 10 ) ); - HGLOBAL hglobal = LoadResource( hmodule, resource ); - arSize = SizeofResource( hmodule, resource ); - if ( arSize == 0 ) { - valid = false; - return; - } - if ( arSize < minimumSize ) { - valid = false; - return; - } - arData = (char*)LockResource( hglobal ); - if ( arData == 0 ) { - valid = false; - return; - } - ba.setRawData( arData, arSize ); -#elif defined(Q_OS_MAC) - valid = false; - arSize = 0; - arData = 0; - QFile f; - QString appDir = qApp->argv()[0]; - int truncpos = appDir.findRev( "/Contents/MacOS/" ); - if (truncpos != -1) - appDir.truncate( truncpos ); - QString path = appDir + "/Contents/Qt/"; - path += resourceName; - f.setName( path ); - if (!f.open( IO_ReadOnly )) - return; - QFileInfo fi(f); - arSize = fi.size(); - arData = new char[arSize]; - if (f.readBlock( arData, arSize ) != arSize) - { - delete[] arData; - return; - } - ba.setRawData( arData, arSize ); - valid = true; - return; -#endif -} - -ResourceLoader::~ResourceLoader() -{ - if ( isValid() ) - ba.resetRawData( arData, arSize ); -#if defined(Q_OS_MAC) - delete[] arData; -#endif -} - -bool ResourceLoader::isValid() const -{ - return valid; -} - -QByteArray ResourceLoader::data() -{ - return ba; -} - - -#if defined(Q_OS_WIN32) -ResourceSaver::ResourceSaver( const QString& appName ) - : applicationName(appName) -{ -} - -ResourceSaver::~ResourceSaver() -{ -} - -bool ResourceSaver::setData( char *resourceName, const QByteArray &data, QString *errorMessage ) -{ - // we don't need wide character versions - HANDLE hExe = BeginUpdateResourceA( applicationName.latin1(), false ); - if ( hExe == 0 ) { - if ( errorMessage ) - *errorMessage = QString("Could not load the executable %1.").arg(applicationName); - return false; - } - if ( !UpdateResourceA(hExe,(char*)RT_RCDATA,resourceName,0,data.data(),data.count()) ) { - EndUpdateResource( hExe, true ); - if ( errorMessage ) - *errorMessage = QString("Could not update the executable %1.").arg(applicationName); - return false; - } - if ( !EndUpdateResource(hExe,false) ) { - if ( errorMessage ) - *errorMessage = QString("Could not update the executable %1.").arg(applicationName); - return false; - } - - if ( errorMessage ) - *errorMessage = QString("Updated the executable %1.").arg(applicationName); - return true; -} -#endif diff --git a/util/install/win/resource.h b/util/install/win/resource.h deleted file mode 100644 index 791edfe..0000000 --- a/util/install/win/resource.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef RESOURCE_H -#define RESOURCE_H - -#include -#include - -class ResourceLoader -{ -public: - ResourceLoader( char *resourceName, int minimumSize=0 ); - ~ResourceLoader(); - - bool isValid() const; - QByteArray data(); - -private: - bool valid; - int arSize; - char *arData; - QByteArray ba; -}; - -#if defined(Q_OS_WIN32) -class ResourceSaver -{ -public: - ResourceSaver( const QString& appName ); - ~ResourceSaver(); - - bool setData( char *resourceName, const QByteArray &data, QString *errorMessage=0 ); - -private: - QString applicationName; -}; -#endif - -#endif // RESOURCE_H diff --git a/util/install/win/setupwizardimpl.cpp b/util/install/win/setupwizardimpl.cpp deleted file mode 100644 index 909d986..0000000 --- a/util/install/win/setupwizardimpl.cpp +++ /dev/null @@ -1,2571 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "setupwizardimpl.h" -#include "environment.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#if defined(Q_OS_WIN32) - -#include -#endif - -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) -#include -#endif - -#if defined(EVAL) -# define LICENSE_DEST "LICENSE.EVAL" -#elif defined(EDU) -# define LICENSE_DEST "LICENSE.EDU" -#elif defined(NON_COMMERCIAL) -# define LICENSE_DEST "LICENSE.NON_COMMERCIAL" -#else -# define LICENSE_DEST "LICENSE" -#endif - -#include "resource.h" -#include "pages/sidedecorationimpl.h" - -#define FILESTOCOPY 4582 - -static const char* const logo_data[] = { -"32 32 238 2", -"Qt c None", -"#u c #000000", -".# c #020204", -"a. c #102322", -"af c #282500", -"as c #292e26", -"a8 c #2c686a", -"ae c #307072", -"#C c #322a0c", -"#s c #36320c", -"am c #3b3d3f", -"#3 c #3c8082", -"#f c #3e3a0c", -"## c #423e0c", -"#9 c #434341", -"ad c #438888", -"aU c #458d8e", -"#g c #46420c", -"aM c #46494a", -"ay c #474948", -"#D c #4a4328", -".W c #4a4611", -"az c #4a4641", -"a1 c #4a4a49", -"aH c #4b9e9e", -"au c #4d9a9f", -"aS c #4e9a9a", -"an c #4f4e4a", -".X c #504e0c", -"a7 c #51a4a9", -"#0 c #525250", -"aT c #55a6a3", -".Y c #56520c", -"#a c #5a5604", -".Z c #5e5a0c", -".V c #5e5e5c", -"a0 c #5e5e60", -"a6 c #5ea0a6", -".J c #625e0c", -"bB c #64aaa9", -"#m c #665e2c", -"aL c #686867", -"bw c #68acb2", -"bo c #696928", -"ba c #696967", -"aE c #69aeb2", -"#z c #6a5614", -".K c #6a660c", -"aZ c #6a6a65", -"bG c #6db4b4", -".9 c #6e5e24", -"#. c #6e6a5c", -"bv c #6fb6b9", -"bC c #706d28", -"br c #70bcc5", -"aQ c #71b7ba", -".I c #726234", -".L c #726e0c", -".0 c #72720c", -"#w c #746d44", -"be c #747028", -"bH c #747428", -".M c #76720a", -"aR c #78c1c2", -"#Z c #797977", -"a2 c #7a5d3d", -"#H c #7a6614", -"#I c #7a760a", -"#l c #7a7634", -".1 c #7a7a0c", -"#e c #7a7a5c", -"bL c #7bc0c2", -"b. c #7c7d82", -"#d c #7e6e34", -".N c #7e7a0a", -"bP c #816c20", -".8 c #82763c", -"#h c #827a3c", -".x c #827e0c", -"#t c #827f4b", -".O c #828204", -"#v c #828384", -".P c #868604", -"bq c #87d4d9", -"#k c #89864b", -"#c c #8a8244", -".y c #8a8604", -"#j c #8d8652", -"al c #8d8d8a", -"#b c #8e8644", -".z c #8e8e04", -"aW c #8f9094", -"#i c #908952", -"#Q c #909021", -"ag c #90d0d2", -"bO c #916f34", -"bQ c #91cdd3", -".7 c #928a44", -"#p c #928e6c", -"#P c #947f2f", -".A c #949204", -"bh c #949495", -".6 c #968e4c", -"aC c #999721", -".w c #9a8a44", -"#M c #9a9a99", -"ap c #9b9b21", -".5 c #9c924c", -"#R c #9c9a04", -"#7 c #9d9d9b", -"ao c #9e7641", -".4 c #9e964c", -"#J c #9e9b21", -".B c #9e9e04", -"ac c #9e9e9d", -"#S c #a09e21", -"ax c #a0a0a3", -"aK c #a1a1a2", -"aX c #a1a1a4", -".r c #a2a204", -"#1 c #a2a221", -"aF c #a2e1dd", -".3 c #a49a54", -".2 c #a69e54", -"bR c #a78446", -"#6 c #a9a9a8", -".T c #aaa254", -".s c #aaaa04", -"#W c #abaaa6", -"aN c #ac8861", -".S c #aea25c", -".R c #aea65c", -".t c #aeae04", -"#L c #b0b0b0", -"#o c #b2ae94", -".u c #b2b204", -"aI c #b2b2b4", -"b# c #b3b3b2", -"#X c #b4b4b6", -"#V c #b5b4b4", -".Q c #b6aa5c", -".n c #b6b604", -"aY c #b6b6b7", -"bN c #b79658", -"ah c #b7e5e3", -"aG c #b7ebe9", -"ar c #b9d9dc", -"#8 c #bcbcbe", -"ab c #bdbdbe", -".m c #beae5c", -".F c #beb264", -"aq c #bef6f6", -"aB c #c1a470", -"#F c #c1c1c3", -".E c #c2b664", -"at c #c2e9eb", -"bI c #c39c6a", -"bs c #c3a366", -"#U c #c3c3c0", -"aw c #c3c3c1", -"#G c #c3c3c7", -"aD c #c3f1f2", -"a# c #c6c6c3", -"#2 c #c7edf3", -".D c #c8ba6c", -"bM c #c9a470", -"#N c #c9c9c4", -".C c #cabe6c", -"ak c #cacaca", -"bx c #cbb076", -"aa c #cbcbc9", -"a3 c #ccac7f", -".H c #ceba54", -"#E c #ceced0", -"bi c #cfaf7e", -"#Y c #cfcfcb", -"bK c #d1ac80", -"#5 c #d1d1cf", -"bu c #d2ae83", -"bm c #d3b180", -"bD c #d3b384", -"bF c #d4b589", -"aJ c #d4d4d3", -".j c #d6c664", -".v c #d6c674", -"#K c #d6d6d5", -"bJ c #d7b588", -"bd c #d8b289", -"bz c #d8b78d", -".q c #d8ca74", -"aj c #d8d8d9", -"bb c #dabd97", -"a5 c #dcba91", -"bE c #dcc097", -"aA c #ddc292", -"aP c #dec491", -".p c #dece75", -"bk c #dfc79c", -"av c #e0e0e0", -"#A c #e2dabc", -"#O c #e2e2e4", -"aO c #e3c898", -"by c #e4c7a1", -".l c #e6da84", -"a4 c #e7c7a2", -"bt c #eacaa5", -".o c #eede84", -".G c #eee284", -".i c #eee294", -"bn c #efd7b4", -".k c #f2e69c", -".e c #f2eaa4", -"bc c #f3d8b8", -"bj c #f5e2c8", -"#r c #f6eea4", -".f c #f6eeb8", -".g c #f6f2cc", -".c c #faf6d4", -".d c #fafae4", -".U c #feee95", -"bA c #fef26c", -"#q c #fef2ac", -"#x c #fef2b8", -"bp c #fef684", -"bl c #fef690", -"bg c #fef69c", -"bf c #fef6a4", -".a c #fef6b4", -"#B c #fef6c4", -"#y c #fef6ce", -"a9 c #fefaac", -"aV c #fefab7", -"ai c #fefac4", -"#4 c #fefad1", -"#n c #fefadf", -".h c #fefaec", -"#T c #fefee6", -".b c #fefefa", -"QtQtQtQtQtQtQtQtQtQtQtQt.#QtQtQtQtQtQt.#QtQtQtQtQtQtQtQtQtQtQtQt", -"QtQtQtQtQtQtQtQtQtQt.#.#.a.#QtQtQtQt.#.b.#.#QtQtQtQtQtQtQtQtQtQt", -"QtQtQtQtQtQtQtQt.#.#.a.a.a.a.#QtQt.#.c.d.b.b.#.#QtQtQtQtQtQtQtQt", -"QtQtQtQtQtQt.#.#.e.e.e.e.e.e.e.#.#.f.f.g.g.c.h.b.#.#QtQtQtQtQtQt", -"QtQtQtQt.#.#.i.i.i.i.i.i.i.i.j.j.b.b.k.e.f.f.g.g.c.d.#.#QtQtQtQt", -"QtQt.#.#.l.l.l.l.l.l.l.l.m.m.n.n.o.o.b.b.k.k.e.f.f.g.g.c.#.#QtQt", -"Qt.#.p.p.q.p.p.p.p.p.m.m.r.s.t.u.p.q.v.v.b.b.i.i.k.e.f.f.g.g.#Qt", -"QtQt.#.j.j.j.j.j.w.w.x.y.z.A.B.r.C.C.D.E.E.F.b.b.o.G.k.k.e.#QtQt", -"QtQtQt.#.H.H.I.I.J.K.L.M.N.O.P.z.Q.Q.Q.R.R.R.S.T.b.b.G.G.#QtQtQt", -"Qt.#.#.U.V.W.W.W.X.Y.Z.J.K.L.0.1.2.3.3.4.5.5.6.6.7.8.9#..b.#.#Qt", -"QtQtQt.#.U.U.U.W.W##.W.X.Y#a.J.K.7.7#b#b#b#c#c#d#d.h.h.b.#QtQtQt", -"QtQtQtQt.##e.U.U.U.W.W#f#g.W.X.Y#h#i#j#k#l#m#m#n#n.h#g.#QtQtQtQt", -"QtQtQtQt.##o#p#e#q#q#r#f#f#s#f#g#t#u#v#u#w#x#y#y#g#g#z.#QtQtQtQt", -"QtQtQtQt.#.b#A#o#p#e#B#B#B#C#C#D#u#E#F#G#u#y#g#g#H#I#J#uQtQtQtQt", -"QtQtQtQt.#.b.h.b#A#o#p#e.d.d.d#u#K#L#M#N#O#u#P#Q#R#S#u#u#uQtQtQt", -"QtQtQtQt.#.b#T.h#T#n#A#o#p#e#u#U#V#W#X#Y#Z#0#u#1#S#u#2#3#uQtQtQt", -"QtQtQtQt.##T.h#T#n#T#n#4#A#u#5#6#7#6#8#Z#0#9#u#S#u#2#3a.Qt#u#uQt", -"QtQtQtQt.##T#n#T#4#4#4#4#u#Oa#aaabac#Z#9#9#u#S#u#2adaeaf#uagah#u", -"QtQtQtQt.##n#n#4#4#4ai#u#Oajak#Yalamanao#u#Sap#uaqar#3asagatau#u", -"QtQtQtQt.##T#4#4#4ai#uav#O#OawaxayazaAaB#uapaC#uaDaEaFaGataH#uQt", -"QtQtQtQt.##4#4aiaiai#uaIaJ#OaKaLaMaNaOaPao#u#uaDaQaRaSaTaU#uQtQt", -"QtQtQtQt.##4aiaV.aaV#uaWaXaYaZa0a1a2a3a4a5ao#ua6a7a8#u#u#uQtQtQt", -"QtQtQtQt.#aiaiaiaV.aa9#ub.b#baa0#u#1#ubbbcbdao#ua8#ube.#.#.#.#Qt", -"QtQtQtQt.#aV.aaVaVbfbfbg#ubhba#u#1.AaC#ubibjbkao#ube#a.#.#.#.#.#", -"QtQtQtQt.#.aa9.abfa9bgbgbg#u#ubl.AaC#uaD#ubmbna5ao#ubo.#.#.#.#Qt", -"QtQtQtQt.#.aa9a9bgbgblblblblbpbpaC#uaDbqbr#ubsbtbuao#u.#.#QtQtQt", -"QtQtQtQtQt.#.#bgbgbgblblbpbpbpbp#uatbvbwa8#u#ubxbybzao#uQtQtQtQt", -"QtQtQtQtQtQtQt.#.#blblbpbpbAbp#uaDbBbwa8#ubebC#ubDbEbFao#uQtQtQt", -"QtQtQtQtQtQtQtQtQt.#.#bAbpbA#uaDbGbwa8#ubH.#.#Qt#ubIbJbKao#uQtQt", -"QtQtQtQtQtQtQtQtQtQtQt.#.##uaDbLbwa8#u.#.#QtQtQtQt#ubMbNbObP#uQt", -"QtQtQtQtQtQtQtQtQtQtQtQtQt#ubQbwa8#u.#QtQtQtQtQtQtQt#ubRbO#uQtQt", -"QtQtQtQtQtQtQtQtQtQtQtQtQtQt#u#u#uQtQtQtQtQtQtQtQtQtQt#u#uQtQtQt"}; - -static bool findFileInPaths( const QString &fileName, const QStringList &paths ) -{ - QDir d; - for( QStringList::ConstIterator it = paths.begin(); it != paths.end(); ++it ) { - // Remove any leading or trailing ", this is commonly used in the environment - // variables - QString path = (*it); - if ( path.startsWith( "\"" ) ) - path = path.right( path.length() - 1 ); - if ( path.endsWith( "\"" ) ) - path = path.left( path.length() - 1 ); - if( d.exists( path + QDir::separator() + fileName ) ) - return true; - } - return false; -} - -bool findFile( const QString &fileName ) -{ - QString file = fileName.lower(); - QStringList paths; -#if defined(Q_OS_WIN32) - QRegExp split( "[;,]" ); -#else - QRegExp split( "[:]" ); -#endif - if ( file.endsWith( ".h" ) ) { - if ( globalInformation.sysId() == GlobalInformation::Borland ) - return true; - paths = QStringList::split( split, QEnvironment::getEnv( "INCLUDE" ) ); - } else if ( file.endsWith( ".lib" ) ) { - if ( globalInformation.sysId() == GlobalInformation::Borland ) - return true; - paths = QStringList::split( split, QEnvironment::getEnv( "LIB" ) ); - } else { - paths = QStringList::split( split, QEnvironment::getEnv( "PATH" ) ); - } - return findFileInPaths( file, paths ); -} - -static bool createDir( const QString& fullPath ) -{ - QStringList hierarchy = QStringList::split( QDir::separator(), fullPath ); - QString pathComponent, tmpPath; - QDir dirTmp; - bool success = true; - - for( QStringList::Iterator it = hierarchy.begin(); it != hierarchy.end(); ++it ) { - pathComponent = *it + QDir::separator(); - tmpPath += pathComponent; -#if defined(Q_OS_WIN32) - success = dirTmp.mkdir( tmpPath ); -#else - success = dirTmp.mkdir( QDir::separator() + tmpPath ); -#endif - } - return success; -} - -SetupWizardImpl::SetupWizardImpl( QWidget* parent, const char* name, bool modal, WindowFlags flag ) : - QWizard( parent, name, modal, flag ), - tmpPath( QEnvironment::getTempPath() ), - fixedPath(false), - filesCopied( false ), - filesToCompile( 0 ), - filesCompiled( 0 ), - licensePage( 0 ), - licenseAgreementPage( 0 ), - licenseAgreementPageQsa( 0 ), - optionsPage( 0 ), - optionsPageQsa( 0 ), - foldersPage( 0 ), - configPage( 0 ), - progressPage( 0 ), - buildPage( 0 ), - finishPage( 0 ) -{ - // initialize - if ( !name ) - setName( "SetupWizard" ); - resize( 600, 390 ); -#if defined(QSA) - setCaption( trUtf8( "QSA Installation Wizard" ) ); -#else - setCaption( trUtf8( "Qt Installation Wizard" ) ); -#endif - QPixmap logo( ( const char** ) logo_data ); - setIcon( logo ); -#if defined(QSA) - setIconText( trUtf8( "QSA Installation Wizard" ) ); -#else - setIconText( trUtf8( "Qt Installation Wizard" ) ); -#endif - QFont f( font() ); - f.setFamily( "Arial" ); - f.setPointSize( 12 ); - f.setBold( true ); - setTitleFont( f ); - - totalFiles = 0; - - // try to read the archive header information and use them instead of - // QT_VERSION_STR if possible - QArchiveHeader *archiveHeader = 0; - ResourceLoader rcLoader( "QT_ARQ", 500 ); - if ( rcLoader.isValid() ) { - // First, try to find qt.arq as a binary resource to the file. - QArchive ar; - QDataStream ds( rcLoader.data(), IO_ReadOnly ); - archiveHeader = ar.readArchiveHeader( &ds ); - } else { - // If the resource could not be loaded or is smaller than 500 - // bytes, we have the dummy qt.arq: try to find and install - // from qt.arq in the current directory instead. - QArchive ar; - QString archiveName = "qt.arq"; -# if defined(Q_OS_MAC) - QString appDir = qApp->argv()[0]; - int truncpos = appDir.findRev( "/Contents/MacOS/" ); - if (truncpos != -1) - appDir.truncate( truncpos ); - archiveName = appDir + "/Contents/Qt/qtmac.arq"; -# endif - ar.setPath( archiveName ); - if( ar.open( IO_ReadOnly ) ) { - archiveHeader = ar.readArchiveHeader(); - } - } - -#if defined(QSA) - ResourceLoader rcLoaderQsa( "QSA_ARQ", 500 ); - if ( rcLoaderQsa.isValid() ) { - // First, try to find qt.arq as a binary resource to the file. - QArchive ar; - QDataStream ds( rcLoaderQsa.data(), IO_ReadOnly ); - QArchiveHeader *archiveHeaderQsa = ar.readArchiveHeader( &ds ); - if ( archiveHeaderQsa ) { - QString qsa_version_str = archiveHeaderQsa->description(); - if ( !qsa_version_str.isEmpty() ) - globalInformation.setQsaVersionStr( qsa_version_str ); - delete archiveHeaderQsa; - } - } -#endif - -#if defined(Q_OS_WIN32) - // First check for MSVC 6.0 - QString regValue = QEnvironment::getRegistryString( "Software\\Microsoft\\VisualStudio\\6.0\\Setup\\Microsoft Visual C++", "ProductDir", QEnvironment::LocalMachine ); - if (!regValue.isEmpty()) - globalInformation.setSysId(GlobalInformation::MSVC); - - // MSVC.NET 7.0 & 7.1 takes presedence over 6.0 - regValue = QEnvironment::getRegistryString( "Software\\Microsoft\\VisualStudio\\7.0", "InstallDir", QEnvironment::LocalMachine ); - if (regValue.isEmpty()) - regValue = QEnvironment::getRegistryString( "Software\\Microsoft\\VisualStudio\\7.1", "InstallDir", QEnvironment::LocalMachine ); - if (!regValue.isEmpty()) - globalInformation.setSysId(GlobalInformation::MSVCNET); - - while (globalInformation.sysId() == GlobalInformation::Other) { - globalInformation.setSysId(GlobalInformation::Borland); - if (findFile(globalInformation.text(GlobalInformation::MakeTool))) - break; - globalInformation.setSysId(GlobalInformation::MSVCNET); - if (findFile(globalInformation.text(GlobalInformation::MakeTool))) - break; - globalInformation.setSysId(GlobalInformation::MinGW); - if (findFile(globalInformation.text(GlobalInformation::MakeTool))) - break; - globalInformation.setSysId(GlobalInformation::Watcom); - if (findFile(globalInformation.text(GlobalInformation::MakeTool))) - break; - } -#endif - - if ( archiveHeader ) { - QString qt_version_str = archiveHeader->description(); - if ( !qt_version_str.isEmpty() ) - globalInformation.setQtVersionStr( qt_version_str ); - -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - if ( archiveHeader->findExtraData( "compiler" ) == "borland" ) - globalInformation.setSysId(GlobalInformation::Borland); -#endif - delete archiveHeader; - } - - initPages(); - initConnections(); - - if (optionsPage) { -#if defined(QSA) - optionsPage->installPath->setText( - QString( "C:\\Qt_QSA\\Qt" ) + - QString( globalInformation.qtVersionStr() ).replace( QRegExp("\\s"), "" ).replace( QRegExp("-"), "" ) - ); -#endif - } - if ( optionsPageQsa ) { -#if defined(QSA) - optionsPageQsa->installPath->setText( - QString( "C:\\Qt_QSA\\QSA" ) + - QString( globalInformation.qsaVersionStr() ).replace( QRegExp("\\s"), "" ).replace( QRegExp("-"), "" ) - ); -#endif - } - readLicense( QDir::homeDirPath() + "/.qt-license" ); -} - -static bool copyFile( const QString& src, const QString& dest ) -{ -#ifdef Q_WS_WIN - QT_WA( { - return CopyFileW( (const wchar_t*)src.ucs2(), (const wchar_t*)dest.ucs2(), false ); - }, { - return CopyFileA( src.local8Bit(), dest.local8Bit(), false ); - } ); -#else - int len; - const int buflen = 4096; - char buf[buflen]; - QFileInfo info( src ); - QFile srcFile( src ), destFile( dest ); - if (!srcFile.open( IO_ReadOnly )) - return false; - destFile.remove(); - if (!destFile.open( IO_WriteOnly )) - return false; - - while (!srcFile.atEnd()) { - len = srcFile.readBlock( buf, buflen ); - if (len <= 0) - break; - if (destFile.writeBlock( buf, len ) != len) - return false; - } - destFile.flush(); - return true; -#endif -} - -void SetupWizardImpl::initPages() -{ -#define ADD_PAGE( var, Class ) \ - { \ - var = new Class( this, #var ); \ - SideDecorationImpl *sideDeco = new SideDecorationImpl( var ); \ - \ - Q_ASSERT( var->layout() != 0 ); \ - if ( var->layout()->inherits("QBoxLayout") ) { \ - ((QBoxLayout*)var->layout())->insertWidget( 0, sideDeco ); \ - ((QBoxLayout*)var->layout())->insertSpacing( 1, 10 ); \ - } \ - \ - pages.append( var ); \ - addPage( var, var->title() ); \ - setHelpEnabled( var, false ); \ - \ - connect( this, SIGNAL(wizardPages(const QPtrList&)), \ - sideDeco, SLOT(wizardPages(const QPtrList&)) ); \ - connect( this, SIGNAL(wizardPageShowed(int)), \ - sideDeco, SLOT(wizardPageShowed(int)) ); \ - connect( this, SIGNAL(wizardPageFailed(int)), \ - sideDeco, SLOT(wizardPageFailed(int)) ); \ - connect( this, SIGNAL(editionString(const QString&)), \ - sideDeco->editionLabel, SLOT(setText(const QString&)) ); \ - } - - QPtrList pages; - if( globalInformation.reconfig() ) { - ADD_PAGE( configPage, ConfigPageImpl ) - ADD_PAGE( buildPage, BuildPageImpl ) - ADD_PAGE( finishPage, FinishPageImpl ) - } else { -#if defined(Q_OS_WIN32) - ADD_PAGE( winIntroPage, WinIntroPageImpl ) -#endif -#if !defined(EVAL_CD) && !defined(NON_COMMERCIAL) - ADD_PAGE( licensePage, LicensePageImpl ) -#endif - ADD_PAGE( licenseAgreementPage, LicenseAgreementPageImpl) -#if defined(QSA) - ADD_PAGE( licenseAgreementPageQsa, LicenseAgreementPageImpl) -#endif - ADD_PAGE( optionsPage, OptionsPageImpl ) -#if defined(QSA) - ADD_PAGE( optionsPageQsa, OptionsPageImpl ) -#endif -#if !defined(Q_OS_UNIX) - ADD_PAGE( foldersPage, FoldersPageImpl ) -#endif - ADD_PAGE( configPage, ConfigPageImpl ) - ADD_PAGE( progressPage, ProgressPageImpl ) - ADD_PAGE( buildPage, BuildPageImpl ) - ADD_PAGE( finishPage, FinishPageImpl ) - } -#undef ADD_PAGE - - if ( licensePage ) { - setNextEnabled( licensePage, false ); - } - if ( licenseAgreementPage ) { - setNextEnabled( licenseAgreementPage, false ); - } - if ( licenseAgreementPageQsa ) { - setNextEnabled( licenseAgreementPageQsa, false ); - licenseAgreementPage->titleStr = "License agreement Qt"; - licenseAgreementPageQsa->titleStr = "License agreement QSA"; - } - if ( optionsPage ) { - setBackEnabled( optionsPage, false ); - } - if ( optionsPageQsa ) { - optionsPageQsa->installExamples->hide(); - optionsPageQsa->installTools->hide(); - optionsPageQsa->installExtensions->hide(); - optionsPageQsa->installTutorials->hide(); - optionsPageQsa->skipBuild->hide(); - optionsPageQsa->installDocs->hide(); - optionsPageQsa->sysGroup->hide(); - optionsPageQsa->pathLabel->setText("QSA destination &path"); - - optionsPage->titleStr = "Options for Qt"; - optionsPage->shortTitleStr = "Choose options for Qt"; - optionsPageQsa->titleStr = "Options for QSA"; - optionsPageQsa->shortTitleStr = "Choose options for QSA"; - } - if ( configPage ) - setBackEnabled( configPage, false ); - if ( progressPage ) { - setBackEnabled( progressPage, false ); - setNextEnabled( progressPage, false ); - } - if ( buildPage ) { - setBackEnabled( buildPage, false ); - setNextEnabled( buildPage, false ); - } - if ( finishPage ) { - setBackEnabled( finishPage, false ); - setFinishEnabled( finishPage, true ); - } - emit wizardPages( pages ); -} - -void SetupWizardImpl::initConnections() -{ - connect( &autoContTimer, SIGNAL( timeout() ), this, SLOT( timerFired() ) ); - - if ( optionsPage ) { - connect( optionsPage->sysGroup, SIGNAL(clicked(int)), SLOT(clickedSystem(int))); - connect( optionsPage->sysOtherCombo, SIGNAL(activated(int)), SLOT(sysOtherComboChanged(int))); - } - if ( foldersPage ) { - connect( foldersPage->folderPathButton, SIGNAL(clicked()), SLOT(clickedFolderPath())); - connect( foldersPage->devSysPathButton, SIGNAL(clicked()), SLOT(clickedDevSysPath())); - } - if ( licensePage ) { - connect( licensePage->readLicenseButton, SIGNAL(clicked()), SLOT(clickedLicenseFile())); - connect( licensePage->customerID, SIGNAL(textChanged(const QString&)), SLOT(licenseChanged())); - connect( licensePage->licenseID, SIGNAL(textChanged(const QString&)), SLOT(licenseChanged())); - connect( licensePage->licenseeName, SIGNAL(textChanged(const QString&)), SLOT(licenseChanged())); - connect( licensePage->expiryDate, SIGNAL(textChanged(const QString&)), SLOT(licenseChanged())); - connect( licensePage->productsString, SIGNAL(activated(int)), SLOT(licenseChanged())); - connect( licensePage->key, SIGNAL(textChanged(const QString&)), SLOT(licenseChanged())); - } - if ( configPage ) { - connect( configPage->configTabs, SIGNAL(currentChanged(QWidget*)), SLOT(configPageChanged())); - } - if ( buildPage ) { - connect( &configure, SIGNAL( processExited() ), this, SLOT( configDone() ) ); - connect( &configure, SIGNAL( readyReadStdout() ), this, SLOT( readConfigureOutput() ) ); - connect( &configure, SIGNAL( readyReadStderr() ), this, SLOT( readConfigureError() ) ); - connect( &make, SIGNAL( processExited() ), this, SLOT( makeDone() ) ); - connect( &make, SIGNAL( readyReadStdout() ), this, SLOT( readMakeOutput() ) ); - connect( &make, SIGNAL( readyReadStderr() ), this, SLOT( readMakeError() ) ); - connect( buildPage->restartBuild, SIGNAL(clicked()), this, SLOT(restartBuild()) ); - } -} - -void SetupWizardImpl::stopProcesses() -{ - if( cleaner.isRunning() ) - cleaner.kill(); - if( configure.isRunning() ) - configure.kill(); - if( make.isRunning() ) - make.kill(); -} - -void SetupWizardImpl::clickedFolderPath() -{ - foldersPage->folderPath->setText( shell.selectFolder( foldersPage->folderPath->text(), ( foldersPage->folderGroups->currentItem() == 0 ) ) ); -} - -void SetupWizardImpl::clickedDevSysPath() -{ - QDir dir( foldersPage->devSysPath->text() ); - if( !dir.exists() ) - dir.setPath( devSysFolder ); - - QString dest = QFileDialog::getExistingDirectory( dir.absPath(), this, 0, "Select the path to Microsoft Visual Studio" ); - if (!dest.isNull()) - foldersPage->devSysPath->setText( dest ); -} - -void SetupWizardImpl::sysOtherComboChanged(int) -{ - clickedSystem(GlobalInformation::Other); -} - -static QString getDirectoryList(const char *envvar) -{ - QString environment; - const char *cpath = getenv(envvar); - if (cpath) { - environment = QString::fromLocal8Bit(cpath); - environment = QStringList::split(QRegExp("[;,]"), environment).join("\n"); - } else { - environment = ""; - } - return environment; -} - -void SetupWizardImpl::clickedSystem( int sys ) -{ -#ifndef Q_OS_MACX - if (sys == 99) // This is the Integrate with IDE checkbox - return; - globalInformation.setSysId( GlobalInformation::SysId(sys) ); - if (sys == GlobalInformation::Other) { - if (optionsPage->sysOtherCombo->currentText() == "win32-watcom") - globalInformation.setSysId(GlobalInformation::Watcom); - } - if (!isVisible()) - return; - QString makeCmd = globalInformation.text(GlobalInformation::MakeTool); - QString environment; - fixedPath = false; - if ( !optionsPage->skipBuild->isChecked() && optionsPage->skipBuild->isEnabled() ) { - QString commandTool; - environment = getenv("COMSPEC"); - if( qWinVersion() & WV_DOS_based ) - commandTool = "command.com"; - else - commandTool = "cmd.exe"; - if (!environment.isEmpty() && !environment.endsWith(commandTool, false)) { - if (QMessageBox::critical(this, "Environment problems", - "The 'COMSPEC' environment variable is not set to use\n" - "'" + commandTool + "'. This could cause some problems when building.\n" - "If you have difficulty then change it to use '" + commandTool + "'\n" - "and restart the installation\n\n" - "Please contact your local system administration if you have\n" - "difficulties finding the file, or if you don't know how to\n" - "modify the environment settings on your system.\n\n" - "Alternatively, by clicking yes, the installer will try to set\n" - "these for you.", - QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) - fixEnvironment("COMSPEC", commandTool); - } - if( !findFile( makeCmd ) ) { - environment = getDirectoryList("PATH"); - // ### try to adjust environment - if (QMessageBox::critical(this, "Environment problems", - "The make tool '" + makeCmd + "' could not be located in any\n" - "directory listed in the 'PATH' environment variable:" - "\n\n" + environment + "\n\n" - "Make sure the path to this file is present in the PATH environment\n" - "variable and restart the installation.\n" - "\n" - "You can find the path to the tool using the 'Find' tool\n" - "and add the location to the environment settings of your\n" - "system. Please contact your local system administration if\n" - "you have difficulties finding the files, or if you don't\n" - "know how to modifiy the environment settings of your system.\n\n" - "Alternatively, by clicking yes, the installer will try to set\n" - "these for you.", - QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) - fixEnvironment("PATH", makeCmd); - } - if (globalInformation.sysId() != GlobalInformation::Borland && globalInformation.sysId() != GlobalInformation::MinGW) { - if (!findFile( "string.h" ) ) { - environment = getDirectoryList("INCLUDE"); - // ### try to adjust environment - if (QMessageBox::critical(this, "Environment problems", - "The file 'string.h' could not be located in any directory\n" - "listed in the 'INCLUDE' environment variable:\n\n" + environment + "\n\n" - "You might have to install the platform headers, or adjust\n" - "the environment variables of your system, and restart the\n" - "installation.\n\n" - "Please contact your local system administration if you have\n" - "difficulties finding the file, or if you don't know how to\n" - "modify the environment settings on your system.\n\n" - "Alternatively, by clicking yes, the installer will try to set\n" - "these for you.", - QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) - fixEnvironment("INCLUDE", "string.h"); - - } - if (!findFile("ole32.lib")) { - environment = getDirectoryList("LIB"); - // ### try to adjust environment - if (QMessageBox::critical(this, "Environment problems", - "The file 'ole32.lib' could not be located in any directory\n" - "listed in the 'LIB' environment variable:\n\n" + environment + "\n\n" - "You might have to install the platform libraries, or adjust\n" - "the environment variables of your system, and restart the\n" - "installation.\n\n" - "Please contact your local system administration if you have\n" - "difficulties finding the file, or if you don't know how to\n" - "modify the environment settings on your system.\n\n" - "Alternatively, by clicking yes, the installer will try to set\n" - "these for you.", - QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) - fixEnvironment("LIB", "ole32.lib"); - - } - bool foundCommonDll = false; - QString commonDll; - QString commonDllText; - QString presentFileText = "Make sure the path to this file is present in the PATH environment\n"; - if (globalInformation.sysId() == GlobalInformation::MSVC) { - commonDll = "mspdb60.dll"; - foundCommonDll = findFile(commonDll); - commonDllText = "The file 'mspdb60.dll' "; - } else if(globalInformation.sysId() == GlobalInformation::MSVCNET) { - commonDll = "mspdb70.dll"; - foundCommonDll = findFile(commonDll); - if (!foundCommonDll) { - commonDll = "mspdb71.dll"; - foundCommonDll = findFile(commonDll); - commonDllText = "The files 'mspdb70.dll' and 'mspdb71.dll' "; // VC 7.0 or VC 7.1 - presentFileText = "Make sure the path to one of these files is present in the PATH environment\n"; - } - } else { - foundCommonDll = true; - } - if(!foundCommonDll && !fixedPath) { - environment = getDirectoryList("PATH"); - // ### try to adjust environment - if (QMessageBox::critical(this, "Environment problems", - commonDllText + "could not be located in any\n" - "directory listed in the 'PATH' environment variable:" - "\n\n" + environment + "\n\n" - + presentFileText + - "variable and restart the installation.\n" - "\n" - "You can find the path to the tool using the 'Find' tool\n" - "and add the location to the environment settings of your\n" - "system. Please contact your local system administration if\n" - "you have difficulties finding the files, or if you don't\n" - "know how to modifiy the environment settings of your system.\n\n" - "Alternatively, by clicking yes, the installer will try to set\n" - "these for you.", - QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) - fixEnvironment("PATH", commonDllText); - - } - } - if (globalInformation.sysId() == GlobalInformation::Intel && !findFile("icl.exe")) { - environment = getDirectoryList("PATH"); - if (QMessageBox::critical(this, "Environment problems", - "The Intel C++ compiler (icl.exe) could not be found\n" - "in your PATH:\n\n" + environment + "\n\n" - "Make sure the path to this file is present in the PATH environment\n" - "variable and restart the installation.\n" - "\n" - "You can find the path to the tool using the 'Find' tool\n" - "and add the location to the environment settings of your\n" - "system. Please contact your local system administration if\n" - "you have difficulties finding the files, or if you don't\n" - "know how to modifiy the environment settings of your system.\n\n" - "Alternatively, by clicking yes, the installer will try to set\n" - "these for you.", - QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) - fixEnvironment("PATH", "icl.exe"); - - } - } -#endif -} - -void SetupWizardImpl::fixEnvironment(const QString &var, const QString &file) -{ - if (var == "COMSPEC" || !(globalInformation.sysId() == GlobalInformation::MSVC || - globalInformation.sysId() == GlobalInformation::MSVCNET)) { - QString fn = QDir::toNativeSeparators(QFileDialog::getOpenFileName(QString(), QString(), this, 0, - "Please find " + file)); - QString envs = getenv(var); - if (var != "COMSPEC") { - fn.truncate(fn.findRev("\\") - 1); - fn += ";" + envs; - } - if (!fn.isEmpty()) - QEnvironment::putEnv(var, fn, QEnvironment::PersistentEnv | QEnvironment::LocalEnv); - } else if (globalInformation.sysId() == GlobalInformation::MSVC) { - QString visualStudio = - QEnvironment::getRegistryString("Software\\Microsoft\\VisualStudio\\6.0\\Setup\\Microsoft Visual Studio", - "ProductDir", QEnvironment::LocalMachine); - if (var == "PATH" && !fixedPath) { - QString newPaths = visualStudio + "\\vc98\\bin;"; - newPaths += visualStudio + "\\Common\\MSDev98\\Bin;"; - if (qWinVersion() & Qt::WV_NT_based) - newPaths += visualStudio + "\\Common\\Tools\\WinNT;"; - else - newPaths += visualStudio + "\\Common\\Tools\\Win95;"; - QEnvironment::putEnv("PATH", newPaths + getenv("PATH"), - QEnvironment::PersistentEnv | QEnvironment::LocalEnv); - fixedPath = true; - } else if (var == "LIB") { - QString newPaths = visualStudio + "\\vc98\\lib;"; - newPaths += visualStudio + "\\vc98\\mfc\\lib;"; - QEnvironment::putEnv("LIB", newPaths + getenv("LIB"), - QEnvironment::PersistentEnv | QEnvironment::LocalEnv); - } else if (var == "INCLUDE") { - QString newPaths = visualStudio + "\\vc98\\atl\\include;"; - newPaths += visualStudio + "\\vc98\\include;"; - newPaths += visualStudio + "\\vc98\\mfc\\include;"; - QEnvironment::putEnv("INCLUDE", newPaths + getenv("INCLUDE"), - QEnvironment::PersistentEnv | QEnvironment::LocalEnv); - } - } else if (globalInformation.sysId() == GlobalInformation::MSVCNET) { - QString visualStudio = QEnvironment::getRegistryString("Software\\Microsoft\\VisualStudio\\7.1\\Setup\\VS", - "ProductDir", QEnvironment::LocalMachine); - if (visualStudio.isEmpty()) - visualStudio = QEnvironment::getRegistryString("Software\\Microsoft\\VisualStudio\\7.0\\Setup\\VS", - "ProductDir", QEnvironment::LocalMachine); - // With .NET this isn't so easily done, we need to read in the vsvars32.bat file - // to get this right - QFile f(visualStudio + "\\Common7\\Tools\\vsvars32.bat"); - QString contents; - if (f.open(IO_ReadOnly)) { - contents = QString(f.readAll()); - } - int vsinstall = contents.find("VSINSTALLDIR=")+13; - QString VSINSTALLDIR = contents.mid(vsinstall, contents.find("\n", vsinstall) - vsinstall); - int vcinstall = contents.find("VCINSTALLDIR=")+13; - QString VCINSTALLDIR = contents.mid(vcinstall, contents.find("\n", vcinstall) - vcinstall); - int framework = contents.find("FrameworkDir=")+13; - QString FrameworkDir = contents.mid(framework, contents.find("\n", framework) - framework); - int frameworkVer = contents.find("FrameworkVersion=")+17; - QString FrameworkVer = contents.mid(frameworkVer, contents.find("\n", frameworkVer) - frameworkVer); - int frameworkSDK = contents.find("FrameworkSDKDir=")+16; - QString FrameworkSDK = contents.mid(frameworkSDK, contents.find("\n", frameworkSDK) - frameworkSDK); - if (var == "PATH" && !fixedPath) { - QString newPaths = VSINSTALLDIR + ";"; - newPaths += VCINSTALLDIR + "\\Bin;"; - newPaths += VCINSTALLDIR + "\\Common7\\Tools;"; - newPaths += VCINSTALLDIR + "\\Common7\\Tools\\bin\\prerelease;"; - newPaths += VCINSTALLDIR + "\\Common7\\Tools\\bin;"; - newPaths += FrameworkSDK + "\\bin;"; - newPaths += FrameworkSDK + "\\" + FrameworkVer + ";"; - QEnvironment::putEnv("PATH", newPaths + getenv("PATH"), - QEnvironment::PersistentEnv | QEnvironment::LocalEnv); - fixedPath = true; - } else if (var == "LIB") { - QString newPaths = VCINSTALLDIR + "\\ATLMFC\\LIB;"; - newPaths += VCINSTALLDIR + "\\LIB;"; - newPaths += VCINSTALLDIR + "\\PlatformSDK\\lib\\prerelease;"; - newPaths += VCINSTALLDIR + "\\PlatformSDK\\lib;"; - newPaths += FrameworkSDK + "\\lib;"; - QEnvironment::putEnv("LIB", newPaths + getenv("LIB"), - QEnvironment::PersistentEnv | QEnvironment::LocalEnv); - } else if (var == "INCLUDE") { - QString newPaths = VCINSTALLDIR + "\\ATLMFC\\INCLUDE;"; - newPaths += VCINSTALLDIR + "\\INCLUDE;"; - newPaths += VCINSTALLDIR + "\\PlatformSDK\\include\\prerelease;"; - newPaths += VCINSTALLDIR + "\\PlatformSDK\\include;"; - newPaths += FrameworkSDK + "\\include;"; - QEnvironment::putEnv("INCLUDE", newPaths + getenv("INCLUDE"), - QEnvironment::PersistentEnv | QEnvironment::LocalEnv); - } - - } -} - -void SetupWizardImpl::readCleanerOutput() -{ - updateDisplay( cleaner.readStdout(), currentOLine ); -} - -void SetupWizardImpl::readConfigureOutput() -{ - updateDisplay( configure.readStdout(), currentOLine ); -} - -void SetupWizardImpl::readMakeOutput() -{ - updateDisplay( make.readStdout(), currentOLine ); -} - -void SetupWizardImpl::readAssistantOutput() -{ -#if defined(QSA) - updateDisplay( assistant.readStdout(), currentOLine ); -#endif -} - -void SetupWizardImpl::readCleanerError() -{ - updateDisplay( cleaner.readStderr(), currentELine ); -} - -void SetupWizardImpl::readConfigureError() -{ - updateDisplay( configure.readStderr(), currentELine ); -} - -void SetupWizardImpl::readMakeError() -{ - updateDisplay( make.readStderr(), currentELine ); -} - -void SetupWizardImpl::readAssistantError() -{ -#if defined(QSA) - updateDisplay( assistant.readStderr(), currentELine ); -#endif -} - -void SetupWizardImpl::updateDisplay( const QString &input, QString &output) -{ - const QChar *c = input.unicode(); - for( int i = 0; i < (int)input.length(); ++i, ++c ) { - switch( char( *c ) ) { - case '\r': - case 0x00: - break; - case '\t': - currentOLine += " "; // Simulate a TAB by using 4 spaces - break; - case '\n': - if( output.length() ) { - if ( !globalInformation.reconfig() ) { - if ( output.right( 4 ) == ".cpp" || - output.right( 2 ) == ".c" || - output.right( 4 ) == ".pro" || - output.right( 3 ) == ".ui" ) { - buildPage->compileProgress->setProgress( ++filesCompiled ); - } - } - logOutput( output ); - output = ""; - } - break; - default: - output += *c; - break; - } - } -} - -#if defined(Q_OS_WIN32) -void SetupWizardImpl::installIcons( const QString& iconFolder, const QString& dirName, bool common ) -{ - QDir dir( dirName ); - - dir.setSorting( QDir::Name | QDir::IgnoreCase ); - const QFileInfoList* filist = dir.entryInfoList(); - if ( !filist ) - return; - QFileInfoListIterator it( *filist ); - QFileInfo* fi; - while( ( fi = it.current() ) ) { - if( fi->fileName()[0] != '.' && // Exclude dot-dirs - fi->fileName() != "sql" ) { // Exclude SQL-dir - if( fi->isDir() ) { - installIcons( iconFolder, fi->absFilePath(), common ); - } else if( fi->fileName().right( 4 ) == ".exe" ) { - shell.createShortcut( iconFolder, common, fi->baseName(), fi->absFilePath() ); - } - } - ++it; - } -} -#endif - -void SetupWizardImpl::assistantDone() -{ -#if defined(QSA) - QString contentFile; - static int count = 0; - if ( count == 0 ) { - connect( &assistant, SIGNAL( processExited() ), this, SLOT( assistantDone() ) ); - connect( &assistant, SIGNAL( readyReadStdout() ), this, SLOT( readAssistantOutput() ) ); - connect( &assistant, SIGNAL( readyReadStderr() ), this, SLOT( readAssistantError() ) ); - contentFile = "qsa.xml"; - } else if ( count == 1 ) { - contentFile = "qt-script-for-applications.xml"; - } else { - doIDEIntegration(); - return; - } - ++count; - - // install documentation - QDir html( optionsPageQsa->installPath->text() ); - html.cd( "doc/html/" ); - - QStringList lst; - lst << "assistant"; - lst << "-addContentFile"; - lst << QDir::toNativeSeparators( html.filePath( contentFile ) ); - assistant.setArguments( lst ); - if( !assistant.start() ) { - logOutput( "Installing QSA documentation failed\n" ); - assistantDone(); - } -#else - doIDEIntegration(); -#endif -} - -void SetupWizardImpl::doIDEIntegration() -{ -#if defined(Q_OS_WIN32) - QDir installDir( optionsPage->installPath->text() ); - if ( optionsPage->installIDEIntegration->isChecked() && optionsPage->installIDEIntegration->isEnabled() - && !foldersPage->devSysPath->text().isEmpty() ) { - // install the precompiled MS integration - if ( globalInformation.sysId() == GlobalInformation::MSVC ) { - QDir addinsDir( foldersPage->devSysPath->text() ); - addinsDir.cd( "Common/MSDev98/Addins" ); - if ( copyFile( installDir.filePath("qmsdev.dll"), addinsDir.filePath("qmsdev.dll") ) ) { - installDir.remove( "qmsdev.dll" ); - } - } else if ( globalInformation.sysId() == GlobalInformation::MSVCNET - || globalInformation.sysId() == GlobalInformation::Intel){ - QString filepath = installDir.filePath("QMsNetSetup.msi"); - filepath = filepath.replace( '/', '\\' ); - - int res = _spawnlp( _P_NOWAIT, "msiexec.exe", "msiexec.exe", "-i", filepath.latin1(), NULL ); - if ( res == -1 ) { - //MSIExec is not in path, look up in registry (only works for NT machines) - QString msiexec = QEnvironment::getRegistryString( "SYSTEM\\CurrentControlSet\\Services\\MSIServer", - "ImagePath", - QEnvironment::LocalMachine ); - if ( !msiexec.isEmpty() ) - msiexec.remove( " /V" ); - res = _spawnl( _P_NOWAIT, msiexec.latin1(), msiexec.latin1(), "-i", filepath.latin1(), NULL ); - } - - if ( res == -1 ) { - QMessageBox::warning( this, "Couldn't execute .NET addin installer script", - "Microsoft Installer (MSI) was not found on your system.\n" - "Please install MSI, then execute the .NET addin installer " - "script,\nlocated at " + filepath ); - } - } - - QFile *autoexp = 0; - QFile *usertype = 0; - switch( globalInformation.sysId() ) { - case GlobalInformation::MSVC: - autoexp = new QFile( foldersPage->devSysPath->text() + "\\Common\\MsDev98\\bin\\autoexp.dat" ); - usertype = new QFile( foldersPage->devSysPath->text() + "\\Common\\MsDev98\\bin\\usertype.dat" ); - break; - case GlobalInformation::MSVCNET: - autoexp = new QFile( foldersPage->devSysPath->text() + "\\Common7\\Packages\\Debugger\\autoexp.dat" ); - usertype = new QFile( foldersPage->devSysPath->text() + "\\Common7\\Packages\\Debugger\\usertype.dat" ); - break; - } - - if ( autoexp ) { - QString autoExpContents; - if ( !autoexp->exists() ) { - autoexp->open( IO_WriteOnly ); - } else { - // First try to open the file to search for existing installations - autoexp->open( IO_ReadOnly ); - QByteArray bytes = autoexp->readAll(); - autoExpContents = QString::fromLatin1(bytes.data(), bytes.size()); - autoexp->close(); - if ( autoExpContents.find( "; Trolltech Qt" ) == -1 ) - autoexp->open(IO_WriteOnly | IO_Translate); - } - if( autoexp->isOpen() ) { - bool written = false; - QTextStream outstream( autoexp ); - QStringList entries = QStringList::split("\r\n", autoExpContents, true); - for (QStringList::Iterator entry = entries.begin(); entry != entries.end(); ++entry) { - QString e(*entry); - outstream << e << endl; - if (!written && e.startsWith("[AutoExpand]")) { - outstream << endl; - outstream << "; Trolltech Qt" << endl; - outstream << "QString=unicode,su> len=len,u>" << endl; - outstream << "QCString =data, s>" << endl; - outstream << "QPoint =x= y=" << endl; - outstream << "QRect =x1= y1= x2= y2=" << endl; - outstream << "QSize =width= height=" << endl; - outstream << "QWMatrix =m11=<_m11> m12=<_m12> m21=<_m21> m22=<_m22> dx=<_dx> dy=<_dy>" << endl; - outstream << "QVariant =Type=typ> value=value>" << endl; - outstream << "QValueList<*> =Count=nodes>" << endl; - outstream << "QPtrList<*> =Count=" << endl; - outstream << "QGuardedPtr<*> =ptr=obj>" << endl; - outstream << "QEvent =type=" << endl; - outstream << "QObject =class=classname,s> name=" << endl; - written = true; - } - } - autoexp->close(); - } - delete autoexp; - } - - if ( usertype ) { - if ( !usertype->exists() ) { - usertype->open( IO_WriteOnly | IO_Translate ); - } else { - usertype->open( IO_ReadOnly ); - QString existingUserType = usertype->readAll(); - usertype->close(); - if ( existingUserType.find( "Q_OBJECT" ) == -1 ) - usertype->open(IO_WriteOnly | IO_Append | IO_Translate); - } - if ( usertype->isOpen() ) { - QTextStream outstream( usertype ); - outstream << endl; - outstream << "Q_OBJECT" << endl; - outstream << "Q_PROPERTY" << endl; - outstream << "Q_ENUMS" << endl; - outstream << "Q_SETS" << endl; - outstream << "Q_CLASSINFO" << endl; - outstream << "emit" << endl; - outstream << "TRUE" << endl; - outstream << "FALSE" << endl; - outstream << "SIGNAL" << endl; - outstream << "SLOT" << endl; - outstream << "signals:" << endl; - outstream << "slots:" << endl; - usertype->close(); - } - delete usertype; - } - } - - if ( globalInformation.sysId() != GlobalInformation::MinGW ) - installDir.remove( "Makefile.win32-g++" ); - if (globalInformation.sysId() != GlobalInformation::MSVC) - installDir.remove( "qmsdev.dll" ); - if (globalInformation.sysId() != GlobalInformation::MSVCNET) - installDir.remove( "QMsNetSetup.msi" ); -#endif - - doStartMenuIntegration(); -} - -void SetupWizardImpl::doStartMenuIntegration() -{ -#if defined(Q_OS_WIN32) - /* - ** Set up our icon folder and populate it with shortcuts. - ** Then move to the next page. - */ - QString dirName, examplesName, tutorialsName; - bool common( foldersPage->folderGroups->currentItem() == 0 ); - QString qtDir = QEnvironment::getEnv( "QTDIR" ); - - dirName = shell.createFolder( foldersPage->folderPath->text(), common ); - shell.createShortcut( dirName, common, "Qt Designer", qtDir + "\\bin\\designer.exe", "GUI designer", "", qtDir ); -#if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - shell.createShortcut( dirName, common, "Reconfigure Qt", - qtDir + "\\bin\\install.exe", - "Reconfigure the Qt library", - QString("-reconfig \"%1\"").arg(globalInformation.qtVersionStr()), - qtDir ); -#endif -#if defined(QSA) - shell.createShortcut( dirName, common, "License agreement for Qt", "notepad.exe", "Review the license agreement", - "\"" + qtDir + "\\" LICENSE_DEST "\"" ); - shell.createShortcut( dirName, common, "Readme for Qt", "notepad.exe", "Important information", - "\"" + qtDir + "\\README\"" ); - shell.createShortcut( dirName, common, "License agreement for QSA", "notepad.exe", "Review the license agreement", - "\"" + optionsPageQsa->installPath->text() + "\\" LICENSE_DEST "\"" ); - shell.createShortcut( dirName, common, "Readme for QSA", "notepad.exe", "Important information", - "\"" + optionsPageQsa->installPath->text() + "\\README\"" ); -#else - shell.createShortcut( dirName, common, "License agreement", "notepad.exe", "Review the license agreement", "\"" + qtDir + "\\" LICENSE_DEST "\"" ); - shell.createShortcut( dirName, common, "Readme", "notepad.exe", "Important information", QString( "\"" ) + qtDir + "\\README\"" ); -#endif - shell.createShortcut( dirName, common, "Qt Assistant", qtDir + "\\bin\\assistant.exe", "Browse the On-line documentation", "", qtDir ); - shell.createShortcut( dirName, common, "Qt Linguist", qtDir + "\\bin\\linguist.exe", "Qt translation utility", "", qtDir ); - shell.createInternetShortcut( dirName, common, "Trolltech.com", "http://qtsoftware.com/" ); -#if defined(EVAL_CD) - shell.createInternetShortcut( dirName, common, "Register for Support", "http://qtsoftware.com/products/qt/evaluate.html" ); -#endif - - if ( ( ( !globalInformation.reconfig() && optionsPage->skipBuild->isChecked() ) - || ( globalInformation.reconfig() && !configPage->rebuildInstallation->isChecked() ) ) - || qWinVersion() & WV_DOS_based ) { - QString description; -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - buildQtShortcutText = "Build Qt Examples and Tutorials"; - description = "Build the Qt Examples and Tutorials"; -#else - buildQtShortcutText = "Build Qt " + globalInformation.qtVersionStr(); - description = "Build the Qt library"; -#endif - shell.createShortcut( dirName, common, - buildQtShortcutText, - QEnvironment::getEnv( "QTDIR" ) + "\\build.bat", - description ); - } - -#if defined(QSA) - QString qsaExamplesName; - if( qWinVersion() & WV_DOS_based ) { - shell.createShortcut( dirName, common, - "QSA Examples", - optionsPageQsa->installPath->text() + "\\examples" ); - } else { - qsaExamplesName = shell.createFolder( foldersPage->folderPath->text() + "\\QSA Examples", common ); - installIcons( qsaExamplesName, optionsPageQsa->installPath->text() + "\\examples", common ); - } -#endif - if( optionsPage->installTutorials->isChecked() ) { - if( qWinVersion() & WV_DOS_based ) { - shell.createShortcut( dirName, common, -#if defined(QSA) - "Qt Tutorials", -#else - "Tutorials", -#endif - QEnvironment::getEnv( "QTDIR" ) + "\\tutorial" ); - } else { -#if defined(QSA) - tutorialsName = shell.createFolder( foldersPage->folderPath->text() + "\\Qt Tutorials", common ); -#else - tutorialsName = shell.createFolder( foldersPage->folderPath->text() + "\\Tutorials", common ); -#endif - installIcons( tutorialsName, QEnvironment::getEnv( "QTDIR" ) + "\\tutorial", common ); - } - } - if( optionsPage->installExamples->isChecked() ) { - if( qWinVersion() & WV_DOS_based ) { - shell.createShortcut( dirName, common, -#if defined(QSA) - "Qt Examples", -#else - "Examples", -#endif - QEnvironment::getEnv( "QTDIR" ) + "\\examples" ); - } else { -#if defined(QSA) - examplesName = shell.createFolder( foldersPage->folderPath->text() + "\\Qt Examples", common ); -#else - examplesName = shell.createFolder( foldersPage->folderPath->text() + "\\Examples", common ); -#endif - installIcons( examplesName, QEnvironment::getEnv( "QTDIR" ) + "\\examples", common ); - } - } -#endif -#if defined(QSA) -#endif - buildPage->compileProgress->setProgress( buildPage->compileProgress->totalSteps() ); - setNextEnabled( buildPage, true ); - logOutput( "The build was successful", true ); -} - -void SetupWizardImpl::makeDone() -{ - makeDone( !make.normalExit() || make.exitStatus() ); -} - -void SetupWizardImpl::makeDone( bool error ) -{ - if( error ) { - if (!backButton()->isEnabled()) { - logOutput( "The build process failed!\n" ); - emit wizardPageFailed( indexOf(currentPage()) ); - QMessageBox::critical( this, "Error", "The build process failed!\nSee the log for details." ); - buildPage->restartBuild->setText( "Restart compile" ); - backButton()->setEnabled(true); - } - setAppropriate( progressPage, false ); -#if defined(QSA) - } else if ( make.workingDirectory() == QEnvironment::getEnv( "QTDIR" ) ) { - QStringList args; - args << globalInformation.text(GlobalInformation::MakeTool); - args << "sub-examples"; - - make.setWorkingDirectory( optionsPageQsa->installPath->text() ); - make.setArguments( args ); - - if( !make.start() ) { - logOutput( "Could not start make process.\n" - "Make sure that your compiler tools are installed\n" - "and registered correctly in your PATH environment." ); - emit wizardPageFailed( indexOf(currentPage()) ); - backButton()->setEnabled( true ); - } -#endif - } else { - // We still have some more items to do in order to finish all the - // integration stuff. - if ( !globalInformation.reconfig() ) { - logOutput( "Doing the final integration steps..." ); - assistantDone(); - } else { - setNextEnabled( buildPage, true ); - logOutput( "The build was successful", true ); - } - buildPage->restartBuild->setText( "Success" ); - buildPage->restartBuild->setEnabled( false ); - } -} - -void SetupWizardImpl::configDone() -{ - QStringList args; - - if( globalInformation.reconfig() && !configPage->rebuildInstallation->isChecked() ) - showPage( finishPage ); - -#if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - if( !configure.normalExit() || configure.exitStatus() ) { - logOutput( "The configure process failed.\n" ); - emit wizardPageFailed( indexOf(currentPage()) ); - buildPage->restartBuild->setText( "Restart configure" ); - setAppropriate( progressPage, false ); - backButton()->setEnabled(true); - } else -#endif - { - args << globalInformation.text(GlobalInformation::MakeTool); -#if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - args << "sub-src"; - args << "sub-plugins"; - if ( optionsPage ) { - if ( optionsPage->installTools->isChecked() ) - args << "sub-tools"; - if ( optionsPage->installTutorials->isChecked() ) - args << "sub-tutorial"; - if ( optionsPage->installExamples->isChecked() ) - args << "sub-examples"; - if ( optionsPage->installExtensions->isChecked() ) - args << "sub-extensions"; - } else if (globalInformation.reconfig()) { - args << "sub-tools"; // We want to make sure it rebuilds uic etc - } -#elif defined(Q_OS_WIN32) - if ( optionsPage ) { - if ( optionsPage->installTutorials->isChecked() ) - args << "sub-tutorial"; - if ( optionsPage->installExamples->isChecked() ) - args << "sub-examples"; -#if !defined(NON_COMMERCIAL) - if ( optionsPage->installExtensions->isChecked() ) - args << "sub-extensions"; -#endif - } - if ( args.count() == 1 ) { - make.setWorkingDirectory( QEnvironment::getEnv( "QTDIR" ) ); - makeDone( false ); - return; - } -#endif - if ( globalInformation.sysId() == GlobalInformation::MinGW ) { - args << "-fMakefile.win32-g++"; - } - - make.setWorkingDirectory( QEnvironment::getEnv( "QTDIR" ) ); - make.setArguments( args ); - - if( !make.start() ) { - logOutput( "Could not start make process.\n" - "Make sure that your compiler tools are installed\n" - "and registered correctly in your PATH environment." ); - emit wizardPageFailed( indexOf(currentPage()) ); - backButton()->setEnabled( true ); - } else { - buildPage->restartBuild->setText( "Stop compilation" ); - } - } -} - -void SetupWizardImpl::restartBuild() -{ - if ( configure.isRunning() || - (!configure.isRunning() && (!configure.normalExit() || configure.exitStatus())) ) { - if ( configure.isRunning() ) { // Stop configure - configure.kill(); - buildPage->restartBuild->setText( "Restart configure" ); - logOutput( "\n*** Configure stopped by user...\n" ); - backButton()->setEnabled( true ); - } else { // Restart configure - emit wizardPageShowed( indexOf(currentPage()) ); - backButton()->setEnabled( false ); - cleanDone(); - buildPage->restartBuild->setText( "Stop configure" ); - logOutput( "\n*** Configure restarted by user...\n" ); - } - } else if ( make.isRunning() || - (!make.isRunning() && (!make.normalExit() || make.exitStatus())) ) { - if ( make.isRunning() ) { // Stop compile - buildPage->restartBuild->setText( "Restart compile" ); - logOutput( "\n*** Compilation stopped by user...\n" ); - backButton()->setEnabled( true ); - make.kill(); - } else { // Restart compile - wizardPageShowed( indexOf(currentPage()) ); - backButton()->setEnabled( false ); - configDone(); - buildPage->restartBuild->setText( "Stop compile" ); - logOutput( "\n*** Compilation restarted by user...\n" ); - } - } -} - -void SetupWizardImpl::saveSettings() -{ -#if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - QApplication::setOverrideCursor( Qt::waitCursor ); - saveSet( configPage->configList ); - saveSet( configPage->advancedList ); - QApplication::restoreOverrideCursor(); -#endif -} - -void SetupWizardImpl::saveSet( QListView* list ) -{ - QSettings settings; - settings.writeEntry( "/Trolltech/Qt/ResetDefaults", "FALSE" ); - - QListViewItemIterator it( list ); - while ( it.current() ) { - QListViewItem *itm = it.current(); - ++it; - if ( itm->rtti() != CheckListItem::RTTI ) - continue; - CheckListItem *item = (CheckListItem*)itm; - if ( item->type() == QCheckListItem::RadioButton ) { - if ( item->isOn() ) { - QString folder; - QListViewItem *pItem = item; - while ( (pItem = pItem->parent() ) ) { - if ( folder.isEmpty() ) - folder = pItem->text( 0 ); - else - folder = pItem->text(0) + "/" + folder; - } - - settings.writeEntry( "/Trolltech/Qt/" + folder, item->text() ); - } - } else if ( item->type() == QCheckListItem::CheckBox ) { - QStringList lst; - QListViewItem *p = item->parent(); - if ( p ) - --it; - QString c = p->text( 0 ); - while ( ( itm = it.current() ) && - itm->rtti() == CheckListItem::RTTI && - item->type() == CheckListItem::CheckBox ) { - item = (CheckListItem*)itm; - ++it; - if ( item->isOn() ) - lst << item->text( 0 ); - } - if ( lst.count() ) - settings.writeEntry( "/Trolltech/Qt/" + p->text(0), lst, ',' ); - else - settings.writeEntry( "/Trolltech/Qt/" + p->text(0), "Nothing selected" ); - } - } -} - -void SetupWizardImpl::showPage( QWidget* newPage ) -{ - if ( currentPage() == configPage && newPage == progressPage && !verifyConfig() ) { - if (QMessageBox::warning( this, "Configuration with Warnings", - "One or more of the selected options could not be verified by the installer.\n" - "Do you want to continue?", "Yes", "No" )) - return; - } - - QWizard::showPage( newPage ); - setInstallStep( indexOf(newPage) + 1 ); - - if( newPage == licensePage ) { - showPageLicense(); - } else if( newPage == licenseAgreementPage ) { - readLicenseAgreement(); - } else if( newPage == licenseAgreementPageQsa ) { - readLicenseAgreement(); - } else if( newPage == optionsPage ) { - showPageOptions(); - } else if( newPage == foldersPage ) { - showPageFolders(); - } else if( newPage == configPage ) { - showPageConfig(); - } else if( newPage == progressPage ) { - showPageProgress(); - } else if( newPage == buildPage ) { - showPageBuild(); - } else if( newPage == finishPage ) { - showPageFinish(); - } -} - -void SetupWizardImpl::showPageLicense() -{ - licenseChanged(); -} - -void SetupWizardImpl::showPageOptions() -{ - static bool done = false; - if (done) - return; - - done = true; - - // First make sure that the current license information is saved - if( !globalInformation.reconfig() ) - writeLicense( QDir::homeDirPath() + "/.qt-license" ); - - // ### unsupported - optionsPage->installDocs->hide(); - - bool enterprise = licenseInfo[ "PRODUCTS" ] == "qt-enterprise"; - optionsPage->installExtensions->setChecked( enterprise ); - optionsPage->installExtensions->setEnabled( enterprise ); - -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - optionsPage->installDocs->setEnabled( false ); - optionsPage->skipBuild->setEnabled( false ); - if ( globalInformation.sysId()==GlobalInformation::Borland ) { - optionsPage->sysMsvcNet->setEnabled( false ); - optionsPage->sysMsvc->setEnabled( false ); - optionsPage->sysBorland->setEnabled( true ); - optionsPage->sysMinGW->setEnabled( false ); - optionsPage->sysIntel->setEnabled( false ); - optionsPage->sysOther->setEnabled( false ); - } else { - optionsPage->sysMsvcNet->setEnabled( true ); - optionsPage->sysMsvc->setEnabled( true ); - optionsPage->sysBorland->setEnabled( false ); - optionsPage->sysOther->setEnabled( false ); - optionsPage->sysIntel->setEnabled( false ); - optionsPage->sysMinGW->setEnabled( false ); - } -# if defined(Q_OS_WIN32) - optionsPage->installExamples->setEnabled( true ); - optionsPage->installTutorials->setEnabled( true ); - optionsPage->installTools->setEnabled( false ); -# if defined(NON_COMMERCIAL) - optionsPage->installExtensions->hide(); -# else - optionsPage->installExtensions->setChecked( true ); - optionsPage->installExtensions->setEnabled( true ); -# endif -# else - optionsPage->installExamples->setEnabled( false ); - optionsPage->installTutorials->setEnabled( false ); - optionsPage->installExtensions->setChecked( false ); - optionsPage->installExtensions->setEnabled( false ); -# endif -#else -# if defined(Q_OS_WIN32) - // No need to offer the option of skipping the build on 9x, it's skipped anyway - if ( qWinVersion() & WV_DOS_based ) - optionsPage->skipBuild->setEnabled( false ); -# endif -#endif - - // trigger environment test - clickedSystem(globalInformation.sysId()); -} - -void SetupWizardImpl::showPageFolders() -{ - QString ideName = globalInformation.text(GlobalInformation::IDE); - foldersPage->devSysLabel->setText( ideName + " path"); - foldersPage->devSysLabel->setShown(!ideName.isEmpty()); - foldersPage->devSysPath->setShown(!ideName.isEmpty()); - foldersPage->devSysPathButton->setShown(!ideName.isEmpty()); -#if defined(Q_OS_WIN32) - if( globalInformation.sysId() == GlobalInformation::MSVC ) { - QString devPath = QEnvironment::getRegistryString( "Software\\Microsoft\\VisualStudio\\6.0\\Setup\\Microsoft Visual Studio", "ProductDir", QEnvironment::LocalMachine ); - if ( devPath.isEmpty() ) { - // fallback for Windows 9x - QDir msdevDir( QEnvironment::getEnv("MSDEVDIR") ); - msdevDir.cdUp(); - msdevDir.cdUp(); - devPath = QDir::toNativeSeparators( msdevDir.absPath() ); - } - foldersPage->devSysPath->setText( devPath ); - } else if ( globalInformation.sysId() == GlobalInformation::MSVCNET ) { - QString devPath = QEnvironment::getRegistryString( "Software\\Microsoft\\VisualStudio\\7.1\\Setup\\VS", "ProductDir", QEnvironment::LocalMachine ); - if ( !devPath.length() ) - devPath = QEnvironment::getRegistryString( "Software\\Microsoft\\VisualStudio\\7.0\\Setup\\VS", "ProductDir", QEnvironment::LocalMachine ); - foldersPage->devSysPath->setText( devPath ); - } -#endif -} - -void SetupWizardImpl::showPageProgress() -{ - saveSettings(); - int totalSize = 0; - QFileInfo fi; - totalRead = 0; - bool copySuccessful = true; - - if( !filesCopied ) { - createDir( optionsPage->installPath->text() ); - if (optionsPageQsa) - createDir( optionsPageQsa->installPath->text() ); - progressPage->filesDisplay->append( "Installing files...\n" ); - - // install the right LICENSE file - QDir installDir( optionsPage->installPath->text() ); - QFile licenseFile( installDir.filePath( LICENSE_DEST ) ); - if ( licenseFile.open( IO_WriteOnly ) ) { - ResourceLoader *rcLoader; -#if defined(EVAL) || defined(EDU) - rcLoader = new ResourceLoader( "LICENSE" ); -#elif defined(NON_COMMERCIAL) - if ( licenseAgreementPage->countryCombo->currentItem() == 0 ) - rcLoader = new ResourceLoader( "LICENSE-US" ); - else - rcLoader = new ResourceLoader( "LICENSE" ); -#else - if ( usLicense ) { - rcLoader = new ResourceLoader( "LICENSE-US" ); - } else { - rcLoader = new ResourceLoader( "LICENSE" ); - } -#endif - if ( rcLoader->isValid() ) { - licenseFile.writeBlock( rcLoader->data() ); - } else { - emit wizardPageFailed( indexOf(currentPage()) ); - QMessageBox::critical( this, tr("Package corrupted"), - tr("Could not find the LICENSE file in the package.\nThe package might be corrupted.") ); - } - delete rcLoader; - licenseFile.close(); - } else { - // ### error handling -- we could not write the LICENSE file - } -#if defined(QSA) - QDir installDirQsa( optionsPageQsa->installPath->text() ); - QFile licenseFileQsa( installDirQsa.filePath( LICENSE_DEST ) ); - if ( licenseFileQsa.open( IO_WriteOnly ) ) { - ResourceLoader *rcLoader; - rcLoader = new ResourceLoader( "LICENSE_QSA" ); - if ( rcLoader->isValid() ) { - licenseFileQsa.writeBlock( rcLoader->data() ); - } else { - emit wizardPageFailed( indexOf(currentPage()) ); - QMessageBox::critical( this, tr("Package corrupted"), - tr("Could not find the LICENSE file in the package.\nThe package might be corrupted.") ); - } - delete rcLoader; - licenseFileQsa.close(); - } else { - // ### error handling -- we could not write the LICENSE file - } -#endif - - // Install the files -- use different fallbacks if one method failed. - QArchive ar; - QString licenseKey; -#if !defined(EVAL_CD) && !defined(NON_COMMERCIAL) - licenseKey = licensePage->key->text(); -#endif - ar.setVerbosity( QArchive::Destination | QArchive::Verbose | QArchive::Progress ); - connect( &ar, SIGNAL( operationFeedback( const QString& ) ), this, SLOT( archiveMsg( const QString& ) ) ); - connect( &ar, SIGNAL( operationFeedback( int ) ), progressPage->operationProgress, SLOT( setProgress( int ) ) ); - // First, try to find qt.arq as a binary resource to the file. - ResourceLoader rcLoader( "QT_ARQ", 500 ); - if ( rcLoader.isValid() ) { - progressPage->operationProgress->setTotalSteps( rcLoader.data().count() ); - QDataStream ds( rcLoader.data(), IO_ReadOnly ); - ar.readArchive( &ds, optionsPage->installPath->text(), licenseKey ); - } else { - // If the resource could not be loaded or is smaller than 500 - // bytes, we have the dummy qt.arq: try to find and install - // from qt.arq in the current directory instead. - QString archiveName = "qt.arq"; -#if defined(Q_OS_MAC) - QString appDir = qApp->argv()[0]; - int truncpos = appDir.findRev( "/Contents/MacOS/" ); - if (truncpos != -1) - appDir.truncate( truncpos ); - archiveName = appDir + "/Contents/Qt/qtmac.arq"; -#endif - fi.setFile( archiveName ); - if( fi.exists() ) - totalSize = fi.size(); - progressPage->operationProgress->setTotalSteps( totalSize ); - - ar.setPath( archiveName ); - if( ar.open( IO_ReadOnly ) ) { - ar.readArchive( optionsPage->installPath->text(), licenseKey ); - } else { - // We were not able to find any qt.arq -- so assume we have - // the old fashioned zip archive and simply copy the files - // instead. - progressPage->operationProgress->setTotalSteps( FILESTOCOPY ); - copySuccessful = copyFiles( QDir::currentDirPath(), optionsPage->installPath->text(), true ); - - /*These lines are only to be used when changing the filecount estimate - QString tmp( "%1" ); - tmp = tmp.arg( totalFiles ); - QMessageBox::information( this, tmp, tmp ); - */ - progressPage->operationProgress->setProgress( FILESTOCOPY ); - } - } - -#if defined(QSA) - QArchive arQsa; - arQsa.setVerbosity( QArchive::Destination | QArchive::Verbose | QArchive::Progress ); - connect( &arQsa, SIGNAL( operationFeedback( const QString& ) ), this, SLOT( archiveMsg( const QString& ) ) ); - connect( &arQsa, SIGNAL( operationFeedback( int ) ), progressPage->operationProgress, SLOT( setProgress( int ) ) ); - ResourceLoader rcLoaderQsa( "QSA_ARQ", 500 ); - if ( rcLoaderQsa.isValid() ) { - progressPage->operationProgress->setTotalSteps( rcLoaderQsa.data().count() ); - QDataStream ds( rcLoaderQsa.data(), IO_ReadOnly ); - arQsa.readArchive( &ds, optionsPageQsa->installPath->text(), licenseKey ); - } else { - // ### error handling - } -#endif - filesCopied = copySuccessful; - - timeCounter = 30; - if( copySuccessful ) { - QDir installDir( optionsPage->installPath->text() ); -#if defined(Q_OS_WIN32) - QDir windowsFolderDir( shell.windowsFolderName ); -# if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - { - // move $QTDIR/install.exe to $QTDIR/bin/install.exe - // This is done because install.exe is also used to reconfigure Qt - // (and this expects install.exe in bin). We can't move install.exe - // to bin in first place, since for the snapshots, we don't have - // the .arq archives. - QString inFile( installDir.filePath("install.exe") ); - copyFile(inFile, installDir.filePath("bin/install.exe")); - QFile::remove(inFile); - } -# endif - { - // move the uninstaller to the Windows directory - // This is necessary since the uninstaller deletes all files in - // the installation directory (and therefore can't delete - // itself). - QString inFile( installDir.filePath("bin/quninstall.exe") ); - copyFile(inFile, windowsFolderDir.filePath("quninstall.exe")); - QFile::remove(inFile); - } -#endif -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - QStringList::Iterator it; - QDir lib( optionsPage->installPath->text() ); - lib.cd( "lib" ); -# if !defined(EVAL_CD) - // patch qt*.dll -# if !defined(Q_OS_MAC) - QStringList qtDlls = lib.entryList( "qt*.dll" ); -# else - QStringList qtDlls = lib.entryList( "libqt-mt-eval.dylib" ); -# endif - if ( qtDlls.count() == 0 ) { - copySuccessful = false; - QMessageBox::critical( this, - tr( "Error patching Qt library" ), -# if defined(EVAL) - tr( "Could not patch the Qt library with the evaluation\n" - "license information - no Qt DLL was found." ) -# elif defined(EDU) - tr( "Could not patch the Qt library with the educational\n" - "edition license information - no Qt DLL was found." ) -# else - tr( "Could not patch the Qt library the installation\n" - "path information - no Qt DLL was found." ) -# endif - ); - } - for ( it=qtDlls.begin(); it!=qtDlls.end(); ++it ) { - //### add serial number etc. to log - logFiles( tr("Patching the Qt library %1.").arg(*it) ); - int ret = trDoIt( lib.absFilePath(*it), -# if defined(EVAL) - licensePage->evalName->text().latin1(), - licensePage->evalCompany->text().latin1(), - licensePage->serialNumber->text().latin1(), -# elif defined(EDU) - "", - licensePage->university->text().latin1(), - licensePage->serialNumber->text().latin1(), -# endif - installDir.absPath() - ); - if ( ret != 0 ) { - copySuccessful = false; - QMessageBox::critical( this, - tr( "Error patching Qt library" ), -# if defined(EVAL) - tr( "Could not patch the Qt library with the evaluation\n" - "license information. You will not be able to execute\n" - "any program linked against %1. Error %2" ).arg( *it ).arg(ret) -# elif defined(EDU) - tr( "Could not patch the Qt library with the educational\n" - "edition license information. You will not be able to\n" - "execute any program linked against %1." ).arg( *it ) -# else - tr( "Could not patch the Qt library with the installation\n" - "path information. You will not be able to execute\n" - "some programs linked against %1." ).arg( *it ) -# endif - ); - } - } -# endif -# if !defined(Q_OS_MAC) - // copy lib/*.dll bin/ - QStringList dlls = lib.entryList( "*.dll" ); - for ( it=dlls.begin(); it!=dlls.end(); ++it ) { - copyFile( lib.absFilePath(*it), QDir::cleanDirPath(lib.absFilePath("../bin/"+*it)) ); - } - // delete the non-wanted database drivers - QDir plugins( optionsPage->installPath->text() ); - plugins.cd( "plugins" ); - plugins.cd( "sqldrivers" ); - QDir bin( optionsPage->installPath->text() ); - bin.cd( "bin" ); -#if defined(NON_COMMERCIAL) - if ( sqlitePluginInstall && !sqlitePluginInstall->isOn() ) { - plugins.remove( "qsqlite.dll" ); - } -#else - if ( mysqlPluginInstall && !mysqlPluginInstall->isOn() ) { - plugins.remove( "qsqlmysql.dll" ); - bin.remove( "libmySQL.dll" ); - } - if ( ociPluginInstall && !ociPluginInstall->isOn() ) { - plugins.remove( "qsqloci.dll" ); - } - if ( odbcPluginInstall && !odbcPluginInstall->isOn() ) { - plugins.remove( "qsqlodbc.dll" ); - } - if ( psqlPluginInstall && !psqlPluginInstall->isOn() ) { - plugins.remove( "qsqlpsql.dll" ); - bin.remove( "libpq.dll" ); - } - if ( tdsPluginInstall && !tdsPluginInstall->isOn() ) { - plugins.remove( "qsqltds.dll" ); - } - if ( db2PluginInstall && !db2PluginInstall->isOn() ) { - plugins.remove( "qsqldb2.dll" ); - } -#endif - // patch the .qmake.cache with the correct paths - QFile cacheFile( installDir.filePath(".qmake.cache") ); - if ( cacheFile.open( IO_ReadOnly | IO_Translate ) ) { - QTextStream tsIn( &cacheFile ); - QString cache = tsIn.read(); - cacheFile.close(); - if ( cacheFile.open( IO_WriteOnly | IO_Translate ) ) { - QTextStream tsOut( &cacheFile ); - if ( globalInformation.sysId() == GlobalInformation::Borland ) - tsOut << cache.replace( "C:/QtEvaluation/qtborland", installDir.absPath() ); - else - tsOut << cache.replace( "C:/QtEvaluation/qtmsvc", installDir.absPath() ); - cacheFile.close(); - } - } -# endif -#endif - logFiles( tr("All files have been installed.\n" - "This log has been saved to the installation directory.\n" - "The build will start automatically in 30 seconds."), true ); - } else { - logFiles( tr("One or more errors occurred during file installation.\n" - "Please review the log and try to amend the situation.\n"), true ); - } - } - if ( copySuccessful ) { -#if defined(Q_OS_WIN32) - /* - ** Then record the installation in the registry, and set up the uninstallation - */ - QStringList uninstaller; - uninstaller << ( QString("\"") + shell.windowsFolderName + "\\quninstall.exe" + QString("\"") ); - uninstaller << optionsPage->installPath->text(); - - if( foldersPage->folderGroups->currentItem() == 0 ) - uninstaller << ( QString("\"") + shell.commonProgramsFolderName + QString("\\") + foldersPage->folderPath->text() + QString("\"") ); - else - uninstaller << ( QString("\"") + shell.localProgramsFolderName + QString("\\") + foldersPage->folderPath->text() + QString("\"") ); - - uninstaller << ( QString("\"") + globalInformation.qtVersionStr() + QString("\"") ); - - QEnvironment::recordUninstall( QString( "Qt " ) + globalInformation.qtVersionStr(), uninstaller.join( " " ) ); -#endif - autoContTimer.start( 1000 ); - } - else - emit wizardPageFailed( indexOf(currentPage()) ); - setNextEnabled( progressPage, copySuccessful ); -} - -void SetupWizardImpl::showPageFinish() -{ - autoContTimer.stop(); - nextButton()->setText( "Next >" ); - QString finishMsg; - if ( ( ( !globalInformation.reconfig() && !optionsPage->skipBuild->isChecked() ) - || ( globalInformation.reconfig() && configPage->rebuildInstallation->isChecked() ) ) -#if defined(Q_OS_WIN32) - && qWinVersion() & WV_NT_based ) { -#else - ) { -#endif - if( globalInformation.reconfig() ) { - finishMsg = "Qt has been reconfigured and rebuilt, and is ready for use."; - } else { -#if defined(Q_OS_MAC) - finishMsg = QString( "Qt has been installed to " ) + optionsPage->installPath->text() + - " and is ready to use.\n\nPlease try out the developer tools in the bin folder and example " - "programs in the examples folder.\n\nFor further information please consult the " - "README.txt file included in the installation folder."; -#else - finishMsg = QString( "Qt has been installed to %1 and is ready to use.\n" - "You might have to logoff and logon for changes to the environment to have an effect."). - arg(optionsPage->installPath->text()); -# if defined(QSA) - finishMsg = QString( "\nQSA has been installed to " ) + optionsPageQsa->installPath->text() + " and is ready to use."; -# endif -#endif - } - } else { - if( globalInformation.reconfig() ) { - finishMsg = "The new configuration has been written.\nThe library needs to be rebuilt to activate the "; - finishMsg += "new configuration."; -#if defined(Q_OS_WIN32) - finishMsg += "To rebuild it, use the \"Build Qt "; - finishMsg += globalInformation.qtVersionStr(); - finishMsg += "\" icon in the Qt program group in the start menu."; -#endif - } else { - finishMsg = QString( "The Qt files have been installed to " ) + optionsPage->installPath->text() + " and is ready to be compiled.\n"; -#if defined(Q_OS_WIN32) - if( persistentEnv && qWinVersion() & WV_DOS_based ) { - finishMsg += "The environment variables needed to use Qt have been recorded into your AUTOEXEC.BAT file.\n"; - finishMsg += "Please review this file, and take action as appropriate depending on your operating system to get them into the persistent environment. (Windows Me users, run MsConfig)\n\n"; - } -# if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - finishMsg += QString( "To build the examples and tutorials, use the " - "\"Build the Qt Examples and Tutorials\"" - " icon which has been installed into your Start-Menu." ); -# else - finishMsg += QString( "To build Qt, use the " - "\"Build Qt " ) + globalInformation.qtVersionStr() + "\"" - " icon which has been installed into your Start-Menu."; -# endif -#endif - } - } -#if defined(EVAL_CD) - finishMsg += "\n\n" - "The Trolltech technical support service is available to " - "Qt Professional and Enterprise Edition licensees. As an " - "evaluation user, you can register for 30 days of evaluation " - "support at\n" - "http://qtsoftware.com/products/qt/evaluate.html"; -#endif - finishPage->finishText->setText( finishMsg ); -} - -void SetupWizardImpl::licenseChanged() -{ -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - int ret = trCheckIt( -# if defined(EVAL) - licensePage->evalName->text().latin1(), - licensePage->evalCompany->text().latin1(), - licensePage->serialNumber->text().latin1() -# elif defined(EDU) - "", - licensePage->university->text().latin1(), - licensePage->serialNumber->text().latin1() -# else - "", - "", - "" -# endif - ); - - if ( ret == 0 ) - setNextEnabled( licensePage, true ); - else - setNextEnabled( licensePage, false ); - return; -#else - QDate date; - uint features; - uint testFeature; - QString platformString; - QString licenseKey = licensePage->key->text().stripWhiteSpace(); - if ( licenseKey.length() != 14 ) { - goto rejectLicense; - } - features = featuresForKey( licenseKey.upper() ); - date = decodedExpiryDate( licenseKey.mid(9) ); - if ( !date.isValid() ) { - goto rejectLicense; - } -# if defined(Q_OS_MAC) - testFeature = Feature_Mac; - platformString = "Mac OS X"; -# elif defined(Q_OS_WIN32) - testFeature = Feature_Windows; - platformString = "Windows"; -# else - testFeature = Feature_Unix; - platformString = "UNIX"; -# ifdef Q_CC_GNU -# warning "What about Qtopia Core?" -# endif -# endif - if ( !(features&testFeature) && currentPage() == licensePage ) { - if ( features & (Feature_Unix|Feature_Windows|Feature_Mac|Feature_Embedded) ) { - int ret = QMessageBox::information( this, - tr("No %1 license").arg(platformString), - tr("You are not licensed for the %1 platform.\n" - "Please contact sales@trolltech.com to upgrade\n" - "your license to include the Windows platform.").arg(platformString), - tr("Try again"), - tr("Abort installation") - ); - if ( ret == 1 ) { - QApplication::exit(); - } else { - licensePage->key->setText( "" ); - } - } - goto rejectLicense; - } - if ( date < QDate::currentDate() && currentPage() == licensePage ) { - static bool alreadyShown = false; - if ( !alreadyShown ) { - QMessageBox::warning( this, - tr("Support and upgrade period has expired"), - tr("Your support and upgrade period has expired.\n" - "\n" - "You may continue to use your last licensed release\n" - "of Qt under the terms of your existing license\n" - "agreement. But you are not entitled to technical\n" - "support, nor are you entitled to use any more recent\n" - "Qt releases.\n" - "\n" - "Please contact sales@trolltech.com to renew your\n" - "support and upgrades for this license.") - ); - alreadyShown = true; - } - } - if ( features & Feature_US ) - usLicense = true; - else - usLicense = false; - - licensePage->expiryDate->setText( date.toString( Qt::ISODate ) ); - if( features & Feature_Enterprise ) { - licensePage->productsString->setCurrentItem( 1 ); - emit editionString( "Enterprise Edition" ); - } else { - licensePage->productsString->setCurrentItem( 0 ); - emit editionString( "Professional Edition" ); - } - setNextEnabled( licensePage, true ); - return; - -rejectLicense: - licensePage->expiryDate->setText( "" ); -# if defined(Q_OS_WIN32) - //TODO: Is this a bug? It bus errors on MACX, ask rms. - // it should work -- if it doesn't this seems to be a bug in the MACX code, - // I guess (rms) - licensePage->productsString->setCurrentItem( -1 ); -# endif - emit editionString( "" ); - setNextEnabled( licensePage, false ); - return; -#endif -} - -void SetupWizardImpl::logFiles( const QString& entry, bool close ) -{ - if( !fileLog.isOpen() ) { - fileLog.setName( optionsPage->installPath->text() + QDir::separator() + "install.log" ); - if( !fileLog.open( IO_WriteOnly | IO_Translate ) ) - return; - } - -#if 1 - progressPage->filesDisplay->append(entry); -#else - progressPage->filesDisplay->setText( "Installing files...\n" + entry + "\n" ); -#endif - - static QTextStream outstream; - outstream.setDevice( &fileLog ); - outstream << ( entry + "\n" ); - - if( close ) - fileLog.close(); -} - -void SetupWizardImpl::logOutput( const QString& entry, bool close ) -{ - if( !outputLog.isOpen() ) { - QDir installDir; - if ( optionsPage ) - installDir.setPath( optionsPage->installPath->text() ); - else - installDir.setPath( QEnvironment::getEnv( "QTDIR" ) ); - outputLog.setName( installDir.filePath("build.log") ); - if( !outputLog.open( IO_WriteOnly | IO_Translate ) ) - return; - } - - buildPage->outputDisplay->append(entry); - - static QTextStream outstream; - outstream.setDevice( &outputLog ); - outstream << ( entry + "\n" ); - - if( close ) - outputLog.close(); -} - -void SetupWizardImpl::archiveMsg( const QString& msg ) -{ - if( msg.right( 7 ) == ".cpp..." || msg.right( 5 ) == ".c..." || msg.right( 7 ) == ".pro..." || msg.right( 6 ) == ".ui..." ) - filesToCompile++; - qApp->processEvents(); - if ( msg.startsWith("Expanding") ) - // only show the "Expanding" entries to avoid flickering - logFiles( msg ); -} - -#ifdef Q_WS_WIN -static HANDLE createFile( const QString &entryName, DWORD attr1, DWORD attr2 ) -{ - QT_WA({ - return ::CreateFileW( entryName.ucs2(), attr1, attr2, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); - }, { - return ::CreateFileA( entryName.local8Bit(), attr1, attr2, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); - }) -} -#endif - -bool SetupWizardImpl::copyFiles( const QString& sourcePath, const QString& destPath, bool topLevel ) -{ - QDir dir( sourcePath ); - const QFileInfoList* list = dir.entryInfoList(); - QFileInfoListIterator it( *list ); - QFileInfo* fi; - bool doCopy; - - while( ( fi = it.current() ) ) { - if( fi->fileName()[ 0 ] != '.' ) { - QString entryName = sourcePath + QDir::separator() + fi->fileName(); - QString targetName = destPath + QDir::separator() + fi->fileName(); - doCopy = true; - if( fi->isDir() ) { - if( !dir.exists( targetName ) ) - createDir( targetName ); - if( topLevel ) { - if ( fi->fileName() == "doc" ) - doCopy = optionsPage->installDocs->isChecked(); - else if ( fi->fileName() == "tools" ) - doCopy = optionsPage->installTools->isChecked(); - else if ( fi->fileName() == "tutorial" ) - doCopy = optionsPage->installTutorials->isChecked(); - else if ( fi->fileName() == "examples" ) - doCopy = optionsPage->installExamples->isChecked(); - } - if( doCopy ) - if( !copyFiles( entryName, targetName, false ) ) - return false; - } else { - if( qApp && isShown() ) { - qApp->processEvents(); - progressPage->operationProgress->setProgress( totalFiles ); - logFiles( targetName ); - } else { - return false; - } - if( entryName.right( 4 ) == ".cpp" || - entryName.right( 2 ) == ".c" || - entryName.right( 4 ) == ".pro" || - entryName.right( 3 ) == ".ui" ) - filesToCompile++; - bool res = true; - if ( !QFile::exists( targetName ) ) - res = copyFile( entryName, targetName ); -#if defined(Q_OS_WIN32) - if ( res ) { - totalFiles++; - HANDLE inFile, outFile; - if( inFile = createFile( entryName, GENERIC_READ, FILE_SHARE_READ ) ){ - if( outFile = createFile( targetName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE ) ){ - FILETIME createTime, accessTime, writeTime; - ::GetFileTime( inFile, &createTime, &accessTime, &writeTime ); - ::SetFileTime( outFile, &createTime, &accessTime, &writeTime ); - ::CloseHandle( outFile ); - } - ::CloseHandle( inFile ); - } - } else { - QString error = QEnvironment::getLastError(); - logFiles( QString( " ERROR: " ) + error + "\n" ); - if( QMessageBox::warning( this, "File copy error", entryName + ": " + error, "Continue", "Cancel", QString(), 0 ) ) - return false; - } -#elif defined( Q_OS_UNIX ) - // ### TODO: keep file date the same, handle errors -#endif - } - } - ++it; - } - return true; -} - -void SetupWizardImpl::setInstallStep( int step ) -{ - QString captionTxt; -#if defined(QSA) - captionTxt = tr("QSA Evaluation Version Installation Wizard"); -#elif defined(EVAL) - captionTxt = tr("Qt Evaluation Version Installation Wizard"); -#elif defined(EDU) - captionTxt = tr("Qt Educational Edition Installation Wizard"); -#elif defined(NON_COMMERCIAL) - captionTxt = tr("Qt Non-Commercial Edition Installation Wizard"); -#else - if( globalInformation.reconfig() ) - captionTxt = tr("Qt Configuration Wizard"); - else - captionTxt = tr("Qt Installation Wizard"); -#endif - setCaption( tr("%1 - Step %2 of %3").arg( captionTxt ).arg( step ).arg( pageCount() ) ); - emit wizardPageShowed( step-1 ); -} - -void SetupWizardImpl::timerFired() -{ - QString tmp( "Next %1 >" ); - - timeCounter--; - - if( timeCounter ) - nextButton()->setText( tmp.arg( timeCounter ) ); - else { - next(); - autoContTimer.stop(); - } -} - -void SetupWizardImpl::readLicense( QString filePath) -{ -#if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - QFile licenseFile( filePath ); - - if( licenseFile.open( IO_ReadOnly ) ) { - QString buffer; - - while( licenseFile.readLine( buffer, 1024 ) != -1 ) { - if( buffer[ 0 ] != '#' ) { - QStringList components = QStringList::split( '=', buffer ); - QStringList::Iterator it = components.begin(); - QString keyString = (*it++).stripWhiteSpace().replace( QRegExp( QString( "\"" ) ), QString() ).upper(); - QString value = (*it++).stripWhiteSpace().replace( QRegExp( QString( "\"" ) ), QString() ); - - licenseInfo[ keyString ] = value; - } - } - licenseFile.close(); - - if ( licensePage ) { - licensePage->customerID->setText( licenseInfo[ "CUSTOMERID" ] ); - licensePage->licenseID->setText( licenseInfo[ "LICENSEID" ] ); - licensePage->licenseeName->setText( licenseInfo[ "LICENSEE" ] ); - if( licenseInfo[ "PRODUCTS" ] == "qt-enterprise" ) { - licensePage->productsString->setCurrentItem( 1 ); - emit editionString( "Enterprise Edition" ); - } else { - licensePage->productsString->setCurrentItem( 0 ); - emit editionString( "Professional Edition" ); - } - licensePage->expiryDate->setText( licenseInfo[ "EXPIRYDATE" ] ); - licensePage->key->setText( licenseInfo[ "LICENSEKEY" ] ); - } - } -#endif -} - -void SetupWizardImpl::writeLicense( QString filePath ) -{ -#if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - QFile licenseFile( filePath ); - - if( licenseFile.open( IO_WriteOnly | IO_Translate ) ) { - QTextStream licStream( &licenseFile ); - - licenseInfo[ "CUSTOMERID" ] = licensePage->customerID->text(); - licenseInfo[ "LICENSEID" ] = licensePage->licenseID->text(); - licenseInfo[ "LICENSEE" ] = licensePage->licenseeName->text(); - if( licensePage->productsString->currentItem() == 0 ) { - licenseInfo[ "PRODUCTS" ] = "qt-professional"; - emit editionString( "Professional Edition" ); - } else { - licenseInfo[ "PRODUCTS" ] = "qt-enterprise"; - emit editionString( "Enterprise Edition" ); - } - - licenseInfo[ "EXPIRYDATE" ] = licensePage->expiryDate->text(); - licenseInfo[ "LICENSEKEY" ] = licensePage->key->text(); - - licStream << "# Toolkit license file" << endl; - licStream << "CustomerID=\"" << licenseInfo[ "CUSTOMERID" ].latin1() << "\"" << endl; - licStream << "LicenseID=\"" << licenseInfo[ "LICENSEID" ].latin1() << "\"" << endl; - licStream << "Licensee=\"" << licenseInfo[ "LICENSEE" ].latin1() << "\"" << endl; - licStream << "Products=\"" << licenseInfo[ "PRODUCTS" ].latin1() << "\"" << endl; - licStream << "ExpiryDate=" << licenseInfo[ "EXPIRYDATE" ].latin1() << endl; - licStream << "LicenseKey=" << licenseInfo[ "LICENSEKEY" ].latin1() << endl; - - licenseFile.close(); - } -#endif -} - -void SetupWizardImpl::clickedLicenseFile() -{ - QString licensePath = QFileDialog::getOpenFileName( optionsPage->installPath->text(), QString(), this, NULL, "Browse for license file" ); - - if( !licensePath.isEmpty() ) - readLicense( licensePath ); - -} - -void SetupWizardImpl::readLicenseAgreement() -{ - // Intropage - ResourceLoader *rcLoader; -#if defined(QSA) - LicenseAgreementPageImpl *lap; - if ( currentPage() == licenseAgreementPageQsa ) { - lap = licenseAgreementPageQsa; - rcLoader = new ResourceLoader( "LICENSE_QSA" ); - } else { - lap = licenseAgreementPage; - rcLoader = new ResourceLoader( "LICENSE" ); - } -#elif defined(EVAL) || defined(EDU) - LicenseAgreementPageImpl *lap = licenseAgreementPage; - rcLoader = new ResourceLoader( "LICENSE" ); -#elif defined(NON_COMMERCIAL) - LicenseAgreementPageImpl *lap = licenseAgreementPage; - if ( lap->countryCombo->currentItem() == 0 ) - rcLoader = new ResourceLoader( "LICENSE-US" ); - else - rcLoader = new ResourceLoader( "LICENSE" ); -#else - LicenseAgreementPageImpl *lap = licenseAgreementPage; - if ( usLicense ) { - rcLoader = new ResourceLoader( "LICENSE-US" ); - } else { - rcLoader = new ResourceLoader( "LICENSE" ); - } -#endif - if ( rcLoader->isValid() ) { - lap->introText->setText( rcLoader->data() ); - lap->acceptLicense->setEnabled( true ); - } else { - emit wizardPageFailed( indexOf(currentPage()) ); - QMessageBox::critical( this, tr("Package corrupted"), - tr("Could not find the LICENSE file in the package.\nThe package might be corrupted.") ); - lap->acceptLicense->setEnabled( false ); - } - delete rcLoader; -} - -void SetupWizardImpl::accept() -{ -#if defined(Q_OS_WIN32) - if ( finishPage->showReadmeCheck->isChecked() ) { - QProcess proc( QString("notepad.exe") ); -#if defined(QSA) - QString qsaDir = optionsPageQsa->installPath->text(); - proc.addArgument( qsaDir + "\\README" ); -#else - QString qtDir = QEnvironment::getEnv( "QTDIR" ); - proc.addArgument( qtDir + "\\README" ); -#endif - proc.start(); - } -#endif - QDialog::accept(); -} diff --git a/util/install/win/setupwizardimpl.h b/util/install/win/setupwizardimpl.h deleted file mode 100644 index 1c86f74..0000000 --- a/util/install/win/setupwizardimpl.h +++ /dev/null @@ -1,276 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef SETUPWIZARDIMPL_H -#define SETUPWIZARDIMPL_H - -#include "pages/pages.h" -#include "shell.h" - -#include -#include -#include -#include -#include -#include - -class QCheckListItem; -class QListView; - -class CheckListItem : public QCheckListItem -{ -public: - CheckListItem(QListView *listview, const QString &text, Type = RadioButtonController); - CheckListItem(QCheckListItem *parent, const QString &text, Type = RadioButtonController); - - void setHelpText(const QString &help, QTextView *display); - void setWarningText(const QString &warning, CheckListItem *conflict = 0); - void addRequiredFiles(const QString &file); - void setRequiredFileLocation(const QString &location); - - void setOpen(bool on); - void setOn(bool on); - void setCritical(bool on); - - int rtti() const; - static int RTTI; - - void displayHelp(); - bool verify() const; - - void paintCell( QPainter *, const QColorGroup & cg, int column, int width, int alignment ); - -protected: - bool testAndWarn(); - void activate(); - -private: - QString help_text; - QString warning_text; - QTextView *help_display; - QStringList required_files; - QString file_location; - CheckListItem *conflict_with; - bool critical; -}; - -class SetupWizardImpl : public QWizard -{ - Q_OBJECT -public: - SetupWizardImpl( QWidget* parent = 0, const char* name = NULL, bool modal = false, WindowFlags f = 0 ); - - void showPage( QWidget* ); - void stopProcesses(); - - void optionClicked( CheckListItem * ); - -signals: - void wizardPages( const QPtrList& ); - void wizardPageShowed( int ); - void wizardPageFailed( int ); - void editionString( const QString& ); - -private: - int totalFiles; - QProcess configure; - QProcess make; - QProcess cleaner; -#if defined(QSA) - QProcess assistant; -#endif - - QString programsFolder; - QString devSysFolder; - QString tmpPath; - - WinShell shell; - - void saveSettings(); - void saveSet( QListView* list ); - -protected slots: - void accept(); // reimplemented from QDialog - -private slots: - void clickedSystem( int ); - void sysOtherComboChanged( int ); - void clickedFolderPath(); - void clickedDevSysPath(); - void clickedLicenseFile(); - void cleanDone(); - void configDone(); - void makeDone(); - void assistantDone(); - void restartBuild(); - void readConfigureOutput(); - void readConfigureError(); - void readCleanerOutput(); - void readCleanerError(); - void readMakeOutput(); - void readMakeError(); - void readAssistantOutput(); - void readAssistantError(); - void timerFired(); - void configPageChanged(); - void archiveMsg(const QString &); - void licenseChanged(); - bool verifyConfig(); - -private: - void showPageLicense(); - void showPageOptions(); - void showPageFolders(); - void showPageConfig(); - void showPageProgress(); - void showPageBuild(); - void showPageFinish(); - - void initPages(); - void initConnections(); - - void fixEnvironment(const QString &var, const QString &file = QString()); - void prepareEnvironment(); - - void makeDone( bool error ); - - void setStaticEnabled( bool se ); - void setJpegDirect( bool jd ); - void readLicenseAgreement(); - - bool copyFiles( const QString& sourcePath, const QString& destPath, bool topLevel ); - int totalRead; - - QString buildQtShortcutText; - bool fixedPath; - bool filesCopied; - bool persistentEnv; - int filesToCompile; - int filesCompiled; -#if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - bool usLicense; -#endif - - QString currentOLine; - QString currentELine; - - void updateDisplay(const QString &input, QString &output); -#if defined(Q_OS_WIN32) - void installIcons( const QString& iconFolder, const QString& dirName, bool common ); -#endif - void doIDEIntegration(); - void doStartMenuIntegration(); - void logFiles( const QString& entry, bool close = false ); - void logOutput( const QString& entry, bool close = false ); - - void setInstallStep( int step ); - void readLicense( QString filePath ); - void writeLicense( QString filePath ); - - QFile fileLog; - QFile outputLog; - QMap licenseInfo; - QTimer autoContTimer; - int timeCounter; - QStringList allModules; - - CheckListItem *accOn, *accOff; - CheckListItem *bigCodecsOn, *bigCodecsOff; - CheckListItem *tabletOn, *tabletOff; - CheckListItem *advancedSTL, *advancedExceptions, *advancedRTTI; - - CheckListItem /* *mngPresent, */ *mngDirect, *mngPlugin, *mngOff; - CheckListItem /* *jpegPresent, */ *jpegDirect, *jpegPlugin, *jpegOff; - CheckListItem /* *pngPresent, */ *pngDirect, *pngPlugin, *pngOff; - CheckListItem *gifDirect, *gifOff; - - CheckListItem *sgiDirect, *sgiPlugin, *sgiOff; - CheckListItem *cdeDirect, *cdePlugin, *cdeOff; - CheckListItem *motifplusDirect, *motifplusPlugin, *motifplusOff; - CheckListItem *platinumDirect, *platinumPlugin, *platinumOff; - CheckListItem *motifDirect, *motifPlugin, *motifOff; - CheckListItem *xpDirect, *xpPlugin, *xpOff; - - CheckListItem *mysqlDirect, *mysqlPlugin, *mysqlOff; - CheckListItem *ociDirect, *ociPlugin, *ociOff; - CheckListItem *odbcDirect, *odbcPlugin, *odbcOff; - CheckListItem *psqlDirect, *psqlPlugin, *psqlOff; - CheckListItem *tdsDirect, *tdsPlugin, *tdsOff; - CheckListItem *db2Direct, *db2Plugin, *db2Off; - CheckListItem *sqliteDirect, *sqlitePlugin, *sqliteOff; - CheckListItem *ibaseDirect, *ibasePlugin, *ibaseOff; - - CheckListItem *zlibDirect, *zlibSystem, *zlibOff; - - CheckListItem *dspOff, *dspOn; - CheckListItem *vcprojOff, *vcprojOn; - - CheckListItem *staticItem; - -#if defined(EVAL) || defined(EDU) - CheckListItem *mysqlPluginInstall; - CheckListItem *ociPluginInstall; - CheckListItem *odbcPluginInstall; - CheckListItem *psqlPluginInstall; - CheckListItem *tdsPluginInstall; - CheckListItem *db2PluginInstall; - CheckListItem *sqlitePluginInstall; - CheckListItem *ibasePluginInstall; -#elif defined(NON_COMMERCIAL) - CheckListItem *sqlitePluginInstall; -#endif - - // wizard pages - LicenseAgreementPageImpl *licenseAgreementPage; - LicenseAgreementPageImpl *licenseAgreementPageQsa; - LicensePageImpl *licensePage; - OptionsPageImpl *optionsPage; - OptionsPageImpl *optionsPageQsa; - FoldersPageImpl *foldersPage; - ConfigPageImpl *configPage; - ProgressPageImpl *progressPage; - BuildPageImpl *buildPage; - FinishPageImpl *finishPage; -#if defined(Q_OS_WIN32) - WinIntroPageImpl *winIntroPage; -#endif -}; - -#endif diff --git a/util/install/win/setupwizardimpl_config.cpp b/util/install/win/setupwizardimpl_config.cpp deleted file mode 100644 index a5959fb..0000000 --- a/util/install/win/setupwizardimpl_config.cpp +++ /dev/null @@ -1,1564 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "setupwizardimpl.h" -#include "environment.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -bool findFile(const QString &); - -CheckListItem::CheckListItem(QListView *listview, const QString &text, Type type) -: QCheckListItem(listview, text, type), help_display(0), conflict_with(0), critical(false) -{ - if (type == RadioButtonController || type == CheckBoxController) - setOpen(true); -} - -CheckListItem::CheckListItem(QCheckListItem *parent, const QString &text, Type type) -: QCheckListItem(parent, text, type), help_display(0), conflict_with(0), critical(false) -{ - if (type == RadioButtonController || type == CheckBoxController) - setOpen(true); -} - -int CheckListItem::RTTI = 666; - -int CheckListItem::rtti() const -{ - return RTTI; -} - -void CheckListItem::setHelpText(const QString &help, QTextView *display) -{ - help_text = help; - help_display = display; -} - -void CheckListItem::setWarningText(const QString &warning, CheckListItem *conflict) -{ - conflict_with = conflict; - warning_text = warning; -} - -void CheckListItem::addRequiredFiles(const QString &file) -{ - QStringList files = QStringList::split(",", file); - for (QStringList::ConstIterator it = files.begin(); it != files.end(); ++it) { - QString f(*it); - required_files << f; - if (!findFile(f)) { - if (type() == QCheckListItem::RadioButtonController - || type() == QCheckListItem::CheckBoxController) { - setOpen(false); - } else { - setOn(false); - setEnabled(false); - } - } - } -} - -void CheckListItem::setRequiredFileLocation(const QString &location) -{ - file_location = location; -} - -bool CheckListItem::verify() const -{ - if (text(0) == "Off") - return true; - - if (!required_files.count()) { - if (parent() && parent()->rtti() == RTTI) - return ((CheckListItem*)parent())->verify(); - return true; - } - - QStringList::ConstIterator it; - for (it = required_files.begin(); it != required_files.end(); ++it) { - QString file(*it); - if (!findFile(file)) - return false; - } - return true; -} - -bool CheckListItem::testAndWarn() -{ - if (!warning_text.isEmpty()) { - if (!conflict_with || conflict_with->isOn()) { - int r = QMessageBox::warning(listView()->window(), "Warning", - warning_text + "
Select anyway?", "Yes", "No" ); - return r == 0; - } else { - return true; - } - } - - QStringList files(required_files); - if (!required_files.count() && text(0) != "Off") { - if (parent() && parent()->rtti() == RTTI) - return ((CheckListItem*)parent())->testAndWarn(); - return true; - } - - if (!verify()) { - QString message = QString("

The option '%1' is not verified by the installer. One or more of the following " - "files could not be located on the system:" - "

%2" - "

Continuing with this option selected might break the installation process.") - .arg(text(0)).arg(required_files.join(", ")); - if (!file_location.isEmpty()) { - message += QString("

The requested files are %1 and need to be installed " - "in the INCLUDE, PATH and LIBS environment as appropriate.").arg(file_location); - } - - int r = QMessageBox::warning(listView()->window(), "Option not Verified", - message + "

Select anyway?", "Yes", "No" ); - return r == 0; - } - return true; -} - -void CheckListItem::displayHelp() -{ - if (help_display) { - help_display->setText(help_text); - return; - } - QListViewItem *p = parent(); - if (p && p->rtti() == RTTI) - ((CheckListItem*)p)->displayHelp(); -} - -void CheckListItem::setOn(bool on) -{ - if (on && (type() == RadioButton || type() == CheckBox) && !testAndWarn()) - return; - QCheckListItem::setOn(on); - - SetupWizardImpl* wizard = qobject_cast(listView()->window()); - if (wizard && listView()->isVisible() && listView()->updatesEnabled()) - wizard->optionClicked(this); -} - -void CheckListItem::activate() -{ - displayHelp(); - QCheckListItem::activate(); -} - -void CheckListItem::setOpen(bool on) -{ - if (on && listView()->isVisible()) { - if (!testAndWarn()) - return; - displayHelp(); - } - QCheckListItem::setOpen(on); -} - -void CheckListItem::setCritical(bool on) -{ - if (critical == on) - return; - - critical = on; - repaint(); -} - -void CheckListItem::paintCell( QPainter *p, const QColorGroup & cg, int column, int width, int alignment ) -{ - QColorGroup group(cg); - if (critical) - group.setColor(QColorGroup::Text, red); - QCheckListItem::paintCell(p, group, column, width, alignment); -} - - - -void SetupWizardImpl::setStaticEnabled( bool se ) -{ - bool enterprise = licenseInfo[ "PRODUCTS" ] == "qt-enterprise"; - if ( se ) { - if ( accOn->isOn() ) { - accOn->setOn( false ); - accOff->setOn( true ); - } - if ( bigCodecsOff->isOn() ) { - bigCodecsOn->setOn( true ); - bigCodecsOff->setOn( false ); - } - if ( mngPlugin->isOn() ) { - mngDirect->setOn( true ); - mngPlugin->setOn( false ); - mngOff->setOn( false ); - } - if ( pngPlugin->isOn() ) { - pngDirect->setOn( true ); - pngPlugin->setOn( false ); - pngOff->setOn( false ); - } - if ( jpegPlugin->isOn() ) { - jpegDirect->setOn( true ); - jpegPlugin->setOn( false ); - jpegOff->setOn( false ); - } - if ( sgiPlugin->isOn() ) { - sgiPlugin->setOn( false ); - sgiDirect->setOn( true ); - } - if ( cdePlugin->isOn() ) { - cdePlugin->setOn( false ); - cdeDirect->setOn( true ); - } - if ( motifplusPlugin->isOn() ) { - motifplusPlugin->setOn( false ); - motifplusDirect->setOn( true ); - } - if ( motifPlugin->isOn() ) { - motifPlugin->setOn( false ); - motifDirect->setOn( true ); - } - if ( platinumPlugin->isOn() ) { - platinumPlugin->setOn( false ); - platinumDirect->setOn( true ); - } - if ( xpPlugin->isOn() ) { - xpPlugin->setOn( false ); - xpOff->setOn( true ); - } - if ( enterprise ) { - if ( mysqlPlugin->isOn() ) { - mysqlPlugin->setOn( false ); - mysqlDirect->setOn( true ); - } - if ( ociPlugin->isOn() ) { - ociPlugin->setOn( false ); - ociDirect->setOn( true ); - } - if ( odbcPlugin->isOn() ) { - odbcPlugin->setOn( false ); - odbcDirect->setOn( true ); - } - if ( psqlPlugin->isOn() ) { - psqlPlugin->setOn( false ); - psqlDirect->setOn( true ); - } - if ( tdsPlugin->isOn() ) { - tdsPlugin->setOn( false ); - tdsDirect->setOn( true ); - } - if ( db2Plugin->isOn() ) { - db2Plugin->setOn( false ); - db2Direct->setOn( true ); - } - if ( sqlitePlugin->isOn() ) { - sqlitePlugin->setOn( false ); - sqliteDirect->setOn( true ); - } - if ( ibasePlugin->isOn() ) { - ibasePlugin->setOn( false ); - ibaseDirect->setOn( true ); - } - } - accOn->setEnabled( false ); - bigCodecsOff->setEnabled( false ); - mngPlugin->setEnabled( false ); - pngPlugin->setEnabled( false ); - jpegPlugin->setEnabled( false ); - sgiPlugin->setEnabled( false ); - cdePlugin->setEnabled( false ); - motifPlugin->setEnabled( false ); - motifplusPlugin->setEnabled( false ); - motifPlugin->setEnabled( false ); - platinumPlugin->setEnabled( false ); - xpPlugin->setEnabled( false ); - if ( enterprise ) { - mysqlPlugin->setEnabled( false ); - ociPlugin->setEnabled( false ); - odbcPlugin->setEnabled( false ); - psqlPlugin->setEnabled( false ); - tdsPlugin->setEnabled( false ); - db2Plugin->setEnabled( false ); - sqlitePlugin->setEnabled( false ); - ibasePlugin->setEnabled( false ); - } - } else { - accOn->setEnabled( true ); - bigCodecsOff->setEnabled( true ); - mngPlugin->setEnabled( true ); - pngPlugin->setEnabled( true ); - jpegPlugin->setEnabled( true ); - sgiPlugin->setEnabled( true ); - cdePlugin->setEnabled( true ); - motifplusPlugin->setEnabled( true ); - motifPlugin->setEnabled( true ); - platinumPlugin->setEnabled( true ); - xpPlugin->setEnabled( true ); - if ( enterprise ) { - mysqlPlugin->setEnabled( true ); - ociPlugin->setEnabled( true ); - odbcPlugin->setEnabled( true ); - psqlPlugin->setEnabled( true ); - tdsPlugin->setEnabled( true ); - db2Plugin->setEnabled( true ); - sqlitePlugin->setEnabled( true ); - ibasePlugin->setEnabled( true ); - } - } - setJpegDirect( mngDirect->isOn() ); -} - -void SetupWizardImpl::setJpegDirect( bool jd ) -{ - // direct MNG support requires also direct JPEG support - if ( jd ) { - jpegOff->setOn( false ); - jpegPlugin->setOn( false ); - jpegDirect->setOn( true ); - - jpegOff->setEnabled( false ); - jpegPlugin->setEnabled( false ); - jpegDirect->setEnabled( true ); - } else { - jpegOff->setEnabled( true ); - if ( !staticItem->isOn() ) - jpegPlugin->setEnabled( true ); - jpegDirect->setEnabled( true ); - } -} - -void SetupWizardImpl::optionClicked( CheckListItem *item ) -{ - if ( !item || item->type() != CheckListItem::RadioButton ) - return; - - if ( item->text(0) == "Static" && item->isOn() ) { - setStaticEnabled( true ); - return; - } else if ( item->text( 0 ) == "Shared" && item->isOn() ) { - setStaticEnabled( false ); - return; - } else if ( item==mngDirect || item==mngPlugin || item==mngOff ) { - setJpegDirect( mngDirect->isOn() ); - } else if ( item==db2Direct && odbcDirect->isOn() ) { - if ( odbcPlugin->isEnabled() ) - odbcPlugin->QCheckListItem::setOn(true); - else - odbcOff->QCheckListItem::setOn(true); - } else if ( item==odbcDirect && db2Direct->isOn() ) { - if ( db2Plugin->isEnabled() ) - db2Plugin->QCheckListItem::setOn(true); - else - db2Off->QCheckListItem::setOn(true); - } -} - - -void SetupWizardImpl::configPageChanged() -{ - if ( configPage->configList->isVisible() ) { - configPage->configList->setSelected( configPage->configList->currentItem(), true ); - } else if ( configPage->advancedList->isVisible() ) { - configPage->advancedList->setSelected( configPage->advancedList->currentItem(), true ); - } -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - else if ( configPage->installList->isVisible() ) { - configPage->installList->setSelected( configPage->installList->currentItem(), true ); - } -#endif -} - -void SetupWizardImpl::cleanDone() -{ -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - prepareEnvironment(); -# if defined(Q_OS_WIN32) - QString qtdir = QEnvironment::getEnv( "QTDIR" ); - - // adjust the .qmake.cache - QFile qmakeCache( qtdir + "/.qmake.cache" ); - if ( qmakeCache.open( IO_ReadOnly ) ) { - QString content = qmakeCache.readAll(); - qmakeCache.close(); - if ( globalInformation.sysId() == GlobalInformation::Borland ) - content.replace( "C:\\QtEvaluation\\qtborland", qtdir ); - else - content.replace( "C:\\QtEvaluation\\qtmsvc", qtdir ); - - if ( qmakeCache.open( IO_WriteOnly ) ) { - QTextStream ts( &qmakeCache ); - ts << content; - qmakeCache.close(); - } else { - logOutput( QString("Warning: can't open the .qmake.cache file for writing: %1\n").arg( qmakeCache.errorString() ) ); - } - } else { - logOutput( QString("Warning: can't open the .qmake.cache file for reading: %1\n").arg( qmakeCache.errorString() ) ); - } - - QStringList args; - args << ( qtdir + "\\bin\\configure.exe" ); - args << "-spec"; - args << globalInformation.text(GlobalInformation::Mkspec); - if ( globalInformation.sysId() == GlobalInformation::MSVC ) - args << "-dsp"; - else if ( globalInformation.sysId() == GlobalInformation::MSVCNET ) - args << "-vcproj"; - - if( qWinVersion() & WV_NT_based ) { - logOutput( "Execute configure...\n" ); - logOutput( args.join( " " ) + "\n" ); - - configure.setWorkingDirectory( qtdir ); - configure.setArguments( args ); - // Start the configure process - buildPage->compileProgress->setTotalSteps( int(double(filesToCompile) * 2.6) ); - buildPage->restartBuild->setText( "Stop configure" ); - buildPage->restartBuild->setEnabled( true ); - buildPage->restartBuild->show(); - buildPage->compileProgress->show(); - if( !configure.start() ) { - logOutput( "Could not start configure process" ); - emit wizardPageFailed( indexOf(currentPage()) ); - } - } else { // no proper process handling on DOS based systems - create a batch file instead - logOutput( "Generating batch file...\n" ); - QDir installDir; - if ( optionsPage ) - installDir.setPath( optionsPage->installPath->text() ); - else - installDir.setPath( qtdir ); - QFile outFile( installDir.filePath("build.bat") ); - QTextStream outStream( &outFile ); - - if( outFile.open( IO_WriteOnly | IO_Translate ) ) { - if ( installDir.absPath()[1] == ':' ) - outStream << installDir.absPath().left(2) << endl; - outStream << "cd %QTDIR%" << endl; - outStream << args.join( " " ) << endl; - if( !globalInformation.reconfig() ) { - outStream << globalInformation.text(GlobalInformation::MakeTool) << endl; - } - outFile.close(); - } - logOutput( "Doing the final integration steps..." ); - doIDEIntegration(); - buildPage->compileProgress->setTotalSteps( buildPage->compileProgress->totalSteps() ); - showPage( finishPage ); - } -# elif defined(Q_OS_UNIX) - buildPage->compileProgress->show(); - buildPage->restartBuild->show(); - - buildPage->compileProgress->setProgress( 0 ); - buildPage->compileProgress->setTotalSteps( int(double(filesToCompile) * 1.8) ); - configDone(); -# endif -#else - QStringList args; - QStringList entries; - QSettings settings; - QString entry; - QStringList::Iterator it; - QFile tmpFile; - QTextStream tmpStream; - bool settingsOK; - -# if defined(Q_OS_WIN32) - args << ( QEnvironment::getEnv( "QTDIR" ) + "\\bin\\configure.exe" ); -# elif defined(Q_OS_UNIX) - args << ( QEnvironment::getEnv( "QTDIR" ) + QDir::separator() + "configure" ); -# endif - - entry = settings.readEntry( "/Trolltech/Qt/Build", "Debug", &settingsOK ); - if ( entry == "Debug" ) - args += "-debug"; - else - args += "-release"; - - entry = settings.readEntry( "/Trolltech/Qt/Library", "Shared", &settingsOK ); - if ( entry == "Static" ) - args += "-static"; - else - args += "-shared"; - - entry = settings.readEntry( "/Trolltech/Qt/Threading", QString(), &settingsOK ); - if ( entry == "Threaded" ) - args += "-thread"; - else - args += "-no-thread"; - - entries = settings.readListEntry( "/Trolltech/Qt/Modules", ',', &settingsOK ); - for( it = allModules.begin(); it != allModules.end(); ++it ) { - entry = *it; - if ( entries.find( entry ) != entries.end() ) - args += QString( "-enable-" ) + entry; - else - args += QString( "-disable-") + entry; - } - - entry = settings.readEntry( "/Trolltech/Qt/SQL Drivers/MySQL", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-sql-mysql"; - else if ( entry == "Plugin" ) - args += "-plugin-sql-mysql"; - else if ( entry == "Off" ) - args += "-no-sql-mysql"; - - entry = settings.readEntry( "/Trolltech/Qt/SQL Drivers/OCI", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-sql-oci"; - else if ( entry == "Plugin" ) - args += "-plugin-sql-oci"; - else if ( entry == "Off" ) - args += "-no-sql-oci"; - - entry = settings.readEntry( "/Trolltech/Qt/SQL Drivers/ODBC", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-sql-odbc"; - else if ( entry == "Plugin" ) - args += "-plugin-sql-odbc"; - else if ( entry == "Off" ) - args += "-no-sql-odbc"; - - entry = settings.readEntry( "/Trolltech/Qt/SQL Drivers/PostgreSQL", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-sql-psql"; - else if ( entry == "Plugin" ) - args += "-plugin-sql-psql"; - else if ( entry == "Off" ) - args += "-no-sql-psql"; - - entry = settings.readEntry( "/Trolltech/Qt/SQL Drivers/TDS", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-sql-tds"; - else if ( entry == "Plugin" ) - args += "-plugin-sql-tds"; - else if ( entry == "Off" ) - args += "-no-sql-tds"; - - entry = settings.readEntry( "/Trolltech/Qt/SQL Drivers/DB2", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-sql-db2"; - else if ( entry == "Plugin" ) - args += "-plugin-sql-db2"; - else if ( entry == "Off" ) - args += "-no-sql-db2"; - - entry = settings.readEntry( "/Trolltech/Qt/SQL Drivers/SQLite", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-sql-sqlite"; - else if ( entry == "Plugin" ) - args += "-plugin-sql-sqlite"; - else if ( entry == "Off" ) - args += "-no-sql-sqlite"; - - entry = settings.readEntry( "/Trolltech/Qt/SQL Drivers/iBase", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-sql-ibase"; - else if ( entry == "Plugin" ) - args += "-plugin-sql-ibase"; - else if ( entry == "Off" ) - args += "-no-sql-ibase"; - -# if defined(Q_OS_WIN32) -//TODO: Win only, remove these options from wizard on mac? - entry = settings.readEntry( "/Trolltech/Qt/Accessibility", "On", &settingsOK ); - if ( entry == "On" ) - args += "-accessibility"; - else - args += "-no-accessibility"; -# endif - - entry = settings.readEntry( "/Trolltech/Qt/Big Textcodecs", "On", &settingsOK ); - if ( entry == "On" ) - args += "-big-codecs"; - else - args += "-no-big-codecs"; - - entry = settings.readEntry( "/Trolltech/Qt/Tablet Support", "Off", &settingsOK ); - if ( entry == "On" ) - args += "-tablet"; - else - args += "-no-tablet"; - - entries = settings.readListEntry( "/Trolltech/Qt/Advanced C++", ',', &settingsOK ); - if ( entries.contains( "STL" ) ) - args += "-stl"; - else - args += "-no-stl"; - if ( entries.contains( "Exceptions" ) ) - args += "-exceptions"; - else - args += "-no-exceptions"; - if ( entries.contains( "RTTI" ) ) - args += "-rtti"; - else - args += "-no-rtti"; - -# if defined(Q_OS_WIN32) -//TODO: Win only, remove these options from wizard on mac? - entry = settings.readEntry( "/Trolltech/Qt/Image Formats/PNG", "Direct", &settingsOK ); - if ( entry == "Plugin" ) - args += "-plugin-imgfmt-png"; - else if ( entry == "Direct" ) - args += "-qt-imgfmt-png"; - else if ( entry == "Off" ) - args += "-no-imgfmt-png"; - args += "-qt-png"; - - entry = settings.readEntry( "/Trolltech/Qt/Image Formats/JPEG", "Direct", &settingsOK ); - if ( entry == "Plugin" ) - args += "-plugin-imgfmt-jpeg"; - else if ( entry == "Direct" ) - args += "-qt-imgfmt-jpeg"; - else if ( entry == "Off" ) - args += "-no-imgfmt-jpeg"; - args += "-qt-jpeg"; - - entry = settings.readEntry( "/Trolltech/Qt/Image Formats/MNG", "Direct", &settingsOK ); - if ( entry == "Plugin" ) - args += "-plugin-imgfmt-mng"; - else if ( entry == "Direct" ) - args += "-qt-imgfmt-mng"; - else if ( entry == "Off" ) - args += "-no-imgfmt-mng"; - args += "-qt-mng"; -# endif - - entry = settings.readEntry( "/Trolltech/Qt/Image Formats/GIF", "Direct", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-gif"; - else if ( entry == "Off" ) - args += "-no-gif"; - -# if defined(Q_OS_WIN32) -//TODO: Win only, remove these options from wizard on mac? - entry = settings.readEntry( "/Trolltech/Qt/Styles/Windows", "Direct", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-style-windows"; - else if ( entry == "Plugin" ) - args += "-plugin-style-windows"; - else if ( entry == "Off" ) - args += "-no-style-windows"; - - entry = settings.readEntry( "/Trolltech/Qt/Styles/Windows XP", "Off", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-style-windowsxp"; - else if ( entry == "Plugin" ) - args += "-plugin-style-windowsxp"; - else if ( entry == "Off" ) - args += "-no-style-windowsxp"; - - entry = settings.readEntry( "/Trolltech/Qt/Styles/Motif", "Plugin", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-style-motif"; - else if ( entry == "Plugin" ) - args += "-plugin-style-motif"; - else if ( entry == "Off" ) - args += "-no-style-motif"; - - entry = settings.readEntry( "/Trolltech/Qt/Styles/Platinum", "Plugin", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-style-platinum"; - else if ( entry == "Plugin" ) - args += "-plugin-style-platinum"; - else if ( entry == "Off" ) - args += "-no-style-platinum"; - - entry = settings.readEntry( "/Trolltech/Qt/Styles/MotifPlus", "Plugin", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-style-motifplus"; - else if ( entry == "Plugin" ) - args += "-plugin-style-motifplus"; - else if ( entry == "Off" ) - args += "-no-style-motifplus"; - - entry = settings.readEntry( "/Trolltech/Qt/Styles/CDE", "Plugin", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-style-cde"; - else if ( entry == "Plugin" ) - args += "-plugin-style-cde"; - else if ( entry == "Off" ) - args += "-no-style-cde"; - - entry = settings.readEntry( "/Trolltech/Qt/Styles/SGI", "Plugin", &settingsOK ); - if ( entry == "Direct" ) - args += "-qt-style-sgi"; - else if ( entry == "Plugin" ) - args += "-plugin-style-sgi"; - else if ( entry == "Off" ) - args += "-no-style-sgi"; -# endif - - if ( globalInformation.sysId() == GlobalInformation::MSVC ) { - entry = settings.readEntry( "/Trolltech/Qt/DSP Generation", "On", &settingsOK ); - if ( entry == "On" ) - args += "-dsp"; - else if ( entry == "Off" ) - args += "-no-dsp"; - } else if ( globalInformation.sysId() == GlobalInformation::MSVCNET ) { - entry = settings.readEntry( "/Trolltech/Qt/VCPROJ Generation", "On", &settingsOK ); - if ( entry == "On" ) - args += "-vcproj"; - else if ( entry == "Off" ) - args += "-no-vcproj"; - } else if ( globalInformation.sysId() != GlobalInformation::MSVC && globalInformation.sysId() == GlobalInformation::MSVCNET ) { - args += "-no-dsp"; - args += "-no-vcproj"; - } - - if ( ( ( !globalInformation.reconfig() && !optionsPage->skipBuild->isChecked() ) - || ( globalInformation.reconfig() && configPage->rebuildInstallation->isChecked() ) ) -# if defined(Q_OS_WIN32) - && qWinVersion() & WV_NT_based ) { -# else - ) { -# endif - logOutput( "Execute configure...\n" ); - logOutput( args.join( " " ) + "\n" ); - - configure.setWorkingDirectory( QEnvironment::getEnv( "QTDIR" ) ); - configure.setArguments( args ); - // Start the configure process - buildPage->compileProgress->setTotalSteps( int(double(filesToCompile) * 2.6) ); - buildPage->restartBuild->setText( "Stop configure" ); - buildPage->restartBuild->setEnabled( true ); - buildPage->restartBuild->show(); - buildPage->compileProgress->show(); - if( !configure.start() ) { - logOutput( "Could not start configure process" ); - emit wizardPageFailed( indexOf(currentPage()) ); - } - } else { // no proper process handling on DOS based systems - create a batch file instead - logOutput( "Generating batch file...\n" ); - QDir installDir; - if ( optionsPage ) - installDir.setPath( optionsPage->installPath->text() ); - else - installDir.setPath( QEnvironment::getEnv( "QTDIR" ) ); - QFile outFile( installDir.filePath("build.bat") ); - QTextStream outStream( &outFile ); - - if( outFile.open( IO_WriteOnly | IO_Translate ) ) { - if ( installDir.absPath()[1] == ':' ) - outStream << installDir.absPath().left(2) << endl; - outStream << "cd %QTDIR%" << endl; - - if ( globalInformation.reconfig() ) - outStream << globalInformation.text(GlobalInformation::MakeTool) << " clean" << endl; - - // There is a limitation on Windows 9x regarding the length of the - // command line. So rather use the configure.cache than specifying - // all configure options on the command line. - QFile configureCache( installDir.filePath("configure.cache") ); - if( configureCache.open( IO_WriteOnly | IO_Translate ) ) { - QTextStream confCacheStream( &configureCache ); - QStringList::Iterator it = args.begin(); - ++it; // skip args[0] (configure) - while ( it != args.end() ) { - confCacheStream << *it << endl; - ++it; - } - configureCache.close(); - outStream << args[0] << " -redo" << endl; - } else { - outStream << args.join( " " ) << endl; - } - - outStream << globalInformation.text(GlobalInformation::MakeTool) << endl; - outFile.close(); - } - logOutput( "Doing the final integration steps..." ); - // No need to redo the integration step - if ( !globalInformation.reconfig() ) - doIDEIntegration(); - buildPage->compileProgress->setTotalSteps( buildPage->compileProgress->totalSteps() ); - showPage( finishPage ); - } -#endif -} - -void SetupWizardImpl::prepareEnvironment() -{ - QByteArray pathBuffer; - QStringList path; - QString qtDir; - int envSpec = QEnvironment::LocalEnv; - - if( globalInformation.reconfig() ) { - qtDir = QEnvironment::getEnv( "QTDIR" ); - if ( configPage ) { - configPage->currentInstallation->setText( qtDir ); - } - } - else { - qtDir = QDir::toNativeSeparators( QEnvironment::getFSFileName( optionsPage->installPath->text() ) ); - } - -#if defined(Q_OS_WIN32) - if( qWinVersion() & Qt::WV_NT_based ) { - // under Windows 9x, we don't compile from the installer -- so there is - // no need to set the local environment; and doing so, results in not - // setting the persistent since qtDir\bin is already in the PATH - path = QStringList::split( QRegExp("[;,]"), QEnvironment::getEnv( "PATH" ) ); - if( path.findIndex( qtDir + "\\bin" ) == -1 ) { - path.prepend( qtDir + "\\bin" ); - QEnvironment::putEnv( "PATH", path.join( ";" ) ); - } - } -#elif defined(Q_OS_UNIX) - path = QStringList::split( QRegExp("[:]"), QEnvironment::getEnv( "PATH" ) ); - if( path.findIndex( qtDir + "/bin" ) == -1 ) { - path.prepend( qtDir + "/bin" ); - QEnvironment::putEnv( "PATH", path.join( ":" ) ); - } - QStringList dyld = QStringList::split( QRegExp("[:]"), QEnvironment::getEnv( "DYLD_LIBRARY_PATH" ) ); - if( dyld.findIndex( qtDir + "/lib" ) == -1 ) { - dyld.prepend( qtDir + "/lib" ); - QEnvironment::putEnv( "DYLD_LIBRARY_PATH", dyld.join( ":" ) ); - } -#endif - -#if defined(Q_OS_WIN32) - if( foldersPage && foldersPage->qtDirCheck->isChecked() ) { - envSpec |= QEnvironment::PersistentEnv; -/* - if( folderGroups->currentItem() == 0 ) - envSpec |= QEnvironment::GlobalEnv; -*/ - path.clear(); - - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - path = QStringList::split( ';', QEnvironment::getEnv( "PATH", QEnvironment::PersistentEnv ) ); - if( path.findIndex( qtDir + "\\bin" ) == -1 ) { - path.prepend( qtDir + "\\bin" ); - QEnvironment::putEnv( "PATH", path.join( ";" ), QEnvironment::PersistentEnv ); - } - } else { - if( path.findIndex( qtDir + "\\bin" ) == -1 ) { - QEnvironment::putEnv( "PATH", qtDir + "\\bin;%PATH%", QEnvironment::PersistentEnv ); - } - } - } -#elif defined(Q_OS_UNIX) -//Persistent environment not supported -#endif - - QEnvironment::putEnv( "QTDIR", qtDir, envSpec ); - if ( globalInformation.sysId() != GlobalInformation::Other ) - QEnvironment::putEnv( "QMAKESPEC", globalInformation.text(GlobalInformation::Mkspec), envSpec ); - else - QEnvironment::putEnv( "QMAKESPEC", optionsPage->sysOtherCombo->currentText(), envSpec ); -#if defined(Q_OS_WIN32) - if( qWinVersion() & WV_NT_based ) { - SendNotifyMessageA( HWND_BROADCAST, WM_WININICHANGE, 0, (LPARAM)"Environment" ); - SendNotifyMessageA( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0 ); - } -#endif -} - -void SetupWizardImpl::showPageConfig() -{ - if (autoContTimer.isActive()) { - autoContTimer.stop(); - timeCounter = 30; - nextButton()->setText("Next >"); - } -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) - setBackEnabled( buildPage, false ); - - static bool alreadyInitialized = false; - if ( !alreadyInitialized ) { - configPage->installList->setSorting( -1 ); - configPage->installList->setUpdatesEnabled(false); - - CheckListItem *item; - CheckListItem *folder; - - folder = new CheckListItem( configPage->installList, "Database drivers" ); - -#if !defined(NON_COMMERCIAL) -#if !defined(Q_OS_MACX) - item = new CheckListItem( folder, "DB2", QCheckListItem::CheckBox ); - item->addRequiredFiles("db2cli.dll"); - db2PluginInstall = item; - db2PluginInstall->setHelpText( tr( - "Installs the DB2 driver. This driver can " - "be used to access DB2 databases." - "

Choosing this option requires " - "that the DB2 Client is installed and set up. " - "The driver depends on the db2cli.dll.

" - ), configPage->explainOption ); - - item = new CheckListItem( folder, "TDS", QCheckListItem::CheckBox ); - item->addRequiredFiles("ntwdblib.dll"); - tdsPluginInstall = item; - tdsPluginInstall->setHelpText( tr( - "Installs the TDS driver to access Sybase Adaptive " - "Server and Microsoft SQL Server (it is recommended " - "to rather use ODBC instead of TDS where applicable). " - "

Choosing this option requires " - "that the ntwdblib.dll is available.

" - ), configPage->explainOption ); - - item = new CheckListItem( folder, "Oracle (OCI)", QCheckListItem::CheckBox ); - item->addRequiredFiles( "oci.dll" ); - ociPluginInstall = item; - ociPluginInstall->setHelpText( tr( - "

Installs the Oracale Call Interface (OCI) driver.

" - "

Choosing this option requires " - "that the Oracle Client is installed and set up. " - "The driver depends on the oci.dll.

" - ), configPage->explainOption ); -#endif - - if ( globalInformation.sysId() != GlobalInformation::Borland ) { - // I was not able to make Postgres work with Borland - item = new CheckListItem( folder, "PostgreSQL", QCheckListItem::CheckBox ); -#ifndef Q_OS_MACX - item->addRequiredFiles( "libpq.dll" ); -#endif - item->setOn( item->verify() ); - psqlPluginInstall = item; - psqlPluginInstall->setHelpText( tr( - "Installs the PostgreSQL 7.x driver. This driver can " - "be used to access PostgreSQL 6 databases as well " - "as PostgreSQL 7 databases." -#ifdef Q_OS_MACX - "\n\nRequires a proper PostgreSQL installation." -#endif - ), configPage->explainOption ); - } else { - psqlPluginInstall = 0; - } - - item = new CheckListItem( folder, "MySQL", QCheckListItem::CheckBox ); -#ifndef Q_OS_MACX - item->addRequiredFiles( "libmySQL.dll" ); -#endif - item->setOn( item->verify() ); - mysqlPluginInstall = item; - mysqlPluginInstall->setHelpText( tr( - "Installs the MySQL 3.x database driver." -#ifdef Q_OS_MACX - "\n\nRequires a proper MySQL installation." -#endif - ), configPage->explainOption ); - -#if !defined(Q_OS_MAC) - item = new CheckListItem( folder, "ODBC", QCheckListItem::CheckBox ); - item->setOn( findFile( "odbc32.dll" ) ); - odbcPluginInstall = item; - odbcPluginInstall->setHelpText( tr( - "Installs the Open Database Connectivity (ODBC) driver. " - "This driver depends on the odbc32.dll which should be " - "available on all modern Windows installations." - ), configPage->explainOption ); -#endif -#else - item = new CheckListItem( folder, "SQLite", QCheckListItem::CheckBox ); - item->setOn( true ); - sqlitePluginInstall = item; - sqlitePluginInstall->setHelpText( tr( - "Installs the SQLite driver.\n" - "This driver is an in-process SQL database " - "driver. It is needed for some of the " - "examples used in the book." - ), configPage->explainOption ); -#endif - - configPage->installList->setUpdatesEnabled(true); - alreadyInitialized = true; - } -#else - - prepareEnvironment(); - - bool enterprise = licenseInfo[ "PRODUCTS" ] == "qt-enterprise"; - configPage->configList->setUpdatesEnabled(false); - configPage->advancedList->setUpdatesEnabled(false); - - if( configPage->configList->childCount() ) { - QListViewItem* current = configPage->configList->firstChild(); - - while( current ) { - QListViewItem* next = current->nextSibling(); - delete current; - current = next; - } - - current = configPage->advancedList->firstChild(); - while( current ) { - QListViewItem* next = current->nextSibling(); - delete current; - current = next; - } - } - QSettings settings; - configPage->configList->setSorting( -1 ); - configPage->advancedList->setSorting( -1 ); - CheckListItem *item; - CheckListItem *folder; - QStringList::Iterator it; - - // general - folder = new CheckListItem ( configPage->configList, "Modules" ); - folder->setHelpText(tr("

Some of these modules are optional." - "

You can deselect the modules that you " - "don't require for your development." - "

By default, all modules are selected."), configPage->explainOption); - bool settingsOK; - QStringList entries = settings.readListEntry( "/Trolltech/Qt/Modules", ',', &settingsOK ); - QStringList licensedModules = QStringList::split( " ", "network canvas table xml opengl sql" ); - for( it = licensedModules.begin(); it != licensedModules.end(); ++it ) { - item = new CheckListItem( folder, (*it), QCheckListItem::CheckBox ); - bool on = entries.isEmpty() || entries.find( *it ) != entries.end(); - item->setOn( enterprise && on ); - item->setEnabled( enterprise ); - if ( enterprise ) - allModules << *it; - } - - licensedModules = QStringList::split( " ", "iconview workspace" ); - for( it = licensedModules.begin(); it != licensedModules.end(); ++it ) { - item = new CheckListItem( folder, (*it), QCheckListItem::CheckBox ); - bool on = entries.isEmpty() || entries.find( *it ) != entries.end(); - item->setOn( on ); - allModules << *it; - } - - QStringList requiredModules = QStringList::split( " ", "styles dialogs widgets tools kernel" ); - for( it = requiredModules.begin(); it != requiredModules.end(); ++it ) { - item = new CheckListItem( folder, (*it), QCheckListItem::CheckBox ); - bool on = entries.isEmpty() || entries.find( *it ) != entries.end(); - item->setOn( on ); - item->setEnabled( false ); - allModules << *it; - } - - folder = new CheckListItem ( configPage->configList, "Threading" ); - folder->setHelpText(tr("

Build the Qt library with or without thread support." - "

By default, threading is supported. Some classes will " - "not be available without thread support."), configPage->explainOption); - QString entry = settings.readEntry( "/Trolltech/Qt/Threading", "Threaded", &settingsOK ); - item = new CheckListItem( folder, "Threaded", QCheckListItem::RadioButton ); - item->setOn( entry == "Threaded" ); - item = new CheckListItem( folder, "Non-threaded", QCheckListItem::RadioButton ); - item->setOn( entry == "Non-threaded" ); - CheckListItem *singleThreaded = item; - - folder = new CheckListItem ( configPage->configList, "Library" ); - folder->setHelpText(tr("

Build a shared or a static Qt library." - "

A shared Qt library makes it necessary to " - "distribute the Qt DLL together with your software. " - "Applications and libraries linked against a shared Qt library " - "are small and can make use of components and plugins." - "

All applications created with a static " - "library will be at least 1.5MB big. " - "It is not possible to " - "build or use any components or plugins with a " - "static Qt library!"), configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Library", "Shared", &settingsOK ); - staticItem = new CheckListItem( folder, "Static", QCheckListItem::RadioButton ); - staticItem->setOn( entry == "Static" ); - staticItem->setWarningText("

It will not be possible to build components " - "or plugins if you select the static build of the Qt library." - "

New features, e.g souce code editing in Qt Designer, will not " - "be available, and you or users of your software might not be able " - "to use all or new features, e.g. new styles."); - - item = new CheckListItem( folder, "Shared", QCheckListItem::RadioButton ); - item->setOn( entry == "Shared" ); - item->setWarningText("

Single-threaded, shared configurations " - "may cause instabilities because of runtime " - "library conflicts.", singleThreaded); - singleThreaded->setWarningText("

Single-threaded, shared configurations " - "may cause instabilities because of runtime " - "library conflicts.", item); - - folder = new CheckListItem ( configPage->configList, "Build" ); - folder->setHelpText(tr("

Build a Qt library with or without debug symbols." - "

Use the debug build of the Qt library to enhance " - "debugging of your application. The release build " - "is both smaller and faster."), configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Build", "Release", &settingsOK ); - item = new CheckListItem( folder, "Debug", QCheckListItem::RadioButton ); - item->setOn( entry == "Debug" ); - item = new CheckListItem( folder, "Release", QCheckListItem::RadioButton ); - item->setOn( entry == "Release" ); - - // Advanced options - if ( globalInformation.sysId() == GlobalInformation::MSVC ) { - entry = settings.readEntry( "/Trolltech/Qt/DSP Generation", "On", &settingsOK ); - folder = new CheckListItem( configPage->advancedList, "DSP Generation" ); - folder->setHelpText(tr("qmake can generate the Visual Studio 6 project files (dsp) as well " - "as makefiles when Qt is being configured."), - configPage->explainOption); - dspOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - dspOff->setOn( entry == "Off" ); - dspOn = new CheckListItem( folder, "On", QCheckListItem::RadioButton ); - dspOn->setOn( entry == "On" ); - } else if ( globalInformation.sysId() == GlobalInformation::MSVCNET ) { - entry = settings.readEntry( "/Trolltech/Qt/VCPROJ Generation", "On", &settingsOK ); - folder = new CheckListItem( configPage->advancedList, "VCPROJ Generation" ); - folder->setHelpText(tr("qmake can generate the Visual Studio.NET project files (vcproj) as well " - "as makefiles when Qt is being configured."), - configPage->explainOption); - vcprojOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - vcprojOff->setOn( entry == "Off" ); - vcprojOn = new CheckListItem( folder, "On", QCheckListItem::RadioButton ); - vcprojOn->setOn( entry == "On" ); - } - - CheckListItem *imfolder = new CheckListItem( configPage->advancedList, "Image Formats" ); - imfolder->setHelpText(tr("

Qt ships with support for a wide range of common image formats. " - "

Standard formats are always included in Qt, and some more special formats " - "can be left out from the Qt library itself and provided by a plugin instead."), - configPage->explainOption); - - folder = new CheckListItem( imfolder, "GIF" ); - folder->setHelpText(tr("

Support for GIF images in Qt." - "

If you are in a country " - "which recognizes software patents and in which " - "Unisys holds a patent on LZW compression and/or " - "decompression and you want to use GIF, Unisys " - "may require you to license the technology. Such " - "countries include Canada, Japan, the USA, " - "France, Germany, Italy and the UK."), - configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Image Formats/GIF", "Off", &settingsOK ); - gifOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - gifOff->setOn( entry == "Off" ); - gifDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - gifDirect->setOn( entry == "Direct" ); - - folder = new CheckListItem( imfolder, "MNG" ); - folder->setHelpText(tr("

Qt can support the \"Multiple-Image Network Graphics\" format." - "

MNG support can be compiled into Qt, provided by a plugin ", - "or turned off completely."), - configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Image Formats/MNG", "Plugin", &settingsOK ); -#if 0 - // ### disable using system MNG for now -- please someone take a closer look - entryPresent = settings.readEntry( "/Trolltech/Qt/Image Formats/MNG Present", "No", &settingsOK ); - mngPresent = new CheckListItem( folder, "Present", QCheckListItem::CheckBox ); - mngPresent->setOn( entry == "Yes" ); -#endif - mngOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - mngOff->setOn( entry == "Off" ); - mngPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - mngPlugin->setOn( entry == "Plugin" ); - mngDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - mngDirect->setOn( entry == "Direct" ); - - folder = new CheckListItem( imfolder, "JPEG" ); - folder->setHelpText(tr("

Qt can support the \"Joint Photographic Experts Group\" format." - "

JPEG support can be compiled into Qt, provided by a plugin ", - "or turned off completely."), - configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Image Formats/JPEG", "Direct", &settingsOK ); -#if 0 - // ### disable using system JPEG for now -- please someone take a closer look - entryPresent = settings.readEntry( "/Trolltech/Qt/Image Formats/JPEG Present", "No", &settingsOK ); - jpegPresent = new CheckListItem( folder, "Present", QCheckListItem::CheckBox ); - jpegPresent->setOn( entry == "Yes" ); -#endif - jpegOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - jpegOff->setOn( entry == "Off" ); - jpegPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - jpegPlugin->setOn( entry == "Plugin" ); - jpegDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - jpegDirect->setOn( entry == "Direct" ); - - folder = new CheckListItem( imfolder, "PNG" ); - folder->setHelpText(tr("

Qt can support the \"Portable Network Graphics\" format." - "

PNG support can be compiled into Qt, provided by a plugin ", - "or turned off completely."), - configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Image Formats/PNG", "Direct", &settingsOK ); -#if 0 - // ### disable using system PNG for now -- please someone take a closer look - entryPresent = settings.readEntry( "/Trolltech/Qt/Image Formats/PNG Present", "No", &settingsOK ); - pngPresent = new CheckListItem( folder, "Present", QCheckListItem::CheckBox ); - pngPresent->setOn( entry == "Yes" ); -#endif - pngOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - pngOff->setOn( entry == "Off" ); - // PNG is required by the build system (ie. we use PNG), so don't allow it to be turned off - pngOff->setEnabled( false ); - pngPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - pngPlugin->setOn( entry == "Plugin" ); - pngDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - pngDirect->setOn( entry == "Direct" ); - - CheckListItem *sqlfolder = new CheckListItem( configPage->advancedList, "Sql Drivers" ); - sqlfolder->setHelpText(tr("

Select the SQL Drivers you want to support." - "

SQL Drivers can be built into Qt or built as plugins to be more flexible " - "for later extensions." - "

You must have the appropriate client libraries " - "and header files installed correctly before you can build the Qt SQL drivers."), - configPage->explainOption); - - folder = new CheckListItem( sqlfolder, "iBase" ); - folder->addRequiredFiles("ibase.h"); - entry = settings.readEntry( "/Trolltech/Qt/Sql Drivers/iBase", "Off", &settingsOK ); - ibaseOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - ibaseOff->setOn( true ); - ibaseOff->setEnabled( enterprise ); - ibasePlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - ibasePlugin->setOn( entry == "Plugin" && folder->verify() && enterprise ); - ibasePlugin->setEnabled( enterprise ); - ibaseDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - ibaseDirect->setOn( entry == "Direct" && folder->verify() && enterprise ); - ibaseDirect->setEnabled( enterprise ); - if (globalInformation.sysId() == GlobalInformation::Borland) - folder->addRequiredFiles("gds32.lib"); - else - folder->addRequiredFiles("gds32_ms.lib"); - - folder = new CheckListItem( sqlfolder, "DB2" ); - folder->addRequiredFiles("db2cli.lib,sqlcli1.h"); - entry = settings.readEntry( "/Trolltech/Qt/Sql Drivers/DB2", "Off", &settingsOK ); - db2Off = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - db2Off->setOn( true ); - db2Off->setEnabled( enterprise ); - db2Plugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - db2Plugin->setOn( entry == "Plugin" && folder->verify() && enterprise ); - db2Plugin->setEnabled( enterprise ); - db2Direct = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - db2Direct->setOn( entry == "Direct" && folder->verify() && enterprise ); - db2Direct->setEnabled( enterprise ); - - folder = new CheckListItem( sqlfolder, "TDS" ); - folder->addRequiredFiles("ntwdblib.lib,sqldb.h"); - entry = settings.readEntry( "/Trolltech/Qt/Sql Drivers/TDS", "Off", &settingsOK ); - tdsOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - tdsOff->setOn( true ); - tdsOff->setEnabled( enterprise ); - tdsPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - tdsPlugin->setOn( entry == "Plugin" && folder->verify() && enterprise ); - tdsPlugin->setEnabled( enterprise ); - tdsDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - tdsDirect->setOn( entry == "Direct" && folder->verify() && enterprise ); - tdsDirect->setEnabled( enterprise ); - - folder = new CheckListItem( sqlfolder, "PostgreSQL" ); - folder->addRequiredFiles("libpqdll.lib,libpq-fe.h"); - entry = settings.readEntry( "/Trolltech/Qt/Sql Drivers/PostgreSQL", "Off", &settingsOK ); - psqlOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - psqlOff->setOn( true ); - psqlOff->setEnabled( enterprise ); - psqlPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - psqlPlugin->setOn( entry == "Plugin" && folder->verify() && enterprise ); - psqlPlugin->setEnabled( enterprise ); - psqlDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - psqlDirect->setOn( entry == "Direct" && folder->verify() && enterprise ); - psqlDirect->setEnabled( enterprise ); - - folder = new CheckListItem( sqlfolder, "OCI" ); - folder->addRequiredFiles("oci.lib,oci.h"); - entry = settings.readEntry( "/Trolltech/Qt/Sql Drivers/OCI", "Off", &settingsOK ); - ociOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - ociOff->setOn( true ); - ociOff->setEnabled( enterprise ); - ociPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - ociPlugin->setOn( entry == "Plugin" && folder->verify() && enterprise ); - ociPlugin->setEnabled( enterprise ); - ociDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - ociDirect->setOn( entry == "Direct" && folder->verify() && enterprise ); - ociDirect->setEnabled( enterprise ); - - folder = new CheckListItem( sqlfolder, "MySQL" ); - folder->addRequiredFiles("libmysql.lib,mysql.h"); - entry = settings.readEntry( "/Trolltech/Qt/Sql Drivers/MySQL", "Off", &settingsOK ); - mysqlOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - mysqlOff->setOn( true ); - mysqlOff->setEnabled( enterprise ); - mysqlPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - mysqlPlugin->setOn( entry == "Plugin" && folder->verify() && enterprise ); - mysqlPlugin->setEnabled( enterprise ); - mysqlDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - mysqlDirect->setOn( entry == "Direct" && folder->verify() && enterprise ); - mysqlDirect->setEnabled( enterprise ); - - folder = new CheckListItem( sqlfolder, "SQLite" ); - entry = settings.readEntry( "/Trolltech/Qt/Sql Drivers/SQLite", "Off", &settingsOK ); - sqliteOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - sqliteOff->setOn( true ); - sqliteOff->setEnabled( enterprise ); - sqlitePlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - sqlitePlugin->setOn( entry == "Plugin" && folder->verify() && enterprise ); - sqlitePlugin->setEnabled( enterprise ); - sqliteDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - sqliteDirect->setOn( entry == "Direct" && folder->verify() && enterprise ); - sqliteDirect->setEnabled( enterprise ); - - folder = new CheckListItem( sqlfolder, "ODBC" ); - folder->addRequiredFiles("odbc32.lib,sql.h"); - entry = settings.readEntry( "/Trolltech/Qt/Sql Drivers/ODBC", "Off", &settingsOK ); - odbcOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - odbcOff->setOn( true ); - odbcOff->setEnabled( enterprise ); - odbcPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - odbcPlugin->setOn( entry == "Plugin" && folder->verify() && enterprise ); - odbcPlugin->setEnabled( enterprise ); - odbcDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - odbcDirect->setOn( entry == "Direct" && folder->verify() && enterprise ); - odbcDirect->setEnabled( enterprise ); - - CheckListItem *stfolder = new CheckListItem( configPage->advancedList, "Styles" ); - stfolder->setHelpText(tr("Select support for the various GUI styles that Qt supports." ),configPage->explainOption); - - folder = new CheckListItem( stfolder, "SGI" ); - entry = settings.readEntry( "/Trolltech/Qt/Styles/SGI", "Plugin", &settingsOK ); - sgiOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - sgiOff->setOn( entry == "Off" ); - sgiPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - sgiPlugin->setOn( entry == "Plugin" ); - sgiDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - sgiDirect->setOn( entry == "Direct" ); - - folder = new CheckListItem( stfolder, "CDE" ); - entry = settings.readEntry( "/Trolltech/Qt/Styles/CDE", "Plugin", &settingsOK ); - cdeOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - cdeOff->setOn( entry == "Off" ); - cdePlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - cdePlugin->setOn( entry == "Plugin" ); - cdeDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - cdeDirect->setOn( entry == "Direct" ); - - folder = new CheckListItem( stfolder, "MotifPlus" ); - entry = settings.readEntry( "/Trolltech/Qt/Styles/MotifPlus", "Plugin", &settingsOK ); - motifplusOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - motifplusOff->setOn( entry == "Off" ); - motifplusPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - motifplusPlugin->setOn( entry == "Plugin" ); - motifplusDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - motifplusDirect->setOn( entry == "Direct" ); - - folder = new CheckListItem( stfolder, "Platinum" ); - entry = settings.readEntry( "/Trolltech/Qt/Styles/Platinum", "Plugin", &settingsOK ); - platinumOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - platinumOff->setOn( entry == "Off" ); - platinumPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - platinumPlugin->setOn( entry == "Plugin" ); - platinumDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - platinumDirect->setOn( entry == "Direct" ); - - folder = new CheckListItem( stfolder, "Motif" ); - entry = settings.readEntry( "/Trolltech/Qt/Styles/Motif", "Plugin", &settingsOK ); - motifOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - motifOff->setOn( entry == "Off" ); - motifPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - motifPlugin->setOn( entry == "Plugin" ); - motifDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - motifDirect->setOn( entry == "Direct" ); - - folder = new CheckListItem( stfolder, "Windows XP" ); - folder->addRequiredFiles("uxtheme.h"); - folder->setRequiredFileLocation("part of the Microsoft Platform SDK, which is usually available for " - "download from the following location:" - "

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

"); - - entry = settings.readEntry( "/Trolltech/Qt/Styles/Windows XP", "Direct", &settingsOK ); - xpOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - xpOff->setOn( true ); - xpPlugin = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - xpPlugin->setOn( entry == "Plugin" && folder->verify() ); - xpPlugin->setEnabled( folder->verify() ); - xpDirect = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - xpDirect->setOn( entry == "Direct" && folder->verify() ); - xpDirect->setEnabled( folder->verify() ); - - folder = new CheckListItem( stfolder, "Windows" ); - entry = settings.readEntry( "/Trolltech/Qt/Styles/Windows", "Direct", &settingsOK ); - item = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - item->setEnabled( false ); - item->setOn( entry == "Off" ); - item = new CheckListItem( folder, "Plugin", QCheckListItem::RadioButton ); - item->setEnabled( false ); - item->setOn( entry == "Plugin" ); - item = new CheckListItem( folder, "Direct", QCheckListItem::RadioButton ); - item->setOn( entry == "Direct" ); - - entries = settings.readListEntry( "/Trolltech/Qt/Advanced C++", ',', &settingsOK ); - folder = new CheckListItem( configPage->advancedList, "Advanced C++" ); - folder->setHelpText(tr("Qt can be built with exception handling, STL support and RTTI support " - "enabled or disabled. Qt itself doesn't use any of those features." - "The default is to disable all advanced C++ features."), - configPage->explainOption); - advancedRTTI = new CheckListItem( folder, "RTTI", QCheckListItem::CheckBox ); - advancedRTTI->setOn( entries.contains( "RTTI" ) ); - advancedExceptions = new CheckListItem( folder, "Exceptions", QCheckListItem::CheckBox ); - advancedExceptions->setOn( entries.contains( "Exceptions" ) ); - advancedSTL = new CheckListItem( folder, "STL", QCheckListItem::CheckBox ); - advancedSTL->setOn( entries.contains( "STL" ) ); - - folder = new CheckListItem( configPage->advancedList, "Tablet Support" ); - folder->addRequiredFiles("wintab.h,wintab.lib"); - folder->setRequiredFileLocation("available at http://www.pointing.com/FTP.HTM"); - folder->setHelpText(tr("Qt can support the Wacom brand tablet device."), configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Tablet Support", "Off", &settingsOK ); - tabletOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - tabletOff->setOn( true ); - tabletOn = new CheckListItem( folder, "On", QCheckListItem::RadioButton ); - tabletOn->setOn( entry == "On" && folder->verify() ); - - folder = new CheckListItem( configPage->advancedList, "Accessibility" ); - folder->setHelpText(tr("

Accessibility means making software usable and accessible to a wide " - "range of users, including those with disabilities." - "This feature is only available with a shared Qt library."), - configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Accessibility", "On", &settingsOK ); - accOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - accOff->setOn( entry == "Off" ); - accOn = new CheckListItem( folder, "On", QCheckListItem::RadioButton ); - accOn->setOn( entry == "On" ); - - entry = settings.readEntry( "/Trolltech/Qt/Big Textcodecs", "On", &settingsOK ); - folder = new CheckListItem( configPage->advancedList, "Big Textcodecs" ); - folder->setHelpText(tr("Textcodecs provide translations between text encodings. For " - "languages and script systems with many characters it is necessary " - "to have big data tables that provide the translation. Those codecs " - "can be left out of the Qt library and will be loaded on demand.\n" - "Having the codecs in a plugin is not available with a static Qt " - "library."), configPage->explainOption); - bigCodecsOff = new CheckListItem( folder, "Off", QCheckListItem::RadioButton ); - bigCodecsOff->setOn( entry == "Off" ); - bigCodecsOn = new CheckListItem( folder, "On", QCheckListItem::RadioButton ); - bigCodecsOn->setOn( entry == "On" ); - - setStaticEnabled( staticItem->isOn() ); - setJpegDirect( mngDirect->isOn() ); - - configPage->configList->setUpdatesEnabled(true); - configPage->advancedList->setUpdatesEnabled(true); - - // Needed to force the scrollbars to appear on Windows 9x... - QListViewItem *dummy = new QListViewItem(configPage->configList, "Dummy Item"); - delete dummy; - - setBackEnabled( buildPage, false ); -#endif -} - -void SetupWizardImpl::showPageBuild() -{ - autoContTimer.stop(); - nextButton()->setText( "Next >" ); - saveSettings(); - -#if defined(Q_OS_WIN32) - if( globalInformation.reconfig() && configPage->rebuildInstallation->isChecked() && qWinVersion() & WV_NT_based ) { - QStringList args; - - buildPage->compileProgress->hide(); - buildPage->restartBuild->hide(); - - args << globalInformation.text(GlobalInformation::MakeTool) << "clean"; - logOutput( "Starting cleaning process" ); - connect( &cleaner, SIGNAL( processExited() ), this, SLOT( cleanDone() ) ); - connect( &cleaner, SIGNAL( readyReadStdout() ), this, SLOT( readCleanerOutput() ) ); - connect( &cleaner, SIGNAL( readyReadStderr() ), this, SLOT( readCleanerError() ) ); - cleaner.setWorkingDirectory( QEnvironment::getEnv( "QTDIR" ) ); - cleaner.setArguments( args ); - if( !cleaner.start() ) { - logOutput( "Could not start cleaning process" ); - emit wizardPageFailed( indexOf(currentPage()) ); - } - } else -#endif - cleanDone(); // We're not doing a reconfig, so skip the clean step - -} - -static bool verifyHelper(QListView *listview, bool result) -{ - QListViewItemIterator it(listview); - while (it.current()) { - QListViewItem *item = it.current(); - ++it; - if (item->rtti() != CheckListItem::RTTI) - continue; - - CheckListItem *checkItem = (CheckListItem*)item; - if (!checkItem->isOn()) - continue; - - bool r = checkItem->verify(); - checkItem->setCritical(!r); - if (result) result = r; - } - return result; -} - -bool SetupWizardImpl::verifyConfig() -{ - bool result = true; -#if !defined(EVAL) && !defined(EDU) && !defined(NON_COMMERCIAL) - result = verifyHelper(configPage->configList, result); - result = verifyHelper(configPage->advancedList, result); -#endif - return result; -} diff --git a/util/install/win/shell.cpp b/util/install/win/shell.cpp deleted file mode 100644 index b1303a7..0000000 --- a/util/install/win/shell.cpp +++ /dev/null @@ -1,472 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "shell.h" -#include "environment.h" -#include "dialogs/folderdlgimpl.h" -#include -#include -#include -#if defined(Q_OS_WIN32) -#include -#include -#else -#include -#include -#endif - -static const char* folder_closed_xpm[]={ - "16 16 9 1", - "g c #808080", - "b c #c0c000", - "e c #c0c0c0", - "# c #000000", - "c c #ffff00", - ". c None", - "a c #585858", - "f c #a0a0a4", - "d c #ffffff", - "..###...........", - ".#abc##.........", - ".#daabc#####....", - ".#ddeaabbccc#...", - ".#dedeeabbbba...", - ".#edeeeeaaaab#..", - ".#deeeeeeefe#ba.", - ".#eeeeeeefef#ba.", - ".#eeeeeefeff#ba.", - ".#eeeeefefff#ba.", - ".##geefeffff#ba.", - "...##gefffff#ba.", - ".....##fffff#ba.", - ".......##fff#b##", - ".........##f#b##", - "...........####." -}; - -static const char* folder_open_xpm[]={ - "16 16 11 1", - "# c #000000", - "g c #c0c0c0", - "e c #303030", - "a c #ffa858", - "b c #808080", - "d c #a0a0a4", - "f c #585858", - "c c #ffdca8", - "h c #dcdcdc", - "i c #ffffff", - ". c None", - "....#ab##.......", - "....###.........", - "....#acab####...", - "###.#acccccca#..", - "#ddefaaaccccca#.", - "#bdddbaaaacccab#", - ".eddddbbaaaacab#", - ".#bddggdbbaaaab#", - "..edgdggggbbaab#", - "..#bgggghghdaab#", - "...ebhggghicfab#", - "....#edhhiiidab#", - "......#egiiicfb#", - "........#egiibb#", - "..........#egib#", - "............#ee#" -}; - -static const char* file_xpm []={ - "16 16 7 1", - "# c #000000", - "b c #ffffff", - "e c #000000", - "d c #404000", - "c c #c0c000", - "a c #ffffc0", - ". c None", - "................", - ".........#......", - "......#.#a##....", - ".....#b#bbba##..", - "....#b#bbbabbb#.", - "...#b#bba##bb#..", - "..#b#abb#bb##...", - ".#a#aab#bbbab##.", - "#a#aaa#bcbbbbbb#", - "#ccdc#bcbbcbbb#.", - ".##c#bcbbcabb#..", - "...#acbacbbbe...", - "..#aaaacaba#....", - "...##aaaaa#.....", - ".....##aa#......", - ".......##......." -}; - -static const char* info_xpm[] = { - "16 16 6 1", - "# c #0000ff", - "a c #6868ff", - "b c #d0d0ff", - "c c #ffffff", - "- c #000000", - ". c none", - ".....------.....", - "...--######--...", - "..-###acca###-..", - ".-####cccc####-.", - ".-####acca####-.", - "-##############-", - "-######bcc#####-", - "-####ccccc#####-", - "-#####cccc#####-", - "-#####cccc#####-", - "-#####cccc#####-", - ".-####cccc####-.", - ".-###cccccc###-.", - "..-##########-..", - "...--#######-...", - ".....------....." -}; - -static QPixmap* closedImage = NULL; -static QPixmap* openImage = NULL; -static QPixmap* fileImage = NULL; -static QPixmap* infoImage = NULL; - -#if defined(Q_OS_WIN32) -typedef BOOL (WINAPI *PtrSHGetPathFromIDListW)(LPITEMIDLIST,LPWSTR); -static PtrSHGetPathFromIDListW ptrSHGetPathFromIDListW = 0; - -static void resolveLibs() -{ - static bool triedResolve = false; - - if ( !triedResolve ) { - triedResolve = true; - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - QLibrary lib("shell32"); - lib.setAutoUnload( false ); - ptrSHGetPathFromIDListW = (PtrSHGetPathFromIDListW) lib.resolve( "SHGetPathFromIDListW" ); - } - } -} -#endif - -WinShell::WinShell() -{ -#if defined(Q_OS_WIN32) - HRESULT hr; - LPITEMIDLIST item; -#endif - - localProgramsFolderName.clear(); - commonProgramsFolderName.clear(); - windowsFolderName.clear(); - -#if defined(Q_OS_WIN32) - resolveLibs(); - if( ptrSHGetPathFromIDListW && int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - ushort buffer[MAX_PATH]; - if( SUCCEEDED( hr = SHGetSpecialFolderLocation( NULL, CSIDL_PROGRAMS, &item ) ) ) { - if( ptrSHGetPathFromIDListW( item, (wchar_t*) buffer ) ) { - localProgramsFolderName = QString::fromUcs2( buffer ); - if( SUCCEEDED( hr = SHGetSpecialFolderLocation( NULL, CSIDL_COMMON_PROGRAMS, &item ) ) ) { - if( ptrSHGetPathFromIDListW( item, (wchar_t*) buffer ) ) - commonProgramsFolderName = QString::fromUcs2( buffer ); - else - qDebug( "Could not get name of common programs folder" ); - } - else - qDebug( "Could not get common programs folder location" ); - - if( GetWindowsDirectoryW( (wchar_t*) buffer, MAX_PATH ) ) - windowsFolderName = QString::fromUcs2( buffer ); - else - qDebug( "Could not get Windows directory" ); - } - else - qDebug( "Could not get name of programs folder" ); - } - else - qDebug( "Could not get programs folder location" ); - } - else { - QByteArray buffer( MAX_PATH ); - if( SUCCEEDED( hr = SHGetSpecialFolderLocation( NULL, CSIDL_PROGRAMS, &item ) ) ) { - if( SHGetPathFromIDListA( item, buffer.data() ) ) { - localProgramsFolderName = buffer.data(); - commonProgramsFolderName = buffer.data(); - } - else - qDebug( "Could not get name of programs folder" ); - } - else - qDebug( "Could not get programs folder location" ); - } -#endif - - closedImage = new QPixmap( folder_closed_xpm ); - openImage = new QPixmap( folder_open_xpm ); - fileImage = new QPixmap( file_xpm ); - infoImage = new QPixmap( info_xpm ); -} - -WinShell::~WinShell() -{ -} - -QString WinShell::selectFolder( QString folderName, bool common ) -{ - QStringList folders; - FolderDlgImpl dlg; - - if( common ) - dlg.setup( commonProgramsFolderName, folderName ); - else - dlg.setup( localProgramsFolderName, folderName ); - - if( dlg.exec() ) { - return dlg.getFolderName(); - } - else - return folderName; -} - -QString WinShell::createFolder( QString folderName, bool common ) -{ - QDir folderDir; - QString folderPath; - - if( common ) - folderPath = commonProgramsFolderName + QString( "\\" ) + folderName; - else - folderPath = localProgramsFolderName + QString( "\\" ) + folderName; - - folderDir.setPath( folderPath ); - - if( !folderDir.exists( folderPath ) ) - if( !createDir( folderPath ) ) - return QString(); - - return folderPath; -} - - -#if defined(Q_OS_WIN32) -HRESULT WinShell::createShortcut( QString folderName, bool, QString shortcutName, QString target, QString description, QString arguments, QString wrkDir ) -{ - IPersistFile* linkFile; - HRESULT hr; - - // Add .lnk to shortcut name if needed - if( shortcutName.right( 4 ) != ".lnk" ) - shortcutName += ".lnk"; - - folderName = QEnvironment::getFSFileName( folderName ); - if( int( qWinVersion() ) & int( Qt::WV_NT_based ) ) { - IShellLinkW* link; - if( SUCCEEDED( hr = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&link ) ) ) { - if( SUCCEEDED( hr = link->QueryInterface( IID_IPersistFile, (void**)&linkFile ) ) ) { - link->SetPath( (const wchar_t*) target.ucs2() ); - QString _wrkDir = wrkDir; - if( !_wrkDir.length() ) { - _wrkDir = QDir::toNativeSeparators( target ); - // remove the filename - int pos = _wrkDir.findRev( '\\' ); - if ( pos > 0 ) - _wrkDir = _wrkDir.left( pos ); - else - _wrkDir = ""; - } - - link->SetWorkingDirectory( (const wchar_t*) _wrkDir.ucs2() ); - if( description.length() ) - link->SetDescription( (const wchar_t*) description.ucs2() ); - if( arguments.length() ) - link->SetArguments( (const wchar_t*) arguments.ucs2() ); - - hr = linkFile->Save( (const wchar_t*) QString( folderName + QString( "\\" ) + shortcutName ).ucs2(), false ); - - linkFile->Release(); - } - else - qDebug( "Could not get link file interface" ); - - link->Release(); - } - else - qDebug( "Could not instantiate link object" ); - } - else { - IShellLinkA* link; - if( SUCCEEDED( hr = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkA, (void**)&link ) ) ) { - if( SUCCEEDED( hr = link->QueryInterface( IID_IPersistFile, (void**)&linkFile ) ) ) { - link->SetPath( target.local8Bit().data() ); - QString wrkDir = QDir::toNativeSeparators( target ); - - // remove the filename - int pos = wrkDir.findRev( '\\' ); - if ( pos > 0 ) - wrkDir = wrkDir.left( pos ); - else - wrkDir = ""; - - link->SetWorkingDirectory( wrkDir ); - if( description.length() ) - link->SetDescription( description.local8Bit() ); - if( arguments.length() ) - link->SetArguments( arguments.local8Bit() ); - - hr = linkFile->Save( (const wchar_t*) QString( folderName + QString( "\\" ) + shortcutName ).ucs2(), false ); - - linkFile->Release(); - } - else - qDebug( "Could not get link file interface" ); - - link->Release(); - } - else - qDebug( "Could not instantiate link object" ); - } - - return hr; -} -#endif - -#if defined(Q_OS_WIN32) -void WinShell::createInternetShortcut( QString folderName, bool, QString shortcutName, QString url ) -{ - // Add .url to shortcut name if needed - if( shortcutName.right( 4 ) != ".url" ) - shortcutName += ".url"; - - // ### maybe we should use some Microsoft API instead (IShellLink, e.g.)? - QDir dir( folderName ); - QFile f( dir.filePath( shortcutName ) ); - if ( f.open( IO_WriteOnly | IO_Translate ) ) { - QTextStream ts( &f ); - ts << "[InternetShortcut]" << endl - << "URL=" << url; - } -} -#endif - -bool WinShell::createDir( QString fullPath ) -{ - QStringList hierarchy = QStringList::split( QString( "\\" ), fullPath ); - QString pathComponent, tmpPath; - QDir dirTmp; - bool success; - - for( QStringList::Iterator it = hierarchy.begin(); it != hierarchy.end(); ++it ) { - pathComponent = *it + "\\"; - tmpPath += pathComponent; - success = dirTmp.mkdir( tmpPath ); - } - return success; -} - -QPixmap* WinShell::getClosedFolderImage() -{ - return closedImage; -} - -QPixmap* WinShell::getOpenFolderImage() -{ - return openImage; -} - -QPixmap* WinShell::getFileImage() -{ - return fileImage; -} - -QPixmap* WinShell::getInfoImage() -{ - return infoImage; -} - -#if defined(Q_OS_WIN32) -QString WinShell::OLESTR2QString( LPOLESTR str ) -{ - QString tmp; - - for( int i = 0; str[ i ]; i++ ) - tmp += QChar( str[ i ] ); - - return tmp; -} -#endif - -/*! - Returns the free space for the directory. The space is returned in bytes, - and should only be considered valid for this particular directory. -*/ -#if defined(Q_OS_WIN32) -ULARGE_INTEGER WinShell::dirFreeSpace( QString dirPath ) -{ - QString drive = dirPath.left( dirPath.find( '\\' ) ); - ULARGE_INTEGER freeSpace; - - freeSpace.QuadPart = 0; - - if( GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "GetDiskFreeSpaceExA" ) ) { - ULARGE_INTEGER ulBytesAvailable, ulBytesTotal; - if( GetDiskFreeSpaceExA( drive.local8Bit(), &ulBytesAvailable, &ulBytesTotal, NULL ) ) - freeSpace = ulBytesAvailable; - } - else if( GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "GetDiskFreeSpaceA" ) ) { - DWORD dwSPC, dwBPS, dwClusters, dwTotalClusters; - if( GetDiskFreeSpaceA( drive.local8Bit(), &dwSPC, &dwBPS, &dwClusters, &dwTotalClusters ) ) - freeSpace.QuadPart = dwSPC * dwBPS * dwClusters; - } - return freeSpace; -} -#elif defined(Q_OS_MAC) -long WinShell::dirFreeSpace( QString dirPath ) -{ - struct statfs buf; - if (statfs( dirPath.local8Bit(), &buf ) != -1) - return buf.f_bavail * buf.f_bsize; - return 0; -} -#endif - diff --git a/util/install/win/shell.h b/util/install/win/shell.h deleted file mode 100644 index 4d5f9af..0000000 --- a/util/install/win/shell.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef SHELL_H -#define SHELL_H - -#include -#include -#include -#if defined(Q_OS_WIN32) -#include -#include -#endif - -class WinShell -{ -public: - WinShell(); - ~WinShell(); - -private: - bool createDir( QString fullPath ); -#if defined(Q_OS_WIN32) - QString OLESTR2QString( LPOLESTR str ); -#endif -public: - QString localProgramsFolderName; - QString commonProgramsFolderName; - QString windowsFolderName; - QString selectFolder( QString folderName, bool common ); - - QString createFolder( QString folderName, bool common ); - -#if defined(Q_OS_WIN32) - HRESULT createShortcut( QString folderName, bool common, QString shortcutName, QString target, QString description = QString(), QString arguments = QString(), QString wrkDir = QString() ); - void createInternetShortcut( QString folderName, bool common, QString shortcutName, QString url ); -#endif - - static QPixmap* getOpenFolderImage(); - static QPixmap* getClosedFolderImage(); - static QPixmap* getFileImage(); - static QPixmap* getInfoImage(); -#if defined(Q_OS_WIN32) - static ULARGE_INTEGER dirFreeSpace( QString dirPath ); -#elif defined(Q_OS_MAC) - static long dirFreeSpace( QString dirPath ); -#endif -}; - -#endif diff --git a/util/install/win/uninstaller/quninstall.pro b/util/install/win/uninstaller/quninstall.pro deleted file mode 100644 index c64e8d2..0000000 --- a/util/install/win/uninstaller/quninstall.pro +++ /dev/null @@ -1,7 +0,0 @@ -TEMPLATE = app -CONFIG += qt -HEADERS = ../environment.h uninstallimpl.h -SOURCES = uninstaller.cpp ../environment.cpp uninstallimpl.cpp -INTERFACES = uninstall.ui -TARGET = quninstall -DESTDIR = ../../../../dist/win/bin diff --git a/util/install/win/uninstaller/uninstall.ui b/util/install/win/uninstaller/uninstall.ui deleted file mode 100644 index 88f27a7..0000000 --- a/util/install/win/uninstaller/uninstall.ui +++ /dev/null @@ -1,167 +0,0 @@ - -UninstallDlg - - - UninstallDlg - - - - 0 - 0 - 527 - 365 - - - - Uninstalling Qt - - - - unnamed - - - 11 - - - 6 - - - - sideBar - - - image0 - - - false - - - AlignTop - - - - - progressBox - - - Uninstallation progress - - - - unnamed - - - 11 - - - 6 - - - - filesDisplay - - - - Courier - - - - NoWrap - - - - - - - layout2 - - - - unnamed - - - - Spacer1 - - - Horizontal - - - Expanding - - - - 90 - 20 - - - - - - cleanRegButton - - - false - - - Clean Registry - - - - - okButton - - - false - - - OK - - - - - Spacer2 - - - Horizontal - - - Expanding - - - - 100 - 20 - - - - - - - - - - 789ced5c595323bb927e3fbfa2e3e8edc6842ed8982526e601b0318bd97726e62125956df0868d59cc8df9ef93ca452e6f34f4e1ccf4c37405747fae2a293fe5a24c49ee7ffee3c7cdc9e18f7ffcf38fa7210ceffd0fdf84c18f7f84e74e67f49ffff51ffffae3cfe5a5a51ff1a7b8b1f1a3f0e7bffdf1a7811ffe8759a23f842b09af13be51bcccf78de015797e27617efe5ab13c6f05afcbf3eb09d3f3f0a0989ff7cd84f9fea360cfef879030dfef335e16f9bd172cf2c125e1f524ef6dc22cef9a62e9ff30616eff4ab0ca5f4d98efaf2a96f7af13e6fb15c122bfbf4f98fbbf532ce355669cf81c27cced9d28e6f68d132cfcec86609117b6044bff8efac7d6a43f7fc358fb0be78af9beeb09d6f1eb0bd6f1180896f6cd2ae382b467af04cbfb595bb0bcef6b84d7f579680896e7c32061e26b2f056bffbb82d53e2e222e2cebfbb02158c7635bb03c6faf1917d5febd6079df497b45ed8fdfdfd0e7c36dc2ac9f4cb0eae342b0f67f2c58ede18d319a1ff747fe541cf7772258f5779430f75767acefdb9b84d93eae0497e4fd52c2743ff4148bbedf046fc8f3649fc5241f5c0bd6f61e12e6fe1e15737b765db0b4679e12e6e797040791ff3c61baef8b8ab9bdb0c1b824fd7b8a072b056dcfef0a96f6fc4ac2ccf75531b707cf8c4bcacf254ccfbb8162f14fe92ff55f4a989fbf51cccf674dc1c2dfde26cccf9f12067d1e7604ebfd57c5c27f59b0f07119e35591cf913d940aa5c0f1213c292e6c90bc7b8c57d53e8e158bbece048b3ce12061eeef50716199da7b16acfadd502cf25c0ad6f1e7f651de22bdefac60b59f9262894f2058ed654bb1c8e7046bfb7a5ff4ebd37d89c79b8a597e77ce784dc7634fb1c8ff9e30bf7fa498df0f6b82d51eb61366794031bfefc9de578bab1b45d6c750b0c8e7cf14cbf8de2ae6f10a59c2f47e28325679a19530b7b7af58f8ae254cefc3bd60912f5414f3f3504a98fb6b286679b28e60d1bfdf51ccedd953c5dc5ea6f2a93ec85f565deaff5eb18c6f2b61eebfad58fad7e7c51e7c3b61e67fa958c6f324616acf6482351e0c1266f9de15cbfbdd84599e3ae3f582f0bd532ccfaf27ccfd51bc5d2beafb6e55b1e8b7c038bd6f13e6f79705aff27dbb9630cb73ad98db83a66090fb778aa5bf15c199d8073fefd2f325c5d25e59b03c6f2e13667b0a8ac5bf1f196fc8f86446b1f02b24ccef8f14f3fbf644b0f009f23e1464fe23fb5a5f49efbf28e6e7fd51c274df2e0996f18243c5624f8d84d93fdf05cb78002816796cc23c5ebb82753cf719abbc7ea458f8937daffbf4fe9260194fbbaa58ee737b1e94af572c7cb384f9f9a160b58fae62d1e75bc26c8f34be1b2bda7e962996f1a80b96f7dd71c22ccfabe215aa2fc263c240f6a2efeb78d6144bff4131bfef5612a6f7dd48b08ecfb26296c79c26ccf755be4cda1b32760589572f8a25de541366be65c5a2ef31e6f6453eb72af9d046c2acef55c532de5630c87c799830c7bf9162997f760567d2de9d62c947683edbf03a7efe5cb1f07d4a98c60f2e04cbf89815c5fc7cc6e3ef95af394a989fef2a16fd5e264cedfb8660198ff09230cb7fa058e66f9f30c707ab58e2db96628907db09b33cfb8a459ee384499e50535ce27af741b08eff5bc21cbf1f154b3e344c98e5bf502cfedb4f98ed6153b1f8632f61bedf129c493ed84b98fbd7f115fdda4ec29c9f14154b7c394898fd27bd2fe3c5f6e57d51fa6b24ccfdd5154b7fed8439dfeb2816ffd84e98f948ff7e4dc6f33e6196f755b1d86b53b093f84df90d94923ddd24ccf6baa698f517fa82355e9d29e6f7cd30618e17d78af97d58162cfa74a058f479a558f455562cfeb49930dbfb4031b7ef2a82459f50502cfeec12e6feb57dd127ec25ccf1f149b1e8f33d6196afa498e5f3a97fe19ffa17f99e19277b6826ccf610148b3db884f9fe9362f1cfd784599e37c5226f2161e673a098e5b535c1623f1612a6fe4e878a451e9330cbd3572ce3b79f30dbc78b62f1c76ac23c1fea7838e97f9030b7ef154bff59c27c5ffb73e28f7b09733c5e532cfdeb78d5a5bfe784d95f54debad8cb56c21c7f78fc83eadf9f2ae6f1846ac26c9f5b8a59ff9eed37a8fe602961d6cf9d6289ffe709b37e2b8ac5df2e12667b2b2a167b6b0b16fd413161f68f8e62c927d3f3228ff62ffab3a384f9be512cfc571266fe0f8a85bff627fa75278a45bff709b37e5f14cb78f512e6f1d8532cf2ed26ccf3d3b362b1f79d8479bcd6154b7cea0a16fbf08f09b37db4148bbc0f09f3fd9a62f1cfa384595e1dffbae46fd58459de03c5920fb0ff8720f1c12d2996f8b5ad58e687a384d9ff68be7125d58f3709f3fcbcaa58f4b3ac78d5d1fd75c132deaea558f2b1f78459fe8e62b18776c23cde5eb1cc27cd84e97e0682653c61a858f4aff2c8f89946c2dcff9962d17735616ebfae58fadf4b98e5bb659cc6b7af58eabf9162d15f2d611e9f65c5325f5d25cce3fd2658fc2bec2816f90b8ae579b22f17923e3a8ad78a844f05bb35ba0fbb8295df49c2cc9fc73fa83c70a658f4bf9130f77f2558ec276c26ccf70f154b7e47f6e05715670f8245dfa7c3bfefb226ff6fbe1206bdbea7afbf9bcb873c7f3b2e6389f2d7d7defbbdb94c4a19fffe2e89ff4e2e3f67b7f0b9e83d2eef51bf1f9769361f3c67be8fc9ff0e97cf58e1efcbe56bec7e372ed6d3ef803f99cdf0771d2f379e51d49a6cc0cf3dfe3408d51167bf1717dbb40dbc82c857174ef77865c22590dc863ee57f33e7f05d4cbe878b7dd091c6bf513fc42b5a4f64d8b22d7a263047d154db76f0a74bd7b7b1f9361b6b3213e2a29ed0144ebda83389c01dfb88bf9dede365488b8ddf870bca1a251e208f28355eb97b461844cf89d23f219721fe76a88ff86c7ceff9b79af7077479b224635f50d627fb6adfec08af77bb89d796ddc6ab6c2b76c756f1d35dbb67f7f1598fef1dfc665c6af610ff756f8f50c6114a7c6c4feca93db3e7f6c25eda2bba2eedb5bdc14f6eed9d5db2cbb6608bf87cb02bdfc3e4735c16cd03b939a28136f3842c4a76d5aed975947a038dcbd08f31902e439f59e38c37c164a66e47a64136e7c62dfe7d5c62eba6893ff78464c6c088da340f76605af8bb6bdaa663baa6671e4ddfe4ffc082cb08ab8179b2a766689e519f6df49f8179c17189712e4687f849dd3e7c3717bceecdab796526e60d6de3017b5ab1c18cccbbd9345b66db9449fa8a5cf359e8dd1d53256c91fdaed933fbe600a5c788877d64e44b6deca7763a34877f0797a9cf7b18938aa88f23736c4e8407a08c1f311973613e207ca2cded99537386fa79b45d8aef4d9a6f8d7dfc3e2e910deae45e6c2c5a345a16feab63cecd85b93457288bdacdce420e7936d7e6062f66738bfab9a3b79d5932cb76db144c112d4bfd9074f37d5c50cfaf631de175883a79428dac989259257d5c9bb54ff198af9fc86c9dc66260363006eedabef4e52503fa543efa152ed44acd0258fb82e200b8e4213acef33d7e9ed5ed4c71b9a127908dbd006f0b6684f6d520368dcfe6d65f995f948b7d4261026424355bd6acacd3e39e8f0855bc7684d10ebd0de91e4637a8e30cf46e62bed68833d7dfc605305a8eec1d348409cbcd32cdf298c479a620acc6ade4e23564d0b465d3c63ebf990bc5e1a8e926c6e2275b817b7b99fa372411244b1beb607a36512daec3c384eceb53fae4c8368016b4a1631ea01b638048d28b59c25fe3821cc0b46c0f7ad8cd9d30614de4b513795ce335b69647bcfa6695b31894af9f63b54eefb39759c910d48bf0137b0d037882a191b99233f158612c92f3937a0914f19d39473f6924bb998cb3636d187844b93378c6b17d81579c81f6f1eac21b8ce01d368d872d923d8ec7383aabff2832b00d65d3414b88594686b3f3540d3a6d6f9fe2d2c339be8133e3ae5d128fbf9e60b233c1a38223ba831caab08b71fb1cf630677e857d9c0563de398203a8c1211cc13132c6c7e184343a393215eac5e233a77046f99ae64e58d1fd152e1883bbd6c1395cc0738ac131285fc2a530d9812bd6075cc30ddcda77b8832558b68f508022e6cf5c6dc68aa58bd21c9906acc02b94306fde9016d76035c727d91db6b786d583c36ca013ab37bcee7f9d0be5f42bb06e2eec19ce27b9a8434c40626a1cc50d4c778d1d3970b1fa8a36d1c46b1c7d6a78c54a07301b2dda5de75d7099ccb69022a17a21406cb7ecea186d7a54c3f5a9aa7b99643266f3192e3163710dd7a45e351ae5628fbb8f4cdc03bcd88a6bd9e0dae38b183562fea31534e7429841765cc7beb9ae3d866bd74b3151a322a47efaeed1ee219b2155a59db4a2b390cbfc3827cfb65c1fedab2e79faa45d9304f0e806ee09da76e886f4fc336924c895f25264508fb646ccf8efccbd9815f74abe63a83dcea04dcab98d7b7358e5a0263be437d98c7c135ca62d0f7b7aa0d5141fad020a98d51f4b5fe319f136f61475027df7ee36cd798c38d33dc41acbdcdb81dbc2485427ddc4567beac7b6e1b63132acb8776403e4339319048fd6b1adbab2abd07a889f9275ca5fe6cda6d4a7c759b78995d6a6db99885e791b2b9b3d3772558c545df6ef311f696980ad34a256dc2e3eb3eff6dcbe3b7035db41dbddc2cfeaf6d59cba43f2c6e90c957a7447ee18ce5dc53dbb13f5405d3f9cf5fd692e512bf89eb72ddb8536565a65b2e44a9a1d53ede14edd1946eb23b29eb13ef2baf1d1e7b0b55e8c86b6e4cedd85bbb4658c4f435a8b69d8babb72d7ee862cd8cce1d2335bb612e389bb8dda1119a7d6d5e771a19991b8c4bf016739ac19c7d589915c9066007707afb680d6554f2b4b7e0e97815bc2df1db7ec0af694d6020670e48a587be13c8e36e863beea565c89e65998b90c4ab082e3e030be371745a9b95ceae358807adc75ab512b3c83249fa7fc1e67e65317d71e7aa293c3b4129bcf0407a8dd1eb5b4e9d6900979b6dd4036eb68391bf8ce3356db43388391e44733191d3ce22099983b2f8eb8f3b990a7504687b1b0e41e482bf9e842f334b60f18abcb927946af68e98aea049798eb764cc315bdc3ead1c4bc05f34be33d66a965f782b3cd7dacefb0af0a3e61139bc405c7d1f86086381a1bd15a66ed6b968be822482dd7b37d38f71945ff9d892c728dc6aaeeebb0ee1b1421984b8357c3a7b99c4629cedc1aadd2ecf8267259f5f7d842c39efa07f49b3aaf7aba1abcd98b592e64dd03dfc2ececf1e75cf29a49b27471a40ad09c8ac540d930c62fdf76719db8e63bc2a541ab0d7569ad46751bb588ba2bfb2ee52beb390b224bf3ce791be71d6cc3d47ccfdba499299f895606058d6193f178924bce4732f1e410ab15bb4e5cf2b912fd1b33c85b8cf96d9c1761721c38eff18fc40545432b2f430b7532ae4fc6d50fd271efb6644698f51d5aeffb7e60af932de73583f5266671059a63781eceb15ac8c5c4bc23fe1b73dc636a79ba468cd9d78e7f722ecf25f95b13a53ac08b2201ce1d177e680624dd0d6998ffac4b1566ec957ff62ff625b680b35419b3ecc789fc42ac0c2539c248f6352e7564136533c8e5842c23af15cecf0798d5df59e432e1191ab70efc2b45af3aeaa4847e32c8555a9c3bdae47b7189fccd8f6c912478c1faeb0533bf692ed827dae3bbdf642e7979177121a61db432e2825e799a7a555fb9a178bcedb76029e691b35cd0ba0e69a6e9da2266ffef34cf82bfcf79b4b6c9bc56fdb62fbb3249807a749b5825cdd10b0ef000e798e698cb22dfcf718933127319619e6f66b8c4569f6117eb93c8a539473387942f9cfb8adfc11a723a1bd55c987e63cdf38e1e5fb5d1b6c13cd8bef37e773a17e7c8e9b19a438f69ce9f2fe772c17a876cdda0e79fcfd14b9c59f6a1ed0f629b5098994f6256d2715564e290c958aaea4c9c35bee687b68439fd3e56270fb427d8c76a744ff492bcd41f92069750a238677c854b866dc6d5a37789f6d35c2afe08abdf3842017f4fed38e2db9477d9d3c8c41f27265593d750b4bb9a3f3117d08bb500e76d3886680de831e5296f21cbb617fef4ab5cf087b8f85e6ef548b950b58715ee1356bf8099deccde2946f2375b82f71835fcf18cb568348eda3d33170e682dbc213b7ed163defc39653aa9c214ebc49c09e7a90baa5703658d33be9f8f07c42748ad14b95c4d8d0f676203d3c5f9ed9eaca919eb13ca7a0632c7efa1846b98ade8cad8e42a66bcee62eeeb2ffd55f439aa64d016503b9e6a9b27bb8d3d68ed92e30f0dcc1eca24a7a3e83c91dde7b950d536ced963fbdb73b850e431fb36f65c8bbb326419547fc69d3e57f6a738330ee4f97c362a6bad1eb3067fe36f3d4525df31affe8e6cac473553166d1b7b48fa1b5fbef6552eb46ad2a4597f5b56c326ed1c6737b38fde4a5a20ff68989669d17acd9e3b8396afcd5421f919ea9a3c6ec92f9b4e8c1f51bba4939e39a4117cb225e132a5196c17ed81463a71996f63b19e652e34ef13177b39870b604f2835ad5c7baec089bfc3aa7c1fbd39669096e693d93a91dbd8211bdb47de7bf63166c9a8df17b2af9e6dc7b97f3e171cd92e2c7dc425f98ae694bc9a15b9948d9fcba58ff9ec1ef6cb5c62dd1e57be767d45ea135d1f9a8c5dd3ad386841d58e5027713e8a7b95b1e73eec432dd9e824976d64cf5ccc4fe6fddc7d64e2ec93b9b03773a290813ec4bdfb5eb4b1681d58b33bb71ce713ca5676644556198ded6b1cd3382b1bf87d8c137bb4e3daa295278c0438c716a03f6399f1ed13cc09f6347e7d860bb61bada66b3b381f1693f7e6e3a9c1883bc2e706317b4349ea581f16a12459fde4eaf26495388eb13b340bf7fd99ddc2da621f47a6c5f9821df91dcad8c66fc93abc5f714517a3f657b8dca3e520175bf5a539352b5601b00907685903b4f506feecdb12fac94098e47763e654bc546d4b4484b8dbb9ec57fd9a6d4bef31db38a33a769a0be6e638ba179c214f3359646314f3a3778dfc3a6513158e3e867328e482f9f729f468ed0be328f41ccf6ed7fe7ac2c6c5c66095b2b87ced32b12b00f77e036b65ac196d0b3a18d3b74d7eb7ad223fb430825e1ce631c9d7c853fe1253f1981d16bc97fa85d7c36505db6e046b77a586ac07e32ec862388baeca1ca9bab9a3dfb713316d3ce3c4bd968d0058b79cd3999f57ff2e33a572d9911f0760474ea3ed4fb8089b40d598b1bd1851a816d35d09b59db84f74845e5b8e953ace8f0781bdfe5ab8b2eda4f8eb6f40a59a7792816a65cc272fcc79f080d970b285c425ae5ea02438ba792e9355ff78dd32c7a54e3b3731bfecdb8209c976930c013f83637835cfe85371a5aee62bc8cda177de8b4759d105c5de90858c6ae4f1a84c44465ac7d8827b3374de0cc9c2c69625f6859f05da594a6b563c23cece95e2757a263272f174f66837d48d31d3e729e2483d864668ba0e9d5979c47cf001eb80be548cb9fac494c3bdbb0e0fa145eb49f35625a4d2c416dba1e34f2447ce5b24a9ce64a6813d8dcf4cb80fb938e16288cb01d6dfbdd095550765531564422f3cba17591b1cba65b70ef7b4bf9cab1931ab3f0b7dcce2dbee0ce792c1148bf1dc110712c2203c996d33b32f12239faf852156076fb2a6c435e34fb968c61c9e914dd756cc13594c75c263aea3ffbbcc75e94cc1033ef74875e4258dbe445168f813a8622edc0c2fb0075564d39f5b01ac139f9b5c9c9bcaf671705f6dc5391b7ce7335c267dc9367ccc2d56dc55e0f520e5c2b6738dd189727fd80f6f9855229f30827358c15af2912d8deb139ea7d1f71ec3bb2be227d367cad4ce62a45ccb696aacb5e87565bf1f36dd068e5a3355b1661197e90897f83d61deb04d5e2d71992c425794eb66c5be9957136b9903f49d57f41b17d751ec15d6f157710e42e1b12e88b5a35f3347762db706336b6bf36dd0982b8ca87b719e10d9682551e3d5ec5c39ffc24cab1178cfe246b9a0fd5634db75a7e6226cdb36fa57b4c93ad6352577e9dfdca5dd76555a9fad637dd2c0bf0fd11ef7423954c6b5b3c4bdc96b5a6fd17de3690f8763a52bbcc265d1fad8222e582776692ffc36ed5d731c208b404b7250735718bf57ec8169d910764235ecfa327a7cdc5fea51ce1635d742a6fbbe1af6bca319787ef59ce724cce038ecbb3e8d869fb49a4539cc022ec139ac998654f3e6aac3fcbc1d0e420d87af432bb787e60df3b322f2883ba571353766f21e3350debb6863b65272716eb733ab60f3195918d85d6ca386d1a8c12bf7f9959fcf7389b52b2c99158c66d32710d9ce622470eec6ad844388b514d52274923c9e637c88a7e87844cd4bccdeb0bdb82fbc82f19b56fd930fceea43d1921b8523db0acf188d7a93fb3b5fd40bf80e143063b6a93e9aae2beea2a59927ac692a389bbd9ceaf96bde278b3bfa8714e978cd08fbc7d8fa168e431b6b5e909c75f6d2334c58f741f4fa1a5d1336f62b5c5cc5b542df94d25afdf45e2fcd8bf612fd20b3dbd833ed286335f0403a1aa41d70a0b5aa26ce1217e1249c86b3dcf8cf6a07d984f370112e319e681696fd35bd60ff4d28842bb34911c08ca5cff9afe159c55e846b33c40a64944eb1c4d3ee9eeacf8c90818e7d05136e3063b99dcbc44cfcee873b5ba27dda8c2cb79ee7b2a8de5f74b9b6bd376f387b8fc29239c9d51ff99ec7d114f9986338c4f93e9e5a3ea7d32c2656f1a68d33c42e3e7401876119f80c703aef30e327a94dac6f8efc168e0e674b8df1ac32c9e753beefa018d78da1034fa1202795389b3126bff39776bba00f0d7b01cfa1c867aeecb6efd9edd00d2b98d91fc3b6ecc6c4eb26c76591ad617e019b7e60ce62a4744bb23ae67e89cb13edb3c4b5e3755b0e258aa6e3b596492e12a5f942bb73e863ab66151a98750e481379b9179f63ce5f96779d7d05e75e23fb152ebf2bfa697f09d089395ddc298022d67e9819718501bca6397bce72d2eea7adb06ac6275fa76bb2ea825c2d66775b7ec716ec4bfefb32bf30bf38bfc967745c0596e13cacc23bd0770fa0924e5c4df63d89afa7e49ec7587fcf5d4fa33d3fccf0c29a1dcaded02fc5319adb5e502385b8328b6c8a61dd3f41597633ccbc3a51fc293fa74eea6c71f6b2e0f31825b156dbc8ec787dff97b8c4dd2f172300fe8df39579806178cf0c5c93fd7f7c823f56fe553927fa310bba1bce17446964622fdc23c6423e3bf4933df1455706e60173ac389ff7dcb3ad650e671c97f970e9ea0b6aab8f477ad2fb75a5c9d05c7221df3a99e0819eff68af83b5551cd37a9ecb97e3d8cc7e646ccb95e10973c447f7f65336d30ca6b954e47b3f4bf0162ec3ddc4c95f5af18d7316bc99675a1b7b9895ead7b9d02ec50b7d93ad688b59b067eec8f5a4ef49df9d97edec4c31a281876318b811d6d17b31878ef50dd612c774d7114b0f712fa39b4e5dc3f770a1959718581eed10f6b12e6e6759d8c25830fe0e0c9d8d356bfe70e6b42eafcfc673b3fcc7e25b57c1857dbb8bb9705c2d7d7345d8a49569cb1e1fbfad8039f879acf778de9f94ec2bfe32c988a3017d5faf4f15ca10f38173730e711ff50933dfc9aa645e54d075166b2fc36bace4ecc8c56f89b4688770689efd80d858ca20b63d3a2c32c17e4deb23097fe57b7c5895189a6f0cd999336ff19c3f46b6badbcce2ca4b3d7df76dba7634921338c8b266768fdaa8640f98a539ac0562a555a34c7868776d296b656dd2c921f9499b7aa66f917c2b178e8a3dfd0eae3b89fbc958e33ca17e3ad0861573e4df61e0f7cc12cab20d0d5ff335cc62b6cd895f811d2c63c09d61e6d9809e8ba7a84dace0a8d2e2d34021ee15da42d6c99a188523932e8d6083f2ca6fb0b1f185759527dddcd3faa6c1eae6c4dde22721bc8417db45569829a0558cc0f8535b7667eecc744d17e5afbaa2f358b19ddb5757768ecf06d82e65f371573ceebcd6716c1ae891fd80c510f42876d573f2f7266dfe6bbe3f473319ed686696ce50b35e62ce879c4e520f58f3a0b50cfd054a5dc62abb0d4bc4009ce373e52a91ec30f08e7da073be4b74a2f881b4dfa3bff99bdb916ff6bd5c26753ca969cb67a29ae3d3d6136fcc7c92eecc9cd4fbf9b746ffba8d7dc4843e6f4e5ed3cfce709f7edf8cbf053bf1e94ffe6f8cefe52265cbc4c8d32e2e5f33e7f0e5d23548c5462bad31afefe2323b72935c663e5fc065fe08d87432339757b8f1897065f01d5ce6dbd124978fff97a485d625dafac8fabe32ce5fe1f2c1fab9997dfe6326b2b7bb405f133afa80d157e3d867b87cae8585f7276a11f120c8e3c5ed86e7f0fc9d5ce6c42133fdd4873d4c7d5f624a83dfc8e5e7e3faddd767fb9b1ec9ffcbff7fecbbafffe7f27b5e7ffef7bffff13fdcf4c93e - - - - - okButton - clicked() - UninstallDlg - accept() - - - cleanRegButton - clicked() - UninstallDlg - cleanRegistry() - - - - init() - destroy() - cleanRegistry() - - - diff --git a/util/install/win/uninstaller/uninstaller.cpp b/util/install/win/uninstaller/uninstaller.cpp deleted file mode 100644 index 9a7c529..0000000 --- a/util/install/win/uninstaller/uninstaller.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include "uninstallimpl.h" -#include "../environment.h" - -#ifdef Q_OS_WIN32 -#include -#endif - -QApplication* app; -UninstallDlg* progress; - -void rmDirRecursive( const QDir &dir ) -{ - const QFileInfoList* list = dir.entryInfoList( QDir::All | QDir::System | QDir::Hidden ); - if ( list ) { - QFileInfoListIterator it( *list ); - QFileInfo* fi; - - while( ( fi = it.current() ) ) { - if( ( fi->fileName() != "." ) && ( fi->fileName() != ".." ) ){ - progress->filesDisplay->append( fi->absFilePath() + "\n" ); - progress->filesDisplay->scrollToBottom(); - app->processEvents(); - if( fi->isDir() ) - rmDirRecursive( QDir(fi->absFilePath()) ); - else - QFile::remove( fi->absFilePath() ); - } - ++it; - } - } - // Remove this dir as well - dir.rmdir( dir.absPath() ); -} - -int main( int argc, char** argv ) -{ - app = new QApplication( argc, argv ); - progress = new UninstallDlgImpl( 0, 0, 0, Qt::WStyle_Customize|Qt::WStyle_NormalBorder|Qt::WStyle_Title); - - if( argc != 4 ) - qFatal( "Incorrect parameters" ); - - if( !QMessageBox::information( 0, - QString( "Uninstalling Qt %1" ).arg(argv[3]), - QString("Are you sure you want to uninstall Qt %1?\n" - "This will remove the directory this version\n" - "of Qt was installed to, along with ALL its contents.").arg(argv[3]), - "Yes", "No" ) ) - { - progress->setCaption( QString( "Uninstalling Qt " ) + argv[ 3 ] ); - progress->show(); - - app->setMainWidget( progress ); - - // Delete the two directories we have written files to during the installation. - // The OK button is disabled at this point. - // Messages will be processed during the delete process. - - // Check if moc.exe exists, if not this could potentially be a - // corrupted registry setting - - if ( QFile::exists( QString( argv[1] ) + QString( "\\bin\\moc.exe" ) ) ) - rmDirRecursive( QDir(argv[1]) ); - else - QMessageBox::warning( 0, "Uninstalling failed", "Qt could not be uninstalled, you will " - "need to remove Qt manually" ); - - rmDirRecursive( QDir(argv[2]) ); - - progress->okButton->setEnabled( true ); - progress->cleanRegButton->setEnabled( true ); - /* - ** Just hang around until someone clicks the "OK" button - */ - app->exec(); -#if defined(Q_OS_WIN32) - QEnvironment::removeUninstall( QString( "Qt " ) + argv[ 3 ] ); - QString qtEnv = QEnvironment::getEnv( "QTDIR", QEnvironment::LocalEnv ); - QString pathEnv = QEnvironment::getEnv( "PATH", QEnvironment::PersistentEnv ); - if ( qtEnv == QString(argv[1]) ) - QEnvironment::removeEnv( "QTDIR", QEnvironment::LocalEnv | QEnvironment::PersistentEnv ); - else - qtEnv = argv[1]; - - qtEnv.append("\\bin;"); - pathEnv.replace( qtEnv, "" ); - QEnvironment::putEnv( "PATH", pathEnv, QEnvironment::PersistentEnv ); - if( qWinVersion() & Qt::WV_NT_based ) { - SendNotifyMessageA( HWND_BROADCAST, WM_WININICHANGE, 0, (LPARAM)"Environment" ); - SendNotifyMessageA( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0 ); - } -#endif - } - - return 0; -} diff --git a/util/install/win/uninstaller/uninstallimpl.cpp b/util/install/win/uninstaller/uninstallimpl.cpp deleted file mode 100644 index d30358b..0000000 --- a/util/install/win/uninstaller/uninstallimpl.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "uninstallimpl.h" -#include -#include - -UninstallDlgImpl::UninstallDlgImpl( QWidget* parent, const char* name, bool modal, WindowFlags f ) - : UninstallDlg( parent, name, modal, f ) -{ -} - -UninstallDlgImpl::~UninstallDlgImpl() -{ -} - -void UninstallDlgImpl::cleanRegistry() -{ - cleanRegistryHelper( "/Trolltech/Qt" ); - cleanRegistryHelper( "/Trolltech/Qt Designer" ); - cleanRegistryHelper( "/Trolltech/Qt Assistant" ); - cleanRegistryHelper( "/Trolltech/Qt Linguist" ); -} - -void UninstallDlgImpl::cleanRegistryHelper( const QString& key ) -{ - QSettings settings; - QStringList::Iterator it; - QStringList keys = settings.subkeyList( key ); - for ( it = keys.begin(); it != keys.end(); ++it ) { - cleanRegistryHelper( key + "/" + *it ); - } - QStringList entries = settings.entryList( key ); - for ( it = entries.begin(); it != entries.end(); ++it ) { - settings.removeEntry( key + "/" + *it ); - } - settings.removeEntry( key + "/." ); -} diff --git a/util/install/win/uninstaller/uninstallimpl.h b/util/install/win/uninstaller/uninstallimpl.h deleted file mode 100644 index b3bff36..0000000 --- a/util/install/win/uninstaller/uninstallimpl.h +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the utils of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "uninstall.h" - -class UninstallDlgImpl : public UninstallDlg -{ - Q_OBJECT -public: - UninstallDlgImpl( QWidget* parent = 0, const char* name = 0, bool modal = false, WindowFlags fl = 0 ); - ~UninstallDlgImpl(); -public slots: - void cleanRegistry(); -private: - void cleanRegistryHelper( const QString& key ); - -}; diff --git a/util/install/win/win.pro b/util/install/win/win.pro deleted file mode 100644 index 470fa03..0000000 --- a/util/install/win/win.pro +++ /dev/null @@ -1,136 +0,0 @@ -TEMPLATE = app -CONFIG += windows qt - -HEADERS = globalinformation.h \ - setupwizardimpl.h \ - environment.h \ - shell.h \ - resource.h \ - dialogs/folderdlgimpl.h \ - pages/pages.h \ - pages/sidedecorationimpl.h - -SOURCES = main.cpp \ - globalinformation.cpp \ - setupwizardimpl.cpp \ - setupwizardimpl_config.cpp \ - environment.cpp \ - shell.cpp \ - resource.cpp \ - dialogs/folderdlgimpl.cpp \ - pages/pages.cpp \ - pages/sidedecorationimpl.cpp - -INTERFACES = dialogs/folderdlg.ui \ - pages/buildpage.ui \ - pages/configpage.ui \ - pages/finishpage.ui \ - pages/folderspage.ui \ - pages/licenseagreementpage.ui \ - pages/licensepage.ui \ - pages/optionspage.ui \ - pages/progresspage.ui \ - pages/sidedecoration.ui \ - pages/winintropage.ui - -win32 { - SOURCES += archive.cpp - HEADERS += archive.h -} - -TARGET = install -DESTDIR = ../../../dist/win -INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty $$QT_SOURCE_TREE/util/install/archive - -win32:RC_FILE = install.rc - -# Comment out one of the following lines to build the installer for: -# -# - a Qt/Windows evaluation version (eval), -# - a Qt/Windows evaluation version that can be burned on CD and -# distributed on tradeshows (eval-cd) -# - the QSA evaluation version (qsa) -# - educational version (edu) -# - non-commercial version (noncommercial) -# -#CONFIG += eval -#CONFIG += eval-cd -#CONFIG += qsa -#CONFIG += edu -#CONFIG += noncommercial - - -unix:LIBS += -L$$QT_BUILD_TREE/util/install/archive -larq -win32:LIBS += ../archive/arq.lib -INCLUDEPATH += ../keygen - -# We have the following dependencies on config: -# -# qsa -> eval -# eval-cd -> eval -# eval -> (none) -# edu -> (none) -# noncommercial -> (none) -# -# For the code this means that the following defines are defined: -# -# eval : EVAL -# eval-cd : EVAL, EVAL_CD -# qsa : EVAL, QSA -# edu : EDU -# noncommercial: NON_COMMERCIAL -# - -qsa { - CONFIG += eval - DEFINES += QSA -} - -eval-cd { - CONFIG += eval - DEFINES += EVAL_CD -} - -eval { - !exists($(QTEVAL)/src) { - error(You must set the QTEVAL environment variable to the directory where you checked out //depot/qteval/main in order to be able to build the evaluation version of install.) - } - DEFINES += EVAL - qsa { - win32:RC_FILE = install-qsa.rc - } else { - win32:RC_FILE = install-eval.rc - } - mac:RC_FILE = ../../../tools/designer/app/designer.icns - SOURCES += $(QTEVAL)/src/check-and-patch.cpp - INCLUDEPATH += $(QTEVAL)/src - DESTDIR = ../../../bin -} - -edu { - !exists($(QTEVAL)/src) { - error(You must set the QTEVAL environment variable to the directory where you checked out //depot/qteval/main in order to be able to build the evaluation version of install.) - } - DEFINES += EDU - win32:RC_FILE = install-edu.rc - SOURCES += $(QTEVAL)/src/check-and-patch.cpp - INCLUDEPATH += $(QTEVAL)/src - DESTDIR = ../../../bin -} - -noncommercial { - !exists($(QTEVAL)/src) { - error(You must set the QTEVAL environment variable to the directory where you checked out //depot/qteval/main in order to be able to build the evaluation version of install.) - } - DEFINES += NON_COMMERCIAL - win32:RC_FILE = install-noncommercial.rc - SOURCES += $(QTEVAL)/src/check-and-patch.cpp - INCLUDEPATH += $(QTEVAL)/src - DESTDIR = ../../../bin -} - -mystaticconfig { - QMAKE_LIBS_QT = - QMAKE_LIBS_QT_THREAD = - LIBS += ../../../lib/libqt-mt.a -lz -framework Carbon -} -- cgit v0.12 From 90cf2f668136f32832405a17f355ab405882a99d Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Mon, 11 May 2009 13:27:43 +0200 Subject: Fixes a code snippet for QPainter::xFormDev() Reviewed-by: TrustMe --- src/gui/painting/qpainter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index baa9ce3..cc48d24 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -7159,14 +7159,14 @@ QPoint QPainter::xFormDev(const QPoint &p) const \fn QRect QPainter::xFormDev(const QRect &rectangle) const \overload - Use combineMatrix() combined with QMatrix::inverted() instead. + Use mapRect() combined with QMatrix::inverted() instead. \oldcode QPainter painter(this); QRect transformed = painter.xFormDev(rectangle); \newcode QPainter painter(this); - QRect transformed = rectangle * painter.combinedMatrix().inverted(); + QRect transformed = painter.combinedMatrix().inverted(rectangle); \endcode */ -- cgit v0.12 From 60ff41273a58835466022f91d4f6eb195953c739 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Mon, 11 May 2009 13:25:21 +0200 Subject: Don't leak memory when assigning scriptvalue to iterator The d-pointer was not deleted as it should be. Reviewed-by: Harald Fernengel --- src/script/qscriptvalueiterator.cpp | 4 +-- .../tst_qscriptvalueiterator.cpp | 33 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/script/qscriptvalueiterator.cpp b/src/script/qscriptvalueiterator.cpp index fe5ef9f..1a60632 100644 --- a/src/script/qscriptvalueiterator.cpp +++ b/src/script/qscriptvalueiterator.cpp @@ -106,6 +106,7 @@ QScriptValueIteratorPrivate::QScriptValueIteratorPrivate() */ QScriptValueIteratorPrivate::~QScriptValueIteratorPrivate() { + delete it; } /*! @@ -130,7 +131,6 @@ QScriptValueIterator::QScriptValueIterator(const QScriptValue &object) QScriptValueIterator::~QScriptValueIterator() { if (d_ptr) { - delete d_ptr->it; delete d_ptr; d_ptr = 0; } @@ -312,7 +312,7 @@ void QScriptValueIterator::remove() QScriptValueIterator& QScriptValueIterator::operator=(QScriptValue &object) { if (d_ptr) { - delete d_ptr->it; + delete d_ptr; d_ptr = 0; } QScriptValueImpl val = QScriptValuePrivate::valueOf(object); diff --git a/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp b/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp index 1413b0d..257ec0b 100644 --- a/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp +++ b/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp @@ -68,6 +68,7 @@ private slots: void iterateString(); void iterateGetterSetter(); void iterateArgumentsObject(); + void assignObjectToIterator(); void undefinedBehavior(); }; @@ -562,5 +563,37 @@ void tst_QScriptValueIterator::undefinedBehavior() QVERIFY(it.value().isNumber()); } +void tst_QScriptValueIterator::assignObjectToIterator() +{ + QScriptEngine eng; + QScriptValue obj1 = eng.newObject(); + obj1.setProperty("foo", 123); + QScriptValue obj2 = eng.newObject(); + obj2.setProperty("bar", 456); + + QScriptValueIterator it(obj1); + QVERIFY(it.hasNext()); + it.next(); + it = obj2; + QVERIFY(it.hasNext()); + it.next(); + QCOMPARE(it.name(), QString::fromLatin1("bar")); + + it = obj1; + QVERIFY(it.hasNext()); + it.next(); + QCOMPARE(it.name(), QString::fromLatin1("foo")); + + it = obj2; + QVERIFY(it.hasNext()); + it.next(); + QCOMPARE(it.name(), QString::fromLatin1("bar")); + + it = obj2; + QVERIFY(it.hasNext()); + it.next(); + QCOMPARE(it.name(), QString::fromLatin1("bar")); +} + QTEST_MAIN(tst_QScriptValueIterator) #include "tst_qscriptvalueiterator.moc" -- cgit v0.12 From 61ba9b2a920fd561b292886b3b75bfde4847e26f Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 7 Nov 2008 22:50:31 +0100 Subject: Add a test for UTF-8 conditions --- tests/auto/utf8/tst_utf8.cpp | 309 +++++++++++++++++++++++++++++++++++++++++++ tests/auto/utf8/utf8.pro | 3 + 2 files changed, 312 insertions(+) create mode 100644 tests/auto/utf8/tst_utf8.cpp create mode 100644 tests/auto/utf8/utf8.pro diff --git a/tests/auto/utf8/tst_utf8.cpp b/tests/auto/utf8/tst_utf8.cpp new file mode 100644 index 0000000..3aef69f --- /dev/null +++ b/tests/auto/utf8/tst_utf8.cpp @@ -0,0 +1,309 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include + +#include +#include + +//TESTED_CLASS= +//TESTED_FILES= + +static const char utf8bom[] = "\xEF\xBB\xBF"; + +class tst_Utf8 : public QObject +{ + Q_OBJECT + +public: + // test data: + QTextCodec *codec; + QString (*from8BitPtr)(const char *, int); + QByteArray (QString:: *to8Bit)() const; + + inline QString from8Bit(const QByteArray &ba) + { return from8BitPtr(ba.constData(), ba.length()); } +public slots: + void initTestCase(); + void init(); + +private slots: + void roundTrip_data(); + void roundTrip(); + + void charByChar_data(); + void charByChar(); + + void invalidUtf8_data(); + void invalidUtf8(); +}; + +void tst_Utf8::initTestCase() +{ + QTest::addColumn("useLocale"); + QTest::newRow("utf8codec") << false; + + // is the locale UTF-8? + if (QString(QChar(QChar::ReplacementCharacter)).toLocal8Bit() == "\xEF\xBF\xBD") { + QTest::newRow("localecodec") << true; + qDebug() << "locale is utf8"; + } +} + +void tst_Utf8::init() +{ + QFETCH_GLOBAL(bool, useLocale); + if (useLocale) { + codec = QTextCodec::codecForLocale(); + from8BitPtr = &QString::fromLocal8Bit; + to8Bit = &QString::toLocal8Bit; + } else { + codec = QTextCodec::codecForMib(106); + from8BitPtr = &QString::fromUtf8; + to8Bit = &QString::toUtf8; + } +} + +void tst_Utf8::roundTrip_data() +{ + QTest::addColumn("utf8"); + QTest::addColumn("utf16"); + + QTest::newRow("empty") << QByteArray() << QString(); + QTest::newRow("nul") << QByteArray("", 1) << QString(QChar(QChar::Null)); + + static const char ascii[] = "This is a standard US-ASCII message"; + QTest::newRow("ascii") << QByteArray(ascii) << ascii; + + static const char ascii2[] = "\1This\2is\3an\4US-ASCII\020 message interspersed with control chars"; + QTest::newRow("ascii2") << QByteArray(ascii2) << ascii2; + + static const char utf8_1[] = "\302\240"; // NBSP + QTest::newRow("utf8_1") << QByteArray(utf8_1) << QString(QChar(QChar::Nbsp)); + + static const char utf8_2[] = "\342\202\254"; // Euro symbol + QTest::newRow("utf8_2") << QByteArray(utf8_2) << QString(QChar(0x20AC)); + +#if 0 + // Can't test this because QString::fromUtf8 consumes it + static const char utf8_3[] = "\357\273\277"; // byte order mark + QTest::newRow("utf8_3") << QByteArray(utf8_3) << QString(QChar(QChar::ByteOrderMark)); +#endif + + static const char utf8_4[] = "\357\277\275"; // replacement char + QTest::newRow("utf8_4") << QByteArray(utf8_4) << QString(QChar(QChar::ReplacementCharacter)); + + static const char utf8_5[] = "\360\220\210\203"; // U+010203 + static const uint utf32_5[] = { 0x010203 }; + QTest::newRow("utf8_5") << QByteArray(utf8_5) << QString::fromUcs4(utf32_5, 1); + + static const char utf8_6[] = "\364\217\277\277"; // U+10FFFF + static const uint utf32_6[] = { 0x10FFFF }; + QTest::newRow("utf8_6") << QByteArray(utf8_6) << QString::fromUcs4(utf32_6, 1); + + static const char utf8_7[] = "abc\302\240\303\241\303\251\307\275 \342\202\254def"; + static const ushort utf16_7[] = { 'a', 'b', 'c', 0x00A0, + 0x00E1, 0x00E9, 0x01FD, + ' ', 0x20AC, 'd', 'e', 'f', 0 }; + QTest::newRow("utf8_7") << QByteArray(utf8_7) << QString::fromUtf16(utf16_7); + + static const char utf8_8[] = "abc\302\240\303\241\303\251\307\275 \364\217\277\277 \342\202\254def"; + static const uint utf32_8[] = { 'a', 'b', 'c', 0x00A0, + 0x00E1, 0x00E9, 0x01FD, + ' ', 0x10FFFF, ' ', + 0x20AC, 'd', 'e', 'f', 0 }; + QTest::newRow("utf8_8") << QByteArray(utf8_8) << QString::fromUcs4(utf32_8); +} + +void tst_Utf8::roundTrip() +{ + QFETCH(QByteArray, utf8); + QFETCH(QString, utf16); + + QCOMPARE((utf16.*to8Bit)(), utf8); + QCOMPARE(from8Bit(utf8), utf16); + + QCOMPARE((from8Bit(utf8).*to8Bit)(), utf8); + QCOMPARE(from8Bit((utf16.*to8Bit)()), utf16); +} + +void tst_Utf8::charByChar_data() +{ + roundTrip_data(); +} + +void tst_Utf8::charByChar() +{ + QFETCH(QByteArray, utf8); + QFETCH(QString, utf16); + + { + // from utf16 to utf8 char by char: + QSharedPointer encoder = QSharedPointer(codec->makeEncoder()); + QByteArray encoded; + + for (int i = 0; i < utf16.length(); ++i) { + encoded += encoder->fromUnicode(utf16.constData() + i, 1); + QVERIFY(!encoder->hasFailure()); + } + + if (encoded.startsWith(utf8bom)) + encoded = encoded.mid(strlen(utf8bom)); + QCOMPARE(encoded, utf8); + } + { + // from utf8 to utf16 char by char: + QSharedPointer decoder = QSharedPointer(codec->makeDecoder()); + QString decoded; + + for (int i = 0; i < utf8.length(); ++i) { + decoded += decoder->toUnicode(utf8.constData() + i, 1); + QVERIFY(!decoder->hasFailure()); + } + + QCOMPARE(decoded, utf16); + } +} + +void tst_Utf8::invalidUtf8_data() +{ + QTest::addColumn("utf8"); + + QTest::newRow("1char") << QByteArray("\x80"); + QTest::newRow("2chars") << QByteArray("\xC2\xC0"); + QTest::newRow("3chars-1") << QByteArray("\xE0\xA0\xC0"); + QTest::newRow("3chars-2") << QByteArray("\xE0\xC0\xA0"); + QTest::newRow("4chars-1") << QByteArray("\xF0\x90\x80\xC0"); + QTest::newRow("4chars-2") << QByteArray("\xF0\x90\xC0\x80"); + QTest::newRow("4chars-3") << QByteArray("\xF0\xC0\x80\x80"); + + // U+FFFE and U+FFFF are non-characters and must not be present + // U+FFFE: 1111 11 1111 11 1110 + // encoding: xxxz:1111 xz11:1111 xz11:1110 + QTest::newRow("fffe") << QByteArray("\xEF\xBF\xBE"); + // U+FFFF: 1111 11 1111 11 1111 + // encoding: xxxz:1111 xz11:1111 xz11:1111 + QTest::newRow("ffff") << QByteArray("\xEF\xBF\xBF"); + + // Surrogate pairs must now be present either + // U+D800: 1101 10 0000 00 0000 + // encoding: xxxz:1101 xz10:0000 xz00:0000 + QTest::newRow("hi-surrogate") << QByteArray("\xED\xA0\x80"); + // U+DC00: 1101 11 0000 00 0000 + // encoding: xxxz:1101 xz11:0000 xz00:0000 + QTest::newRow("lo-surrogate") << QByteArray("\xED\xB0\x80"); + + // not even in pair: + QTest::newRow("surrogate-pair") << QByteArray("\xED\xA0\x80\xED\xB0\x80"); + + // Characters outside the Unicode range: + // 0x110000: 00 0100 01 0000 00 0000 00 0000 + // encoding: xxxx:z100 xz01:0000 xz00:0000 xz00:0000 + QTest::newRow("non-unicode-1") << QByteArray("\xF4\x90\x80\x80"); + // 0x200000: 00 1000 00 0000 00 0000 00 0000 + // encoding: xxxx:xz00 xz00:1000 xz00:0000 xz00:0000 xz00:0000 + QTest::newRow("non-unicode-2") << QByteArray("\xF8\x88\x80\x80\x80"); + // 0x04000000: 0100 00 0000 00 0000 00 0000 00 0000 + // encoding: xxxx:xxz0 xz00:0100 xz00:0000 xz00:0000 xz00:0001 xz00:0001 + QTest::newRow("non-unicode-3") << QByteArray("\xFC\x84\x80\x80\x80\x80"); + // 0x7fffffff: 1 11 1111 11 1111 11 1111 11 1111 11 1111 + // encoding: xxxx:xxz0 xz00:0100 xz00:0000 xz00:0000 xz00:0001 xz00:0001 + QTest::newRow("non-unicode-3") << QByteArray("\xFD\xBF\xBF\xBF\xBF\xBF"); + + // As seen above, 0xFE and 0xFF never appear: + QTest::newRow("fe") << QByteArray("\xFE"); + QTest::newRow("fe-bis") << QByteArray("\xFE\xBF\xBF\xBF\xBF\xBF\xBF"); + QTest::newRow("ff") << QByteArray("\xFF"); + QTest::newRow("ff-bis") << QByteArray("\xFF\xBF\xBF\xBF\xBF\xBF\xBF\xBF"); + + // some combinations in UTF-8 are invalid even though they have the proper bits set + // these are known as overlong sequences + + // "A": U+0041: 01 00 0001 + // overlong 2: xxz0:0001 xz00:0001 + QTest::newRow("overlong-1-2") << QByteArray("\xC1\x81"); + // overlong 3: xxxz:0000 xz00:0001 xz00:0001 + QTest::newRow("overlong-1-3") << QByteArray("\xE0\x81\x81"); + // overlong 4: xxxx:z000 xz00:0000 xz00:0001 xz00:0001 + QTest::newRow("overlong-1-4") << QByteArray("\xF0\x80\x81\x81"); + // overlong 5: xxxx:xz00 xz00:0000 xz00:0000 xz00:0001 xz00:0001 + QTest::newRow("overlong-1-5") << QByteArray("\xF8\x80\x80\x81\x81"); + // overlong 6: xxxx:xxz0 xz00:0000 xz00:0000 xz00:0000 xz00:0001 xz00:0001 + QTest::newRow("overlong-1-6") << QByteArray("\xFC\x80\x80\x80\x81\x81"); + + // NBSP: U+00A0: 10 00 0000 + // proper encoding: xxz0:0010 xz00:0000 + // overlong 3: xxxz:0000 xz00:0010 xz00:0000 + QTest::newRow("overlong-2-3") << QByteArray("\xC0\x82\x80"); + // overlong 4: xxxx:z000 xz00:0000 xz00:0010 xz00:0000 + QTest::newRow("overlong-2-4") << QByteArray("\xF0\x80\x82\x80"); + // overlong 5: xxxx:xz00 xz00:0000 xz00:0000 xz00:0010 xz00:0000 + QTest::newRow("overlong-2-4") << QByteArray("\xF8\x80\x80\x82\x80"); + // overlong 6: xxxx:xxz0 xz00:0000 xz00:0000 xz00:0000 xz00:0010 xz00:0000 + QTest::newRow("overlong-2-4") << QByteArray("\xFC\x80\x80\x80\x82\x80"); + + // U+0800: 10 0000 00 0000 + // proper encoding: xxxz:0000 xz10:0000 xz00:0000 + // overlong 4: xxxx:z000 xz00:0000 xz10:0000 xz00:0000 + QTest::newRow("overlong-3-4") << QByteArray("\xF0\x80\xA0\x80"); + // overlong 5: xxxx:xz00 xz00:0000 xz00:0000 xz10:0000 xz00:0000 + QTest::newRow("overlong-3-5") << QByteArray("\xF8\x80\x80\xA0\x80"); + // overlong 6: xxxx:xxz0 xz00:0000 xz00:0000 xz00:0000 xz10:0000 xz00:0000 + QTest::newRow("overlong-3-6") << QByteArray("\xFC\x80\x80\x80\xA0\x80"); + + // U+010000: 00 0100 00 0000 00 0000 + // proper encoding: xxxx:z000 xz00:0100 xz00:0000 xz00:0000 + // overlong 5: xxxx:xz00 xz00:0000 xz00:0100 xz00:0000 xz00:0000 + QTest::newRow("overlong-4-5") << QByteArray("\xF8\x80\x84\x80\x80"); + // overlong 6: xxxx:xxz0 xz00:0000 xz00:0000 xz00:0100 xz00:0000 xz00:0000 + QTest::newRow("overlong-4-6") << QByteArray("\xFC\x80\x80\x84\x80\x80"); +} + +void tst_Utf8::invalidUtf8() +{ + QFETCH(QByteArray, utf8); + + QSharedPointer decoder = QSharedPointer(codec->makeDecoder()); + QString decoded = decoder->toUnicode(utf8); + QVERIFY(decoder->hasFailure()); +} + +QTEST_MAIN(tst_Utf8) +#include "tst_utf8.moc" diff --git a/tests/auto/utf8/utf8.pro b/tests/auto/utf8/utf8.pro new file mode 100644 index 0000000..4ec6851 --- /dev/null +++ b/tests/auto/utf8/utf8.pro @@ -0,0 +1,3 @@ +load(qttest_p4) +QT -= gui +SOURCES += tst_utf8.cpp -- cgit v0.12 From cbfe3be00f123f3e9c4a4463f255f596cfb41ef1 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 11 May 2009 13:34:48 +0200 Subject: Document that we don't support NTLM version 2. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: 236925 Reviewed-by: Tor Arne Vestbø --- src/network/kernel/qauthenticator.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index c9161f8..33795aa 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -73,6 +73,15 @@ static QByteArray qNtlmPhase3(QAuthenticatorPrivate *ctx, const QByteArray& phas authentication information to the socket when accessing services that require authentication. + QAuthenticator supports the following authentication methods: + \list + \o Basic + \o NTLM version 1 + \o Digest-MD5 + \endlist + + Note that, in particular, NTLM version 2 is not supported. + \sa QSslSocket */ -- cgit v0.12 From 12a1662a8cf79ff6fd7bd16ef66f7f1e77edc9e8 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 11 May 2009 13:40:17 +0200 Subject: Don't crash at runtime with when relaying a signal. We have this function called qDBusInterfaceFromMetaObject that calculates the interface name from a given meta object. There's no need to duplicate the code here (and not do it right). All tests still pss. Task-number: 236955 Reviewed-by: Trust Me --- src/dbus/qdbusintegrator.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 2c27381..f40a45f 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1125,12 +1125,7 @@ void QDBusConnectionPrivate::objectDestroyed(QObject *obj) void QDBusConnectionPrivate::relaySignal(QObject *obj, const QMetaObject *mo, int signalId, const QVariantList &args) { - int mciid = mo->indexOfClassInfo(QCLASSINFO_DBUS_INTERFACE); - Q_ASSERT(mciid != -1); - - QMetaClassInfo mci = mo->classInfo(mciid); - Q_ASSERT(mci.value()); - const char *interface = mci.value(); + QString interface = qDBusInterfaceFromMetaObject(mo); QMetaMethod mm = mo->method(signalId); QByteArray memberName = mm.signature(); @@ -1146,12 +1141,12 @@ void QDBusConnectionPrivate::relaySignal(QObject *obj, const QMetaObject *mo, in } QDBusReadLocker locker(RelaySignalAction, this); - QDBusMessage message = QDBusMessage::createSignal(QLatin1String("/"), QLatin1String(interface), + QDBusMessage message = QDBusMessage::createSignal(QLatin1String("/"), interface, QLatin1String(memberName)); message.setArguments(args); DBusMessage *msg = QDBusMessagePrivate::toDBusMessage(message); if (!msg) { - qWarning("QDBusConnection: Could not emit signal %s.%s", interface, memberName.constData()); + qWarning("QDBusConnection: Could not emit signal %s.%s", qPrintable(interface), memberName.constData()); return; } -- cgit v0.12 From 0f3a48850529e84c51e6ae0c23544f9cf8fca846 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 11 May 2009 13:43:39 +0200 Subject: Update the --help output of qdbusxml2cpp. Don't say we produce output when no options are passed if we don't. Task-number: 222778 Reviewed-by: Trust Me --- tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp b/tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp index a871fe4..d7dab0b 100644 --- a/tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp +++ b/tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp @@ -82,7 +82,6 @@ static QStringList wantedInterfaces; static const char help[] = "Usage: " PROGRAMNAME " [options...] [xml-or-xml-file] [interfaces...]\n" "Produces the C++ code to implement the interfaces defined in the input file.\n" - "If no options are given, the code is written to the standard output.\n" "\n" "Options:\n" " -a Write the adaptor code to \n" @@ -99,7 +98,10 @@ static const char help[] = "If the file name given to the options -a and -p does not end in .cpp or .h, the\n" "program will automatically append the suffixes and produce both files.\n" "You can also use a colon (:) to separate the header name from the source file\n" - "name, as in '-a filename_p.h:filename.cpp'.\n"; + "name, as in '-a filename_p.h:filename.cpp'.\n" + "\n" + "If you pass a dash (-) as the argument to either -p or -a, the output is written\n" + "to the standard output\n"; static const char includeList[] = "#include \n" -- cgit v0.12 From 92c5c75a9840853fad4f30235f9bf86dc7133fc4 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Mon, 11 May 2009 13:44:44 +0200 Subject: Clarifying docs for QTextTable::splitCell() Clarifying details about QTextTable::splitCell() regarding splitting and merging over several rows and columns Task-number:193732 Rev-by: Geir Vattekar --- src/gui/text/qtexttable.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gui/text/qtexttable.cpp b/src/gui/text/qtexttable.cpp index ba1c04f..48708c9 100644 --- a/src/gui/text/qtexttable.cpp +++ b/src/gui/text/qtexttable.cpp @@ -525,7 +525,12 @@ void QTextTablePrivate::update() const Rows and columns within a QTextTable can be merged and split using the mergeCells() and splitCell() functions. However, only cells that span multiple rows or columns can be split. (Merging or splitting does not increase or decrease - the number of rows and columns.) + the number of rows and columns.) + + Note that if you have merged multiple columns and rows into one cell, you will not + be able to split the merged cell into new cells spanning over more than one row + or column. To be able to split cells spanning over several rows and columns you + need to do this over several iterations. \table 80% \row -- cgit v0.12 From aeea8fd5a940787600002dda39a10dff4d19d090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Mon, 11 May 2009 13:37:59 +0200 Subject: Made QFontEngineFT compile on 64-bit platforms with legacy headers. In older Freetype headers FT_LCD_FILTER_DEFAULT is apparently defined to be ((const FT_Byte*)(void*)(ft_ptrdiff_t)1), which leads to a compile error due to precision loss when casting to int. Task-number: 253186 Reviewed-by: Trond --- src/gui/text/qfontengine_ft.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 7a236fd..6f5ee1f 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -613,7 +613,7 @@ QFontEngineFT::QFontEngineFT(const QFontDef &fd) subpixelType = Subpixel_None; lcdFilterType = 0; #if defined(FT_LCD_FILTER_H) - lcdFilterType = (int) FT_LCD_FILTER_DEFAULT; + lcdFilterType = (int)((quintptr) FT_LCD_FILTER_DEFAULT); #endif defaultFormat = Format_None; canUploadGlyphsToServer = false; -- cgit v0.12 From e51c865ceb47dddfedb83ca4554ead21bd24ce7c Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Mon, 11 May 2009 14:19:17 +0200 Subject: Explaining details in QKeyEvent consruktor signature Explained the role of the key attribute. Task-number:246839 Rev-by: Richard Moe Gustavsen --- src/gui/kernel/qevent.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp index 8c7e47d..2aed287 100644 --- a/src/gui/kernel/qevent.cpp +++ b/src/gui/kernel/qevent.cpp @@ -675,12 +675,13 @@ QWheelEvent::QWheelEvent(const QPoint &pos, const QPoint& globalPos, int delta, The \a type parameter must be QEvent::KeyPress, QEvent::KeyRelease, or QEvent::ShortcutOverride. - If \a key is 0, the event is not a result of - a known key; for example, it may be the result of a compose - sequence or keyboard macro. The \a modifiers holds the keyboard - modifiers, and the given \a text is the Unicode text that the - key generated. If \a autorep is true, isAutoRepeat() will be - true. \a count is the number of keys involved in the event. + Int \a key is the code for the Qt::Key that the event loop should listen + for. If \a key is 0, the event is not a result of a known key; for + example, it may be the result of a compose sequence or keyboard macro. + The \a modifiers holds the keyboard modifiers, and the given \a text + is the Unicode text that the key generated. If \a autorep is true, + isAutoRepeat() will be true. \a count is the number of keys involved + in the event. */ QKeyEvent::QKeyEvent(Type type, int key, Qt::KeyboardModifiers modifiers, const QString& text, bool autorep, ushort count) -- cgit v0.12 From 1d09e9cfd77d398788b6a31eb8c07ca2ac6fa9a8 Mon Sep 17 00:00:00 2001 From: "Bradley T. Hughes" Date: Mon, 11 May 2009 14:52:00 +0200 Subject: Set the instruction set when building on Debian's Linux/MIPS port We use MIPS2 instructions in the inline assembler, so we need to make sure that the assembler is informed of this. Task-number: 253275 Reviewed-by: thiago --- src/corelib/arch/qatomic_mips.h | 106 ++++++++++++++++++++++++++++++++-------- 1 file changed, 86 insertions(+), 20 deletions(-) diff --git a/src/corelib/arch/qatomic_mips.h b/src/corelib/arch/qatomic_mips.h index b263aab..ea9954b 100644 --- a/src/corelib/arch/qatomic_mips.h +++ b/src/corelib/arch/qatomic_mips.h @@ -103,16 +103,25 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::isFetchAndAddWaitFree() #if defined(Q_CC_GNU) && !defined(Q_OS_IRIX) +#if _MIPS_SIM == _ABIO32 +#define SET_MIPS2 ".set mips2\n\t" +#else +#define SET_MIPS2 +#endif + inline bool QBasicAtomicInt::ref() { register int originalValue; register int newValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" "ll %[originalValue], %[_q_value]\n" "addiu %[newValue], %[originalValue], %[one]\n" "sc %[newValue], %[_q_value]\n" "beqz %[newValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [_q_value] "+m" (_q_value), [newValue] "=&r" (newValue) @@ -125,12 +134,15 @@ inline bool QBasicAtomicInt::deref() { register int originalValue; register int newValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" "ll %[originalValue], %[_q_value]\n" "addiu %[newValue], %[originalValue], %[minusOne]\n" "sc %[newValue], %[_q_value]\n" "beqz %[newValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [_q_value] "+m" (_q_value), [newValue] "=&r" (newValue) @@ -143,7 +155,9 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) { register int result; register int tempValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" "ll %[result], %[_q_value]\n" "xor %[result], %[result], %[expectedValue]\n" "bnez %[result], 0f\n" @@ -153,6 +167,7 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) "beqz %[tempValue], 0b\n" "nop\n" "0:\n" + ".set pop\n" : [result] "=&r" (result), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -166,7 +181,9 @@ inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) { register int result; register int tempValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" "ll %[result], %[_q_value]\n" "xor %[result], %[result], %[expectedValue]\n" "bnez %[result], 0f\n" @@ -177,6 +194,7 @@ inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) "nop\n" "sync\n" "0:\n" + ".set pop\n" : [result] "=&r" (result), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -190,7 +208,9 @@ inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) { register int result; register int tempValue; - asm volatile("sync\n" + asm volatile(".set push\n" + SET_MIPS2 + "sync\n" "0:\n" "ll %[result], %[_q_value]\n" "xor %[result], %[result], %[expectedValue]\n" @@ -201,6 +221,7 @@ inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) "beqz %[tempValue], 0b\n" "nop\n" "0:\n" + ".set pop\n" : [result] "=&r" (result), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -219,12 +240,15 @@ inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) { register int originalValue; register int tempValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" "ll %[originalValue], %[_q_value]\n" "move %[tempValue], %[newValue]\n" "sc %[tempValue], %[_q_value]\n" "beqz %[tempValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -237,13 +261,16 @@ inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) { register int originalValue; register int tempValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" "ll %[originalValue], %[_q_value]\n" "move %[tempValue], %[newValue]\n" "sc %[tempValue], %[_q_value]\n" "beqz %[tempValue], 0b\n" "nop\n" "sync\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -256,13 +283,16 @@ inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue) { register int originalValue; register int tempValue; - asm volatile("sync\n" + asm volatile(".set push\n" + SET_MIPS2 + "sync\n" "0:\n" "ll %[originalValue], %[_q_value]\n" "move %[tempValue], %[newValue]\n" "sc %[tempValue], %[_q_value]\n" "beqz %[tempValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -280,12 +310,15 @@ inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) { register int originalValue; register int newValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" "ll %[originalValue], %[_q_value]\n" "addu %[newValue], %[originalValue], %[valueToAdd]\n" "sc %[newValue], %[_q_value]\n" "beqz %[newValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [_q_value] "+m" (_q_value), [newValue] "=&r" (newValue) @@ -298,13 +331,16 @@ inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) { register int originalValue; register int newValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" "ll %[originalValue], %[_q_value]\n" "addu %[newValue], %[originalValue], %[valueToAdd]\n" "sc %[newValue], %[_q_value]\n" "beqz %[newValue], 0b\n" "nop\n" "sync\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [_q_value] "+m" (_q_value), [newValue] "=&r" (newValue) @@ -317,13 +353,16 @@ inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) { register int originalValue; register int newValue; - asm volatile("sync\n" + asm volatile(".set push\n" + SET_MIPS2 + "sync\n" "0:\n" "ll %[originalValue], %[_q_value]\n" "addu %[newValue], %[originalValue], %[valueToAdd]\n" "sc %[newValue], %[_q_value]\n" "beqz %[newValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [_q_value] "+m" (_q_value), [newValue] "=&r" (newValue) @@ -350,7 +389,9 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValu { register T *result; register T *tempValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" LLP" %[result], %[_q_value]\n" "xor %[result], %[result], %[expectedValue]\n" "bnez %[result], 0f\n" @@ -360,6 +401,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValu "beqz %[tempValue], 0b\n" "nop\n" "0:\n" + ".set pop\n" : [result] "=&r" (result), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -374,7 +416,9 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValu { register T *result; register T *tempValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" LLP" %[result], %[_q_value]\n" "xor %[result], %[result], %[expectedValue]\n" "bnez %[result], 0f\n" @@ -385,6 +429,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValu "nop\n" "sync\n" "0:\n" + ".set pop\n" : [result] "=&r" (result), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -399,7 +444,9 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValu { register T *result; register T *tempValue; - asm volatile("sync\n" + asm volatile(".set push\n" + SET_MIPS2 + "sync\n" "0:\n" LLP" %[result], %[_q_value]\n" "xor %[result], %[result], %[expectedValue]\n" @@ -410,6 +457,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValu "beqz %[tempValue], 0b\n" "nop\n" "0:\n" + ".set pop\n" : [result] "=&r" (result), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -430,12 +478,15 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) { register T *originalValue; register T *tempValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" LLP" %[originalValue], %[_q_value]\n" "move %[tempValue], %[newValue]\n" SCP" %[tempValue], %[_q_value]\n" "beqz %[tempValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -449,13 +500,16 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) { register T *originalValue; register T *tempValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" LLP" %[originalValue], %[_q_value]\n" "move %[tempValue], %[newValue]\n" SCP" %[tempValue], %[_q_value]\n" "beqz %[tempValue], 0b\n" "nop\n" "sync\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -469,13 +523,16 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelease(T *newValue) { register T *originalValue; register T *tempValue; - asm volatile("sync\n" + asm volatile(".set push\n" + SET_MIPS2 + "sync\n" "0:\n" LLP" %[originalValue], %[_q_value]\n" "move %[tempValue], %[newValue]\n" SCP" %[tempValue], %[_q_value]\n" "beqz %[tempValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [tempValue] "=&r" (tempValue), [_q_value] "+m" (_q_value) @@ -495,12 +552,15 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueTo { register T *originalValue; register T *newValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" LLP" %[originalValue], %[_q_value]\n" "addu %[newValue], %[originalValue], %[valueToAdd]\n" SCP" %[newValue], %[_q_value]\n" "beqz %[newValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [_q_value] "+m" (_q_value), [newValue] "=&r" (newValue) @@ -514,13 +574,16 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddAcquire(qptrdiff valueTo { register T *originalValue; register T *newValue; - asm volatile("0:\n" + asm volatile(".set push\n" + SET_MIPS2 + "0:\n" LLP" %[originalValue], %[_q_value]\n" "addu %[newValue], %[originalValue], %[valueToAdd]\n" SCP" %[newValue], %[_q_value]\n" "beqz %[newValue], 0b\n" "nop\n" "sync\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [_q_value] "+m" (_q_value), [newValue] "=&r" (newValue) @@ -534,13 +597,16 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelease(qptrdiff valueTo { register T *originalValue; register T *newValue; - asm volatile("sync\n" + asm volatile(".set push\n" + SET_MIPS2 + "sync\n" "0:\n" LLP" %[originalValue], %[_q_value]\n" "addu %[newValue], %[originalValue], %[valueToAdd]\n" SCP" %[newValue], %[_q_value]\n" "beqz %[newValue], 0b\n" "nop\n" + ".set pop\n" : [originalValue] "=&r" (originalValue), [_q_value] "+m" (_q_value), [newValue] "=&r" (newValue) -- cgit v0.12 From 27d2f348792be0e08e204896dad8f3d80f51d80b Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 11 May 2009 15:35:49 +0200 Subject: qdoc: Fixed qdoc errors, or tried to. --- src/corelib/tools/qhash.cpp | 219 +++++++++++++++++++++----------------------- 1 file changed, 102 insertions(+), 117 deletions(-) diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index 21d98b5..b2512e1 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -379,6 +379,107 @@ void QHashData::checkSanity() #endif /*! + \fn uint qHash(const QPair &key) + \relates QHash + \since 4.3 + + Returns the hash value for the \a key. + + Types \c T1 and \c T2 must be supported by qHash(). +*/ + +/*! \fn uint qHash(char key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(uchar key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(signed char key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(ushort key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(short key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(uint key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(int key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(ulong key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(long key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(quint64 key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(qint64 key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(QChar key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(const QByteArray &key) + \fn uint qHash(const QBitArray &key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(const QString &key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \fn uint qHash(const T *key) + \relates QHash + + Returns the hash value for the \a key. +*/ + +/*! \class QHash \brief The QHash class is a template class that provides a hash-table-based dictionary. @@ -401,7 +502,7 @@ void QHashData::checkSanity() key. With QHash, the items are arbitrarily ordered. \i The key type of a QMap must provide operator<(). The key type of a QHash must provide operator==() and a global - \l{qHash()}{qHash}(Key) function. + \l{qHash()} {hash} function. \endlist Here's an example QHash with QString keys and \c int values: @@ -732,7 +833,6 @@ void QHashData::checkSanity() */ /*! \fn const T QHash::value(const Key &key, const T &defaultValue) const - \overload If the hash contains no item with the given \a key, the function returns @@ -1490,121 +1590,6 @@ void QHashData::checkSanity() \sa operator+=(), operator-() */ -/*! \fn uint qHash(char key) - \relates QHash - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(uchar key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(signed char key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(ushort key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(short key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(uint key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(int key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(ulong key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(long key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(quint64 key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(qint64 key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(QChar key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(const QByteArray &key) - \fn uint qHash(const QBitArray &key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(const QString &key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! \fn uint qHash(const T *key) - \relates QHash - \overload - - Returns the hash value for the \a key. -*/ - -/*! - \fn uint qHash(const QPair &key) - \relates QHash - \since 4.3 - - Returns the hash value for the \a key. - - Types \c T1 and \c T2 must be supported by qHash(). -*/ - /*! \fn QDataStream &operator<<(QDataStream &out, const QHash& hash) \relates QHash -- cgit v0.12 From 0ce24108aa20a38e53a7f307231a6752f89ef65a Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Mon, 11 May 2009 15:41:26 +0200 Subject: Correcting bug in custom Database Driver code snipptet Adding const to call. Changing QSqlRecord record() { return QSqlRecord(); } to QSqlRecord record() const { return QSqlRecord(); } This is needed since record() is a virtual function. Task-number:204557 Rev-by: Geir Vattekar --- doc/src/snippets/sqldatabase/sqldatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/snippets/sqldatabase/sqldatabase.cpp b/doc/src/snippets/sqldatabase/sqldatabase.cpp index ae176ac..06afa0c 100644 --- a/doc/src/snippets/sqldatabase/sqldatabase.cpp +++ b/doc/src/snippets/sqldatabase/sqldatabase.cpp @@ -524,7 +524,7 @@ protected: bool fetchLast() { return false; } int size() { return 0; } int numRowsAffected() { return 0; } - QSqlRecord record() { return QSqlRecord(); } + QSqlRecord record() const { return QSqlRecord(); } }; //! [47] -- cgit v0.12 From fecfc325bbd4decc0d61e10dc6536575c305f812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Mon, 11 May 2009 13:32:46 +0200 Subject: QFSFileEngine: Fix access to uninitialized memory Reviewed-by: Peter Hartmann --- src/corelib/io/qfsfileengine_unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp index 0d88b06..18b92e2 100644 --- a/src/corelib/io/qfsfileengine_unix.cpp +++ b/src/corelib/io/qfsfileengine_unix.cpp @@ -780,7 +780,7 @@ QString QFSFileEngine::fileName(FileName file) const #endif if (len > 0) { QString ret; - if (S_ISDIR(d->st.st_mode) && s[0] != '/') { + if (d->doStat() && S_ISDIR(d->st.st_mode) && s[0] != '/') { QDir parent(d->filePath); parent.cdUp(); ret = parent.path(); -- cgit v0.12 From 6200d413487517eadb8f4696d92a38fc73ba737c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trond=20Kjern=C3=A5sen?= Date: Mon, 11 May 2009 16:40:33 +0200 Subject: Improved caching of QSvgIconEngine::actualSize() calls. If an application calls QIcon::actualSize() for SVG based icons, before the icon is drawn for the first time, the actualSize() call will result in the SVG file being loaded and parsed for each call. Instead of doing that, just render a pixmap of the queried size and then the resulting actualSize() calls will used the size of the cached pixmap. Task-number: related to 251106 Reviewed-by: Kim --- src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp index c7249d3..3273513 100644 --- a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp +++ b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp @@ -122,16 +122,10 @@ QSize QSvgIconEngine::actualSize(const QSize &size, QIcon::Mode mode, return size; } - QSvgRenderer renderer; - d->loadDataForModeAndState(&renderer, mode, state); - if (renderer.isValid()) { - QSize defaultSize = renderer.defaultSize(); - if (!defaultSize.isNull()) - defaultSize.scale(size, Qt::KeepAspectRatio); - return defaultSize; - } else { + QPixmap pm = pixmap(size, mode, state); + if (pm.isNull()) return QSize(); - } + return pm.size(); } void QSvgIconEnginePrivate::loadDataForModeAndState(QSvgRenderer *renderer, QIcon::Mode mode, QIcon::State state) -- cgit v0.12 From 5f135bd9ba053c0ef41df9fe5450c78460ad89d3 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Mon, 11 May 2009 10:16:44 -0700 Subject: Fix a type in warning QDirecttFBPixmapData => QDirectFBPixmapData Reviewed-by: TrustMe --- src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp index 7297a99..c9b676a 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp @@ -271,7 +271,7 @@ void QDirectFBPixmapData::fill(const QColor &color) forceRaster = false; setSerialNumber(++global_ser_no); if (!dfbSurface) { - qWarning("QDirecttFBPixmapData::fill()"); + qWarning("QDirectFBPixmapData::fill()"); invalidate(); return; } -- cgit v0.12 From 15e5a770635ca891bb3e0297fab130f7c1538655 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Mon, 11 May 2009 14:01:54 -0700 Subject: Remove unused variable Reviewed-by: TrustMe --- src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp index 91a60e7..989a37a 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp @@ -275,7 +275,6 @@ private: int lastLockedHeight; IDirectFB *fb; - DFBSurfaceDescription fbDescription; int fbWidth; int fbHeight; -- cgit v0.12 From e16c235ecdb0b13ece15722b69e180a53cff431a Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Mon, 11 May 2009 14:07:39 -0700 Subject: initialize all DFBSurfaceDescriptions to 0 Since this is C there are no constructors. Reviewed-by: Donald --- src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp index f571d1b..65fddbf 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp @@ -205,6 +205,7 @@ IDirectFBSurface *QDirectFBScreen::createDFBSurface(const QSize &size, SurfaceCreationOptions options) { DFBSurfaceDescription desc; + memset(&desc, 0, sizeof(DFBSurfaceDescription)); desc.flags = DFBSurfaceDescriptionFlags(DSDESC_WIDTH|DSDESC_HEIGHT); if (!QDirectFBScreen::initSurfaceDescriptionPixelFormat(&desc, format)) return 0; @@ -213,7 +214,6 @@ IDirectFBSurface *QDirectFBScreen::createDFBSurface(const QSize &size, return createDFBSurface(desc, options); } - IDirectFBSurface *QDirectFBScreen::createDFBSurface(DFBSurfaceDescription desc, SurfaceCreationOptions options) { DFBResult result = DFB_OK; @@ -247,6 +247,7 @@ IDirectFBSurface *QDirectFBScreen::createDFBSurface(DFBSurfaceDescription desc, } desc.caps = DFBSurfaceCapabilities(desc.caps & ~DSCAPS_VIDEOONLY); } + if (d_ptr->directFBFlags & SystemOnly) desc.caps = DFBSurfaceCapabilities(desc.caps | DSCAPS_SYSTEMONLY); @@ -445,6 +446,7 @@ QImage::Format QDirectFBScreen::getImageFormat(IDirectFBSurface *surface) DFBSurfaceDescription QDirectFBScreen::getSurfaceDescription(const QImage &image) { DFBSurfaceDescription description; + memset(&description, 0, sizeof(DFBSurfaceDescription)); const DFBSurfacePixelFormat format = getSurfacePixelFormat(image.format()); @@ -479,6 +481,7 @@ DFBSurfaceDescription QDirectFBScreen::getSurfaceDescription(const uint *buffer, int length) { DFBSurfaceDescription description; + memset(&description, 0, sizeof(DFBSurfaceDescription)); description.flags = DFBSurfaceDescriptionFlags(DSDESC_CAPS | DSDESC_WIDTH @@ -917,6 +920,8 @@ bool QDirectFBScreen::connect(const QString &displaySpec) d_ptr->dfb->SetCooperativeLevel(d_ptr->dfb, DFSCL_FULLSCREEN); DFBSurfaceDescription description; + memset(&description, 0, sizeof(DFBSurfaceDescription)); + description.flags = DFBSurfaceDescriptionFlags(DSDESC_CAPS); if (::setIntOption(displayArgs, QLatin1String("width"), &description.width)) description.flags = DFBSurfaceDescriptionFlags(description.flags | DSDESC_WIDTH); -- cgit v0.12 From 7f0ffec90467c12d41566bb20fc02e09cfe3afa1 Mon Sep 17 00:00:00 2001 From: kh Date: Tue, 12 May 2009 09:09:33 +0200 Subject: Version update. --- tools/assistant/tools/assistant/assistant.qch | Bin 368640 -> 368640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/assistant/tools/assistant/assistant.qch b/tools/assistant/tools/assistant/assistant.qch index 64763f7..99687ed 100644 Binary files a/tools/assistant/tools/assistant/assistant.qch and b/tools/assistant/tools/assistant/assistant.qch differ -- cgit v0.12 From 8d94fcce0a2ca382eac8357dae05ad387551e364 Mon Sep 17 00:00:00 2001 From: jasplin Date: Tue, 12 May 2009 09:47:29 +0200 Subject: Fixed bug with Qt::WidgetWithChildren shortcut context in QGraphicsWidget. For a QGraphicsWidget w, a shortcut with Qt::WidgetWithChildren context would trigger even if w did not have focus (provided no other widgets in the view had focus). Reviewed-by: andreas Task-number: 250119 --- src/gui/kernel/qshortcutmap.cpp | 1 + tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp | 85 ++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/src/gui/kernel/qshortcutmap.cpp b/src/gui/kernel/qshortcutmap.cpp index ed9654b..86894b4 100644 --- a/src/gui/kernel/qshortcutmap.cpp +++ b/src/gui/kernel/qshortcutmap.cpp @@ -753,6 +753,7 @@ bool QShortcutMap::correctGraphicsWidgetContext(Qt::ShortcutContext context, QGr tw = tw->parentWidget(); return tw == w; } + return false; } // Below is Qt::WindowShortcut context diff --git a/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp index f25a079..b85abd3 100644 --- a/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp +++ b/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp @@ -50,6 +50,7 @@ #include #include #include +#include #include "../../shared/util.h" @@ -150,6 +151,7 @@ private slots: // Task fixes void task236127_bspTreeIndexFails(); void task243004_setStyleCrash(); + void task250119_shortcutContext(); }; @@ -1827,6 +1829,89 @@ void tst_QGraphicsWidget::task243004_setStyleCrash() delete item2; } +class GraphicsWidget_task250119 : public QGraphicsWidget +{ +public: + GraphicsWidget_task250119() + : shortcutEvents(0) + { + setFocusPolicy(Qt::StrongFocus); + resize(100, 100); + } + + int shortcutEvents; + +private: + bool event(QEvent *event) + { + if (event->type() == QEvent::Shortcut) + shortcutEvents++; + return QGraphicsWidget::event(event); + } + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) + { + if (hasFocus()) { + painter->setPen(QPen(Qt::black, 0, Qt::DashLine)); + painter->drawRect(rect()); + } + painter->setPen(QPen(Qt::black, 0, Qt::SolidLine)); + painter->fillRect(rect().adjusted(2, 2, -2, -2), Qt::yellow); + painter->drawRect(rect().adjusted(2, 2, -2, -2)); + } +}; + +void tst_QGraphicsWidget::task250119_shortcutContext() +{ + QGraphicsScene scene; + QGraphicsView view; + view.setScene(&scene); + view.show(); + QTest::qWait(100); + + + // *** Event: *** + + GraphicsWidget_task250119 w_event; + scene.addItem(&w_event); + + const int id = w_event.grabShortcut(Qt::Key_A, Qt::WidgetWithChildrenShortcut); + w_event.setShortcutEnabled(id, true); + + w_event.setFocus(); + QTest::keyPress(&view, Qt::Key_A); + QCOMPARE(w_event.shortcutEvents, 1); + + w_event.clearFocus(); + QTest::keyPress(&view, Qt::Key_A); + QCOMPARE(w_event.shortcutEvents, 1); + + scene.removeItem(&w_event); + + + // *** Signal: *** + + GraphicsWidget_task250119 w_signal; + scene.addItem(&w_signal); + + QAction action(0); + action.setShortcut(Qt::Key_B); + action.setShortcutContext(Qt::WidgetWithChildrenShortcut); + QSignalSpy spy(&action, SIGNAL(triggered())); + + w_signal.addAction(&action); + + w_signal.setFocus(); + QTest::keyPress(&view, Qt::Key_B); + QCOMPARE(spy.count(), 1); + + w_signal.clearFocus(); + QTest::keyPress(&view, Qt::Key_B); + QCOMPARE(spy.count(), 1); + + scene.removeItem(&w_signal); +} + QTEST_MAIN(tst_QGraphicsWidget) #include "tst_qgraphicswidget.moc" -- cgit v0.12 From bb0e2a55192cd134eb642dfa2f5e7ee93668a059 Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Tue, 12 May 2009 10:21:21 +0200 Subject: Fix handling of gradients on pens in the emulation paint engine. The handling of gradients with object bounding mode on pens in the emulation paint engine has been changed to agree with the SVG standard, where pen widths are ignored when calculating bounding boxes. Instead of converting strokes to fills and then transforming the gradients based on the fills' bounding box, the gradients are now transformed first based on the bounding box of the stroke path. Reviewed-by: Trond --- src/gui/painting/qemulationpaintengine.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/gui/painting/qemulationpaintengine.cpp b/src/gui/painting/qemulationpaintengine.cpp index 3397c45..175f1ab 100644 --- a/src/gui/painting/qemulationpaintengine.cpp +++ b/src/gui/painting/qemulationpaintengine.cpp @@ -123,14 +123,30 @@ void QEmulationPaintEngine::stroke(const QVectorPath &path, const QPen &pen) real_engine->stroke(path, bgPen); } - QBrush brush = pen.brush(); + QPen copy = pen; Qt::BrushStyle style = qbrush_style(brush); if (style >= Qt::LinearGradientPattern && style <= Qt::ConicalGradientPattern) { const QGradient *g = brush.gradient(); + if (g->coordinateMode() > QGradient::LogicalMode) { - QPaintEngineEx::stroke(path, pen); - return; + if (g->coordinateMode() == QGradient::StretchToDeviceMode) { + QTransform mat = brush.transform(); + mat.scale(real_engine->painter()->device()->width(), real_engine->painter()->device()->height()); + brush.setTransform(mat); + copy.setBrush(brush); + real_engine->stroke(path, copy); + return; + } else if (g->coordinateMode() == QGradient::ObjectBoundingMode) { + QTransform mat = brush.transform(); + QRealRect r = path.controlPointRect(); + mat.translate(r.x1, r.y1); + mat.scale(r.x2 - r.x1, r.y2 - r.y1); + brush.setTransform(mat); + copy.setBrush(brush); + real_engine->stroke(path, copy); + return; + } } } -- cgit v0.12 From bc184432c49eb56254bc5db07c6af03718c6b0e7 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Tue, 12 May 2009 13:52:28 +0200 Subject: Correcting bug in QString::fromWCharArray documentation Clearifying details about bit size of the wchar_t input and the way they are handled. Task-number:227709 Rev-by: Marius Storm-Olsen --- src/corelib/tools/qstring.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 375d672..c3649e3 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -743,7 +743,9 @@ int QString::grow(int size) /*! \since 4.2 - Returns a copy of the \a string string encoded in ucs4. + Returns a copy of the \a string, where the encoding of \a string depends on + the size of wchar. If wchar is 4 bytes, the \a string is interpreted as ucs-4, + if wchar is 2 bytes it is interpreted as ucs-2. If \a size is -1 (default), the \a string has to be 0 terminated. -- cgit v0.12 From 4d5a5149b716c67f031a3a40e23370f90542c92f Mon Sep 17 00:00:00 2001 From: Harald Fernengel Date: Tue, 12 May 2009 14:34:10 +0200 Subject: Make QAccessibleLineEdit actually accessible Q_ACCESSIBLE_OBJECT was missing --- src/plugins/accessible/widgets/simplewidgets.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h index d4552e3..d1fd0da 100644 --- a/src/plugins/accessible/widgets/simplewidgets.h +++ b/src/plugins/accessible/widgets/simplewidgets.h @@ -115,6 +115,7 @@ public: class QAccessibleLineEdit : public QAccessibleWidgetEx, public QAccessibleTextInterface, public QAccessibleSimpleEditableTextInterface { + Q_ACCESSIBLE_OBJECT public: explicit QAccessibleLineEdit(QWidget *o, const QString &name = QString()); -- cgit v0.12 From 62edc8d78a8e38c62a87420bd3b37c886c6926d3 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Tue, 12 May 2009 16:11:41 +0200 Subject: Adding documentation to the fancy browser example Added documentation to the fancy browser example. Task-number:252097 Rev-by: Geir Vattekar Rev-by: Ariya Hidayat --- doc/src/examples/fancybrowser.qdoc | 103 +++++++++++++++++++++++++++- examples/webkit/fancybrowser/mainwindow.cpp | 20 +++++- examples/webkit/fancybrowser/mainwindow.h | 4 +- 3 files changed, 122 insertions(+), 5 deletions(-) diff --git a/doc/src/examples/fancybrowser.qdoc b/doc/src/examples/fancybrowser.qdoc index 9001c20..8338d8b 100644 --- a/doc/src/examples/fancybrowser.qdoc +++ b/doc/src/examples/fancybrowser.qdoc @@ -40,12 +40,109 @@ ****************************************************************************/ /*! - \example webkit/fancybrowser - \title Fancy Browser Example + \example webkit/fancybrowser + \title Fancy Browser Example The Fancy Browser example shows how to use jQuery with QtWebKit to - make a web browser with some special effects and content manipulation. + create a web browser with special effects and content + manipulation. \image fancybrowser-example.png + The application makes use of QWebFrame::evaluateJavaScript to + evaluate the jQuery JavaScript code. A QMainWindow with a QWebView + as central widget builds up the browser itself. + + \section1 MainWindow Class Definition + + The \c MainWindow class inherits QMainWindow. It implements a number of + slots to perform actions on both the application and on the web content. + + \snippet examples/webkit/fancybrowser/mainwindow.h 1 + + We also declare a QString that contains the jQuery, a QWebView + that displays the web content, and a QLineEdit that acts as the + address bar. + + \section1 MainWindow Class Implementation + + We start by implementing the constructor. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 1 + + The first part of the constructor sets the value of \c progress to + 0. This value will be used later in the code to visualize the + loading of a webpage. + + Next, the jQuery library is loaded using a QFile and reading the file + content. The jQuery library is a JavaScript library that provides different + functions for manipulating HTML. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 2 + + The second part of the constructor creates a QWebView and connects + slots to the views signals. Furthermore, we create a QLineEdit as + the browsers address bar. We then set the horizontal QSizePolicy + to fill the available area in the browser at all times. We add the + QLineEdit to a QToolbar together with a set of navigation actions + from QWebView::pageAction. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 3 + + The third and last part of the constructor implements two QMenus and assigns + a set of actions to them. The last line sets the QWebView as the central + widget in the QMainWindow. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 4 + + When the page is loaded, \c adjustLocation() updates the address + bar; \c adjustLocation() is triggered by the \c loadFinished() + signal in QWebView. In \c changeLocation() we create a QUrl + objecti, and then use it to load the page into the QWebView. When + the new web page has finished loading, \c adjustLocation() will be + run once more to update the address bar. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 5 + + \c adjustTitle() sets the window title and displays the loading + progress. This slot is triggered by the \c titleChanged() signal + in QWebView. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 6 + + When a web page has loaded, \c finishLoading() is triggered by the + \c loadFinished() signal in QWebView. \c finishLoading() then updates the + progress in the title bar and calls \c evaluateJavaScript() to evaluate the + jQuery library. This evaluates the JavaScript against the current web page. + What that means is that the JavaScript can be viewed as part of the content + loaded into the QWebView, and therefore needs to be loaded every time a new + page is loaded. Once the jQuery library is loaded, we can start executing + the different jQuery functions in the browser. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 7 + + The first jQuery-based function, \c highlightAllLinks(), is designed to + highlight all links in the current webpage. The JavaScript code looks + for web elements named \i {a}, which is the tag for a hyperlink. + For each such element, the background color is set to be yellow by + using CSS. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 8 + + The \c rotateImages() function rotates the images on the current + web page. Webkit supports CSS transforms and this JavaScript code + looks up all \i {img} elements and rotates the images 180 degrees + and then back again. + + \snippet examples/webkit/fancybrowser/mainwindow.cpp 9 + + The remaining four methods remove different elements from the current web + page. \c removeGifImages() removes all Gif images on the page by looking up + the \i {src} attribute of all the elements on the web page. Any element with + a \i {gif} file as its source is removed. \c removeInlineFrames() removes all + \i {iframe} or inline elements. \c removeObjectElements() removes all + \i {object} elements, and \c removeEmbeddedElements() removes any elements + such as plugins embedded on the page using the \i {embed} element. + */ + diff --git a/examples/webkit/fancybrowser/mainwindow.cpp b/examples/webkit/fancybrowser/mainwindow.cpp index bf61f9c..e24f6cf 100644 --- a/examples/webkit/fancybrowser/mainwindow.cpp +++ b/examples/webkit/fancybrowser/mainwindow.cpp @@ -43,6 +43,8 @@ #include #include "mainwindow.h" +//! [1] + MainWindow::MainWindow() { progress = 0; @@ -52,7 +54,9 @@ MainWindow::MainWindow() file.open(QIODevice::ReadOnly); jQuery = file.readAll(); file.close(); +//! [1] +//! [2] view = new QWebView(this); view->load(QUrl("http://www.google.com/ncr")); connect(view, SIGNAL(loadFinished(bool)), SLOT(adjustLocation())); @@ -70,7 +74,9 @@ MainWindow::MainWindow() toolBar->addAction(view->pageAction(QWebPage::Reload)); toolBar->addAction(view->pageAction(QWebPage::Stop)); toolBar->addWidget(locationEdit); +//! [2] +//! [3] QMenu *effectMenu = menuBar()->addMenu(tr("&Effect")); effectMenu->addAction("Highlight all links", this, SLOT(highlightAllLinks())); @@ -89,7 +95,9 @@ MainWindow::MainWindow() setCentralWidget(view); } +//! [3] +//! [4] void MainWindow::adjustLocation() { locationEdit->setText(view->url().toString()); @@ -98,11 +106,12 @@ void MainWindow::adjustLocation() void MainWindow::changeLocation() { QUrl url = QUrl(locationEdit->text()); - locationEdit->setText(url.toString()); view->load(url); view->setFocus(); } +//! [4] +//! [5] void MainWindow::adjustTitle() { if (progress <= 0 || progress >= 100) @@ -116,20 +125,26 @@ void MainWindow::setProgress(int p) progress = p; adjustTitle(); } +//! [5] +//! [6] void MainWindow::finishLoading(bool) { progress = 100; adjustTitle(); view->page()->mainFrame()->evaluateJavaScript(jQuery); } +//! [6] +//! [7] void MainWindow::highlightAllLinks() { QString code = "$('a').each( function () { $(this).css('background-color', 'yellow') } )"; view->page()->mainFrame()->evaluateJavaScript(code); } +//! [7] +//! [8] void MainWindow::rotateImages(bool toggle) { QString code = "$('img').each( function () { $(this).css('-webkit-transition', '-webkit-transform 2s') } )"; @@ -140,7 +155,9 @@ void MainWindow::rotateImages(bool toggle) code = "$('img').each( function () { $(this).css('-webkit-transform', 'rotate(0deg)') } )"; view->page()->mainFrame()->evaluateJavaScript(code); } +//! [8] +//! [9] void MainWindow::removeGifImages() { QString code = "$('[src*=gif]').remove()"; @@ -164,4 +181,5 @@ void MainWindow::removeEmbeddedElements() QString code = "$('embed').remove()"; view->page()->mainFrame()->evaluateJavaScript(code); } +//! [9] diff --git a/examples/webkit/fancybrowser/mainwindow.h b/examples/webkit/fancybrowser/mainwindow.h index 9362ca7..2e1068c 100644 --- a/examples/webkit/fancybrowser/mainwindow.h +++ b/examples/webkit/fancybrowser/mainwindow.h @@ -39,13 +39,14 @@ ** ****************************************************************************/ -#include +#include QT_BEGIN_NAMESPACE class QWebView; class QLineEdit; QT_END_NAMESPACE +//! [1] class MainWindow : public QMainWindow { Q_OBJECT @@ -73,4 +74,5 @@ private: QWebView *view; QLineEdit *locationEdit; int progress; +//! [1] }; -- cgit v0.12 From 661096f7ed2d9d5c91d716ba414c7286220c6cf9 Mon Sep 17 00:00:00 2001 From: Benjamin Poulain Date: Tue, 12 May 2009 16:12:52 +0200 Subject: The description cited MySQL and the code is for PostgreSQL. Task-number: 253427 Reviewed-by: TrustMe --- src/sql/kernel/qsqldatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp index 6232452..a270c0e 100644 --- a/src/sql/kernel/qsqldatabase.cpp +++ b/src/sql/kernel/qsqldatabase.cpp @@ -378,7 +378,7 @@ void QSqlDatabasePrivate::disable() the connection name argument, if you don't pass the connection name argument, the default connection is assumed. The following snippet shows how to create and open a default connection to a - MySQL database: + PostgreSQL database: \snippet doc/src/snippets/sqldatabase/sqldatabase.cpp 0 -- cgit v0.12 From 64f86caef81ee0047fe28f0bc9c1d8a4ca606ebb Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Tue, 12 May 2009 17:05:33 +0200 Subject: Reviewed-by: TrustMe Small polishing. --- doc/src/examples/fancybrowser.qdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/examples/fancybrowser.qdoc b/doc/src/examples/fancybrowser.qdoc index 8338d8b..ea4da71 100644 --- a/doc/src/examples/fancybrowser.qdoc +++ b/doc/src/examples/fancybrowser.qdoc @@ -98,7 +98,7 @@ When the page is loaded, \c adjustLocation() updates the address bar; \c adjustLocation() is triggered by the \c loadFinished() signal in QWebView. In \c changeLocation() we create a QUrl - objecti, and then use it to load the page into the QWebView. When + object, and then use it to load the page into the QWebView. When the new web page has finished loading, \c adjustLocation() will be run once more to update the address bar. @@ -142,7 +142,7 @@ a \i {gif} file as its source is removed. \c removeInlineFrames() removes all \i {iframe} or inline elements. \c removeObjectElements() removes all \i {object} elements, and \c removeEmbeddedElements() removes any elements - such as plugins embedded on the page using the \i {embed} element. + such as plugins embedded on the page using the \i {embed} tag. */ -- cgit v0.12 From e58b7a29206bf81735ce45c964285de2e94ccc70 Mon Sep 17 00:00:00 2001 From: Trond Kjernaasen Date: Tue, 12 May 2009 17:22:33 +0200 Subject: Fixed a memory leak that occured when loading system icons on Windows. There was a qFree() call missing. Task-number: related to 253367 Reviewed-by: jbache --- src/gui/image/qpixmap_win.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/image/qpixmap_win.cpp b/src/gui/image/qpixmap_win.cpp index 3ec441b..cbe9004 100644 --- a/src/gui/image/qpixmap_win.cpp +++ b/src/gui/image/qpixmap_win.cpp @@ -319,6 +319,7 @@ static QImage qt_fromWinHBITMAP(HDC hdc, HBITMAP bitmap, int w, int h) } else { qWarning("qt_fromWinHBITMAP(), failed to get bitmap bits"); } + qFree(data); return image; } -- cgit v0.12 From 8a4934d8b97b55b80b2709dba04346e068251906 Mon Sep 17 00:00:00 2001 From: Norwegian Rock Cat Date: Tue, 12 May 2009 17:53:27 +0200 Subject: Document a gotcha with QIcon::addFile addFile makes a QIcon not null, which may be a surprise if the path given is bad. Reviewed-by: Jens Bache-Wiig --- src/gui/image/qicon.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp index 3c71f15..53430ab 100644 --- a/src/gui/image/qicon.cpp +++ b/src/gui/image/qicon.cpp @@ -854,6 +854,9 @@ void QIcon::addPixmap(const QPixmap &pixmap, Mode mode, State state) QImageWriter::supportedImageFormats() functions to retrieve a complete list of the supported file formats. + Note: When you add a non-empty filename to a QIcon, the icon becomes + non-null, even if the file doesn't exist or points to a corrupt file. + \sa addPixmap() */ void QIcon::addFile(const QString &fileName, const QSize &size, Mode mode, State state) -- cgit v0.12 From efad5df3ee7dea6cb587aacd27010e15a69f4320 Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Tue, 12 May 2009 18:18:29 +0200 Subject: Doc - cleaning up the documentation of QUiLoader. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also mentioned an important point: If you subclass QUiLoader and reimplement either createAction(), createActionGroup(), createLayout(), or createWidget() -- you must call the original implementation first, within your implementation. Reviewed-by: João Abecasis --- tools/designer/src/uitools/quiloader.cpp | 194 +++++++++++++++++-------------- 1 file changed, 105 insertions(+), 89 deletions(-) diff --git a/tools/designer/src/uitools/quiloader.cpp b/tools/designer/src/uitools/quiloader.cpp index 67bd29c..106e641 100644 --- a/tools/designer/src/uitools/quiloader.cpp +++ b/tools/designer/src/uitools/quiloader.cpp @@ -572,53 +572,52 @@ void QUiLoaderPrivate::setupWidgetMap() const \class QUiLoader \inmodule QtUiTools - \brief The QUiLoader class allows standalone applications dynamically - create user interfaces at run-time using the information stored in - .ui files or specified plugin paths. + \brief enables standalone applications to dynamically create user + interfaces at run-time using the information stored in .ui files or + specified in plugin paths. - In addition, you can customize of creating an user interface by + In addition, you can customize or create your own user interface by deriving your own loader class. - If you have a custom component or an application that embeds Qt - Designer, you can also use the QFormBuilder class provided by the - QtDesigner module to create user interfaces from .ui files. + If you have a custom component or an application that embeds \QD, you can + also use the QFormBuilder class provided by the QtDesigner module to create + user interfaces from \c{.ui} files. - The QUiLoader class provides a collection of functions that allows - you to create widgets based on the information stored in \c .ui - files (created with Qt Designer) or available in the specified - plugin paths. The specified plugin paths can be retrieved using - the pluginPaths() function. You can retrieve the contents of an \c - .ui file using the load() function. For example: + The QUiLoader class provides a collection of functions allowing you to + create widgets based on the information stored in \c .ui files (created + with \QD) or available in the specified plugin paths. The specified plugin + paths can be retrieved using the pluginPaths() function. Similarly, the + contents of a \c{.ui} file can be retrieved using the load() function. For + example: \snippet doc/src/snippets/quiloader/mywidget.cpp 0 - By including the user interface in the form's resources (\c myform.qrc), - we ensure that it will be present at run-time: + By including the user interface in the form's resources (\c myform.qrc), we + ensure that it will be present at run-time: \quotefile doc/src/snippets/quiloader/mywidget.qrc - The availableWidgets() function returns a QStringList with the - class names of the widgets available in the specified plugin - paths. You can create any of these widgets using the - createWidget() function. For example: + The availableWidgets() function returns a QStringList with the class names + of the widgets available in the specified plugin paths. To create these + widgets, simply use the createWidget() function. For example: \snippet doc/src/snippets/quiloader/main.cpp 0 - You can make a custom widget available to the loader using the - addPluginPath() function, and you can remove all the available widgets - by calling the clearPluginPaths() function. + To make a custom widget available to the loader, you can use the + addPluginPath() function; to remove all available widgets, you can call + the clearPluginPaths() function. - The createAction(), createActionGroup(), createLayout() and - createWidget() functions are used internally by the QUiLoader class - whenever it has to create an action, action group, layout or - widget respectively. For that reason, you can subclass the QUiLoader - class and reimplement these functions to intervene the process of - constructing an user interface. For example, you might want to - create a list of the actions created when loading a form or - creating a custom widget. + The createAction(), createActionGroup(), createLayout(), and createWidget() + functions are used internally by the QUiLoader class whenever it has to + create an action, action group, layout, or widget respectively. For that + reason, you can subclass the QUiLoader class and reimplement these + functions to intervene the process of constructing a user interface. For + example, you might want to have a list of the actions created when loading + a form or creating a custom widget. However, in your reimplementation, you + must call QUiLoader's original implementation of these functions first. - For a complete example using the QUiLoader class, see the \l - {designer/calculatorbuilder}{Calculator Builder} example. + For a complete example using the QUiLoader class, see the + \l{Calculator Builder Example}. \sa QtUiTools, QFormBuilder */ @@ -653,8 +652,8 @@ QUiLoader::~QUiLoader() } /*! - Loads a form from the given \a device and creates a new widget with the given - \a parentWidget to hold its contents. + Loads a form from the given \a device and creates a new widget with the + given \a parentWidget to hold its contents. \sa createWidget() */ @@ -668,8 +667,8 @@ QWidget *QUiLoader::load(QIODevice *device, QWidget *parentWidget) } /*! - Returns a list naming the paths the loader searches when locating - custom widget plugins. + Returns a list naming the paths in which the loader will search when + locating custom widget plugins. \sa addPluginPath(), clearPluginPaths() */ @@ -680,7 +679,7 @@ QStringList QUiLoader::pluginPaths() const } /*! - Clears the list of paths the loader searches when locating + Clears the list of paths in which the loader will search when locating plugins. \sa addPluginPath(), pluginPaths() @@ -692,7 +691,7 @@ void QUiLoader::clearPluginPaths() } /*! - Adds the given \a path to the list of paths the loader searches + Adds the given \a path to the list of paths in which the loader will search when locating plugins. \sa pluginPaths(), clearPluginPaths() @@ -704,17 +703,17 @@ void QUiLoader::addPluginPath(const QString &path) } /*! - Creates a new widget with the given \a parent and \a name - using the class specified by \a className. You can use this - function to create any of the widgets returned by the - availableWidgets() function. + Creates a new widget with the given \a parent and \a name using the class + specified by \a className. You can use this function to create any of the + widgets returned by the availableWidgets() function. - The function is also used internally by the QUiLoader class whenever - it has to create a widget. For that reason, you can subclass the - QUiLoader class and reimplement this function to intervene in the - process of constructing a user interface or widget. + The function is also used internally by the QUiLoader class whenever it + creates a widget. Hence, you can subclass QUiLoader and reimplement this + function to intervene process of constructing a user interface or widget. + However, in your implementation, ensure that you call QUiLoader's version + first. - \sa availableWidgets(), load() + \sa availableWidgets(), load() */ QWidget *QUiLoader::createWidget(const QString &className, QWidget *parent, const QString &name) { @@ -723,13 +722,14 @@ QWidget *QUiLoader::createWidget(const QString &className, QWidget *parent, cons } /*! - Creates a new layout with the given \a parent and \a name - using the class specified by \a className. + Creates a new layout with the given \a parent and \a name using the class + specified by \a className. - The function is used internally by the QUiLoader class whenever it - has to create a layout. For that reason, you can subclass the - QUiLoader class and reimplement this function to intervene the - process of constructing an user interface or widget. + The function is also used internally by the QUiLoader class whenever it + creates a widget. Hence, you can subclass QUiLoader and reimplement this + function to intervene process of constructing a user interface or widget. + However, in your implementation, ensure that you call QUiLoader's version + first. \sa createWidget(), load() */ @@ -742,10 +742,11 @@ QLayout *QUiLoader::createLayout(const QString &className, QObject *parent, cons /*! Creates a new action group with the given \a parent and \a name. - The function is used internally by the QUiLoader class whenever it - has to create an action group. For that reason, you can subclass - the QUiLoader class and reimplement this function to intervene the - process of constructing an user interface or widget. + The function is also used internally by the QUiLoader class whenever it + creates a widget. Hence, you can subclass QUiLoader and reimplement this + function to intervene process of constructing a user interface or widget. + However, in your implementation, ensure that you call QUiLoader's version + first. \sa createAction(), createWidget(), load() */ @@ -758,10 +759,11 @@ QActionGroup *QUiLoader::createActionGroup(QObject *parent, const QString &name) /*! Creates a new action with the given \a parent and \a name. - The function is used internally by the QUiLoader class whenever it - has to create an action. For that reason, you can subclass the - QUiLoader class and reimplement this function to intervene the - process of constructing an user interface or widget. + The function is also used internally by the QUiLoader class whenever it + creates a widget. Hence, you can subclass QUiLoader and reimplement this + function to intervene process of constructing a user interface or widget. + However, in your implementation, ensure that you call QUiLoader's version + first. \sa createActionGroup(), createWidget(), load() */ @@ -772,9 +774,9 @@ QAction *QUiLoader::createAction(QObject *parent, const QString &name) } /*! - Returns a list naming the available widgets that can be built - using the createWidget() function, i.e all the widgets specified - within the given plugin paths. + Returns a list naming all available widgets that can be built using the + createWidget() function, i.e all the widgets specified within the given + plugin paths. \sa pluginPaths(), createWidget() @@ -795,11 +797,11 @@ QStringList QUiLoader::availableWidgets() const /*! - Returns a list naming the available layouts that can be built - using the createLayout() function + \since 4.5 + Returns a list naming all available layouts that can be built using the + createLayout() function \sa createLayout() - \since 4.5 */ QStringList QUiLoader::availableLayouts() const @@ -816,9 +818,9 @@ QStringList QUiLoader::availableLayouts() const } /*! - Sets the working directory of the loader to \a dir. The loader - looks for other resources, such as icons and resource files, - in paths relative to this directory. + Sets the working directory of the loader to \a dir. The loader will look + for other resources, such as icons and resource files, in paths relative to + this directory. \sa workingDirectory() */ @@ -842,9 +844,13 @@ QDir QUiLoader::workingDirectory() const } /*! - Sets whether the execution of scripts is enabled to \a enabled. - \since 4.3 \internal + \since 4.3 + + If \a enabled is true, the loader will be able to execute scripts. + Otherwise, execution of scripts will be disabled. + + \sa isScriptingEnabled() */ void QUiLoader::setScriptingEnabled(bool enabled) @@ -854,10 +860,12 @@ void QUiLoader::setScriptingEnabled(bool enabled) } /*! - Returns whether the execution of scripts is enabled. - \sa setScriptingEnabled() - \since 4.3 - \internal + \internal + \since 4.3 + + Returns true if execution of scripts is enabled; returns false otherwise. + + \sa setScriptingEnabled() */ bool QUiLoader::isScriptingEnabled() const @@ -867,11 +875,13 @@ bool QUiLoader::isScriptingEnabled() const } /*! - Sets whether user interfaces loaded by this loader automatically - retranslate themselves upon receiving a language change event or not, - depending on \a enabled. - \since 4.5 + + If \a enabled is true, user interfaces loaded by this loader will + automatically retranslate themselves upon receiving a language change + event. Otherwise, the user interfaces will not be retranslated. + + \sa isLanguageChangeEnabled() */ void QUiLoader::setLanguageChangeEnabled(bool enabled) @@ -881,9 +891,12 @@ void QUiLoader::setLanguageChangeEnabled(bool enabled) } /*! - Returns whether dynamic retranslation on language change is enabled. - \sa setLanguageChangeEnabled() - \since 4.5 + \since 4.5 + + Returns true if dynamic retranslation on language change is enabled; + returns false otherwise. + + \sa setLanguageChangeEnabled() */ bool QUiLoader::isLanguageChangeEnabled() const @@ -894,11 +907,14 @@ bool QUiLoader::isLanguageChangeEnabled() const /*! \internal + \since 4.5 + + If \a enabled is true, user interfaces loaded by this loader will be + translated. Otherwise, the user interfaces will not be translated. - Sets whether user interfaces loaded by this loader are translated - at all. Note that this is orthogonal to languageChangeEnabled. + \note This is orthogonal to languageChangeEnabled. - \since 4.5 + \sa isLanguageChangeEnabled(), setLanguageChangeEnabled() */ void QUiLoader::setTranslationEnabled(bool enabled) @@ -909,11 +925,11 @@ void QUiLoader::setTranslationEnabled(bool enabled) /*! \internal + \since 4.5 - Returns whether translation is enabled. - \sa setTranslationEnabled() + Returns true if translation is enabled; returns false otherwise. - \since 4.5 + \sa setTranslationEnabled() */ bool QUiLoader::isTranslationEnabled() const -- cgit v0.12 From 7f5e15034a324ecd7df082e012403ad99c5b5476 Mon Sep 17 00:00:00 2001 From: Kavindra Devi Palaraja Date: Tue, 12 May 2009 18:25:30 +0200 Subject: Doc - removing trailing whitespaces --- tools/designer/src/uitools/quiloader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/designer/src/uitools/quiloader.cpp b/tools/designer/src/uitools/quiloader.cpp index 106e641..548f07e 100644 --- a/tools/designer/src/uitools/quiloader.cpp +++ b/tools/designer/src/uitools/quiloader.cpp @@ -862,7 +862,7 @@ void QUiLoader::setScriptingEnabled(bool enabled) /*! \internal \since 4.3 - + Returns true if execution of scripts is enabled; returns false otherwise. \sa setScriptingEnabled() @@ -908,7 +908,7 @@ bool QUiLoader::isLanguageChangeEnabled() const /*! \internal \since 4.5 - + If \a enabled is true, user interfaces loaded by this loader will be translated. Otherwise, the user interfaces will not be translated. -- cgit v0.12 From d3f8c08548cf7a454d3fd31c3313031d3e0bb223 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Tue, 12 May 2009 16:31:32 -0700 Subject: Fixed wrong function name in warning Reviewed-by: Donald --- src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp index 65fddbf..98e32ed 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp @@ -294,14 +294,14 @@ IDirectFBSurface *QDirectFBScreen::copyToDFBSurface(const QImage &img, IDirectFBSurface *dfbSurface = createDFBSurface(image.size(), pixmapFormat, options); if (!dfbSurface) { - qWarning("QDirectFBPixmapData::fromImage() Couldn't create surface"); + qWarning("QDirectFBScreen::copyToDFBSurface() Couldn't create surface"); return 0; } #ifndef QT_NO_DIRECTFB_PREALLOCATED IDirectFBSurface *imgSurface = createDFBSurface(image, DontTrackSurface); if (!imgSurface) { - qWarning("QDirectFBPixmapData::fromImage()"); + qWarning("QDirectFBScreen::copyToDFBSurface()"); QDirectFBScreen::releaseDFBSurface(dfbSurface); return 0; } @@ -316,7 +316,7 @@ IDirectFBSurface *QDirectFBScreen::copyToDFBSurface(const QImage &img, dfbSurface->SetBlittingFlags(dfbSurface, flags); DFBResult result = dfbSurface->Blit(dfbSurface, imgSurface, 0, 0, 0); if (result != DFB_OK) - DirectFBError("QDirectFBPixmapData::fromImage()", result); + DirectFBError("QDirectFBScreen::copyToDFBSurface()", result); dfbSurface->ReleaseSource(dfbSurface); imgSurface->Release(imgSurface); #else // QT_NO_DIRECTFB_PREALLOCATED -- cgit v0.12 From dcf1867f5715991e233120122f6252b18ccd26e3 Mon Sep 17 00:00:00 2001 From: Bill King Date: Wed, 13 May 2009 14:06:47 +1000 Subject: Fixes a segfault from out of order cleanup of mysql resources. If a QSqlQuery survived the lifetime of removal of a mysql db connection (that failed), the cleanup code would cause a segfault because it was using an out of date pointer that was pointing at memory that'd been freed by the removeDatabase() call. Revby: Justin McPherson Task-number: 205701 --- src/sql/drivers/mysql/qsql_mysql.cpp | 123 +++++++++++++++++++-------------- tests/auto/qsqlquery/tst_qsqlquery.cpp | 22 +++++- 2 files changed, 93 insertions(+), 52 deletions(-) diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp index 1f54db7..fbefa0c 100644 --- a/src/sql/drivers/mysql/qsql_mysql.cpp +++ b/src/sql/drivers/mysql/qsql_mysql.cpp @@ -163,18 +163,21 @@ static inline QVariant qDateTimeFromString(QString &val) #endif } -class QMYSQLResultPrivate +class QMYSQLResultPrivate : public QObject { + Q_OBJECT public: - QMYSQLResultPrivate(QMYSQLDriverPrivate* dp) : d(dp), result(0), + QMYSQLResultPrivate(const QMYSQLDriver* dp) : driver(dp), result(0), rowsAffected(0), hasBlobs(false) #if MYSQL_VERSION_ID >= 40108 , stmt(0), meta(0), inBinds(0), outBinds(0) #endif , precisionPolicy(QSql::HighPrecision) - {} + { + connect(dp, SIGNAL(destroyed()), this, SLOT(driverDestroyed())); + } - QMYSQLDriverPrivate* d; + const QMYSQLDriver* driver; MYSQL_RES *result; MYSQL_ROW row; @@ -207,6 +210,8 @@ public: MYSQL_BIND *outBinds; #endif QSql::NumericalPrecisionPolicy precisionPolicy; +private Q_SLOTS: + void driverDestroyed() { driver = NULL; } }; #ifndef QT_NO_TEXTCODEC @@ -379,7 +384,7 @@ bool QMYSQLResultPrivate::bindInValues() QMYSQLResult::QMYSQLResult(const QMYSQLDriver* db) : QSqlResult(db) { - d = new QMYSQLResultPrivate(db->d); + d = new QMYSQLResultPrivate(db); } QMYSQLResult::~QMYSQLResult() @@ -391,7 +396,7 @@ QMYSQLResult::~QMYSQLResult() QVariant QMYSQLResult::handle() const { #if MYSQL_VERSION_ID >= 40108 - if(d->d->preparedQuerys) + if(d->driver && d->driver->d->preparedQuerys) return d->meta ? qVariantFromValue(d->meta) : qVariantFromValue(d->stmt); else #endif @@ -406,8 +411,8 @@ void QMYSQLResult::cleanup() // must iterate trough leftover result sets from multi-selects or stored procedures // if this isn't done subsequent queries will fail with "Commands out of sync" #if MYSQL_VERSION_ID >= 40100 - while (d->d->mysql && mysql_next_result(d->d->mysql) == 0) { - MYSQL_RES *res = mysql_store_result(d->d->mysql); + while (d->driver && d->driver->d->mysql && mysql_next_result(d->driver->d->mysql) == 0) { + MYSQL_RES *res = mysql_store_result(d->driver->d->mysql); if (res) mysql_free_result(res); } @@ -447,11 +452,14 @@ void QMYSQLResult::cleanup() setAt(-1); setActive(false); - d->d->preparedQuerys = d->d->preparedQuerysEnabled; + if(d->driver) + d->driver->d->preparedQuerys = d->driver->d->preparedQuerysEnabled; } bool QMYSQLResult::fetch(int i) { + if(!d->driver) + return false; if (isForwardOnly()) { // fake a forward seek if (at() < i) { int x = i - at(); @@ -463,7 +471,7 @@ bool QMYSQLResult::fetch(int i) } if (at() == i) return true; - if (d->d->preparedQuerys) { + if (d->driver->d->preparedQuerys) { #if MYSQL_VERSION_ID >= 40108 mysql_stmt_data_seek(d->stmt, i); @@ -494,7 +502,9 @@ bool QMYSQLResult::fetch(int i) bool QMYSQLResult::fetchNext() { - if (d->d->preparedQuerys) { + if(!d->driver) + return false; + if (d->driver->d->preparedQuerys) { #if MYSQL_VERSION_ID >= 40108 if (mysql_stmt_fetch(d->stmt)) return false; @@ -512,6 +522,8 @@ bool QMYSQLResult::fetchNext() bool QMYSQLResult::fetchLast() { + if(!d->driver) + return false; if (isForwardOnly()) { // fake this since MySQL can't seek on forward only queries bool success = fetchNext(); // did we move at all? while (fetchNext()) {}; @@ -519,7 +531,7 @@ bool QMYSQLResult::fetchLast() } my_ulonglong numRows; - if (d->d->preparedQuerys) { + if (d->driver->d->preparedQuerys) { #if MYSQL_VERSION_ID >= 40108 numRows = mysql_stmt_num_rows(d->stmt); #else @@ -553,15 +565,18 @@ QVariant QMYSQLResult::data(int field) return QVariant(); } + if (!d->driver) + return QVariant(); + int fieldLength = 0; const QMYSQLResultPrivate::QMyField &f = d->fields.at(field); QString val; - if (d->d->preparedQuerys) { + if (d->driver->d->preparedQuerys) { if (f.nullIndicator) return QVariant(f.type); if (f.type != QVariant::ByteArray) - val = toUnicode(d->d->tc, f.outField, f.bufLength); + val = toUnicode(d->driver->d->tc, f.outField, f.bufLength); } else { if (d->row[field] == NULL) { // NULL value @@ -569,7 +584,7 @@ QVariant QMYSQLResult::data(int field) } fieldLength = mysql_fetch_lengths(d->result)[field]; if (f.type != QVariant::ByteArray) - val = toUnicode(d->d->tc, d->row[field], fieldLength); + val = toUnicode(d->driver->d->tc, d->row[field], fieldLength); } switch(f.type) { @@ -614,7 +629,7 @@ QVariant QMYSQLResult::data(int field) case QVariant::ByteArray: { QByteArray ba; - if (d->d->preparedQuerys) { + if (d->driver->d->preparedQuerys) { ba = QByteArray(f.outField, f.bufLength); } else { ba = QByteArray(d->row[field], fieldLength); @@ -631,7 +646,7 @@ QVariant QMYSQLResult::data(int field) bool QMYSQLResult::isNull(int field) { - if (d->d->preparedQuerys) + if (d->driver->d->preparedQuerys) return d->fields.at(field).nullIndicator; else return d->row[field] == NULL; @@ -639,31 +654,31 @@ bool QMYSQLResult::isNull(int field) bool QMYSQLResult::reset (const QString& query) { - if (!driver() || !driver()->isOpen() || driver()->isOpenError()) + if (!driver() || !driver()->isOpen() || driver()->isOpenError() || !d->driver) return false; - if(d->d->preparedQuerysEnabled && prepare(query)) { - d->d->preparedQuerys = true; + if(d->driver->d->preparedQuerysEnabled && prepare(query)) { + d->driver->d->preparedQuerys = true; return exec(); } - d->d->preparedQuerys = false; + d->driver->d->preparedQuerys = false; - const QByteArray encQuery(fromUnicode(d->d->tc, query)); - if (mysql_real_query(d->d->mysql, encQuery.data(), encQuery.length())) { + const QByteArray encQuery(fromUnicode(d->driver->d->tc, query)); + if (mysql_real_query(d->driver->d->mysql, encQuery.data(), encQuery.length())) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to execute query"), - QSqlError::StatementError, d->d)); + QSqlError::StatementError, d->driver->d)); return false; } - d->result = mysql_store_result(d->d->mysql); - if (!d->result && mysql_field_count(d->d->mysql) > 0) { + d->result = mysql_store_result(d->driver->d->mysql); + if (!d->result && mysql_field_count(d->driver->d->mysql) > 0) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to store result"), - QSqlError::StatementError, d->d)); + QSqlError::StatementError, d->driver->d)); return false; } - int numFields = mysql_field_count(d->d->mysql); + int numFields = mysql_field_count(d->driver->d->mysql); setSelect(numFields != 0); d->fields.resize(numFields); - d->rowsAffected = mysql_affected_rows(d->d->mysql); + d->rowsAffected = mysql_affected_rows(d->driver->d->mysql); if (isSelect()) { for(int i = 0; i < numFields; i++) { MYSQL_FIELD* field = mysql_fetch_field_direct(d->result, i); @@ -677,8 +692,8 @@ bool QMYSQLResult::reset (const QString& query) int QMYSQLResult::size() { - if (isSelect()) - if (d->d->preparedQuerys) + if (d->driver && isSelect()) + if (d->driver->d->preparedQuerys) #if MYSQL_VERSION_ID >= 40108 return mysql_stmt_num_rows(d->stmt); #else @@ -697,17 +712,17 @@ int QMYSQLResult::numRowsAffected() QVariant QMYSQLResult::lastInsertId() const { - if (!isActive()) + if (!isActive() || !d->driver) return QVariant(); - if (d->d->preparedQuerys) { + if (d->driver->d->preparedQuerys) { #if MYSQL_VERSION_ID >= 40108 quint64 id = mysql_stmt_insert_id(d->stmt); if (id) return QVariant(id); #endif } else { - quint64 id = mysql_insert_id(d->d->mysql); + quint64 id = mysql_insert_id(d->driver->d->mysql); if (id) return QVariant(id); } @@ -718,20 +733,20 @@ QSqlRecord QMYSQLResult::record() const { QSqlRecord info; MYSQL_RES *res; - if (!isActive() || !isSelect()) + if (!isActive() || !isSelect() || !d->driver) return info; #if MYSQL_VERSION_ID >= 40108 - res = d->d->preparedQuerys ? d->meta : d->result; + res = d->driver->d->preparedQuerys ? d->meta : d->result; #else res = d->result; #endif - if (!mysql_errno(d->d->mysql)) { + if (!mysql_errno(d->driver->d->mysql)) { mysql_field_seek(res, 0); MYSQL_FIELD* field = mysql_fetch_field(res); while(field) { - info.append(qToField(field, d->d->tc)); + info.append(qToField(field, d->driver->d->tc)); field = mysql_fetch_field(res); } } @@ -741,6 +756,8 @@ QSqlRecord QMYSQLResult::record() const bool QMYSQLResult::nextResult() { + if(!d->driver) + return false; #if MYSQL_VERSION_ID >= 40100 setAt(-1); setActive(false); @@ -754,26 +771,26 @@ bool QMYSQLResult::nextResult() delete[] d->fields[i].outField; d->fields.clear(); - int status = mysql_next_result(d->d->mysql); + int status = mysql_next_result(d->driver->d->mysql); if (status > 0) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to execute next query"), - QSqlError::StatementError, d->d)); + QSqlError::StatementError, d->driver->d)); return false; } else if (status == -1) { return false; // No more result sets } - d->result = mysql_store_result(d->d->mysql); - int numFields = mysql_field_count(d->d->mysql); + d->result = mysql_store_result(d->driver->d->mysql); + int numFields = mysql_field_count(d->driver->d->mysql); if (!d->result && numFields > 0) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to store next result"), - QSqlError::StatementError, d->d)); + QSqlError::StatementError, d->driver->d)); return false; } setSelect(numFields > 0); d->fields.resize(numFields); - d->rowsAffected = mysql_affected_rows(d->d->mysql); + d->rowsAffected = mysql_affected_rows(d->driver->d->mysql); if (isSelect()) { for (int i = 0; i < numFields; i++) { @@ -833,9 +850,11 @@ static MYSQL_TIME *toMySqlDate(QDate date, QTime time, QVariant::Type type) bool QMYSQLResult::prepare(const QString& query) { + if(!d->driver) + return false; #if MYSQL_VERSION_ID >= 40108 cleanup(); - if (!d->d->preparedQuerys) + if (!d->driver->d->preparedQuerys) return QSqlResult::prepare(query); int r; @@ -844,14 +863,14 @@ bool QMYSQLResult::prepare(const QString& query) return false; if (!d->stmt) - d->stmt = mysql_stmt_init(d->d->mysql); + d->stmt = mysql_stmt_init(d->driver->d->mysql); if (!d->stmt) { setLastError(qMakeError(QCoreApplication::translate("QMYSQLResult", "Unable to prepare statement"), - QSqlError::StatementError, d->d)); + QSqlError::StatementError, d->driver->d)); return false; } - const QByteArray encQuery(fromUnicode(d->d->tc, query)); + const QByteArray encQuery(fromUnicode(d->driver->d->tc, query)); r = mysql_stmt_prepare(d->stmt, encQuery.constData(), encQuery.length()); if (r != 0) { setLastError(qMakeStmtError(QCoreApplication::translate("QMYSQLResult", @@ -873,7 +892,9 @@ bool QMYSQLResult::prepare(const QString& query) bool QMYSQLResult::exec() { - if (!d->d->preparedQuerys) + if (!d->driver) + return false; + if (!d->driver->d->preparedQuerys) return QSqlResult::exec(); if (!d->stmt) return false; @@ -963,7 +984,7 @@ bool QMYSQLResult::exec() break; case QVariant::String: default: { - QByteArray ba = fromUnicode(d->d->tc, val.toString()); + QByteArray ba = fromUnicode(d->driver->d->tc, val.toString()); stringVector.append(ba); currBind->buffer_type = MYSQL_TYPE_STRING; currBind->buffer = const_cast(ba.constData()); @@ -1459,3 +1480,5 @@ bool QMYSQLDriver::isIdentifierEscapedImplementation(const QString &identifier, } QT_END_NAMESPACE + +#include "qsql_mysql.moc" \ No newline at end of file diff --git a/tests/auto/qsqlquery/tst_qsqlquery.cpp b/tests/auto/qsqlquery/tst_qsqlquery.cpp index 074f16f..7f97972 100644 --- a/tests/auto/qsqlquery/tst_qsqlquery.cpp +++ b/tests/auto/qsqlquery/tst_qsqlquery.cpp @@ -178,9 +178,11 @@ private slots: void task_217003_data() { generic_data(); } void task_217003(); #endif - void task_250026_data() { generic_data("QODBC"); } void task_250026(); + void task_205701_data() { generic_data("QMYSQL"); } + void task_205701(); + private: @@ -297,7 +299,7 @@ void tst_QSqlQuery::dropTestTables( QSqlDatabase db ) #ifdef NOT_READY_YET tablenames << qTableName( "Planet" ); #endif - tablenames << qTableName( "task_250026" ); + tablenames << qTableName( "task_250026" ); tst_Databases::safeDropTables( db, tablenames ); } @@ -2711,5 +2713,21 @@ void tst_QSqlQuery::task_250026() QCOMPARE( q.value( 0 ).toString().length(), data1026.length() ); } +void tst_QSqlQuery::task_205701() +{ + QSqlDatabase qsdb = QSqlDatabase::addDatabase("QMYSQL", "atest"); + qsdb.setHostName("test"); + qsdb.setDatabaseName("test"); + qsdb.setUserName("test"); + qsdb.setPassword("test"); + qsdb.open(); + +// { + QSqlQuery query(qsdb); +// } + QSqlDatabase::removeDatabase("atest"); +} + + QTEST_MAIN( tst_QSqlQuery ) #include "tst_qsqlquery.moc" -- cgit v0.12 From 03415f5db33ee1d8af15b924f84b547a9ed8020b Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Fri, 8 May 2009 09:09:32 +0200 Subject: fix WinCE build Reviewed-by: thartman --- src/gui/widgets/qmenu_wince.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/widgets/qmenu_wince.cpp b/src/gui/widgets/qmenu_wince.cpp index 847a623..fbe54fe 100644 --- a/src/gui/widgets/qmenu_wince.cpp +++ b/src/gui/widgets/qmenu_wince.cpp @@ -214,10 +214,12 @@ static HWND qt_wce_create_menubar(HWND parentHandle, HINSTANCE resourceHandle, i mbi.nToolBarId = toolbarID; if (ptrCreateMenuBar(&mbi)) { +#ifdef Q_WS_WINCE_WM // Tell the menu bar that we want to override hot key behaviour. LPARAM lparam = MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY); SendMessage(mbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TBACK, lparam); +#endif return mbi.hwndMB; } } -- cgit v0.12 From 55829ebc5664a65fcef158e7ccd3579aaffa8d20 Mon Sep 17 00:00:00 2001 From: Leonardo Sobral Cunha Date: Mon, 11 May 2009 17:37:37 +0200 Subject: Reset the 'connectedToScene' flag when changing the scene of a view In QGraphicsScene::_q_emitUpdated() the slot QGrpahicsView::updateScene(QList) gets connected and a boolean (connectedToScene) is set to prevent double connections. The problem is that this boolean was not reset when the view gets a new scene. Task-number: 253415 Reviewed-by: andreas --- src/gui/graphicsview/qgraphicsview.cpp | 1 + tests/auto/qgraphicsview/tst_qgraphicsview.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp index 05e4907..8b133f3 100644 --- a/src/gui/graphicsview/qgraphicsview.cpp +++ b/src/gui/graphicsview/qgraphicsview.cpp @@ -1681,6 +1681,7 @@ void QGraphicsView::setScene(QGraphicsScene *scene) disconnect(d->scene, SIGNAL(sceneRectChanged(QRectF)), this, SLOT(updateSceneRect(QRectF))); d->scene->d_func()->views.removeAll(this); + d->connectedToScene = false; } // Assign the new scene and update the contents (scrollbars, etc.)). diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp index b5af115..db1e4c3 100644 --- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp @@ -200,6 +200,7 @@ private slots: void task239729_noViewUpdate(); void task239047_fitInViewSmallViewport(); void task245469_itemsAtPointWithClip(); + void task253415_reconnectUpdateSceneOnSceneChanged(); }; void tst_QGraphicsView::initTestCase() @@ -3044,5 +3045,28 @@ void tst_QGraphicsView::centerOnDirtyItem() QCOMPARE(before, after); } +void tst_QGraphicsView::task253415_reconnectUpdateSceneOnSceneChanged() +{ + QGraphicsView view; + QGraphicsView dummyView; + view.setWindowFlags(view.windowFlags() | Qt::WindowStaysOnTopHint); + view.resize(200, 200); + + QGraphicsScene scene1; + QObject::connect(&scene1, SIGNAL(changed(QList)), &dummyView, SLOT(updateScene(QList))); + view.setScene(&scene1); + + QTest::qWait(125); + + QGraphicsScene scene2; + QObject::connect(&scene2, SIGNAL(changed(QList)), &dummyView, SLOT(updateScene(QList))); + view.setScene(&scene2); + + QTest::qWait(125); + + bool wasConnected2 = QObject::disconnect(&scene2, SIGNAL(changed(QList)), &view, 0); + QVERIFY(wasConnected2); +} + QTEST_MAIN(tst_QGraphicsView) #include "tst_qgraphicsview.moc" -- cgit v0.12 From 589dfd480d6158aaa59ab56c8be6a6bfc41da3ef Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Wed, 13 May 2009 12:59:07 +0200 Subject: qdoc: Fixed some qdoc errors. --- doc/src/examples/fancybrowser.qdoc | 14 +++++++------- src/corelib/tools/qhash.cpp | 6 +++--- tools/designer/src/uitools/quiloader.cpp | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/src/examples/fancybrowser.qdoc b/doc/src/examples/fancybrowser.qdoc index ea4da71..631aff9 100644 --- a/doc/src/examples/fancybrowser.qdoc +++ b/doc/src/examples/fancybrowser.qdoc @@ -123,7 +123,7 @@ The first jQuery-based function, \c highlightAllLinks(), is designed to highlight all links in the current webpage. The JavaScript code looks - for web elements named \i {a}, which is the tag for a hyperlink. + for web elements named \e {a}, which is the tag for a hyperlink. For each such element, the background color is set to be yellow by using CSS. @@ -131,18 +131,18 @@ The \c rotateImages() function rotates the images on the current web page. Webkit supports CSS transforms and this JavaScript code - looks up all \i {img} elements and rotates the images 180 degrees + looks up all \e {img} elements and rotates the images 180 degrees and then back again. \snippet examples/webkit/fancybrowser/mainwindow.cpp 9 The remaining four methods remove different elements from the current web page. \c removeGifImages() removes all Gif images on the page by looking up - the \i {src} attribute of all the elements on the web page. Any element with - a \i {gif} file as its source is removed. \c removeInlineFrames() removes all - \i {iframe} or inline elements. \c removeObjectElements() removes all - \i {object} elements, and \c removeEmbeddedElements() removes any elements - such as plugins embedded on the page using the \i {embed} tag. + the \e {src} attribute of all the elements on the web page. Any element with + a \e {gif} file as its source is removed. \c removeInlineFrames() removes all + \e {iframe} or inline elements. \c removeObjectElements() removes all + \e {object} elements, and \c removeEmbeddedElements() removes any elements + such as plugins embedded on the page using the \e {embed} tag. */ diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index b2512e1..6c4a3ba 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -379,8 +379,7 @@ void QHashData::checkSanity() #endif /*! - \fn uint qHash(const QPair &key) - \relates QHash + \ \since 4.3 Returns the hash value for the \a key. @@ -502,7 +501,8 @@ void QHashData::checkSanity() key. With QHash, the items are arbitrarily ordered. \i The key type of a QMap must provide operator<(). The key type of a QHash must provide operator==() and a global - \l{qHash()} {hash} function. + hash function called qHash() (see the related non-member + functions). \endlist Here's an example QHash with QString keys and \c int values: diff --git a/tools/designer/src/uitools/quiloader.cpp b/tools/designer/src/uitools/quiloader.cpp index 548f07e..2a66095 100644 --- a/tools/designer/src/uitools/quiloader.cpp +++ b/tools/designer/src/uitools/quiloader.cpp @@ -572,9 +572,9 @@ void QUiLoaderPrivate::setupWidgetMap() const \class QUiLoader \inmodule QtUiTools - \brief enables standalone applications to dynamically create user - interfaces at run-time using the information stored in .ui files or - specified in plugin paths. + \brief The QUiLoader class enables standalone applications to + dynamically create user interfaces at run-time using the + information stored in .ui files or specified in plugin paths. In addition, you can customize or create your own user interface by deriving your own loader class. -- cgit v0.12 From ad7b21dd57d20cd55774d7a62db117905637e950 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Wed, 13 May 2009 13:44:03 +0200 Subject: qdoc: Fixed some qdoc errors. --- src/corelib/tools/qhash.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index 6c4a3ba..2313e0e 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -379,9 +379,10 @@ void QHashData::checkSanity() #endif /*! - \ + \fn uint qHash(const QPair &key) \since 4.3 - + \relates QHash + Returns the hash value for the \a key. Types \c T1 and \c T2 must be supported by qHash(). -- cgit v0.12 From 4910404284b1bb4fdde89d4fd8a420767ee52069 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Wed, 13 May 2009 13:48:13 +0200 Subject: Clearifying docs QSet::insert Chaning the sentence to clearify where the iterator points to. Task-number: 202656 Rev-by: Geir Vattekar --- doc/src/qset.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/qset.qdoc b/doc/src/qset.qdoc index 7fbf97a..afbedc3 100644 --- a/doc/src/qset.qdoc +++ b/doc/src/qset.qdoc @@ -437,7 +437,7 @@ \fn QSet::const_iterator QSet::insert(const T &value) Inserts item \a value into the set, if \a value isn't already - in the set, and returns an iterator positioned at the inserted + in the set, and returns an iterator pointing at the inserted item. \sa operator<<(), remove(), contains() -- cgit v0.12 From 87022c9a4ab00a9faaf6bcdaa8d5884962ccf305 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 13 May 2009 12:25:36 +0200 Subject: Fix handling of garbage data sent by the HTTP server instead of a proper HTTP reply. If the server's reply doesn't start with "HTTP/", then the reply is not valid. This could happen if we connected via HTTP to an HTTPS server. It could also happen with an Icecast server (reply ICY/x.y). Task-number: 248838 Reviewed-by: Markus Goetz --- src/network/access/qhttpnetworkconnection.cpp | 14 +++++++-- src/network/access/qhttpnetworkreply.cpp | 11 ++++++- tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 42 ++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 5940fba..f558f2b 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -529,10 +529,20 @@ void QHttpNetworkConnectionPrivate::receiveReply(QAbstractSocket *socket, QHttpN QHttpNetworkReplyPrivate::ReplyState state = reply ? reply->d_func()->state : QHttpNetworkReplyPrivate::AllDoneState; switch (state) { case QHttpNetworkReplyPrivate::NothingDoneState: - case QHttpNetworkReplyPrivate::ReadingStatusState: - bytes += reply->d_func()->readStatus(socket); + case QHttpNetworkReplyPrivate::ReadingStatusState: { + qint64 statusBytes = reply->d_func()->readStatus(socket); + if (statusBytes == -1) { + // error reading the status, close the socket and emit error + socket->close(); + reply->d_func()->errorString = errorDetail(QNetworkReply::ProtocolFailure, socket); + emit reply->finishedWithError(QNetworkReply::ProtocolFailure, reply->d_func()->errorString); + QMetaObject::invokeMethod(q, "_q_startNextRequest", Qt::QueuedConnection); + break; + } + bytes += statusBytes; channels[i].lastStatus = reply->d_func()->statusCode; break; + } case QHttpNetworkReplyPrivate::ReadingHeaderState: bytes += reply->d_func()->readHeader(socket); if (reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingDataState) { diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp index fe3f6af..1b41e1e 100644 --- a/src/network/access/qhttpnetworkreply.cpp +++ b/src/network/access/qhttpnetworkreply.cpp @@ -409,6 +409,9 @@ qint64 QHttpNetworkReplyPrivate::readStatus(QAbstractSocket *socket) if (fragment.endsWith('\r')) { fragment.truncate(fragment.length()-1); } + if (!fragment.startsWith("HTTP/")) + return -1; + parseStatus(fragment); state = ReadingHeaderState; fragment.clear(); // next fragment @@ -418,7 +421,13 @@ qint64 QHttpNetworkReplyPrivate::readStatus(QAbstractSocket *socket) bytes += socket->read(&c, 1); fragment.append(c); } + + // is this a valid reply? + if (fragment.length() >= 5 && !fragment.startsWith("HTTP/")) + return -1; + } + return bytes; } @@ -660,4 +669,4 @@ void QHttpNetworkReply::ignoreSslErrors() QT_END_NAMESPACE -#endif // QT_NO_HTTP \ No newline at end of file +#endif // QT_NO_HTTP diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index 104b788..c97fcf3 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -172,6 +172,8 @@ private Q_SLOTS: void ioGetFromHttpsWithIgnoreSslErrors(); void ioGetFromHttpsWithSslHandshakeError(); #endif + void ioGetFromHttpBrokenServer_data(); + void ioGetFromHttpBrokenServer(); void ioGetWithManyProxies_data(); void ioGetWithManyProxies(); @@ -1887,6 +1889,46 @@ void tst_QNetworkReply::ioGetFromHttpsWithSslHandshakeError() } #endif +void tst_QNetworkReply::ioGetFromHttpBrokenServer_data() +{ + QTest::addColumn("dataToSend"); + QTest::addColumn("doDisconnect"); + + QTest::newRow("no-newline") << QByteArray("Hello World") << false; + QTest::newRow("just-newline") << QByteArray("\r\n") << false; + QTest::newRow("just-2newline") << QByteArray("\r\n\r\n") << false; + QTest::newRow("with-newlines") << QByteArray("Long first line\r\nLong second line") << false; + QTest::newRow("with-newlines2") << QByteArray("\r\nSecond line") << false; + QTest::newRow("with-newlines3") << QByteArray("ICY\r\nSecond line") << false; + + QTest::newRow("empty+disconnect") << QByteArray() << true; + + QTest::newRow("no-newline+disconnect") << QByteArray("Hello World") << true; + QTest::newRow("just-newline+disconnect") << QByteArray("\r\n") << true; + QTest::newRow("just-2newline+disconnect") << QByteArray("\r\n\r\n") << true; + QTest::newRow("with-newlines+disconnect") << QByteArray("Long first line\r\nLong second line") << true; + QTest::newRow("with-newlines2+disconnect") << QByteArray("\r\nSecond line") << true; + QTest::newRow("with-newlines3+disconnect") << QByteArray("ICY\r\nSecond line") << true; +} + +void tst_QNetworkReply::ioGetFromHttpBrokenServer() +{ + QFETCH(QByteArray, dataToSend); + QFETCH(bool, doDisconnect); + MiniHttpServer server(dataToSend); + server.doClose = doDisconnect; + + QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort()))); + QNetworkReplyPtr reply = manager.get(request); + + connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QCOMPARE(reply->url(), request.url()); + QVERIFY(reply->error() != QNetworkReply::NoError); +} + void tst_QNetworkReply::ioGetWithManyProxies_data() { QTest::addColumn >("proxyList"); -- cgit v0.12 From a18ebd2a70e83863bc9a8cc64a65791a6d879f02 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 13 May 2009 13:27:01 +0200 Subject: Improve the HTTP status line parsing and catch more errors. There's no need for using QByteArrayMatcher for one single character, so avoid the overhead. Also validate the message header a bit more: we require the status line to start with "HTTP/n.m " where n and m are positive integers less than 10. Task-number: 248838 Reviewed-by: Markus Goetz --- src/network/access/qhttpnetworkreply.cpp | 58 ++++++++++++++++---------- src/network/access/qhttpnetworkreply_p.h | 2 +- tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 7 ++++ 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp index 1b41e1e..69e0a4c 100644 --- a/src/network/access/qhttpnetworkreply.cpp +++ b/src/network/access/qhttpnetworkreply.cpp @@ -409,12 +409,12 @@ qint64 QHttpNetworkReplyPrivate::readStatus(QAbstractSocket *socket) if (fragment.endsWith('\r')) { fragment.truncate(fragment.length()-1); } - if (!fragment.startsWith("HTTP/")) - return -1; - - parseStatus(fragment); + bool ok = parseStatus(fragment); state = ReadingHeaderState; fragment.clear(); // next fragment + + if (!ok) + return -1; break; } else { c = 0; @@ -431,26 +431,40 @@ qint64 QHttpNetworkReplyPrivate::readStatus(QAbstractSocket *socket) return bytes; } -void QHttpNetworkReplyPrivate::parseStatus(const QByteArray &status) +bool QHttpNetworkReplyPrivate::parseStatus(const QByteArray &status) { - const QByteArrayMatcher sp(" "); - int i = sp.indexIn(status); - const QByteArray version = status.mid(0, i); - int j = sp.indexIn(status, i + 1); + // from RFC 2616: + // Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF + // HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT + // that makes: 'HTTP/n.n xxx Message' + // byte count: 0123456789012 + + static const int minLength = 11; + static const int dotPos = 6; + static const int spacePos = 8; + static const char httpMagic[] = "HTTP/"; + + if (status.length() < minLength + || !status.startsWith(httpMagic) + || status.at(dotPos) != '.' + || status.at(spacePos) != ' ') { + // I don't know how to parse this status line + return false; + } + + // optimize for the valid case: defer checking until the end + majorVersion = status.at(dotPos - 1) - '0'; + minorVersion = status.at(dotPos + 1) - '0'; + + int i = spacePos; + int j = status.indexOf(' ', i + 1); // j == -1 || at(j) == ' ' so j+1 == 0 && j+1 <= length() const QByteArray code = status.mid(i + 1, j - i - 1); - const QByteArray reason = status.mid(j + 1, status.count() - j); - - const QByteArrayMatcher slash("/"); - int k = slash.indexIn(version); - const QByteArrayMatcher dot("."); - int l = dot.indexIn(version, k); - const QByteArray major = version.mid(k + 1, l - k - 1); - const QByteArray minor = version.mid(l + 1, version.count() - l); - - majorVersion = QString::fromAscii(major.constData()).toInt(); - minorVersion = QString::fromAscii(minor.constData()).toInt(); - statusCode = QString::fromAscii(code.constData()).toInt(); - reasonPhrase = QString::fromAscii(reason.constData()); + + bool ok; + statusCode = code.toInt(&ok); + reasonPhrase = QString::fromLatin1(status.constData() + j + 1); + + return ok && uint(majorVersion) <= 9 && uint(minorVersion) <= 9; } qint64 QHttpNetworkReplyPrivate::readHeader(QAbstractSocket *socket) diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h index c17c65c..cb4d34f 100644 --- a/src/network/access/qhttpnetworkreply_p.h +++ b/src/network/access/qhttpnetworkreply_p.h @@ -154,7 +154,7 @@ public: QHttpNetworkReplyPrivate(const QUrl &newUrl = QUrl()); ~QHttpNetworkReplyPrivate(); qint64 readStatus(QAbstractSocket *socket); - void parseStatus(const QByteArray &status); + bool parseStatus(const QByteArray &status); qint64 readHeader(QAbstractSocket *socket); void parseHeader(const QByteArray &header); qint64 readBody(QAbstractSocket *socket, QIODevice *out); diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index c97fcf3..4be0863 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -1900,6 +1900,9 @@ void tst_QNetworkReply::ioGetFromHttpBrokenServer_data() QTest::newRow("with-newlines") << QByteArray("Long first line\r\nLong second line") << false; QTest::newRow("with-newlines2") << QByteArray("\r\nSecond line") << false; QTest::newRow("with-newlines3") << QByteArray("ICY\r\nSecond line") << false; + QTest::newRow("invalid-version") << QByteArray("HTTP/123 200 \r\n") << false; + QTest::newRow("invalid-version2") << QByteArray("HTTP/a.\033 200 \r\n") << false; + QTest::newRow("invalid-reply-code") << QByteArray("HTTP/1.0 fuu \r\n") << false; QTest::newRow("empty+disconnect") << QByteArray() << true; @@ -1909,6 +1912,10 @@ void tst_QNetworkReply::ioGetFromHttpBrokenServer_data() QTest::newRow("with-newlines+disconnect") << QByteArray("Long first line\r\nLong second line") << true; QTest::newRow("with-newlines2+disconnect") << QByteArray("\r\nSecond line") << true; QTest::newRow("with-newlines3+disconnect") << QByteArray("ICY\r\nSecond line") << true; + + QTest::newRow("invalid-version+disconnect") << QByteArray("HTTP/123 200 ") << true; + QTest::newRow("invalid-version2+disconnect") << QByteArray("HTTP/a.\033 200 ") << true; + QTest::newRow("invalid-reply-code+disconnect") << QByteArray("HTTP/1.0 fuu ") << true; } void tst_QNetworkReply::ioGetFromHttpBrokenServer() -- cgit v0.12 From 56191830cdad9cbaa81c2ed8f22f1b2650a5608a Mon Sep 17 00:00:00 2001 From: Marius Storm-Olsen Date: Wed, 13 May 2009 13:58:18 +0200 Subject: Turn off Link Time Code Generation (/LTCG) by default Turning on LTCG affected too many projects, where customers applications would take a long time linking, severly affecting their development time (even though it was only added for release builds) We turn it off by default, and add a -ltcg configuration option, and the possibility to also do CONFIG+=ltcg in projects, should they not want it for Qt, but in their own projects. (Same, they can build Qt with it, and do CONFIG-=ltcg for their project) Reviewed-by: andy --- configure.exe | Bin 860160 -> 856064 bytes mkspecs/features/win32/ltcg.prf | 5 +++++ mkspecs/win32-msvc2005/qmake.conf | 7 +++++-- mkspecs/win32-msvc2008/qmake.conf | 7 +++++-- tools/configure/configureapp.cpp | 13 +++++++++++++ 5 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 mkspecs/features/win32/ltcg.prf diff --git a/configure.exe b/configure.exe index ff71f08..40843b4 100644 Binary files a/configure.exe and b/configure.exe differ diff --git a/mkspecs/features/win32/ltcg.prf b/mkspecs/features/win32/ltcg.prf new file mode 100644 index 0000000..f6f1299 --- /dev/null +++ b/mkspecs/features/win32/ltcg.prf @@ -0,0 +1,5 @@ +CONFIG(release, debug|release) { + QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG + QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG + QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG +} diff --git a/mkspecs/win32-msvc2005/qmake.conf b/mkspecs/win32-msvc2005/qmake.conf index 00287cb..5ed8e01 100644 --- a/mkspecs/win32-msvc2005/qmake.conf +++ b/mkspecs/win32-msvc2005/qmake.conf @@ -19,9 +19,10 @@ QMAKE_YACCFLAGS = -d QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t- QMAKE_CFLAGS_WARN_ON = -W3 QMAKE_CFLAGS_WARN_OFF = -W0 -QMAKE_CFLAGS_RELEASE = -O2 -MD -GL +QMAKE_CFLAGS_RELEASE = -O2 -MD QMAKE_CFLAGS_DEBUG = -Zi -MDd QMAKE_CFLAGS_YACC = +QMAKE_CFLAGS_LTCG = -GL QMAKE_CXX = $$QMAKE_CC QMAKE_CXXFLAGS = $$QMAKE_CFLAGS @@ -30,6 +31,7 @@ QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC +QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG QMAKE_CXXFLAGS_STL_ON = -EHsc QMAKE_CXXFLAGS_STL_OFF = QMAKE_CXXFLAGS_RTTI_ON = -GR @@ -50,11 +52,12 @@ QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<< QMAKE_LINK = link QMAKE_LFLAGS = /NOLOGO -QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /LTCG +QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO QMAKE_LFLAGS_DEBUG = /DEBUG QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" QMAKE_LFLAGS_DLL = /DLL +QMAKE_LFLAGS_LTCG = /LTCG QMAKE_LIBS_CORE = kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib winspool.lib ws2_32.lib ole32.lib user32.lib advapi32.lib diff --git a/mkspecs/win32-msvc2008/qmake.conf b/mkspecs/win32-msvc2008/qmake.conf index b56b41c..373a36d 100644 --- a/mkspecs/win32-msvc2008/qmake.conf +++ b/mkspecs/win32-msvc2008/qmake.conf @@ -19,9 +19,10 @@ QMAKE_YACCFLAGS = -d QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t- QMAKE_CFLAGS_WARN_ON = -W3 QMAKE_CFLAGS_WARN_OFF = -W0 -QMAKE_CFLAGS_RELEASE = -O2 -MD -GL +QMAKE_CFLAGS_RELEASE = -O2 -MD QMAKE_CFLAGS_DEBUG = -Zi -MDd QMAKE_CFLAGS_YACC = +QMAKE_CFLAGS_LTCG = -GL QMAKE_CXX = $$QMAKE_CC QMAKE_CXXFLAGS = $$QMAKE_CFLAGS @@ -30,6 +31,7 @@ QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC +QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG QMAKE_CXXFLAGS_STL_ON = -EHsc QMAKE_CXXFLAGS_STL_OFF = QMAKE_CXXFLAGS_RTTI_ON = -GR @@ -50,11 +52,12 @@ QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<< QMAKE_LINK = link QMAKE_LFLAGS = /NOLOGO -QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /LTCG +QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO QMAKE_LFLAGS_DEBUG = /DEBUG QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" QMAKE_LFLAGS_DLL = /DLL +QMAKE_LFLAGS_LTCG = /LTCG QMAKE_LIBS_CORE = kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib winspool.lib ws2_32.lib ole32.lib user32.lib advapi32.lib diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index bcbf557..91344c8 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -351,6 +351,7 @@ Configure::Configure( int& argc, char** argv ) dictionary[ "QMAKESPEC" ] = tmp; dictionary[ "INCREDIBUILD_XGE" ] = "auto"; + dictionary[ "LTCG" ] = "no"; } Configure::~Configure() @@ -487,6 +488,12 @@ void Configure::parseCmdLine() else if( configCmdLine.at(i) == "-commercial" ) { dictionary[ "BUILDTYPE" ] = "commercial"; } + else if( configCmdLine.at(i) == "-ltcg" ) { + dictionary[ "LTCG" ] = "yes"; + } + else if( configCmdLine.at(i) == "-no-ltcg" ) { + dictionary[ "LTCG" ] = "no"; + } #endif else if( configCmdLine.at(i) == "-platform" ) { @@ -1465,6 +1472,9 @@ bool Configure::displayHelp() desc("SHARED", "yes", "-shared", "Create and use shared Qt libraries."); desc("SHARED", "no", "-static", "Create and use static Qt libraries.\n"); + desc("LTCG", "yes", "-ltcg", "Use Link Time Code Generation. (Release builds only)"); + desc("LTCG", "no", "-no-ltcg", "Do not use Link Time Code Generation.\n"); + desc("FAST", "no", "-no-fast", "Configure Qt normally by generating Makefiles for all project files."); desc("FAST", "yes", "-fast", "Configure Qt quickly by generating Makefiles only for library and " "subdirectory targets. All other Makefiles are created as wrappers " @@ -2494,6 +2504,8 @@ void Configure::generateCachefile() else configStream << " static"; + if( dictionary[ "LTCG" ] == "yes" ) + configStream << " ltcg"; if( dictionary[ "STL" ] == "yes" ) configStream << " stl"; if ( dictionary[ "EXCEPTIONS" ] == "yes" ) @@ -2916,6 +2928,7 @@ void Configure::displayConfig() cout << "Architecture................" << dictionary[ "ARCHITECTURE" ] << endl; cout << "Maketool...................." << dictionary[ "MAKE" ] << endl; cout << "Debug symbols..............." << (dictionary[ "BUILD" ] == "debug" ? "yes" : "no") << endl; + cout << "Link Time Code Generation..." << dictionary[ "LTCG" ] << endl; cout << "Accessibility support......." << dictionary[ "ACCESSIBILITY" ] << endl; cout << "STL support................." << dictionary[ "STL" ] << endl; cout << "Exception support..........." << dictionary[ "EXCEPTIONS" ] << endl; -- cgit v0.12 From bb000e03fc1e876eb6ee0d02de15a0bc9a6ea1b8 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 13 May 2009 14:53:24 +0200 Subject: Added API for quietly saving a form. Task-number: 163220 Added to FormWindowBase. Required among other things for Qt Creator code completion for uic-generated-headers. Acked-by: dt --- tools/designer/src/lib/shared/formwindowbase.cpp | 10 +++++++++- tools/designer/src/lib/shared/formwindowbase_p.h | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/designer/src/lib/shared/formwindowbase.cpp b/tools/designer/src/lib/shared/formwindowbase.cpp index 3e7e17b..b569b51 100644 --- a/tools/designer/src/lib/shared/formwindowbase.cpp +++ b/tools/designer/src/lib/shared/formwindowbase.cpp @@ -55,7 +55,7 @@ TRANSLATOR qdesigner_internal::FormWindowBase #include "deviceprofile_p.h" #include "qdesigner_utils_p.h" -#include +#include "qsimpleresource_p.h" #include #include @@ -482,6 +482,14 @@ void FormWindowBase::setupDefaultAction(QDesignerFormWindowInterface *fw) QObject::connect(fw, SIGNAL(activated(QWidget*)), fw, SLOT(triggerDefaultAction(QWidget*))); } +QString FormWindowBase::fileContents() const +{ + const bool oldValue = QSimpleResource::setWarningsEnabled(false); + const QString rc = contents(); + QSimpleResource::setWarningsEnabled(oldValue); + return rc; +} + } // namespace qdesigner_internal QT_END_NAMESPACE diff --git a/tools/designer/src/lib/shared/formwindowbase_p.h b/tools/designer/src/lib/shared/formwindowbase_p.h index 68e977e..0891f6e 100644 --- a/tools/designer/src/lib/shared/formwindowbase_p.h +++ b/tools/designer/src/lib/shared/formwindowbase_p.h @@ -90,6 +90,9 @@ public: QVariantMap formData(); void setFormData(const QVariantMap &vm); + // Return contents without warnings. Should be 'contents(bool quiet)' + QString fileContents() const; + // Return the widget containing the form. This is used to // apply embedded design settings to that are inherited (for example font). // These are meant to be applied to the form only and not to the other editors -- cgit v0.12 From 960d2a7639062b6582d460aaae140b4d2e0a8b70 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Wed, 13 May 2009 14:59:52 +0200 Subject: Adding details to QVariant docs Adding note about requriements for converting QVariants Task-number: 192607 Rev-by: David Boddie --- src/corelib/kernel/qvariant.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index b4427c0..0a0500d 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -1187,8 +1187,9 @@ const QVariant::Handler *QVariant::handler = &qt_kernel_variant_handler; and versatile, but may prove less memory and speed efficient than storing specific types in standard data structures. - QVariant also supports the notion of null values, where you have - a defined type with no value set. + QVariant also supports the notion of null values, where you can + have a defined type with no value set. However, note that QVariant + types can only be cast when they have had a value set. \snippet doc/src/snippets/code/src_corelib_kernel_qvariant.cpp 1 -- cgit v0.12 From 62677589caf8b2f45f369cfc9df30ded323c4155 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Wed, 13 May 2009 15:13:10 +0200 Subject: Cleaning docs Highlight part of the general description in QTimeLine Task-number: 218487 Rev-by: Geir Vattekar --- src/corelib/tools/qtimeline.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qtimeline.cpp b/src/corelib/tools/qtimeline.cpp index 2979a09..3a03558 100644 --- a/src/corelib/tools/qtimeline.cpp +++ b/src/corelib/tools/qtimeline.cpp @@ -225,7 +225,9 @@ void QTimeLinePrivate::setCurrentTime(int msecs) valueForTime() and emitting valueChanged(). By default, valueForTime() applies an interpolation algorithm to generate these value. You can choose from a set of predefined timeline algorithms by calling - setCurveShape(). By default, QTimeLine uses the EaseInOut curve shape, + setCurveShape(). + + Note that by default, QTimeLine uses the EaseInOut curve shape, which provides a value that grows slowly, then grows steadily, and finally grows slowly. For a custom timeline, you can reimplement valueForTime(), in which case QTimeLine's curveShape property is ignored. -- cgit v0.12 From 1c22d96f15d46c222bf5f1720e3e49e202a6c941 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Tue, 12 May 2009 17:58:27 +0200 Subject: HTTP backend / network cache: only cache responses to GET by default responses to POST might be cacheable, but are not cacheable by default; responses to PUT or DELETE are never cacheable. Reviewed-by: Thiago Macieira Task-number: 252281 --- src/network/access/qnetworkaccesshttpbackend.cpp | 42 +++++++++++++++++------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index a52b5a0..f214699 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -1036,21 +1036,39 @@ QNetworkCacheMetaData QNetworkAccessHttpBackend::fetchCacheMetaData(const QNetwo if (it != cacheHeaders.rawHeaders.constEnd()) metaData.setLastModified(QNetworkHeadersPrivate::fromHttpDate(it->second)); - bool canDiskCache = true; // Everything defaults to being cacheable on disk - - // 14.32 - // HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client - // had sent "Cache-Control: no-cache". - it = cacheHeaders.findRawHeader("pragma"); - if (it != cacheHeaders.rawHeaders.constEnd() - && it->second == "no-cache") - canDiskCache = false; + bool canDiskCache; + // only cache GET replies by default, all other replies (POST, PUT, DELETE) + // are not cacheable by default (according to RFC 2616 section 9) + if (httpReply->request().operation() == QHttpNetworkRequest::Get) { + + canDiskCache = true; + // 14.32 + // HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client + // had sent "Cache-Control: no-cache". + it = cacheHeaders.findRawHeader("pragma"); + if (it != cacheHeaders.rawHeaders.constEnd() + && it->second == "no-cache") + canDiskCache = false; + + // HTTP/1.1. Check the Cache-Control header + if (cacheControl.contains("no-cache")) + canDiskCache = false; + else if (cacheControl.contains("no-store")) + canDiskCache = false; + + // responses to POST might be cacheable + } else if (httpReply->request().operation() == QHttpNetworkRequest::Post) { - // HTTP/1.1. Check the Cache-Control header - if (cacheControl.contains("no-cache")) canDiskCache = false; - else if (cacheControl.contains("no-store")) + // some pages contain "expires:" and "cache-control: no-cache" field, + // so we only might cache POST requests if we get "cache-control: max-age ..." + if (cacheControl.contains("max-age")) + canDiskCache = true; + + // responses to PUT and DELETE are not cacheable + } else { canDiskCache = false; + } metaData.setSaveToDisk(canDiskCache); int statusCode = httpReply->statusCode(); -- cgit v0.12 From 484ad0eccc84488b57d58a1223760623c70389a5 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Wed, 13 May 2009 17:10:43 +0200 Subject: Correcting bug in cardLayout example Adding the count() function to the example. Task-number: 220766 Rev-by: Geir Vattekar --- doc/src/layout.qdoc | 16 +++++++----- doc/src/snippets/code/doc_src_layout.qdoc | 41 +++++++++++++++++-------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/doc/src/layout.qdoc b/doc/src/layout.qdoc index 55dfd8b..196999b 100644 --- a/doc/src/layout.qdoc +++ b/doc/src/layout.qdoc @@ -315,7 +315,11 @@ \snippet doc/src/snippets/code/doc_src_layout.qdoc 1 - First we define two functions that iterate over the layout: \c{itemAt()} + First we define \c{count()} to fetch the number of items in the list. + + \snippet doc/src/snippets/code/doc_src_layout.qdoc 2 + + Then we define two functions that iterate over the layout: \c{itemAt()} and \c{takeAt()}. These functions are used internally by the layout system to handle deletion of widgets. They are also available for application programmers. @@ -326,7 +330,7 @@ structure, we may have to spend more effort defining a linear order for the items. - \snippet doc/src/snippets/code/doc_src_layout.qdoc 2 + \snippet doc/src/snippets/code/doc_src_layout.qdoc 3 \c{addItem()} implements the default placement strategy for layout items. This function must be implemented. It is used by QLayout::add(), by the @@ -336,26 +340,26 @@ QGridLayout::addItem(), QGridLayout::addWidget(), and QGridLayout::addLayout(). - \snippet doc/src/snippets/code/doc_src_layout.qdoc 3 + \snippet doc/src/snippets/code/doc_src_layout.qdoc 4 The layout takes over responsibility of the items added. Since QLayoutItem does not inherit QObject, we must delete the items manually. The function QLayout::deleteAllItems() uses \c{takeAt()} defined above to delete all the items in the layout. - \snippet doc/src/snippets/code/doc_src_layout.qdoc 4 + \snippet doc/src/snippets/code/doc_src_layout.qdoc 5 The \c{setGeometry()} function actually performs the layout. The rectangle supplied as an argument does not include \c{margin()}. If relevant, use \c{spacing()} as the distance between items. - \snippet doc/src/snippets/code/doc_src_layout.qdoc 5 + \snippet doc/src/snippets/code/doc_src_layout.qdoc 6 \c{sizeHint()} and \c{minimumSize()} are normally very similar in implementation. The sizes returned by both functions should include \c{spacing()}, but not \c{margin()}. - \snippet doc/src/snippets/code/doc_src_layout.qdoc 6 + \snippet doc/src/snippets/code/doc_src_layout.qdoc 7 \section2 Further Notes diff --git a/doc/src/snippets/code/doc_src_layout.qdoc b/doc/src/snippets/code/doc_src_layout.qdoc index 48e10e9..fedcf0c 100644 --- a/doc/src/snippets/code/doc_src_layout.qdoc +++ b/doc/src/snippets/code/doc_src_layout.qdoc @@ -2,23 +2,21 @@ #ifndef CARD_H #define CARD_H -#include +#include #include class CardLayout : public QLayout { public: - CardLayout(QWidget *parent, int dist) - : QLayout(parent, 0, dist) {} - CardLayout(QLayout *parent, int dist) - : QLayout(parent, dist) {} - CardLayout(int dist) - : QLayout(dist) {} + CardLayout(QWidget *parent, int dist): QLayout(parent, 0, dist) {} + CardLayout(QLayout *parent, int dist): QLayout(parent, dist) {} + CardLayout(int dist): QLayout(dist) {} ~CardLayout(); void addItem(QLayoutItem *item); QSize sizeHint() const; QSize minimumSize() const; + QLayoutItem *count() const; QLayoutItem *itemAt(int) const; QLayoutItem *takeAt(int); void setGeometry(const QRect &rect); @@ -31,11 +29,18 @@ private: //! [1] -#include "card.h" +//#include "card.h" //! [1] - //! [2] +QLayoutItem *CardLayout::count() const +{ + // QList::size() returns the number of QLayoutItems in the list + return list.size(); +} +//! [2] + +//! [3] QLayoutItem *CardLayout::itemAt(int idx) const { // QList::value() performs index checking, and returns 0 if we are @@ -48,26 +53,26 @@ QLayoutItem *CardLayout::takeAt(int idx) // QList::take does not do index checking return idx >= 0 && idx < list.size() ? list.takeAt(idx) : 0; } -//! [2] +//! [3] -//! [3] +//! [4] void CardLayout::addItem(QLayoutItem *item) { list.append(item); } -//! [3] +//! [4] -//! [4] +//! [5] CardLayout::~CardLayout() { deleteAllItems(); } -//! [4] +//! [5] -//! [5] +//! [6] void CardLayout::setGeometry(const QRect &r) { QLayout::setGeometry(r); @@ -85,10 +90,10 @@ void CardLayout::setGeometry(const QRect &r) ++i; } } -//! [5] +//! [6] -//! [6] +//! [7] QSize CardLayout::sizeHint() const { QSize s(0,0); @@ -116,4 +121,4 @@ QSize CardLayout::minimumSize() const } return s + n*QSize(spacing(), spacing()); } -//! [6] +//! [7] \ No newline at end of file -- cgit v0.12 From 54ad50c99fee0db0dc9a64ee16dfcc4315b9d86d Mon Sep 17 00:00:00 2001 From: Jason McDonald Date: Thu, 14 May 2009 09:41:08 +1000 Subject: Fix broken wince build. The WinCE build was failing due to a spelling error in an #ifdef directive. Reviewed-by: Trust Me --- src/gui/widgets/qmenu_wince.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/widgets/qmenu_wince.cpp b/src/gui/widgets/qmenu_wince.cpp index fbe54fe..42a4e0b 100644 --- a/src/gui/widgets/qmenu_wince.cpp +++ b/src/gui/widgets/qmenu_wince.cpp @@ -214,7 +214,7 @@ static HWND qt_wce_create_menubar(HWND parentHandle, HINSTANCE resourceHandle, i mbi.nToolBarId = toolbarID; if (ptrCreateMenuBar(&mbi)) { -#ifdef Q_WS_WINCE_WM +#ifdef Q_OS_WINCE_WM // Tell the menu bar that we want to override hot key behaviour. LPARAM lparam = MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY); -- cgit v0.12 From 4cfe2b57d97488b4f312ad2ec2985f619b4984b6 Mon Sep 17 00:00:00 2001 From: Bill King Date: Thu, 14 May 2009 14:15:21 +1000 Subject: Use newer safer error function if available. Uses fb_interpret instead of isc_interprete if using firebird. Closes a potential security hole/buffer overrun. Reviewed-by: Justin McPherson --- src/sql/drivers/ibase/qsql_ibase.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/sql/drivers/ibase/qsql_ibase.cpp b/src/sql/drivers/ibase/qsql_ibase.cpp index 6834d9a..4f3d79d 100644 --- a/src/sql/drivers/ibase/qsql_ibase.cpp +++ b/src/sql/drivers/ibase/qsql_ibase.cpp @@ -66,8 +66,11 @@ QT_BEGIN_NAMESPACE enum { QIBaseChunkSize = SHRT_MAX / 2 }; -static bool getIBaseError(QString& msg, ISC_STATUS* status, ISC_LONG &sqlcode, - QTextCodec *tc) +#if defined(FB_API_VER) && FB_API_VER >= 20 +static bool getIBaseError(QString& msg, const ISC_STATUS* status, ISC_LONG &sqlcode, QTextCodec *tc) +#else +static bool getIBaseError(QString& msg, ISC_STATUS* status, ISC_LONG &sqlcode, QTextCodec *tc) +#endif { if (status[0] != 1 || status[1] <= 0) return false; @@ -75,7 +78,11 @@ static bool getIBaseError(QString& msg, ISC_STATUS* status, ISC_LONG &sqlcode, msg.clear(); sqlcode = isc_sqlcode(status); char buf[512]; +#if defined(FB_API_VER) && FB_API_VER >= 20 + while(fb_interpret(buf, 512, &status)) { +#else while(isc_interprete(buf, &status)) { +#endif if(!msg.isEmpty()) msg += QLatin1String(" - "); if (tc) -- cgit v0.12 From 8a97b3b9e506580b4a89c1277068b274794a858c Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Thu, 14 May 2009 10:37:37 +0200 Subject: Sheets misbehaviour on Carbon - Mac OS X Seems like some old legacy code was left behind when sheets behaved as application modal. This is not the case anymore, so this patch just removes the special case code for enforcing the old behaviour, and let carbon do the correct thing instead. Task-number: 252379 Reviewed-by: Trenton Schulz --- src/gui/kernel/qwidget_mac.mm | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index b315eaf..0e021dc 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -786,16 +786,6 @@ OSStatus QWidgetPrivate::qt_window_event(EventHandlerCallRef er, EventRef event, // By also setting the current modal window back into the event, we // help Carbon determining which window is supposed to be raised. handled_event = qApp->activePopupWidget() ? true : false; - QWidget *top = 0; - if (!QApplicationPrivate::tryModalHelper(widget, &top) && top && top != widget){ - if(!qt_mac_is_macsheet(top) || top->parentWidget() != widget) { - handled_event = true; - WindowPtr topWindowRef = qt_mac_window_for(top); - SetEventParameter(event, kEventParamModalWindow, typeWindowRef, sizeof(topWindowRef), &topWindowRef); - HIModalClickResult clickResult = kHIModalClickIsModal; - SetEventParameter(event, kEventParamModalClickResult, typeModalClickResult, sizeof(clickResult), &clickResult); - } - } #endif } else if(ekind == kEventWindowClose) { widget->d_func()->close_helper(QWidgetPrivate::CloseWithSpontaneousEvent); -- cgit v0.12 From 8a0272a37aa44ed7583cce40eeff1b030c07741e Mon Sep 17 00:00:00 2001 From: Norwegian Rock Cat Date: Thu, 14 May 2009 10:57:22 +0200 Subject: Small updates to the .hgignore file. This is handy in cases where you are maybe using something like the hg-git extension in Mercurial or just storing release in Mercurial for patch queues or what have you. --- .hgignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.hgignore b/.hgignore index 784d507..eb6ff05 100755 --- a/.hgignore +++ b/.hgignore @@ -5,6 +5,8 @@ syntax: glob *~ *.a +*.la +*.pc *.core *.moc *.o @@ -45,7 +47,9 @@ bin/rcc* bin/uic* bin/qcollectiongenerator bin/qhelpgenerator +bin/macdeployqt tools/qdoc3/qdoc3* +tools/macdeployqt/macchangeqt/macchangeqt #configure.cache mkspecs/default mkspecs/qconfig.pri -- cgit v0.12 From d6e87c332c721bbcb86bebc6f4daa8a3125e80c6 Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 14 May 2009 15:07:25 +0200 Subject: Fixes build issue with WinCE and MSVC 2008 and MIPS-II Reviewed-by: Maurice --- mkspecs/wince50standard-mipsii-msvc2008/default_post.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/wince50standard-mipsii-msvc2008/default_post.prf b/mkspecs/wince50standard-mipsii-msvc2008/default_post.prf index a232ba3..d423784 100644 --- a/mkspecs/wince50standard-mipsii-msvc2008/default_post.prf +++ b/mkspecs/wince50standard-mipsii-msvc2008/default_post.prf @@ -1 +1 @@ -include(../wince50standard-mipsii-msvc2005/qmake.conf) +include(../wince50standard-mipsii-msvc2005/default_post.prf) -- cgit v0.12 From 7179792bbbc34a091bfc18ebc3e5bd2e401faa65 Mon Sep 17 00:00:00 2001 From: Andreas Aardal Hanssen Date: Thu, 14 May 2009 15:06:48 +0200 Subject: Fix QGraphicsItem::deviceTransform() to also work with normal items. QGraphicsItem::deviceTransform() returns the item-to-device transform, provided with the device-to-scene transform, and combining it with the item's scene transform. This function is meant to handle items that enable ItemIgnoresTransformations, but it happened to not work properly for items that _don't_ enable that flag. Unfortunately this bug is hard to work around for users from the outside, as it requires you to check if the item or any ancestor enables ItemIgnoresTransformations. The fix also removes unnecessary branchs inside QGV so that we use the same function for all items. Reviewed-by: bnilsen --- src/gui/graphicsview/qgraphicsitem.cpp | 4 + src/gui/graphicsview/qgraphicsscene.cpp | 21 +---- src/gui/graphicsview/qgraphicsview.cpp | 13 +-- tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp | 110 +++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 28 deletions(-) diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index 30c15bc..4908296 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -2572,6 +2572,10 @@ QTransform QGraphicsItem::sceneTransform() const */ QTransform QGraphicsItem::deviceTransform(const QTransform &viewportTransform) const { + // Ensure we return the standard transform if we're not untransformable. + if (!d_ptr->itemIsUntransformable()) + return sceneTransform() * viewportTransform; + // Find the topmost item that ignores view transformations. const QGraphicsItem *untransformedAncestor = this; QList parents; diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 13f70e5..b89e352 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -2289,12 +2289,7 @@ void QGraphicsScene::render(QPainter *painter, const QRectF &target, const QRect // Calculate a simple level-of-detail metric. // ### almost identical code in QGraphicsView::paintEvent() // and QGraphicsView::render() - consider refactoring - QTransform itemToDeviceTransform; - if (item->d_ptr->itemIsUntransformable()) { - itemToDeviceTransform = item->deviceTransform(painterTransform); - } else { - itemToDeviceTransform = item->sceneTransform() * painterTransform; - } + QTransform itemToDeviceTransform = item->deviceTransform(painterTransform); option.levelOfDetail = qSqrt(itemToDeviceTransform.map(v1).length() * itemToDeviceTransform.map(v2).length()); option.matrix = itemToDeviceTransform.toAffine(); //### discards perspective @@ -5078,11 +5073,7 @@ void QGraphicsScene::drawItems(QPainter *painter, // optimization, but it's hit very rarely. for (int i = clippers.size() - 1; i >= 0; --i) { QGraphicsItem *clipper = clippers[i]; - if (clipper->d_ptr->itemIsUntransformable()) { - painter->setWorldTransform(clipper->deviceTransform(viewTransform), false); - } else { - painter->setWorldTransform(clipper->sceneTransform() * viewTransform, false); - } + painter->setWorldTransform(clipper->deviceTransform(viewTransform), false); childClippers.append(clipper); painter->save(); @@ -5093,12 +5084,8 @@ void QGraphicsScene::drawItems(QPainter *painter, } // Set up the painter transform - if (item->d_ptr->itemIsUntransformable()) { - painter->setWorldTransform(item->deviceTransform(viewTransform), false); - } else { - painter->setWorldTransform(item->sceneTransform() * viewTransform, false); - } - + painter->setWorldTransform(item->deviceTransform(viewTransform), false); + // Save painter bool saveState = (d->painterStateProtection || (item->flags() & QGraphicsItem::ItemClipsToShape)); if (saveState) diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp index 8b133f3..a795fb4 100644 --- a/src/gui/graphicsview/qgraphicsview.cpp +++ b/src/gui/graphicsview/qgraphicsview.cpp @@ -1153,11 +1153,7 @@ void QGraphicsViewPrivate::generateStyleOptions(const QList &it // Calculate a simple level-of-detail metric. // ### almost identical code in QGraphicsScene::render() // and QGraphicsView::render() - consider refactoring - if (item->d_ptr->itemIsUntransformable()) { - itemToViewportTransform = item->deviceTransform(worldTransform); - } else { - itemToViewportTransform = item->sceneTransform() * worldTransform; - } + itemToViewportTransform = item->deviceTransform(worldTransform); if (itemToViewportTransform.type() <= QTransform::TxTranslate) { // Translation and rotation only? The LOD is 1. @@ -2160,12 +2156,7 @@ void QGraphicsView::render(QPainter *painter, const QRectF &target, const QRect // Calculate a simple level-of-detail metric. // ### almost identical code in QGraphicsScene::render() // and QGraphicsView::paintEvent() - consider refactoring - QTransform itemToViewportTransform; - if (item->d_ptr->itemIsUntransformable()) { - itemToViewportTransform = item->deviceTransform(painterMatrix); - } else { - itemToViewportTransform = item->sceneTransform() * painterMatrix; - } + QTransform itemToViewportTransform = item->deviceTransform(painterMatrix); option->levelOfDetail = qSqrt(itemToViewportTransform.map(v1).length() * itemToViewportTransform.map(v2).length()); option->matrix = itemToViewportTransform.toAffine(); diff --git a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp index 6d150cb..58a17ea 100644 --- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp @@ -215,6 +215,8 @@ private slots: void tabChangesFocus_data(); void cacheMode(); void updateCachedItemAfterMove(); + void deviceTransform_data(); + void deviceTransform(); // task specific tests below me void task141694_textItemEnsureVisible(); @@ -6200,5 +6202,113 @@ void tst_QGraphicsItem::updateCachedItemAfterMove() QCOMPARE(tester->repaints, 1); } +class Track : public QGraphicsRectItem +{ +public: + Track(const QRectF &rect) + : QGraphicsRectItem(rect) + { + setAcceptHoverEvents(true); + } + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) + { + QGraphicsRectItem::paint(painter, option, widget); + painter->drawText(boundingRect(), Qt::AlignCenter, QString("%1x%2\n%3x%4").arg(p.x()).arg(p.y()).arg(sp.x()).arg(sp.y())); + } + +protected: + void hoverMoveEvent(QGraphicsSceneHoverEvent *event) + { + p = event->pos(); + sp = event->widget()->mapFromGlobal(event->screenPos()); + update(); + } +private: + QPointF p; + QPoint sp; +}; + +void tst_QGraphicsItem::deviceTransform_data() +{ + QTest::addColumn("untransformable1"); + QTest::addColumn("untransformable2"); + QTest::addColumn("untransformable3"); + QTest::addColumn("rotation1"); + QTest::addColumn("rotation2"); + QTest::addColumn("rotation3"); + QTest::addColumn("deviceX"); + QTest::addColumn("mapResult1"); + QTest::addColumn("mapResult2"); + QTest::addColumn("mapResult3"); + + QTest::newRow("nil") << false << false << false + << qreal(0.0) << qreal(0.0) << qreal(0.0) + << QTransform() + << QPointF(150, 150) << QPointF(250, 250) << QPointF(350, 350); + QTest::newRow("deviceX rot 90") << false << false << false + << qreal(0.0) << qreal(0.0) << qreal(0.0) + << QTransform().rotate(90) + << QPointF(-150, 150) << QPointF(-250, 250) << QPointF(-350, 350); + QTest::newRow("deviceX rot 90 100") << true << false << false + << qreal(0.0) << qreal(0.0) << qreal(0.0) + << QTransform().rotate(90) + << QPointF(-50, 150) << QPointF(50, 250) << QPointF(150, 350); + QTest::newRow("deviceX rot 90 010") << false << true << false + << qreal(0.0) << qreal(0.0) << qreal(0.0) + << QTransform().rotate(90) + << QPointF(-150, 150) << QPointF(-150, 250) << QPointF(-50, 350); + QTest::newRow("deviceX rot 90 001") << false << false << true + << qreal(0.0) << qreal(0.0) << qreal(0.0) + << QTransform().rotate(90) + << QPointF(-150, 150) << QPointF(-250, 250) << QPointF(-250, 350); + QTest::newRow("deviceX rot 90 111") << true << true << true + << qreal(0.0) << qreal(0.0) << qreal(0.0) + << QTransform().rotate(90) + << QPointF(-50, 150) << QPointF(50, 250) << QPointF(150, 350); + QTest::newRow("deviceX rot 90 101") << true << false << true + << qreal(0.0) << qreal(0.0) << qreal(0.0) + << QTransform().rotate(90) + << QPointF(-50, 150) << QPointF(50, 250) << QPointF(150, 350); +} + +void tst_QGraphicsItem::deviceTransform() +{ + QFETCH(bool, untransformable1); + QFETCH(bool, untransformable2); + QFETCH(bool, untransformable3); + QFETCH(qreal, rotation1); + QFETCH(qreal, rotation2); + QFETCH(qreal, rotation3); + QFETCH(QTransform, deviceX); + QFETCH(QPointF, mapResult1); + QFETCH(QPointF, mapResult2); + QFETCH(QPointF, mapResult3); + + QGraphicsScene scene; + Track *rect1 = new Track(QRectF(0, 0, 100, 100)); + Track *rect2 = new Track(QRectF(0, 0, 100, 100)); + Track *rect3 = new Track(QRectF(0, 0, 100, 100)); + rect2->setParentItem(rect1); + rect3->setParentItem(rect2); + rect1->setPos(100, 100); + rect2->setPos(100, 100); + rect3->setPos(100, 100); + rect1->rotate(rotation1); + rect2->rotate(rotation2); + rect3->rotate(rotation3); + rect1->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable1); + rect2->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable2); + rect3->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable3); + rect1->setBrush(Qt::red); + rect2->setBrush(Qt::green); + rect3->setBrush(Qt::blue); + scene.addItem(rect1); + + QCOMPARE(rect1->deviceTransform(deviceX).map(QPointF(50, 50)), mapResult1); + QCOMPARE(rect2->deviceTransform(deviceX).map(QPointF(50, 50)), mapResult2); + QCOMPARE(rect3->deviceTransform(deviceX).map(QPointF(50, 50)), mapResult3); +} + QTEST_MAIN(tst_QGraphicsItem) #include "tst_qgraphicsitem.moc" -- cgit v0.12 From d755bb5e8cfd88d0cd909f32d240d18e856bbd36 Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 14 May 2009 15:37:00 +0200 Subject: Prevent duplicate entries in the sidebar when the paths are the same If two urls were added to the sidebar that only differed in how they referenced the added url (i.e. /foo/bar/. and /foo/bar) then only one entry should appear. Task-number: 253532 Reviewed-by: Alexis --- src/gui/dialogs/qsidebar.cpp | 4 ++-- tests/auto/qsidebar/tst_qsidebar.cpp | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/gui/dialogs/qsidebar.cpp b/src/gui/dialogs/qsidebar.cpp index 26108d7..9abefdf 100644 --- a/src/gui/dialogs/qsidebar.cpp +++ b/src/gui/dialogs/qsidebar.cpp @@ -249,9 +249,9 @@ void QUrlModel::addUrls(const QList &list, int row, bool move) continue; for (int j = 0; move && j < rowCount(); ++j) { #if defined(Q_OS_WIN) - if (index(j, 0).data(UrlRole).toUrl().toLocalFile().toLower() == url.toLocalFile().toLower()) { + if (QDir::cleanPath(index(j, 0).data(UrlRole).toUrl().toLocalFile()).toLower() == QDir::cleanPath(url.toLocalFile()).toLower()) { #else - if (index(j, 0).data(UrlRole) == url) { + if (QDir::cleanPath(index(j, 0).data(UrlRole)) == QDir::cleanPath(url)) { #endif removeRow(j); if (j <= row) diff --git a/tests/auto/qsidebar/tst_qsidebar.cpp b/tests/auto/qsidebar/tst_qsidebar.cpp index 705e222..1384391 100644 --- a/tests/auto/qsidebar/tst_qsidebar.cpp +++ b/tests/auto/qsidebar/tst_qsidebar.cpp @@ -185,6 +185,13 @@ void tst_QSidebar::addUrls() qsidebar.addUrls(doubleUrls, 1); QCOMPARE(qsidebar.urls().size(), 1); + // Two paths that are effectively pointing to the same location + doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath()); + doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath() + "/."); + qsidebar.setUrls(emptyUrls); + qsidebar.addUrls(doubleUrls, 1); + QCOMPARE(qsidebar.urls().size(), 1); + #if defined(Q_OS_WIN) //Windows is case insensitive so no duplicate entries in that case doubleUrls << QUrl::fromLocalFile(QDir::home().absolutePath()); @@ -200,8 +207,6 @@ void tst_QSidebar::addUrls() qsidebar.addUrls(doubleUrls, 1); QCOMPARE(qsidebar.urls().size(), 2); #endif - - } void tst_QSidebar::goToUrl() -- cgit v0.12 From f09304d46bac91f3e8329cb7147f8df44898d1e0 Mon Sep 17 00:00:00 2001 From: jasplin Date: Thu, 14 May 2009 15:45:21 +0200 Subject: Fixed regression that prevented any widget from having focus when graphics view was disabled. A bug in Commit d5c018f7b014ab794e49d6e1f24e02233555847d prevented any widget from having focus when QT_NO_GRAPHICSVIEW was defined. This patch fixes the bug. Reviewed-by: bnilsen Task-number: 249589 --- src/gui/kernel/qapplication.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp index f3bd57b..4cf0ad7 100644 --- a/src/gui/kernel/qapplication.cpp +++ b/src/gui/kernel/qapplication.cpp @@ -2032,12 +2032,10 @@ QWidget *QApplication::focusWidget() void QApplicationPrivate::setFocusWidget(QWidget *focus, Qt::FocusReason reason) { - if (focus && focus->window() #ifndef QT_NO_GRAPHICSVIEW - && focus->window()->graphicsProxyWidget() -#endif - ) + if (focus && focus->window()->graphicsProxyWidget()) return; +#endif hidden_focus_widget = 0; -- cgit v0.12 From 8e9b041f0081cd5af67c5c5f3cee0cf2b70ffe11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20Thomsch=C3=BCtz?= Date: Thu, 14 May 2009 15:48:31 +0200 Subject: Use isNull() for strings instead of comparing against QString(). foo == QString() should be foo.isNull(). Fixes 7 warnings in the Norwegian Breakfast Network Reviewed-by: Samuel --- qmake/generators/xmloutput.cpp | 2 +- src/corelib/concurrent/qfuturewatcher.cpp | 2 +- src/corelib/kernel/qcoreapplication.cpp | 4 ++-- tools/macdeployqt/shared/shared.cpp | 4 ++-- tools/porting/src/portingrules.cpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/qmake/generators/xmloutput.cpp b/qmake/generators/xmloutput.cpp index 68d22e1..d77dd4b 100644 --- a/qmake/generators/xmloutput.cpp +++ b/qmake/generators/xmloutput.cpp @@ -277,7 +277,7 @@ void XmlOutput::closeTag() void XmlOutput::closeTo(const QString &tag) { bool cont = true; - if (!tagStack.contains(tag) && tag != QString()) { + if (!tagStack.contains(tag) && !tag.isNull()) { //warn_msg(WarnLogic, "<%s>: Cannot close to tag <%s>, not on stack", tagStack.last().latin1(), tag.latin1()); qDebug("<%s>: Cannot close to tag <%s>, not on stack", tagStack.last().toLatin1().constData(), tag.toLatin1().constData()); return; diff --git a/src/corelib/concurrent/qfuturewatcher.cpp b/src/corelib/concurrent/qfuturewatcher.cpp index ea35e9e..39d7698 100644 --- a/src/corelib/concurrent/qfuturewatcher.cpp +++ b/src/corelib/concurrent/qfuturewatcher.cpp @@ -465,7 +465,7 @@ void QFutureWatcherBasePrivate::sendCallOutEvent(QFutureCallOutEvent *event) break; emit q->progressValueChanged(event->index1); - if (event->text != QString()) // ### + if (!event->text.isNull()) // ### q->progressTextChanged(event->text); break; case QFutureCallOutEvent::ProgressRange: diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index a23b2dd..f6ce4b3 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1696,7 +1696,7 @@ QString QCoreApplication::applicationDirPath() } QCoreApplicationPrivate *d = self->d_func(); - if (d->cachedApplicationDirPath == QString()) + if (d->cachedApplicationDirPath.isNull()) d->cachedApplicationDirPath = QFileInfo(applicationFilePath()).path(); return d->cachedApplicationDirPath; } @@ -1724,7 +1724,7 @@ QString QCoreApplication::applicationFilePath() } QCoreApplicationPrivate *d = self->d_func(); - if (d->cachedApplicationFilePath != QString()) + if (!d->cachedApplicationFilePath.isNull()) return d->cachedApplicationFilePath; #if defined( Q_WS_WIN ) diff --git a/tools/macdeployqt/shared/shared.cpp b/tools/macdeployqt/shared/shared.cpp index db76ef2..1faa63a 100644 --- a/tools/macdeployqt/shared/shared.cpp +++ b/tools/macdeployqt/shared/shared.cpp @@ -343,7 +343,7 @@ DeploymentInfo deployQtFrameworks(QList frameworks, const QString copiedFrameworks.append(framework.frameworkName); // Get the qt path from one of the Qt frameworks; - if (deploymenInfo.qtPath == QString() && framework.frameworkName.contains("Qt") + if (deploymenInfo.qtPath.isNull() && framework.frameworkName.contains("Qt") && framework.frameworkDirectory.contains("/lib")) { deploymenInfo.qtPath = framework.frameworkDirectory; @@ -364,7 +364,7 @@ DeploymentInfo deployQtFrameworks(QList frameworks, const QString // Copy farmework to app bundle. const QString deployedBinaryPath = copyFramework(framework, bundlePath); // Skip the rest if already was deployed. - if (deployedBinaryPath == QString()) + if (deployedBinaryPath.isNull()) continue; runStrip(deployedBinaryPath); diff --git a/tools/porting/src/portingrules.cpp b/tools/porting/src/portingrules.cpp index 4931064..cd29403 100644 --- a/tools/porting/src/portingrules.cpp +++ b/tools/porting/src/portingrules.cpp @@ -189,7 +189,7 @@ void PortingRules::parseXml(QString fileName) QString includeFile = xml[QLatin1String("Rules")][QLatin1String("Include")].text(); - if(includeFile != QString()) { + if(!includeFile.isNull()) { QString resolvedIncludeFile = resolveFileName(fileName, includeFile); if (!resolvedIncludeFile.isEmpty()) parseXml(resolvedIncludeFile); -- cgit v0.12 From d644a9a89ff4f7bf8866b69af5334ea1c696e4a7 Mon Sep 17 00:00:00 2001 From: Norwegian Rock Cat Date: Thu, 14 May 2009 16:19:22 +0200 Subject: Compile. Need the proper types. Reviewed-by: Andy --- src/gui/dialogs/qsidebar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/qsidebar.cpp b/src/gui/dialogs/qsidebar.cpp index 9abefdf..000a06b 100644 --- a/src/gui/dialogs/qsidebar.cpp +++ b/src/gui/dialogs/qsidebar.cpp @@ -251,7 +251,7 @@ void QUrlModel::addUrls(const QList &list, int row, bool move) #if defined(Q_OS_WIN) if (QDir::cleanPath(index(j, 0).data(UrlRole).toUrl().toLocalFile()).toLower() == QDir::cleanPath(url.toLocalFile()).toLower()) { #else - if (QDir::cleanPath(index(j, 0).data(UrlRole)) == QDir::cleanPath(url)) { + if (QDir::cleanPath(index(j, 0).data(UrlRole).toUrl().toLocalFile()) == QDir::cleanPath(url.toLocalFile())) { #endif removeRow(j); if (j <= row) -- cgit v0.12 From 85f98acaa3a38079071bea711e43c9a86edec1f6 Mon Sep 17 00:00:00 2001 From: Trond Kjernaasen Date: Thu, 14 May 2009 17:38:56 +0200 Subject: Fixed an issue with text drawing under Windows. Some text drawn with OpenType fonts where cut off by a pixel or two under certain circumstances. This adds an additional 2 pixel pad margin to the glyph cache entries. The padding behaves slightly different when ClearType is enabled/disabled, hence the general 2 pixel padding. Task-number: 246196 Reviewed-by: Samuel --- src/gui/painting/qtextureglyphcache.cpp | 11 ++++------- src/gui/text/qfontengine_win.cpp | 6 +++--- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp index 1ea40ba..3fd1ffb 100644 --- a/src/gui/painting/qtextureglyphcache.cpp +++ b/src/gui/painting/qtextureglyphcache.cpp @@ -88,11 +88,12 @@ void QTextureGlyphCache::populate(const QTextItemInt &ti, ti.ascent.toReal(), ti.descent.toReal()); #endif - int glyph_width = metrics.width.ceil().toInt() + margin * 2; - int glyph_height = metrics.height.ceil().toInt() + margin * 2; + int glyph_width = metrics.width.ceil().toInt(); + int glyph_height = metrics.height.ceil().toInt(); if (glyph_height == 0 || glyph_width == 0) continue; - + glyph_width += margin * 2 + 2; + glyph_height += margin * 2 + 2; // align to 8-bit boundary if (m_type == QFontEngineGlyphCache::Raster_Mono) glyph_width = (glyph_width+7)&~7; @@ -188,11 +189,7 @@ void QImageTextureGlyphCache::createTextureData(int width, int height) int QImageTextureGlyphCache::glyphMargin() const { -#ifdef Q_WS_MAC return 2; -#else - return m_type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0; -#endif } void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g) diff --git a/src/gui/text/qfontengine_win.cpp b/src/gui/text/qfontengine_win.cpp index 1996d44..bf3a176 100644 --- a/src/gui/text/qfontengine_win.cpp +++ b/src/gui/text/qfontengine_win.cpp @@ -1406,8 +1406,8 @@ QNativeImage *QFontEngineWin::drawGDIGlyph(HFONT font, glyph_t glyph, int margin #endif #endif - QNativeImage *ni = new QNativeImage(iw + 2 * margin, - ih + 2 * margin, + QNativeImage *ni = new QNativeImage(iw + 2 * margin + 2, + ih + 2 * margin + 2, QNativeImage::systemFormat(), true); ni->image.fill(0xffffffff); @@ -1449,7 +1449,7 @@ QImage QFontEngineWin::alphaMapForGlyph(glyph_t glyph, const QTransform &xform) font = CreateFontIndirectW(&lf); } - QNativeImage *mask = drawGDIGlyph(font, glyph, 0, xform); + QNativeImage *mask = drawGDIGlyph(font, glyph, 2, xform); if (mask == 0) return QImage(); -- cgit v0.12 From ae3f20e9ce7f592c22c23e8dea6bb9feb52c8b90 Mon Sep 17 00:00:00 2001 From: Benjamin Poulain Date: Thu, 14 May 2009 18:40:03 +0200 Subject: QColor::toCmyk() does not convert the color if it is already in CMYK QColor::toCmyk() converted the color to RGB and then to CMYK. If the color was already in CMYK, this conversion change it. The color is now returned directly if it is in CMYK Reviewed-by: Ariya Task-number: 253625 --- src/gui/painting/qcolor.cpp | 4 ++-- tests/auto/qcolor/tst_qcolor.cpp | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/gui/painting/qcolor.cpp b/src/gui/painting/qcolor.cpp index 5d7d4ab..1723a19 100644 --- a/src/gui/painting/qcolor.cpp +++ b/src/gui/painting/qcolor.cpp @@ -1369,7 +1369,7 @@ QColor QColor::toRgb() const */ QColor QColor::toHsv() const { - if (!isValid()) + if (!isValid() || cspec == Hsv) return *this; if (cspec != Rgb) @@ -1421,7 +1421,7 @@ QColor QColor::toHsv() const */ QColor QColor::toCmyk() const { - if (!isValid()) + if (!isValid() || cspec == Cmyk) return *this; if (cspec != Rgb) return toRgb().toCmyk(); diff --git a/tests/auto/qcolor/tst_qcolor.cpp b/tests/auto/qcolor/tst_qcolor.cpp index 7608a15..684d5b5 100644 --- a/tests/auto/qcolor/tst_qcolor.cpp +++ b/tests/auto/qcolor/tst_qcolor.cpp @@ -111,12 +111,15 @@ private slots: void toRgb_data(); void toRgb(); + void toRgbNonDestructive(); void toHsv_data(); void toHsv(); + void toHsvNonDestructive(); void toCmyk_data(); void toCmyk(); + void toCmykNonDestructive(); void convertTo(); @@ -1124,6 +1127,12 @@ void tst_QColor::toHsv_data() << QColor::fromCmykF(0., 1., 1., 0.); } +void tst_QColor::toRgbNonDestructive() +{ + QColor aColor = QColor::fromRgbF(0.11, 0.22, 0.33, 0.44); + QCOMPARE(aColor, aColor.toRgb()); +} + void tst_QColor::toHsv() { // invalid should remain invalid @@ -1136,6 +1145,12 @@ void tst_QColor::toHsv() QCOMPARE(cmykColor.toHsv(), expectedColor); } +void tst_QColor::toHsvNonDestructive() +{ + QColor aColor = QColor::fromHsvF(0.11, 0.22, 0.33, 0.44); + QCOMPARE(aColor, aColor.toHsv()); +} + void tst_QColor::toCmyk_data() { QTest::addColumn("expectedColor"); @@ -1165,6 +1180,12 @@ void tst_QColor::toCmyk() QCOMPARE(hsvColor.toCmyk(), expectedColor); } +void tst_QColor::toCmykNonDestructive() +{ + QColor aColor = QColor::fromCmykF(0.11, 0.22, 0.33, 0.44); + QCOMPARE(aColor, aColor.toCmyk()); +} + void tst_QColor::convertTo() { QColor color(Qt::black); -- cgit v0.12 From ad679a7993042f1df8da8c2d90d325be3cf0113d Mon Sep 17 00:00:00 2001 From: Jason McDonald Date: Fri, 15 May 2009 18:51:54 +1000 Subject: Fix syntax error in demos.pro. Reviewed-by: Lincoln Ramsay --- demos/demos.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/demos.pro b/demos/demos.pro index 9248ab8..6084550 100644 --- a/demos/demos.pro +++ b/demos/demos.pro @@ -30,7 +30,7 @@ contains(QT_BUILD_PARTS, tools):{ wince*: SUBDIRS += demos_sqlbrowser } } -contains(QT_CONFIG, phonon)!static:SUBDIRS += demos_mediaplayer +contains(QT_CONFIG, phonon):!static:SUBDIRS += demos_mediaplayer contains(QT_CONFIG, webkit):contains(QT_CONFIG, svg):SUBDIRS += demos_browser # install -- cgit v0.12 From 9c3f5040bc9b80619ebe167c352ac8f0394f9b41 Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Fri, 15 May 2009 11:43:09 +0200 Subject: Cleaning bug in custom layout example. The example was using deleteAllItems() to delete items from the layout. This method is now part of the QT3_SUPPORT and shold not be used if not needed. Replaced by deleting all items one by one. Task-number: 220656 Rev-by: janarve --- doc/src/layout.qdoc | 6 +++--- doc/src/snippets/code/doc_src_layout.qdoc | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/doc/src/layout.qdoc b/doc/src/layout.qdoc index 196999b..d97fcfc 100644 --- a/doc/src/layout.qdoc +++ b/doc/src/layout.qdoc @@ -343,9 +343,9 @@ \snippet doc/src/snippets/code/doc_src_layout.qdoc 4 The layout takes over responsibility of the items added. Since QLayoutItem - does not inherit QObject, we must delete the items manually. The function - QLayout::deleteAllItems() uses \c{takeAt()} defined above to delete all the - items in the layout. + does not inherit QObject, we must delete the items manually. In the + destructor, we remove each item from the list using \c{takeAt()}, and + then delete it. \snippet doc/src/snippets/code/doc_src_layout.qdoc 5 diff --git a/doc/src/snippets/code/doc_src_layout.qdoc b/doc/src/snippets/code/doc_src_layout.qdoc index fedcf0c..60f36b0 100644 --- a/doc/src/snippets/code/doc_src_layout.qdoc +++ b/doc/src/snippets/code/doc_src_layout.qdoc @@ -67,7 +67,9 @@ void CardLayout::addItem(QLayoutItem *item) //! [5] CardLayout::~CardLayout() { - deleteAllItems(); + QLayoutItem *item; + while ((item = takeAt(0))) + delete item; } //! [5] @@ -121,4 +123,4 @@ QSize CardLayout::minimumSize() const } return s + n*QSize(spacing(), spacing()); } -//! [7] \ No newline at end of file +//! [7] -- cgit v0.12 From d216c0fd62a879fd1eb84e087f70c7f542d75d58 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 14 May 2009 11:21:25 +0200 Subject: HTTP authentication: return error if authentication cannot be handled return error upon receiving an unknown authentication method (e.g. WSSE); before we were just silently returning. Reviewed-by: Thiago Macieira --- src/network/access/qhttpnetworkconnection.cpp | 20 +++++++--- tests/auto/qnetworkreply/tst_qnetworkreply.cpp | 52 ++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index f558f2b..ae518df 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -643,10 +643,21 @@ void QHttpNetworkConnectionPrivate::handleStatus(QAbstractSocket *socket, QHttpN switch (statusCode) { case 401: case 407: - handleAuthenticateChallenge(socket, reply, (statusCode == 407), resend); - if (resend) { - eraseData(reply); - sendRequest(socket); + if (handleAuthenticateChallenge(socket, reply, (statusCode == 407), resend)) { + if (resend) { + eraseData(reply); + sendRequest(socket); + } + } else { + int i = indexOf(socket); + emit channels[i].reply->headerChanged(); + emit channels[i].reply->readyRead(); + QNetworkReply::NetworkError errorCode = (statusCode == 407) + ? QNetworkReply::ProxyAuthenticationRequiredError + : QNetworkReply::AuthenticationRequiredError; + reply->d_func()->errorString = errorDetail(errorCode, socket); + emit q->error(errorCode, reply->d_func()->errorString); + emit channels[i].reply->finished(); } break; default: @@ -749,7 +760,6 @@ bool QHttpNetworkConnectionPrivate::handleAuthenticateChallenge(QAbstractSocket // authentication is cancelled, send the current contents to the user. emit channels[i].reply->headerChanged(); emit channels[i].reply->readyRead(); - emit channels[i].reply->finished(); QNetworkReply::NetworkError errorCode = isProxy ? QNetworkReply::ProxyAuthenticationRequiredError diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index 4be0863..bb199b9 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -217,6 +217,8 @@ private Q_SLOTS: void httpProxyCommands_data(); void httpProxyCommands(); void proxyChange(); + void authorizationError_data(); + void authorizationError(); }; QT_BEGIN_NAMESPACE @@ -3012,5 +3014,55 @@ void tst_QNetworkReply::proxyChange() QVERIFY(int(reply3->error()) > 0); } +void tst_QNetworkReply::authorizationError_data() +{ + + QTest::addColumn("url"); + QTest::addColumn("errorSignalCount"); + QTest::addColumn("finishedSignalCount"); + QTest::addColumn("error"); + QTest::addColumn("httpStatusCode"); + QTest::addColumn("httpBody"); + + QTest::newRow("unknown-authorization-method") << "http://" + QtNetworkSettings::serverName() + + "/cgi-bin/http-unknown-authentication-method.cgi?401-authorization-required" << 1 << 1 + << int(QNetworkReply::AuthenticationRequiredError) << 401 << "authorization required"; + QTest::newRow("unknown-proxy-authorization-method") << "http://" + QtNetworkSettings::serverName() + + "/cgi-bin/http-unknown-authentication-method.cgi?407-proxy-authorization-required" << 1 << 1 + << int(QNetworkReply::ProxyAuthenticationRequiredError) << 407 + << "authorization required"; +} + +void tst_QNetworkReply::authorizationError() +{ + QFETCH(QString, url); + QNetworkRequest request(url); + QNetworkReplyPtr reply = manager.get(request); + + QCOMPARE(reply->error(), QNetworkReply::NoError); + + qRegisterMetaType("QNetworkReply::NetworkError"); + QSignalSpy errorSpy(reply, SIGNAL(error(QNetworkReply::NetworkError))); + QSignalSpy finishedSpy(reply, SIGNAL(finished())); + // now run the request: + connect(reply, SIGNAL(finished()), + &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QFETCH(int, errorSignalCount); + QCOMPARE(errorSpy.count(), errorSignalCount); + QFETCH(int, finishedSignalCount); + QCOMPARE(finishedSpy.count(), finishedSignalCount); + QFETCH(int, error); + QCOMPARE(reply->error(), QNetworkReply::NetworkError(error)); + + QFETCH(int, httpStatusCode); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), httpStatusCode); + + QFETCH(QString, httpBody); + QCOMPARE(QString(reply->readAll()), httpBody); +} + QTEST_MAIN(tst_QNetworkReply) #include "tst_qnetworkreply.moc" -- cgit v0.12 From 3875cd2b0a81c190939ea2803a2efbe890ae38ec Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 15 May 2009 14:53:23 +0200 Subject: Cocoa: Window flickers when resized with a QTabWidget Seems like we were not using the correct functions for setting the max/min size on a cocoa window. The version we used before included the unified toolbar, which is wrong. The new one does not. Task-number: 252642 Reviewed-by: Trenton Schulz --- src/gui/kernel/qwidget_mac.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 0e021dc..f863428 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -4035,8 +4035,8 @@ void QWidgetPrivate::applyMaxAndMinSizeOnWindow() NSSize max = NSMakeSize(SF(extra->maxw), SF(extra->maxh)); NSSize min = NSMakeSize(SF(extra->minw), SF(extra->minh)); #undef SF - [qt_mac_window_for(q) setMinSize:min]; - [qt_mac_window_for(q) setMaxSize:max]; + [qt_mac_window_for(q) setContentMinSize:min]; + [qt_mac_window_for(q) setContentMaxSize:max]; #endif } -- cgit v0.12