diff options
198 files changed, 2603 insertions, 13060 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) diff --git a/doc/src/qnamespace.qdoc b/doc/src/qnamespace.qdoc index 21aae2d..9dc76a9 100644 --- a/doc/src/qnamespace.qdoc +++ b/doc/src/qnamespace.qdoc @@ -157,6 +157,14 @@ set to true won't be used as a native menubar (e.g, the menubar at the top of the main screen on Mac OS X or at the bottom in Windows CE). + \value AA_MacDontSwapCtrlAndMeta On Mac OS X by default, Qt swaps the + Control and Meta (Command) keys (i.e., whenever Control is pressed, Qt + sends Meta and whenever Meta is pressed Control is sent. When this + attribute is true, Qt will not do the flip. QKeySequence::StandardShortcuts + will also flip accordingly (i.e., QKeySequence::Copy will be + Command+C on the keyboard regardless of the value set, though what is output for + QKeySequence::toString(QKeySequence::PortableText) will be different). + \omitvalue AA_AttributeCount */ 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 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 diff --git a/mkspecs/common/mac-g++.conf b/mkspecs/common/mac-g++.conf index 287f115..dca2e2f 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 e6a3120..06bbdcb 100644 --- a/mkspecs/macx-g++42/qmake.conf +++ b/mkspecs/macx-g++42/qmake.conf @@ -12,10 +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 +include(../common/mac-g++.conf) + load(qt_config) 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 diff --git a/src/corelib/codecs/qtsciicodec_p.h b/src/corelib/codecs/qtsciicodec_p.h index 8f11e48..425e7fd 100644 --- a/src/corelib/codecs/qtsciicodec_p.h +++ b/src/corelib/codecs/qtsciicodec_p.h @@ -88,7 +88,7 @@ QT_BEGIN_NAMESPACE #ifndef QT_NO_CODECS -class Q_CORE_EXPORT QTsciiCodec : public QTextCodec { +class QTsciiCodec : public QTextCodec { public: ~QTsciiCodec(); diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index b5b5291..29f6701 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -507,6 +507,7 @@ public: AA_DontCreateNativeWidgetSiblings = 4, AA_MacPluginApplication = 5, AA_DontUseNativeMenuBar = 6, + AA_MacDontSwapCtrlAndMeta = 7, // Add new attributes before this line AA_AttributeCount 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() diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index d62328f..0dc8a63 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 @@ -192,32 +193,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) @@ -266,18 +263,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 { @@ -294,9 +284,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<i; j++) { if(infos) diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp index a8d28cb..36b1ed8 100644 --- a/src/corelib/io/qfileinfo.cpp +++ b/src/corelib/io/qfileinfo.cpp @@ -571,7 +571,6 @@ void QFileInfo::setFile(const QFile &file) void QFileInfo::setFile(const QDir &dir, const QString &file) { - Q_D(QFileInfo); *this = QFileInfo(dir.filePath(file)); } diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index 63506c2..c5b54b4 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -1392,8 +1392,6 @@ bool QFSFileEnginePrivate::doStat() const if (tmpAttributes != -1) { fileAttrib = tmpAttributes; could_stat = true; - } else { - return false; } #endif } else { diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h index dd72fd9..93d07e0 100644 --- a/src/corelib/io/qsettings_p.h +++ b/src/corelib/io/qsettings_p.h @@ -146,7 +146,7 @@ inline QString QSettingsGroup::toString() const return result; } -class Q_CORE_EXPORT QConfFile +class QConfFile { public: ParsedSettingsMap mergedKeyMap() const; 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/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp index f63d29e..612d7f7 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -67,9 +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 because as long as the - application is running, stdin has no end. - + 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 diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 05015c0..287ac30 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -70,7 +70,7 @@ static int DIRECT_CONNECTION_ONLY = 0; static int *queuedConnectionTypes(const QList<QByteArray> &typeNames) { - int *types = static_cast<int *>(qMalloc((typeNames.count() + 1) * sizeof(int))); + int *types = new int [typeNames.count() + 1]; for (int i = 0; i < typeNames.count(); ++i) { const QByteArray typeName = typeNames.at(i); if (typeName.endsWith('*')) @@ -82,7 +82,7 @@ static int *queuedConnectionTypes(const QList<QByteArray> &typeNames) qWarning("QObject::connect: Cannot queue arguments of type '%s'\n" "(Make sure '%s' is registered using qRegisterMetaType().)", typeName.constData(), typeName.constData()); - qFree(types); + delete [] types; return 0; } } @@ -216,6 +216,7 @@ public: } }; +// Used by QAccessibleWidget bool QObjectPrivate::isSender(const QObject *receiver, const char *signal) const { Q_Q(const QObject); @@ -227,8 +228,8 @@ bool QObjectPrivate::isSender(const QObject *receiver, const char *signal) const if (signal_index < connectionLists->count()) { const ConnectionList &connectionList = connectionLists->at(signal_index); for (int i = 0; i < connectionList.count(); ++i) { - const QObjectPrivate::Connection &c = connectionList.at(i); - if (c.receiver && c.receiver == receiver) + const QObjectPrivate::Connection *c = connectionList.at(i); + if (c->receiver == receiver) return true; } } @@ -236,6 +237,7 @@ bool QObjectPrivate::isSender(const QObject *receiver, const char *signal) const return false; } +// Used by QAccessibleWidget QObjectList QObjectPrivate::receiverList(const char *signal) const { Q_Q(const QObject); @@ -248,21 +250,22 @@ QObjectList QObjectPrivate::receiverList(const char *signal) const if (signal_index < connectionLists->count()) { const ConnectionList &connectionList = connectionLists->at(signal_index); for (int i = 0; i < connectionList.count(); ++i) { - const QObjectPrivate::Connection &c = connectionList.at(i); - if (c.receiver) - returnValue << c.receiver; + const QObjectPrivate::Connection *c = connectionList.at(i); + if (c->receiver) + returnValue << c->receiver; } } } return returnValue; } +// Used by QAccessibleWidget QObjectList QObjectPrivate::senderList() const { QObjectList returnValue; QMutexLocker locker(&threadData->mutex); for (int i = 0; i < senders.count(); ++i) - returnValue << senders.at(i).sender; + returnValue << senders.at(i)->sender; return returnValue; } @@ -274,33 +277,11 @@ void QObjectPrivate::addConnection(int signal, Connection *c) connectionLists->resize(signal + 1); ConnectionList &connectionList = (*connectionLists)[signal]; - connectionList.append(*c); + connectionList.append(c); cleanConnectionLists(); } -void QObjectPrivate::removeReceiver(int signal, QObject *receiver) -{ - if (!connectionLists) - return; - - if (signal >= connectionLists->count()) - return; - - ConnectionList &connectionList = (*connectionLists)[signal]; - for (int i = 0; i < connectionList.count(); ++i) { - Connection &c = connectionList[i]; - if (c.receiver == receiver) { - c.receiver = 0; - if (c.argumentTypes && c.argumentTypes != &DIRECT_CONNECTION_ONLY) { - qFree(c.argumentTypes); - c.argumentTypes = 0; - } - connectionLists->dirty = true; - } - } -} - void QObjectPrivate::cleanConnectionLists() { if (connectionLists->dirty && !connectionLists->inUse) { @@ -308,55 +289,17 @@ void QObjectPrivate::cleanConnectionLists() for (int signal = -1; signal < connectionLists->count(); ++signal) { QObjectPrivate::ConnectionList &connectionList = (*connectionLists)[signal]; for (int i = 0; i < connectionList.count(); ++i) { - const QObjectPrivate::Connection &c = connectionList.at(i); - if (!c.receiver) + QObjectPrivate::Connection *c = connectionList.at(i); + if (!c->receiver) { + delete c; connectionList.removeAt(i--); + } } } connectionLists->dirty = false; } } -void QObjectPrivate::refSender(QObject *sender, int signal) -{ - for (int i = 0; i < senders.count(); ++i) { - Sender &s = senders[i]; - if (s.sender == sender && s.signal == signal) { - ++s.ref; - return; - } - } - - Sender s = { sender, signal, 1 }; - senders.append(s); -} - -void QObjectPrivate::derefSender(QObject *sender, int signal) -{ - for (int i = 0; i < senders.count(); ++i) { - Sender &s = senders[i]; - if (s.sender == sender && s.signal == signal) { - if (--s.ref == 0) { - senders.removeAt(i); - break; - } - } - } - // Q_ASSERT_X(false, "QObjectPrivate::derefSender", "sender not found"); -} - -void QObjectPrivate::removeSender(QObject *sender, int signal) -{ - for (int i = 0; i < senders.count(); ++i) { - Sender &s = senders[i]; - if (s.sender == sender && s.signal == signal) { - senders.removeAt(i); - return; - } - } - // Q_ASSERT_X(false, "QObjectPrivate::removeSender", "sender not found"); -} - QObjectPrivate::Sender *QObjectPrivate::setCurrentSender(QObject *receiver, Sender *sender) { @@ -782,23 +725,21 @@ QObject::~QObject() for (int signal = -1; signal < d->connectionLists->count(); ++signal) { QObjectPrivate::ConnectionList &connectionList = (*d->connectionLists)[signal]; for (int i = 0; i < connectionList.count(); ++i) { - QObjectPrivate::Connection *c = &connectionList[i]; - if (!c->receiver) + QObjectPrivate::Connection *c = connectionList[i]; + if (!c->receiver) { + delete c; continue; + } QMutex *m = &c->receiver->d_func()->threadData->mutex; bool needToUnlock = QOrderedMutexLocker::relock(locker.mutex(), m); - c = &connectionList[i]; + c = connectionList[i]; if (c->receiver) - c->receiver->d_func()->removeSender(this, signal); + c->receiver->d_func()->senders.removeOne(c); if (needToUnlock) m->unlock(); - if (c->argumentTypes && c->argumentTypes != &DIRECT_CONNECTION_ONLY) { - qFree(c->argumentTypes); - c->argumentTypes = 0; - } - c->receiver = 0; + delete c; } } @@ -812,15 +753,20 @@ QObject::~QObject() // disconnect all senders for (int i = 0; i < d->senders.count(); ++i) { - QObjectPrivate::Sender *s = &d->senders[i]; + QObjectPrivate::Connection *s = d->senders[i]; if (!s->sender) continue; QMutex *m = &s->sender->d_func()->threadData->mutex; bool needToUnlock = QOrderedMutexLocker::relock(locker.mutex(), m); - s = &d->senders[i]; - if (s->sender) - s->sender->d_func()->removeReceiver(s->signal, this); + s = d->senders[i]; + s->receiver = 0; + if (s->sender) { + QObjectConnectionListVector *senderLists = s->sender->d_func()->connectionLists; + if (senderLists) + senderLists->dirty = true; + } + if (needToUnlock) m->unlock(); } @@ -866,6 +812,12 @@ QObject::~QObject() d_ptr = 0; } +QObjectPrivate::Connection::~Connection() +{ + if (argumentTypes != &DIRECT_CONNECTION_ONLY) + delete [] argumentTypes; +} + /*! \fn QMetaObject *QObject::metaObject() const @@ -2304,7 +2256,7 @@ QObject *QObject::sender() const // Return 0 if d->currentSender isn't in d->senders bool found = false; for (int i = 0; !found && i < d->senders.count(); ++i) - found = (d->senders.at(i).sender == d->currentSender->sender); + found = (d->senders.at(i)->sender == d->currentSender->sender); if (!found) return 0; return d->currentSender->sender; @@ -2359,8 +2311,8 @@ int QObject::receivers(const char *signal) const const QObjectPrivate::ConnectionList &connectionList = d->connectionLists->at(signal_index); for (int i = 0; i < connectionList.count(); ++i) { - const QObjectPrivate::Connection &c = connectionList.at(i); - receivers += c.receiver ? 1 : 0; + const QObjectPrivate::Connection *c = connectionList.at(i); + receivers += c->receiver ? 1 : 0; } } } @@ -2793,20 +2745,18 @@ bool QMetaObject::connect(const QObject *sender, int signal_index, QObject *s = const_cast<QObject *>(sender); QObject *r = const_cast<QObject *>(receiver); + QObjectPrivate::Connection *c = new QObjectPrivate::Connection; + c->sender = s; + c->receiver = r; + c->method = method_index; + c->connectionType = type; + c->argumentTypes = types; + QOrderedMutexLocker locker(&s->d_func()->threadData->mutex, &r->d_func()->threadData->mutex); -#if defined(Q_CC_HPACC) && defined(QT_ARCH_PARISC) - QObjectPrivate::Connection c; - c.receiver = r; - c.method = method_index; - c.connectionType = type; - c.argumentTypes = types; -#else - QObjectPrivate::Connection c = { r, method_index, type, Q_BASIC_ATOMIC_INITIALIZER(types) }; -#endif - s->d_func()->addConnection(signal_index, &c); - r->d_func()->refSender(s, signal_index); + s->d_func()->addConnection(signal_index, c); + r->d_func()->senders.append(c); if (signal_index < 0) sender->d_func()->connectedSignals = ~0u; @@ -2845,27 +2795,23 @@ bool QMetaObject::disconnect(const QObject *sender, int signal_index, for (signal_index = -1; signal_index < connectionLists->count(); ++signal_index) { QObjectPrivate::ConnectionList &connectionList = (*connectionLists)[signal_index]; for (int i = 0; i < connectionList.count(); ++i) { - QObjectPrivate::Connection *c = &connectionList[i]; + QObjectPrivate::Connection *c = connectionList[i]; if (c->receiver && (r == 0 || (c->receiver == r && (method_index < 0 || c->method == method_index)))) { QMutex *m = &c->receiver->d_func()->threadData->mutex; + bool needToUnlock = false; if (!receiverMutex && senderMutex != m) { // need to relock this receiver and sender in the correct order - bool needToUnlock = QOrderedMutexLocker::relock(senderMutex, m); - c = &connectionList[i]; - if (c->receiver) - c->receiver->d_func()->derefSender(s, signal_index); - if (needToUnlock) - m->unlock(); - } else { - // no need to unlock - c->receiver->d_func()->derefSender(s, signal_index); - } - if (c->argumentTypes && c->argumentTypes != &DIRECT_CONNECTION_ONLY) { - qFree(c->argumentTypes); - c->argumentTypes = 0; + needToUnlock = QOrderedMutexLocker::relock(senderMutex, m); + c = connectionList[i]; } + if (c->receiver) + c->receiver->d_func()->senders.removeOne(c); + + if (needToUnlock) + m->unlock(); + c->receiver = 0; success = true; @@ -2876,27 +2822,22 @@ bool QMetaObject::disconnect(const QObject *sender, int signal_index, } else if (signal_index < connectionLists->count()) { QObjectPrivate::ConnectionList &connectionList = (*connectionLists)[signal_index]; for (int i = 0; i < connectionList.count(); ++i) { - QObjectPrivate::Connection *c = &connectionList[i]; + QObjectPrivate::Connection *c = connectionList[i]; if (c->receiver && (r == 0 || (c->receiver == r && (method_index < 0 || c->method == method_index)))) { QMutex *m = &c->receiver->d_func()->threadData->mutex; + bool needToUnlock = false; if (!receiverMutex && senderMutex != m) { // need to relock this receiver and sender in the correct order - bool needToUnlock = QOrderedMutexLocker::relock(senderMutex, m); - c = &connectionList[i]; - if (c->receiver) - c->receiver->d_func()->derefSender(s, signal_index); - if (needToUnlock) - m->unlock(); - } else { - // no need to unlock - c->receiver->d_func()->derefSender(s, signal_index); - } - if (c->argumentTypes && c->argumentTypes != &DIRECT_CONNECTION_ONLY) { - qFree(c->argumentTypes); - c->argumentTypes = 0; + needToUnlock = QOrderedMutexLocker::relock(senderMutex, m); + c = connectionList[i]; } + if (c->receiver) + c->receiver->d_func()->senders.removeOne(c); + + if (needToUnlock) + m->unlock(); c->receiver = 0; success = true; @@ -2979,32 +2920,31 @@ void QMetaObject::connectSlotsByName(QObject *o) } } -static void queued_activate(QObject *sender, int signal, const QObjectPrivate::Connection &c, +static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connection *c, void **argv, QSemaphore *semaphore = 0) { - if (!c.argumentTypes || c.argumentTypes != &DIRECT_CONNECTION_ONLY) { + if (!c->argumentTypes && c->argumentTypes != &DIRECT_CONNECTION_ONLY) { QMetaMethod m = sender->metaObject()->method(signal); - QObjectPrivate::Connection &x = const_cast<QObjectPrivate::Connection &>(c); int *tmp = queuedConnectionTypes(m.parameterTypes()); if (!tmp) // cannot queue arguments tmp = &DIRECT_CONNECTION_ONLY; - if (!x.argumentTypes.testAndSetOrdered(0, tmp)) { + if (!c->argumentTypes.testAndSetOrdered(0, tmp)) { if (tmp != &DIRECT_CONNECTION_ONLY) - qFree(tmp); + delete [] tmp; } } - if (c.argumentTypes == &DIRECT_CONNECTION_ONLY) // cannot activate + if (c->argumentTypes == &DIRECT_CONNECTION_ONLY) // cannot activate return; int nargs = 1; // include return type - while (c.argumentTypes[nargs-1]) + while (c->argumentTypes[nargs-1]) ++nargs; int *types = (int *) qMalloc(nargs*sizeof(int)); void **args = (void **) qMalloc(nargs*sizeof(void *)); types[0] = 0; // return type args[0] = 0; // return value for (int n = 1; n < nargs; ++n) - args[n] = QMetaType::construct((types[n] = c.argumentTypes[n-1]), argv[n]); - QCoreApplication::postEvent(c.receiver, new QMetaCallEvent(c.method, + args[n] = QMetaType::construct((types[n] = c->argumentTypes[n-1]), argv[n]); + QCoreApplication::postEvent(c->receiver, new QMetaCallEvent(c->method, sender, signal, nargs, @@ -3013,13 +2953,13 @@ static void queued_activate(QObject *sender, int signal, const QObjectPrivate::C semaphore)); } -static void blocking_activate(QObject *sender, int signal, const QObjectPrivate::Connection &c, void **argv) +static void blocking_activate(QObject *sender, int signal, QObjectPrivate::Connection *c, void **argv) { - if (QThread::currentThread() == c.receiver->thread()) { + if (QThread::currentThread() == c->receiver->thread()) { qWarning("Qt: Dead lock detected while activating a BlockingQueuedConnection: " "Sender is %s(%p), receiver is %s(%p)", sender->metaObject()->className(), sender, - c.receiver->metaObject()->className(), c.receiver); + c->receiver->metaObject()->className(), c->receiver); } #ifdef QT_NO_THREAD @@ -3069,7 +3009,7 @@ void QMetaObject::activate(QObject *sender, int from_signal_index, int to_signal } int count = connectionLists->at(signal).count(); for (int i = 0; i < count; ++i) { - const QObjectPrivate::Connection *c = &connectionLists->at(signal)[i]; + QObjectPrivate::Connection *c = connectionLists->at(signal)[i]; if (!c->receiver) continue; @@ -3081,10 +3021,10 @@ void QMetaObject::activate(QObject *sender, int from_signal_index, int to_signal && (currentThreadData != sender->d_func()->threadData || receiver->d_func()->threadData != sender->d_func()->threadData)) || (c->connectionType == Qt::QueuedConnection)) { - queued_activate(sender, signal, *c, argv); + queued_activate(sender, signal, c, argv); continue; } else if (c->connectionType == Qt::BlockingQueuedConnection) { - blocking_activate(sender, signal, *c, argv); + blocking_activate(sender, signal, c, argv); continue; } @@ -3412,16 +3352,16 @@ void QObject::dumpObjectInfo() // receivers const QObjectPrivate::ConnectionList &connectionList = d->connectionLists->at(signal_index); for (int i = 0; i < connectionList.count(); ++i) { - const QObjectPrivate::Connection &c = connectionList.at(i); - if (!c.receiver) { + const QObjectPrivate::Connection *c = connectionList.at(i); + if (!c->receiver) { qDebug(" <Disconnected receiver>"); continue; } - const QMetaObject *receiverMetaObject = c.receiver->metaObject(); - const QMetaMethod method = receiverMetaObject->method(c.method); + const QMetaObject *receiverMetaObject = c->receiver->metaObject(); + const QMetaMethod method = receiverMetaObject->method(c->method); qDebug(" --> %s::%s %s", receiverMetaObject->className(), - c.receiver->objectName().isEmpty() ? "unnamed" : qPrintable(c.receiver->objectName()), + c->receiver->objectName().isEmpty() ? "unnamed" : qPrintable(c->receiver->objectName()), method.signature()); } } @@ -3434,13 +3374,12 @@ void QObject::dumpObjectInfo() if (!d->senders.isEmpty()) { for (int i = 0; i < d->senders.count(); ++i) { - const QObjectPrivate::Sender &s = d->senders.at(i); - const QMetaObject *senderMetaObject = s.sender->metaObject(); - const QMetaMethod signal = senderMetaObject->method(s.signal); - qDebug(" <-- %s::%s %s", - senderMetaObject->className(), - s.sender->objectName().isEmpty() ? "unnamed" : qPrintable(s.sender->objectName()), - signal.signature()); + const QObjectPrivate::Connection *s = d->senders.at(i); + const QMetaMethod slot = metaObject()->method(s->method); + qDebug(" <-- %s::%s %s", + s->sender->metaObject()->className(), + s->sender->objectName().isEmpty() ? "unnamed" : qPrintable(s->sender->objectName()), + slot.signature()); } } else { qDebug(" <None>"); diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index b324334..96d79af 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -114,7 +114,6 @@ public: int signal; int ref; }; - // object currently activating the object Sender *currentSender; @@ -148,22 +147,20 @@ public: // Note: you must hold the signalSlotLock() before accessing the lists below or calling the functions struct Connection { + QObject *sender; QObject *receiver; int method; uint connectionType : 3; // 0 == auto, 1 == direct, 2 == queued, 4 == blocking QBasicAtomicPointer<int> argumentTypes; + ~Connection(); }; - typedef QList<Connection> ConnectionList; + typedef QList<Connection *> ConnectionList; QObjectConnectionListVector *connectionLists; void addConnection(int signal, Connection *c); - void removeReceiver(int signal, QObject *receiver); void cleanConnectionLists(); - QList<Sender> senders; - void refSender(QObject *sender, int signal); - void derefSender(QObject *sender, int signal); - void removeSender(QObject *sender, int signal); + ConnectionList senders; static Sender *setCurrentSender(QObject *receiver, Sender *sender); @@ -208,7 +205,7 @@ private: QSemaphore *semaphore_; }; -class Q_CORE_EXPORT QBoolBlocker +class QBoolBlocker { public: inline QBoolBlocker(bool &b, bool value=true):block(b), reset(b){block = value;} diff --git a/src/corelib/tools/qringbuffer_p.h b/src/corelib/tools/qringbuffer_p.h index 3a0901d..eed4ba9 100644 --- a/src/corelib/tools/qringbuffer_p.h +++ b/src/corelib/tools/qringbuffer_p.h @@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE -class Q_CORE_EXPORT QRingBuffer +class QRingBuffer { public: inline QRingBuffer(int growth = 4096) : basicBlockSize(growth) { diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index 1493dce..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) 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(); 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<T>::detach_helper() { realloc(d->size, d->alloc); } template <typename T> void QVector<T>::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 <typename T> void QVector<T>::resize(int asize) { realloc(asize, (asize > d->alloc || (!d->capacity && asize < d->size && asize < (d->alloc >> 1))) ? 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; } diff --git a/src/gui/dialogs/qcolordialog.cpp b/src/gui/dialogs/qcolordialog.cpp index e06d14a..7e885da 100644 --- a/src/gui/dialogs/qcolordialog.cpp +++ b/src/gui/dialogs/qcolordialog.cpp @@ -1578,10 +1578,11 @@ void QColorDialog::setCurrentColor(const QColor &color) { Q_D(QColorDialog); d->setCurrentColor(color.rgb()); - d->selectColor(color.rgb()); + d->selectColor(color); d->setCurrentAlpha(color.alpha()); #ifdef Q_WS_MAC + d->setCurrentQColor(color); if (d->delegate) QColorDialogPrivate::setColor(d->delegate, color); #endif diff --git a/src/gui/dialogs/qcolordialog_mac.mm b/src/gui/dialogs/qcolordialog_mac.mm index 2556265..9862c1c 100644 --- a/src/gui/dialogs/qcolordialog_mac.mm +++ b/src/gui/dialogs/qcolordialog_mac.mm @@ -234,16 +234,22 @@ QT_USE_NAMESPACE CGFloat cyan, magenta, yellow, black, alpha; [color getCyan:&cyan magenta:&magenta yellow:&yellow black:&black alpha:&alpha]; mQtColor->setCmykF(cyan, magenta, yellow, black, alpha); + } else if (colorSpace == NSCalibratedRGBColorSpace || colorSpace == NSDeviceRGBColorSpace) { + CGFloat red, green, blue, alpha; + [color getRed:&red green:&green blue:&blue alpha:&alpha]; + mQtColor->setRgbF(red, green, blue, alpha); } else { - NSColor *tmpColor; - if (colorSpace == NSCalibratedRGBColorSpace || colorSpace == NSDeviceRGBColorSpace) { - tmpColor = color; + NSColorSpace *colorSpace = [color colorSpace]; + if ([colorSpace colorSpaceModel] == NSCMYKColorSpaceModel && [color numberOfComponents] == 5){ + CGFloat components[5]; + [color getComponents:components]; + mQtColor->setCmykF(components[0], components[1], components[2], components[3], components[4]); } else { - tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; + NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; + CGFloat red, green, blue, alpha; + [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha]; + mQtColor->setRgbF(red, green, blue, alpha); } - CGFloat red, green, blue, alpha; - [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha]; - mQtColor->setRgbF(red, green, blue, alpha); } if (mPriv) @@ -414,10 +420,20 @@ void QColorDialogPrivate::setColor(void *delegate, const QColor &color) { QMacCocoaAutoReleasePool pool; QCocoaColorPanelDelegate *theDelegate = static_cast<QCocoaColorPanelDelegate *>(delegate); - NSColor *nsColor = [NSColor colorWithCalibratedRed:color.red() / 255.0 - green:color.green() / 255.0 - blue:color.blue() / 255.0 - alpha:color.alpha() / 255.0]; + NSColor *nsColor; + const QColor::Spec spec = color.spec(); + if (spec == QColor::Cmyk) { + nsColor = [NSColor colorWithDeviceCyan:color.cyanF() + magenta:color.magentaF() + yellow:color.yellowF() + black:color.blackF() + alpha:color.alphaF()]; + } else { + nsColor = [NSColor colorWithCalibratedRed:color.redF() + green:color.greenF() + blue:color.blueF() + alpha:color.alphaF()]; + } [[theDelegate colorPanel] setColor:nsColor]; } diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp index 044aa43..903cd74 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/src/gui/dialogs/qprintpreviewdialog.cpp b/src/gui/dialogs/qprintpreviewdialog.cpp index c00bd14..3580fdc 100644 --- a/src/gui/dialogs/qprintpreviewdialog.cpp +++ b/src/gui/dialogs/qprintpreviewdialog.cpp @@ -54,6 +54,9 @@ #include <QtGui/qtoolbutton.h> #include <QtGui/qvalidator.h> #include <QtGui/qfiledialog.h> +#include <QtGui/qmainwindow.h> +#include <QtGui/qtoolbar.h> +#include <QtGui/qformlayout.h> #include <QtCore/QCoreApplication> #include <math.h> @@ -63,6 +66,13 @@ QT_BEGIN_NAMESPACE namespace { +class QPrintPreviewMainWindow : public QMainWindow +{ +public: + QPrintPreviewMainWindow(QWidget *parent) : QMainWindow(parent) {} + QMenu *createPopupMenu() { return 0; } +}; + class ZoomFactorValidator : public QDoubleValidator { public: @@ -197,7 +207,6 @@ public: QActionGroup *printerGroup; QAction *printAction; QAction *pageSetupAction; - QAction *closeAction; QPointer<QObject> receiverToDisconnectOnClose; QByteArray memberToDisconnectOnClose; @@ -219,27 +228,12 @@ void QPrintPreviewDialogPrivate::init(QPrinter *_printer) QObject::connect(preview, SIGNAL(previewChanged()), q, SLOT(_q_previewChanged())); setupActions(); - // Navigation - QToolButton* nextPageButton = new QToolButton; - nextPageButton->setDefaultAction(nextPageAction); - QToolButton* prevPageButton = new QToolButton; - prevPageButton->setDefaultAction(prevPageAction); - QToolButton* firstPageButton = new QToolButton; - firstPageButton->setDefaultAction(firstPageAction); - QToolButton* lastPageButton = new QToolButton; - lastPageButton->setDefaultAction(lastPageAction); - pageNumEdit = new LineEdit; pageNumEdit->setAlignment(Qt::AlignRight); - pageNumEdit->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding)); + pageNumEdit->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); pageNumLabel = new QLabel; QObject::connect(pageNumEdit, SIGNAL(editingFinished()), q, SLOT(_q_pageNumEdited())); - QToolButton* fitWidthButton = new QToolButton; - fitWidthButton->setDefaultAction(fitWidthAction); - QToolButton* fitPageButton = new QToolButton; - fitPageButton->setDefaultAction(fitPageAction); - zoomFactor = new QComboBox; zoomFactor->setEditable(true); zoomFactor->setMinimumContentsLength(7); @@ -255,77 +249,66 @@ void QPrintPreviewDialogPrivate::init(QPrinter *_printer) QObject::connect(zoomFactor, SIGNAL(currentIndexChanged(int)), q, SLOT(_q_zoomFactorChanged())); - QToolButton* zoomInButton = new QToolButton; - zoomInButton->setDefaultAction(zoomInAction); + QPrintPreviewMainWindow *mw = new QPrintPreviewMainWindow(q); + QToolBar *toolbar = new QToolBar(mw); + toolbar->addAction(fitWidthAction); + toolbar->addAction(fitPageAction); + toolbar->addSeparator(); + toolbar->addWidget(zoomFactor); + toolbar->addAction(zoomOutAction); + toolbar->addAction(zoomInAction); + toolbar->addSeparator(); + toolbar->addAction(portraitAction); + toolbar->addAction(landscapeAction); + toolbar->addSeparator(); + toolbar->addAction(firstPageAction); + toolbar->addAction(prevPageAction); + + // this is to ensure the label text and the editor text are + // aligned in all styles - the extra QVBoxLayout is a workaround + // for bug in QFormLayout + QWidget *pageEdit = new QWidget(toolbar); + QVBoxLayout *vboxLayout = new QVBoxLayout; + vboxLayout->setContentsMargins(0, 0, 0, 0); + QFormLayout *formLayout = new QFormLayout; + formLayout->setWidget(0, QFormLayout::LabelRole, pageNumEdit); + formLayout->setWidget(0, QFormLayout::FieldRole, pageNumLabel); + vboxLayout->addLayout(formLayout); + vboxLayout->setAlignment(Qt::AlignVCenter); + pageEdit->setLayout(vboxLayout); + toolbar->addWidget(pageEdit); + + toolbar->addAction(nextPageAction); + toolbar->addAction(lastPageAction); + toolbar->addSeparator(); + toolbar->addAction(singleModeAction); + toolbar->addAction(facingModeAction); + toolbar->addAction(overviewModeAction); + toolbar->addSeparator(); + toolbar->addAction(pageSetupAction); + toolbar->addAction(printAction); + + // Cannot use the actions' triggered signal here, since it doesn't autorepeat + QToolButton *zoomInButton = static_cast<QToolButton *>(toolbar->widgetForAction(zoomInAction)); + QToolButton *zoomOutButton = static_cast<QToolButton *>(toolbar->widgetForAction(zoomOutAction)); zoomInButton->setAutoRepeat(true); zoomInButton->setAutoRepeatInterval(200); zoomInButton->setAutoRepeatDelay(200); - - QToolButton* zoomOutButton = new QToolButton; - zoomOutButton->setDefaultAction(zoomOutAction); zoomOutButton->setAutoRepeat(true); zoomOutButton->setAutoRepeatInterval(200); zoomOutButton->setAutoRepeatDelay(200); - - //Cannot use the actions' triggered signal here, since it doesnt autorepeat QObject::connect(zoomInButton, SIGNAL(clicked()), q, SLOT(_q_zoomIn())); QObject::connect(zoomOutButton, SIGNAL(clicked()), q, SLOT(_q_zoomOut())); - QToolButton* portraitButton = new QToolButton; - portraitButton->setDefaultAction(portraitAction); - QToolButton* landscapeButton = new QToolButton; - landscapeButton->setDefaultAction(landscapeAction); - - QToolButton* singleModeButton = new QToolButton; - singleModeButton->setDefaultAction(singleModeAction); - QToolButton* facingModeButton = new QToolButton; - facingModeButton->setDefaultAction(facingModeAction); - QToolButton* overviewModeButton = new QToolButton; - overviewModeButton->setDefaultAction(overviewModeAction); - - QToolButton *printButton = new QToolButton; - printButton->setDefaultAction(printAction); - QToolButton *pageSetupButton = new QToolButton; - pageSetupButton->setDefaultAction(pageSetupAction); - QToolButton *closeButton = new QToolButton; - closeButton->setDefaultAction(closeAction); - - QHBoxLayout* modeLayout = new QHBoxLayout; - modeLayout->setSpacing(0); - modeLayout->addWidget(singleModeButton); - modeLayout->addWidget(facingModeButton); - modeLayout->addWidget(overviewModeButton); - - QHBoxLayout *barLayout = new QHBoxLayout; - barLayout->addWidget(fitWidthButton); - barLayout->addWidget(fitPageButton); - barLayout->addWidget(zoomFactor); - barLayout->addWidget(zoomOutButton); - barLayout->addWidget(zoomInButton); - barLayout->addWidget(portraitButton); - barLayout->addWidget(landscapeButton); - barLayout->addStretch(); - barLayout->addWidget(firstPageButton); - barLayout->addWidget(prevPageButton); - barLayout->addWidget(pageNumEdit); - barLayout->addWidget(pageNumLabel); - barLayout->addWidget(nextPageButton); - barLayout->addWidget(lastPageButton); - barLayout->addStretch(); - barLayout->addLayout(modeLayout); - barLayout->addStretch(); - barLayout->addWidget(pageSetupButton); - barLayout->addWidget(printButton); - barLayout->addWidget(closeButton); - - QWidget* buttonBar = new QWidget; - buttonBar->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum)); - barLayout->setMargin(0); - buttonBar->setLayout(barLayout); + mw->addToolBar(toolbar); + mw->setCentralWidget(preview); + // QMainWindows are always created as top levels, force it to be a + // plain widget + mw->setParent(q, Qt::Widget); QVBoxLayout *topLayout = new QVBoxLayout; - topLayout->addWidget(buttonBar); - topLayout->addWidget(preview); + topLayout->addWidget(mw); + topLayout->setMargin(0); q->setLayout(topLayout); QString caption = QCoreApplication::translate("QPrintPreviewDialog", "Print Preview"); @@ -338,7 +321,8 @@ void QPrintPreviewDialogPrivate::init(QPrinter *_printer) || printer->outputFormat() != QPrinter::NativeFormat #endif ) - pageSetupButton->setEnabled(false); + pageSetupAction->setEnabled(false); + preview->setFocus(); } static inline void qt_setupActionIcon(QAction *action, const QLatin1String &name) @@ -418,12 +402,10 @@ void QPrintPreviewDialogPrivate::setupActions() printerGroup = new QActionGroup(q); printAction = printerGroup->addAction(QCoreApplication::translate("QPrintPreviewDialog", "Print")); pageSetupAction = printerGroup->addAction(QCoreApplication::translate("QPrintPreviewDialog", "Page setup")); - closeAction = printerGroup->addAction(QCoreApplication::translate("QPrintPreviewDialog", "Close")); qt_setupActionIcon(printAction, QLatin1String("print")); qt_setupActionIcon(pageSetupAction, QLatin1String("page-setup")); QObject::connect(printAction, SIGNAL(triggered(bool)), q, SLOT(_q_print())); QObject::connect(pageSetupAction, SIGNAL(triggered(bool)), q, SLOT(_q_pageSetup())); - QObject::connect(closeAction, SIGNAL(triggered(bool)), q, SLOT(reject())); // Initial state: fitPageAction->setChecked(true); diff --git a/src/gui/graphicsview/qgraphicsview_p.h b/src/gui/graphicsview/qgraphicsview_p.h index abab921..daaeca2 100644 --- a/src/gui/graphicsview/qgraphicsview_p.h +++ b/src/gui/graphicsview/qgraphicsview_p.h @@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE -class Q_GUI_EXPORT QGraphicsViewPrivate : public QAbstractScrollAreaPrivate +class QGraphicsViewPrivate : public QAbstractScrollAreaPrivate { Q_DECLARE_PUBLIC(QGraphicsView) public: diff --git a/src/gui/graphicsview/qgraphicswidget_p.h b/src/gui/graphicsview/qgraphicswidget_p.h index 3509a54..f4cdeca 100644 --- a/src/gui/graphicsview/qgraphicswidget_p.h +++ b/src/gui/graphicsview/qgraphicswidget_p.h @@ -68,7 +68,7 @@ class QStyleOptionTitleBar; #if !defined(QT_NO_GRAPHICSVIEW) || (QT_EDITION & QT_MODULE_GRAPHICSVIEW) != QT_MODULE_GRAPHICSVIEW -class Q_GUI_EXPORT QGraphicsWidgetPrivate : public QGraphicsItemPrivate +class QGraphicsWidgetPrivate : public QGraphicsItemPrivate { Q_DECLARE_PUBLIC(QGraphicsWidget) public: diff --git a/src/gui/image/qnativeimage_p.h b/src/gui/image/qnativeimage_p.h index 860485a..6402af2 100644 --- a/src/gui/image/qnativeimage_p.h +++ b/src/gui/image/qnativeimage_p.h @@ -70,7 +70,7 @@ QT_BEGIN_NAMESPACE class QWidget; -class Q_GUI_EXPORT QNativeImage +class QNativeImage { public: QNativeImage(int width, int height, QImage::Format format, bool isTextBuffer = false, QWidget *widget = 0); diff --git a/src/gui/itemviews/qabstractitemview_p.h b/src/gui/itemviews/qabstractitemview_p.h index 16bd1ab..139d0b7 100644 --- a/src/gui/itemviews/qabstractitemview_p.h +++ b/src/gui/itemviews/qabstractitemview_p.h @@ -99,7 +99,7 @@ public: QVariant data(const QModelIndex &, int) const { return QVariant(); } }; -class Q_GUI_EXPORT QAbstractItemViewPrivate : public QAbstractScrollAreaPrivate +class QAbstractItemViewPrivate : public QAbstractScrollAreaPrivate { Q_DECLARE_PUBLIC(QAbstractItemView) diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp index 4c31d33..15f0511 100644 --- a/src/gui/kernel/qevent.cpp +++ b/src/gui/kernel/qevent.cpp @@ -862,6 +862,17 @@ bool QKeyEvent::matches(QKeySequence::StandardKey matchKey) const uint searchkey = (modifiers() | key()) & ~(Qt::KeypadModifier); //The keypad modifier should not make a difference uint platform = QApplicationPrivate::currentPlatform(); +#ifdef Q_WS_MAC + if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) { + uint oldSearchKey = searchkey; + searchkey &= ~(Qt::ControlModifier | Qt::MetaModifier); + if (oldSearchKey & Qt::ControlModifier) + searchkey |= Qt::MetaModifier; + if (oldSearchKey & Qt::MetaModifier) + searchkey |= Qt::ControlModifier; + } +#endif + uint N = QKeySequencePrivate::numberOfKeyBindings; int first = 0; int last = N - 1; diff --git a/src/gui/kernel/qkeymapper.cpp b/src/gui/kernel/qkeymapper.cpp index 535d009..503a33b 100644 --- a/src/gui/kernel/qkeymapper.cpp +++ b/src/gui/kernel/qkeymapper.cpp @@ -116,6 +116,4 @@ QKeyMapperPrivate *qt_keymapper_private() return QKeyMapper::instance()->d_func(); } -Q_GUI_EXPORT QList<int> qt_keymapper_possibleKeys(QKeyEvent *e) { return QKeyMapper::instance()->possibleKeys(e); } - QT_END_NAMESPACE diff --git a/src/gui/kernel/qkeymapper_mac.cpp b/src/gui/kernel/qkeymapper_mac.cpp index 39abc5e..01b2c13 100644 --- a/src/gui/kernel/qkeymapper_mac.cpp +++ b/src/gui/kernel/qkeymapper_mac.cpp @@ -161,6 +161,14 @@ Qt::KeyboardModifiers qt_mac_get_modifiers(int keys) ret |= Qt::KeyboardModifier(qt_mac_modifier_symbols[i].qt_code); } } + if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) { + Qt::KeyboardModifiers oldModifiers = ret; + ret &= ~(Qt::MetaModifier | Qt::ControlModifier); + if (oldModifiers & Qt::ControlModifier) + ret |= Qt::MetaModifier; + if (oldModifiers & Qt::MetaModifier) + ret |= Qt::ControlModifier; + } return ret; } static int qt_mac_get_mac_modifiers(Qt::KeyboardModifiers keys) @@ -177,6 +185,15 @@ static int qt_mac_get_mac_modifiers(Qt::KeyboardModifiers keys) ret |= qt_mac_modifier_symbols[i].mac_code; } } + + if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) { + int oldModifiers = ret; + ret &= ~(controlKeyBit | cmdKeyBit); + if (oldModifiers & controlKeyBit) + ret |= cmdKeyBit; + if (oldModifiers & cmdKeyBit) + ret |= controlKeyBit; + } return ret; } void qt_mac_send_modifiers_changed(quint32 modifiers, QObject *object) diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp index 352d26a..d1cb572 100644 --- a/src/gui/kernel/qkeysequence.cpp +++ b/src/gui/kernel/qkeysequence.cpp @@ -105,20 +105,39 @@ static bool operator<(int key, const MacSpecialKey &entry) static const MacSpecialKey * const MacSpecialKeyEntriesEnd = entries + NumEntries; -static QChar macSymbolForQtKey(int key) +QChar qt_macSymbolForQtKey(int key) { const MacSpecialKey *i = qBinaryFind(entries, MacSpecialKeyEntriesEnd, key); if (i == MacSpecialKeyEntriesEnd) return QChar(); - return QChar(i->macSymbol); + ushort macSymbol = i->macSymbol; + if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta) + && (macSymbol == kControlUnicode || macSymbol == kCommandUnicode)) { + if (macSymbol == kControlUnicode) + macSymbol = kCommandUnicode; + else + macSymbol = kControlUnicode; + } + + return QChar(macSymbol); } static int qtkeyForMacSymbol(const QChar ch) { + const ushort unicode = ch.unicode(); for (int i = 0; i < NumEntries; ++i) { const MacSpecialKey &entry = entries[i]; - if (entry.macSymbol == ch.unicode()) - return entry.key; + if (entry.macSymbol == unicode) { + int key = entry.key; + if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta) + && (unicode == kControlUnicode || unicode == kCommandUnicode)) { + if (unicode == kControlUnicode) + key = Qt::Key_Control; + else + key = Qt::Key_Meta; + } + return key; + } } return -1; } @@ -213,12 +232,14 @@ void Q_GUI_EXPORT qt_set_sequence_auto_mnemonic(bool b) { qt_sequence_no_mnemoni \row \i Open \i Ctrl+O \i Ctrl+O \i Ctrl+O \i Ctrl+O \row \i Close \i Ctrl+F4, Ctrl+W \i Ctrl+W, Ctrl+F4 \i Ctrl+W \i Ctrl+W \row \i Save \i Ctrl+S \i Ctrl+S \i Ctrl+S \i Ctrl+S + \row \i Quit \i \i Ctrl+Q \i Qtrl+Q \i Qtrl+Q \row \i SaveAs \i \i Ctrl+Shift+S \i \i Ctrl+Shift+S \row \i New \i Ctrl+N \i Ctrl+N \i Ctrl+N \i Ctrl+N \row \i Delete \i Del \i Del, Meta+D \i Del, Ctrl+D \i Del, Ctrl+D \row \i Cut \i Ctrl+X, Shift+Del \i Ctrl+X \i Ctrl+X, F20, Shift+Del \i Ctrl+X, F20, Shift+Del \row \i Copy \i Ctrl+C, Ctrl+Ins \i Ctrl+C \i Ctrl+C, F16, Ctrl+Ins \i Ctrl+C, F16, Ctrl+Ins \row \i Paste \i Ctrl+V, Shift+Ins \i Ctrl+V \i Ctrl+V, F18, Shift+Ins \i Ctrl+V, F18, Shift+Ins + \row \i Preferences \i \i Ctrl+, \i \i \row \i Undo \i Ctrl+Z, Alt+Backspace \i Ctrl+Z \i Ctrl+Z, F14 \i Ctrl+Z, F14 \row \i Redo \i Ctrl+Y, Shift+Ctrl+Z, Alt+Shift+Backspace \i Ctrl+Shift+Z, Ctrl+Y \i Ctrl+Shift+Z \i Ctrl+Shift+Z \row \i Back \i Alt+Left, Backspace \i Ctrl+[ \i Alt+Left \i Alt+Left @@ -521,6 +542,7 @@ const QKeyBinding QKeySequencePrivate::keyBindings[] = { {QKeySequence::FindPrevious, 1, Qt::SHIFT | Qt::Key_F3, QApplicationPrivate::KB_Win}, {QKeySequence::ZoomIn, 1, Qt::CTRL | Qt::Key_Plus, QApplicationPrivate::KB_All}, {QKeySequence::NextChild, 0, Qt::CTRL | Qt::Key_Comma, QApplicationPrivate::KB_KDE}, + {QKeySequence::Preferences, 0, Qt::CTRL | Qt::Key_Comma, QApplicationPrivate::KB_Mac}, {QKeySequence::ZoomOut, 1, Qt::CTRL | Qt::Key_Minus, QApplicationPrivate::KB_All}, {QKeySequence::PreviousChild, 0, Qt::CTRL | Qt::Key_Period, QApplicationPrivate::KB_KDE}, {QKeySequence::HelpContents, 1, Qt::CTRL | Qt::Key_Question, QApplicationPrivate::KB_Mac}, @@ -538,6 +560,7 @@ const QKeyBinding QKeySequencePrivate::keyBindings[] = { {QKeySequence::New, 1, Qt::CTRL | Qt::Key_N, QApplicationPrivate::KB_All}, {QKeySequence::Open, 1, Qt::CTRL | Qt::Key_O, QApplicationPrivate::KB_All}, {QKeySequence::Print, 1, Qt::CTRL | Qt::Key_P, QApplicationPrivate::KB_All}, + {QKeySequence::Quit, 0, Qt::CTRL | Qt::Key_Q, QApplicationPrivate::KB_Gnome | QApplicationPrivate::KB_KDE | QApplicationPrivate::KB_Mac}, {QKeySequence::Refresh, 1, Qt::CTRL | Qt::Key_R, QApplicationPrivate::KB_Gnome | QApplicationPrivate::KB_Mac}, {QKeySequence::Replace, 0, Qt::CTRL | Qt::Key_R, QApplicationPrivate::KB_KDE}, {QKeySequence::Save, 1, Qt::CTRL | Qt::Key_S, QApplicationPrivate::KB_All}, @@ -671,12 +694,14 @@ const uint QKeySequencePrivate::numberOfKeyBindings = sizeof(QKeySequencePrivate \value NextChild Navigate to next tab or child window. \value Open Open document. \value Paste Paste. + \value Preferences Open the preferences dialog. \value PreviousChild Navigate to previous tab or child window. \value Print Print document. + \value Quit Quit the application. \value Redo Redo. \value Refresh Refresh or reload current document. \value Replace Find and replace. - \value SaveAs Save document after prompting the user for a file name. + \value SaveAs Save document after prompting the user for a file name. \value Save Save document. \value SelectAll Select all text. \value SelectEndOfBlock Extend selection to the end of a text block. This shortcut is only used on OS X. @@ -782,6 +807,21 @@ QKeySequence::QKeySequence(const QKeySequence& keysequence) d->ref.ref(); } +#ifdef Q_WS_MAC +static inline int maybeSwapShortcut(int shortcut) +{ + if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) { + uint oldshortcut = shortcut; + shortcut &= ~(Qt::CTRL | Qt::META); + if (oldshortcut & Qt::CTRL) + shortcut |= Qt::META; + if (oldshortcut & Qt::META) + shortcut |= Qt::CTRL; + } + return shortcut; +} +#endif + /*! \since 4.2 @@ -798,10 +838,16 @@ QList<QKeySequence> QKeySequence::keyBindings(StandardKey key) for (uint i = 0; i < QKeySequencePrivate::numberOfKeyBindings ; ++i) { QKeyBinding keyBinding = QKeySequencePrivate::keyBindings[i]; if (keyBinding.standardKey == key && (keyBinding.platform & platform)) { - if (keyBinding.priority > 0) - list.prepend(QKeySequence(QKeySequencePrivate::keyBindings[i].shortcut)); - else - list.append(QKeySequence(QKeySequencePrivate::keyBindings[i].shortcut)); + uint shortcut = +#ifdef Q_WS_MAC + maybeSwapShortcut(QKeySequencePrivate::keyBindings[i].shortcut); +#else + QKeySequencePrivate::keyBindings[i].shortcut; +#endif + if (keyBinding.priority > 0) + list.prepend(QKeySequence(shortcut)); + else + list.append(QKeySequence(shortcut)); } } return list; @@ -969,9 +1015,16 @@ int QKeySequencePrivate::decodeString(const QString &str, QKeySequence::Sequence gmodifs = globalModifs(); if (gmodifs->isEmpty()) { #ifdef Q_WS_MAC - *gmodifs << QModifKeyName(Qt::CTRL, QChar(kCommandUnicode)); + const bool dontSwap = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta); + if (dontSwap) + *gmodifs << QModifKeyName(Qt::META, QChar(kCommandUnicode)); + else + *gmodifs << QModifKeyName(Qt::CTRL, QChar(kCommandUnicode)); *gmodifs << QModifKeyName(Qt::ALT, QChar(kOptionUnicode)); - *gmodifs << QModifKeyName(Qt::META, QChar(kControlUnicode)); + if (dontSwap) + *gmodifs << QModifKeyName(Qt::CTRL, QChar(kControlUnicode)); + else + *gmodifs << QModifKeyName(Qt::META, QChar(kControlUnicode)); *gmodifs << QModifKeyName(Qt::SHIFT, QChar(kShiftUnicode)); #endif *gmodifs << QModifKeyName(Qt::CTRL, QLatin1String("ctrl+")) @@ -1069,8 +1122,6 @@ int QKeySequencePrivate::decodeString(const QString &str, QKeySequence::Sequence if (found) break; } -#ifdef Q_WS_MAC -#endif } return ret; } @@ -1099,15 +1150,30 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat QString s; #if defined(Q_WS_MAC) if (nativeText) { - // On MAC the order is Meta, Alt, Shift, Control. - if ((key & Qt::META) == Qt::META) - s += macSymbolForQtKey(Qt::Key_Meta); - if ((key & Qt::ALT) == Qt::ALT) - s += macSymbolForQtKey(Qt::Key_Alt); - if ((key & Qt::SHIFT) == Qt::SHIFT) - s += macSymbolForQtKey(Qt::Key_Shift); - if ((key & Qt::CTRL) == Qt::CTRL) - s += macSymbolForQtKey(Qt::Key_Control); + // On Mac OS X the order (by default) is Meta, Alt, Shift, Control. + // If the AA_MacDontSwapCtrlAndMeta is enabled, then the order + // is Ctrl, Alt, Shift, Meta. The macSymbolForQtKey does this swap + // for us, which means that we have to adjust our order here. + // The upshot is a lot more infrastructure to keep the number of + // if tests down and the code relatively clean. + static const int ModifierOrder[] = { Qt::META, Qt::ALT, Qt::SHIFT, Qt::CTRL, 0 }; + static const int QtKeyOrder[] = { Qt::Key_Meta, Qt::Key_Alt, Qt::Key_Shift, Qt::Key_Control, 0 }; + static const int DontSwapModifierOrder[] = { Qt::CTRL, Qt::ALT, Qt::SHIFT, Qt::META, 0 }; + static const int DontSwapQtKeyOrder[] = { Qt::Key_Control, Qt::Key_Alt, Qt::Key_Shift, Qt::Key_Meta, 0 }; + const int *modifierOrder; + const int *qtkeyOrder; + if (qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta)) { + modifierOrder = DontSwapModifierOrder; + qtkeyOrder = DontSwapQtKeyOrder; + } else { + modifierOrder = ModifierOrder; + qtkeyOrder = QtKeyOrder; + } + + for (int i = 0; modifierOrder[i] != 0; ++i) { + if (key & modifierOrder[i]) + s += qt_macSymbolForQtKey(qtkeyOrder[i]); + } } else #endif { @@ -1140,7 +1206,7 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat int i=0; #if defined(Q_WS_MAC) if (nativeText) { - QChar ch = macSymbolForQtKey(key); + QChar ch = qt_macSymbolForQtKey(key); if (!ch.isNull()) p = ch; else diff --git a/src/gui/kernel/qkeysequence.h b/src/gui/kernel/qkeysequence.h index 1c4776f..f78e34a 100644 --- a/src/gui/kernel/qkeysequence.h +++ b/src/gui/kernel/qkeysequence.h @@ -136,7 +136,9 @@ public: DeleteEndOfLine, InsertParagraphSeparator, InsertLineSeparator, - SaveAs + SaveAs, + Preferences, + Quit }; QKeySequence(); diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 1be4573..7d06d3f 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -11509,3 +11509,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 diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index a5cfbbd..4744f14 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 */ diff --git a/src/gui/painting/qpainterpath_p.h b/src/gui/painting/qpainterpath_p.h index 29c48df..6fb439d 100644 --- a/src/gui/painting/qpainterpath_p.h +++ b/src/gui/painting/qpainterpath_p.h @@ -124,7 +124,7 @@ private: Q_DISABLE_COPY(QVectorPathConverter) }; -class Q_GUI_EXPORT QPainterPathData : public QPainterPathPrivate +class QPainterPathData : public QPainterPathPrivate { public: QPainterPathData() : diff --git a/src/gui/painting/qprinter.cpp b/src/gui/painting/qprinter.cpp index 5efe0be..154d90c 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 diff --git a/src/gui/painting/qstroker_p.h b/src/gui/painting/qstroker_p.h index 72141aa..ca1f270 100644 --- a/src/gui/painting/qstroker_p.h +++ b/src/gui/painting/qstroker_p.h @@ -179,7 +179,7 @@ private: }; -class Q_GUI_EXPORT QStroker : public QStrokerOps +class QStroker : public QStrokerOps { public: diff --git a/src/gui/styles/qmacstyle_mac.mm b/src/gui/styles/qmacstyle_mac.mm index 64ec29a..5e538cb 100644 --- a/src/gui/styles/qmacstyle_mac.mm +++ b/src/gui/styles/qmacstyle_mac.mm @@ -5274,7 +5274,6 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex if (const QStyleOptionToolButton *tb = qstyleoption_cast<const QStyleOptionToolButton *>(opt)) { if (widget && qobject_cast<QToolBar *>(widget->parentWidget())) { -// p->fillRect(tb->rect, QColor(155, 0, 155, 155)); if (tb->subControls & SC_ToolButtonMenu) { QStyleOption arrowOpt(0); arrowOpt.rect = subControlRect(cc, tb, SC_ToolButtonMenu, widget); 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(); 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; 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 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/src/gui/widgets/qabstractscrollarea_p.h b/src/gui/widgets/qabstractscrollarea_p.h index e4c47e9..f153711 100644 --- a/src/gui/widgets/qabstractscrollarea_p.h +++ b/src/gui/widgets/qabstractscrollarea_p.h @@ -62,7 +62,7 @@ QT_BEGIN_NAMESPACE class QScrollBar; class QAbstractScrollAreaScrollBarContainer; -class Q_GUI_EXPORT QAbstractScrollAreaPrivate: public QFramePrivate +class QAbstractScrollAreaPrivate: public QFramePrivate { Q_DECLARE_PUBLIC(QAbstractScrollArea) diff --git a/src/gui/widgets/qframe_p.h b/src/gui/widgets/qframe_p.h index 4fd341d..3ea0c8b 100644 --- a/src/gui/widgets/qframe_p.h +++ b/src/gui/widgets/qframe_p.h @@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE -class Q_GUI_EXPORT QFramePrivate : public QWidgetPrivate +class QFramePrivate : public QWidgetPrivate { Q_DECLARE_PUBLIC(QFrame) public: diff --git a/src/gui/widgets/qmenu_mac.mm b/src/gui/widgets/qmenu_mac.mm index d2aad99..cce083f 100644 --- a/src/gui/widgets/qmenu_mac.mm +++ b/src/gui/widgets/qmenu_mac.mm @@ -142,6 +142,39 @@ static int qt_mac_CountMenuItems(OSMenuRef menu) return 0; } +static quint32 constructModifierMask(quint32 accel_key) +{ + quint32 ret = 0; + const bool dontSwap = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta); +#ifndef QT_MAC_USE_COCOA + if ((accel_key & Qt::ALT) == Qt::ALT) + ret |= kMenuOptionModifier; + if ((accel_key & Qt::SHIFT) == Qt::SHIFT) + ret |= kMenuShiftModifier; + if (dontSwap) { + if ((accel_key & Qt::META) != Qt::META) + ret |= kMenuNoCommandModifier; + if ((accel_key & Qt::CTRL) == Qt::CTRL) + ret |= kMenuControlModifier; + } else { + if ((accel_key & Qt::CTRL) != Qt::CTRL) + ret |= kMenuNoCommandModifier; + if ((accel_key & Qt::META) == Qt::META) + ret |= kMenuControlModifier; + } +#else + if ((accel_key & Qt::CTRL) == Qt::CTRL) + ret |= (dontSwap ? NSControlKeyMask : NSCommandKeyMask); + if ((accel_key & Qt::META) == Qt::META) + ret |= (dontSwap ? NSCommandKeyMask : NSControlKeyMask); + if ((accel_key & Qt::ALT) == Qt::ALT) + ret |= NSAlternateKeyMask; + if ((accel_key & Qt::SHIFT) == Qt::SHIFT) + ret |= NSShiftKeyMask; +#endif + return ret; +} + static bool actualMenuItemVisibility(const QMenuBarPrivate::QMacMenuBarPrivate *mbp, const QMacMenuAction *action) { @@ -525,15 +558,7 @@ static bool qt_mac_auto_apple_menu(MenuCommand cmd) static void qt_mac_get_accel(quint32 accel_key, quint32 *modif, quint32 *key) { if (modif) { - *modif = 0; - if ((accel_key & Qt::CTRL) != Qt::CTRL) - *modif |= kMenuNoCommandModifier; - if ((accel_key & Qt::META) == Qt::META) - *modif |= kMenuControlModifier; - if ((accel_key & Qt::ALT) == Qt::ALT) - *modif |= kMenuOptionModifier; - if ((accel_key & Qt::SHIFT) == Qt::SHIFT) - *modif |= kMenuShiftModifier; + *modif = constructModifierMask(accel_key); } accel_key &= ~(Qt::MODIFIER_MASK | Qt::UNICODE_ACCEL); @@ -928,14 +953,14 @@ static QKeySequence qt_mac_menu_merge_accel(QMacMenuAction *action) ret = action->action->shortcut(); #ifndef QT_MAC_USE_COCOA else if (action->command == kHICommandPreferences) - ret = QKeySequence(Qt::CTRL+Qt::Key_Comma); + ret = QKeySequence(QKeySequence::Preferences); else if (action->command == kHICommandQuit) - ret = QKeySequence(Qt::CTRL+Qt::Key_Q); + ret = QKeySequence(QKeySequence::Quit); #else else if (action->menuItem == [loader preferencesMenuItem]) - ret = QKeySequence(Qt::CTRL+Qt::Key_Comma); + ret = QKeySequence(QKeySequence::Preferences); else if (action->menuItem == [loader quitMenuItem]) - ret = QKeySequence(Qt::CTRL+Qt::Key_Q); + ret = QKeySequence(QKeySequence::Quit); #endif return ret; } @@ -1220,58 +1245,21 @@ QMenuPrivate::QMacMenuPrivate::addAction(QMacMenuAction *action, QMacMenuAction NSString *keySequenceToKeyEqivalent(const QKeySequence &accel) { quint32 accel_key = (accel[0] & ~(Qt::MODIFIER_MASK | Qt::UNICODE_ACCEL)); - unichar keyEquiv[1] = { 0 }; - if (accel_key == Qt::Key_Return) - keyEquiv[0] = kReturnCharCode; - else if (accel_key == Qt::Key_Enter) - keyEquiv[0] = kEnterCharCode; - else if (accel_key == Qt::Key_Tab) - keyEquiv[0] = kTabCharCode; - else if (accel_key == Qt::Key_Backspace) - keyEquiv[0] = kBackspaceCharCode; - else if (accel_key == Qt::Key_Delete) - keyEquiv[0] = NSDeleteFunctionKey; - else if (accel_key == Qt::Key_Escape) - keyEquiv[0] = kEscapeCharCode; - else if (accel_key == Qt::Key_PageUp) - keyEquiv[0] = NSPageUpFunctionKey; - else if (accel_key == Qt::Key_PageDown) - keyEquiv[0] = NSPageDownFunctionKey; - else if (accel_key == Qt::Key_Up) - keyEquiv[0] = NSUpArrowFunctionKey; - else if (accel_key == Qt::Key_Down) - keyEquiv[0] = NSDownArrowFunctionKey; - else if (accel_key == Qt::Key_Left) - keyEquiv[0] = NSLeftArrowFunctionKey; - else if (accel_key == Qt::Key_Right) - keyEquiv[0] = NSRightArrowFunctionKey; - else if (accel_key == Qt::Key_CapsLock) - keyEquiv[0] = kMenuCapsLockGlyph; // ### Cocoa has no equivalent - else if (accel_key >= Qt::Key_F1 && accel_key <= Qt::Key_F15) - keyEquiv[0] = (accel_key - Qt::Key_F1) + NSF1FunctionKey; - else if (accel_key == Qt::Key_Home) - keyEquiv[0] = NSHomeFunctionKey; - else if (accel_key == Qt::Key_End) - keyEquiv[0] = NSEndFunctionKey; - else - keyEquiv[0] = unichar(QChar(accel_key).toLower().unicode()); - return [NSString stringWithCharacters:keyEquiv length:1]; + extern QChar qt_macSymbolForQtKey(int key); // qkeysequence.cpp + QChar keyEquiv = qt_macSymbolForQtKey(accel_key); + if (keyEquiv.isNull()) { + if (accel_key >= Qt::Key_F1 && accel_key <= Qt::Key_F15) + keyEquiv = (accel_key - Qt::Key_F1) + NSF1FunctionKey; + else + keyEquiv = unichar(QChar(accel_key).toLower().unicode()); + } + return [NSString stringWithCharacters:&keyEquiv.unicode() length:1]; } // return the cocoa modifier mask for the QKeySequence (currently only looks at the first one). NSUInteger keySequenceModifierMask(const QKeySequence &accel) { - NSUInteger ret = 0; - quint32 accel_key = accel[0]; - if ((accel_key & Qt::CTRL) == Qt::CTRL) - ret |= NSCommandKeyMask; - if ((accel_key & Qt::META) == Qt::META) - ret |= NSControlKeyMask; - if ((accel_key & Qt::ALT) == Qt::ALT) - ret |= NSAlternateKeyMask; - if ((accel_key & Qt::SHIFT) == Qt::SHIFT) - ret |= NSShiftKeyMask; - return ret; + return constructModifierMask(accel[0]); } void diff --git a/src/gui/widgets/qprintpreviewwidget.cpp b/src/gui/widgets/qprintpreviewwidget.cpp index 16334b8..d4e5122 100644 --- a/src/gui/widgets/qprintpreviewwidget.cpp +++ b/src/gui/widgets/qprintpreviewwidget.cpp @@ -98,29 +98,8 @@ void PageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QRectF paperRect(0,0, paperSize.width(), paperSize.height()); - painter->setClipRect(paperRect & option->exposedRect); - painter->fillRect(paperRect, Qt::white); - if (!pagePicture) - return; - painter->drawPicture(pageRect.topLeft(), *pagePicture); - - // Effect: make anything drawn in the margins look washed out. - QPainterPath path; - path.addRect(paperRect); - path.addRect(pageRect); - painter->setPen(QPen(Qt::NoPen)); - painter->setBrush(QColor(255, 255, 255, 180)); - painter->drawPath(path); - - painter->setClipRect(option->exposedRect); -#if 0 - // Draw frame around paper. - painter->setPen(QPen(Qt::black, 0)); - painter->setBrush(Qt::NoBrush); - painter->drawRect(paperRect); -#endif - // Draw shadow + painter->setClipRect(option->exposedRect); qreal shWidth = paperRect.width()/100; QRectF rshadow(paperRect.topRight() + QPointF(0, shWidth), paperRect.bottomRight() + QPointF(shWidth, 0)); @@ -141,6 +120,27 @@ void PageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, cgrad.setColorAt(1.0, QColor(0,0,0,0)); painter->fillRect(cshadow, QBrush(cgrad)); + painter->setClipRect(paperRect & option->exposedRect); + painter->fillRect(paperRect, Qt::white); + if (!pagePicture) + return; + painter->drawPicture(pageRect.topLeft(), *pagePicture); + + // Effect: make anything drawn in the margins look washed out. + QPainterPath path; + path.addRect(paperRect); + path.addRect(pageRect); + painter->setPen(QPen(Qt::NoPen)); + painter->setBrush(QColor(255, 255, 255, 180)); + painter->drawPath(path); + +#if 0 + // Draw frame around paper. + painter->setPen(QPen(Qt::black, 0)); + painter->setBrush(Qt::NoBrush); + painter->drawRect(paperRect); +#endif + // todo: drawtext "Page N" below paper } diff --git a/src/gui/widgets/qtoolbarlayout_p.h b/src/gui/widgets/qtoolbarlayout_p.h index 27164b3..37755b1 100644 --- a/src/gui/widgets/qtoolbarlayout_p.h +++ b/src/gui/widgets/qtoolbarlayout_p.h @@ -65,7 +65,7 @@ class QAction; class QToolBarExtension; class QMenu; -class Q_GUI_EXPORT QToolBarItem : public QWidgetItem +class QToolBarItem : public QWidgetItem { public: QToolBarItem(QWidget *widget); diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index 19243aa..a66672d 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 */ 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/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/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 936b936..8c76c5d 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -54,6 +54,7 @@ #include <QtCore/qdir.h> #include <QtCore/qprocess.h> #include <QtCore/qdebug.h> +#include <QtCore/qlibraryinfo.h> #include "QtTest/private/qtestlog_p.h" #include "QtTest/private/qtesttable_p.h" @@ -846,9 +847,8 @@ static void qParseArgs(int argc, char *argv[]) " -iterations n : Sets the number of accumulation iterations.\n" " -median n : Sets the number of median iterations.\n" " -vb : Print out verbose benchmarking information.\n" -#ifndef QT_NO_PROCESS -// Will be enabled when tools are integrated. -// " -chart : Runs the chart generator after the test. No output is printed to the console\n" +#if !defined(QT_NO_PROCESS) || !defined(QT_NO_SETTINGS) + " -chart : Create chart based on the benchmark result.\n" #endif "\n" " -help : This help\n"; @@ -963,7 +963,7 @@ static void qParseArgs(int argc, char *argv[]) } else if (strcmp(argv[i], "-vb") == 0) { QBenchmarkGlobalData::current->verboseOutput = true; -#ifndef QT_NO_PROCESS +#if !defined(QT_NO_PROCESS) || !defined(QT_NO_SETTINGS) } else if (strcmp(argv[i], "-chart") == 0) { QBenchmarkGlobalData::current->createChart = true; QTestLog::setLogMode(QTestLog::XML); @@ -1463,26 +1463,17 @@ int QTest::qExec(QObject *testObject, int argc, char **argv) #endif -#ifndef QT_NO_PROCESS +#if !defined(QT_NO_PROCESS) || !defined(QT_NO_SETTINGS) if (QBenchmarkGlobalData::current->createChart) { - -#define XSTR(s) STR(s) -#define STR(s) #s -#ifdef Q_OS_WIN - const char * path = XSTR(QBENCHLIB_BASE) "/tools/generatereport/generatereport.exe"; -#else - const char * path = XSTR(QBENCHLIB_BASE) "/tools/generatereport/generatereport"; -#endif -#undef XSTR -#undef STR - - if (QFile::exists(QLatin1String(path))) { + QString chartLocation = QLibraryInfo::location(QLibraryInfo::BinariesPath) + + QLatin1String("/../tools/qtestlib/chart/chart"); + if (QFile::exists(chartLocation)) { QProcess p; p.setProcessChannelMode(QProcess::ForwardedChannels); - p.start(QLatin1String(path), QStringList() << QLatin1String("results.xml")); + p.start(chartLocation, QStringList() << QLatin1String("results.xml")); p.waitForFinished(-1); } else { - qWarning("Could not find %s, please make sure it is compiled.", path); + qDebug() << QLatin1String("Could not find the chart tool in ") + chartLocation + QLatin1String(", please make sure it is compiled."); } } #endif 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)) 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<QStringList>("list"); + QTest::addColumn<int>("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" 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" 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" 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); 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 <windows.h> #endif +#if defined(Q_OS_UNIX) +# include <sys/types.h> +# include <sys/stat.h> +# include <errno.h> +# include <fcntl.h> // open(2) +# include <unistd.h> // 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" 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. 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 <QtTest/QtTest> + +#include <qtextcodec.h> +#include <qsharedpointer.h> + +//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<bool>("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<QByteArray>("utf8"); + QTest::addColumn<QString>("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<QTextEncoder> encoder = QSharedPointer<QTextEncoder>(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<QTextDecoder> decoder = QSharedPointer<QTextDecoder>(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<QByteArray>("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<QTextDecoder> decoder = QSharedPointer<QTextDecoder>(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 diff --git a/tests/benchmarks/qgraphicsview/images/wine.jpeg b/tests/benchmarks/qgraphicsview/images/wine.jpeg Binary files differnew file mode 100644 index 0000000..8fe1d3a --- /dev/null +++ b/tests/benchmarks/qgraphicsview/images/wine.jpeg diff --git a/tests/benchmarks/qgraphicsview/qgraphicsview.qrc b/tests/benchmarks/qgraphicsview/qgraphicsview.qrc index 9f280dd..5e80029 100644 --- a/tests/benchmarks/qgraphicsview/qgraphicsview.qrc +++ b/tests/benchmarks/qgraphicsview/qgraphicsview.qrc @@ -1,6 +1,7 @@ <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>images/designer.png</file> + <file>images/wine.jpeg</file> <file>random.data</file> </qresource> </RCC> diff --git a/tests/benchmarks/qgraphicsview/tst_qgraphicsview.cpp b/tests/benchmarks/qgraphicsview/tst_qgraphicsview.cpp index d2213f4..a293de4 100644 --- a/tests/benchmarks/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/benchmarks/qgraphicsview/tst_qgraphicsview.cpp @@ -122,6 +122,8 @@ private slots: void imageRiver(); void textRiver_data(); void textRiver(); + void moveItemCache_data(); + void moveItemCache(); }; tst_QGraphicsView::tst_QGraphicsView() @@ -688,5 +690,112 @@ void tst_QGraphicsView::textRiver() } } +class AnimatedPixmapCacheItem : public QGraphicsPixmapItem +{ +public: + AnimatedPixmapCacheItem(int x, int y, QGraphicsItem *parent = 0) + : QGraphicsPixmapItem(parent) + { + xspeed = x; + yspeed = y; + } + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) + { + QGraphicsPixmapItem::paint(painter,option,widget); + //We just want to wait, and we don't want to process the event loop with qWait + QTest::qSleep(3); + + } +protected: + void advance(int i) + { + if (!i) + return; + int x = int(pos().x()) + pixmap().width(); + x += xspeed; + x = (x % (300 + pixmap().width() * 2)) - pixmap().width(); + int y = int(pos().y()) + pixmap().width(); + y += yspeed; + y = (y % (300 + pixmap().width() * 2)) - pixmap().width(); + setPos(x, y); + } + +private: + int xspeed; + int yspeed; +}; + +void tst_QGraphicsView::moveItemCache_data() +{ + QTest::addColumn<int>("direction"); + QTest::addColumn<bool>("rotation"); + QTest::addColumn<int>("cacheMode"); + QTest::newRow("Horizontal movement : ItemCoordinate Cache") << 0 << false << (int)QGraphicsItem::ItemCoordinateCache; + QTest::newRow("Horizontal movement : DeviceCoordinate Cache") << 0 << false << (int)QGraphicsItem::DeviceCoordinateCache; + QTest::newRow("Horizontal movement : No Cache") << 0 << false << (int)QGraphicsItem::NoCache; + QTest::newRow("Vertical + Horizontal movement : ItemCoordinate Cache") << 2 << false << (int)QGraphicsItem::ItemCoordinateCache; + QTest::newRow("Vertical + Horizontal movement : DeviceCoordinate Cache") << 2 << false << (int)QGraphicsItem::DeviceCoordinateCache; + QTest::newRow("Vertical + Horizontal movement : No Cache") << 2 << false << (int)QGraphicsItem::NoCache; + QTest::newRow("Horizontal movement + Rotation : ItemCoordinate Cache") << 0 << true << (int)QGraphicsItem::ItemCoordinateCache; + QTest::newRow("Horizontal movement + Rotation : DeviceCoordinate Cache") << 0 << true << (int)QGraphicsItem::DeviceCoordinateCache; + QTest::newRow("Horizontal movement + Rotation : No Cache") << 0 << true << (int)QGraphicsItem::NoCache; +} + +void tst_QGraphicsView::moveItemCache() +{ + QFETCH(int, direction); + QFETCH(bool, rotation); + QFETCH(int, cacheMode); + + QGraphicsScene scene(0, 0, 300, 300); + + CountPaintEventView view(&scene); + view.resize(600, 600); + view.setFrameStyle(0); + view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + view.show(); + + QPixmap pix(":/images/wine.jpeg"); + QVERIFY(!pix.isNull()); + + QList<QGraphicsItem *> items; + QFile file(":/random.data"); + QVERIFY(file.open(QIODevice::ReadOnly)); + QDataStream str(&file); + for (int i = 0; i < 50; ++i) { + AnimatedPixmapCacheItem *item; + if (direction == 0) item = new AnimatedPixmapCacheItem((i % 4) + 1, 0); + if (direction == 1) item = new AnimatedPixmapCacheItem(0, (i % 4) + 1); + if (direction == 2) item = new AnimatedPixmapCacheItem((i % 4) + 1, (i % 4) + 1); + item->setPixmap(pix); + item->setCacheMode((QGraphicsItem::CacheMode)cacheMode); + if (rotation) + item->setTransform(QTransform().rotate(45)); + int rnd1, rnd2; + str >> rnd1 >> rnd2; + item->setPos(-pix.width() + rnd1 % (view.width() + pix.width()), + -pix.height() + rnd2 % (view.height() + pix.height())); + scene.addItem(item); + } + + view.count = 0; + + QBENCHMARK { +#ifdef CALLGRIND_DEBUG + CALLGRIND_START_INSTRUMENTATION +#endif + for (int i = 0; i < 100; ++i) { + scene.advance(); + while (view.count < (i+1)) + qApp->processEvents(); + } +#ifdef CALLGRIND_DEBUG + CALLGRIND_STOP_INSTRUMENTATION +#endif + } +} + QTEST_MAIN(tst_QGraphicsView) #include "tst_qgraphicsview.moc" diff --git a/tools/designer/src/lib/shared/qdesigner_toolbar.cpp b/tools/designer/src/lib/shared/qdesigner_toolbar.cpp index 012b498..0bb91ee 100644 --- a/tools/designer/src/lib/shared/qdesigner_toolbar.cpp +++ b/tools/designer/src/lib/shared/qdesigner_toolbar.cpp @@ -443,12 +443,17 @@ QAction *ToolBarEventFilter::actionAt(const QToolBar *tb, const QPoint &pos) QRect ToolBarEventFilter::handleArea(const QToolBar *tb) { //that's a trick to get acces to the initStyleOption which is a protected member - class ToolBar : public QToolBar + class FriendlyToolBar : public QToolBar { - friend class ToolBarEventFilter; + public: +#ifdef Q_NO_USING_KEYWORD + void initStyleOption(QStyleOptionToolBar *option) { QToolBar::initStyleOption(option); } +#else + using QToolBar::initStyleOption; +#endif }; QStyleOptionToolBar opt; - static_cast<const ToolBar*>(tb)->initStyleOption(&opt); + static_cast<const FriendlyToolBar*>(tb)->initStyleOption(&opt); return tb->style()->subElementRect(QStyle::SE_ToolBarHandle, &opt, tb); } 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 <filename> Write the adaptor code to <filename>\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 <QtCore/QByteArray>\n" diff --git a/tools/qtestlib/chart/3rdparty/excanvas.js b/tools/qtestlib/chart/3rdparty/excanvas.js new file mode 100644 index 0000000..e77763a --- /dev/null +++ b/tools/qtestlib/chart/3rdparty/excanvas.js @@ -0,0 +1,14 @@ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +if(!window.CanvasRenderingContext2D){(function(){var N=Math;var O=N.round;var L=N.sin;var U=N.cos;var A=10;var I=A/2;var G={init:function(W){var X=W||document;if(/MSIE/.test(navigator.userAgent)&&!window.opera){var V=this;X.attachEvent("onreadystatechange",function(){V.init_(X)})}},init_:function(Y){if(Y.readyState=="complete"){if(!Y.namespaces.g_vml_){Y.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml")}var X=Y.createStyleSheet();X.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}";var W=Y.getElementsByTagName("canvas");for(var V=0;V<W.length;V++){if(!W[V].getContext){this.initElement(W[V])}}}},fixElement_:function(X){var Z=X.outerHTML;var Y=X.ownerDocument.createElement(Z);if(Z.slice(-2)!="/>"){var V="/"+X.tagName;var W;while((W=X.nextSibling)&&W.tagName!=V){W.removeNode()}if(W){W.removeNode()}}X.parentNode.replaceChild(Y,X);return Y},initElement:function(W){W=this.fixElement_(W);W.getContext=function(){if(this.context_){return this.context_}return this.context_=new J(this)};W.attachEvent("onpropertychange",T);W.attachEvent("onresize",B);var V=W.attributes;if(V.width&&V.width.specified){W.style.width=V.width.nodeValue+"px"}else{W.width=W.clientWidth}if(V.height&&V.height.specified){W.style.height=V.height.nodeValue+"px"}else{W.height=W.clientHeight}return W}};function T(W){var V=W.srcElement;switch(W.propertyName){case"width":V.style.width=V.attributes.width.nodeValue+"px";V.getContext().clearRect();break;case"height":V.style.height=V.attributes.height.nodeValue+"px";V.getContext().clearRect();break}}function B(W){var V=W.srcElement;if(V.firstChild){V.firstChild.style.width=V.clientWidth+"px";V.firstChild.style.height=V.clientHeight+"px"}}G.init();var D=[];for(var R=0;R<16;R++){for(var Q=0;Q<16;Q++){D[R*16+Q]=R.toString(16)+Q.toString(16)}}function K(){return[[1,0,0],[0,1,0],[0,0,1]]}function E(Y,X){var W=K();for(var V=0;V<3;V++){for(var b=0;b<3;b++){var Z=0;for(var a=0;a<3;a++){Z+=Y[V][a]*X[a][b]}W[V][b]=Z}}return W}function P(W,V){V.fillStyle=W.fillStyle;V.lineCap=W.lineCap;V.lineJoin=W.lineJoin;V.lineWidth=W.lineWidth;V.miterLimit=W.miterLimit;V.shadowBlur=W.shadowBlur;V.shadowColor=W.shadowColor;V.shadowOffsetX=W.shadowOffsetX;V.shadowOffsetY=W.shadowOffsetY;V.strokeStyle=W.strokeStyle;V.arcScaleX_=W.arcScaleX_;V.arcScaleY_=W.arcScaleY_}function C(W){var Z,Y=1;W=String(W);if(W.substring(0,3)=="rgb"){var b=W.indexOf("(",3);var V=W.indexOf(")",b+1);var a=W.substring(b+1,V).split(",");Z="#";for(var X=0;X<3;X++){Z+=D[Number(a[X])]}if((a.length==4)&&(W.substr(3,1)=="a")){Y=a[3]}}else{Z=W}return[Z,Y]}function M(V){switch(V){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function J(W){this.m_=K();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=A*1;this.globalAlpha=1;this.canvas=W;var V=W.ownerDocument.createElement("div");V.style.width=W.clientWidth+"px";V.style.height=W.clientHeight+"px";V.style.overflow="hidden";V.style.position="absolute";W.appendChild(V);this.element_=V;this.arcScaleX_=1;this.arcScaleY_=1}var H=J.prototype;H.clearRect=function(){this.element_.innerHTML="";this.currentPath_=[]};H.beginPath=function(){this.currentPath_=[]};H.moveTo=function(W,V){this.currentPath_.push({type:"moveTo",x:W,y:V});this.currentX_=W;this.currentY_=V};H.lineTo=function(W,V){this.currentPath_.push({type:"lineTo",x:W,y:V});this.currentX_=W;this.currentY_=V};H.bezierCurveTo=function(X,V,a,Z,Y,W){this.currentPath_.push({type:"bezierCurveTo",cp1x:X,cp1y:V,cp2x:a,cp2y:Z,x:Y,y:W});this.currentX_=Y;this.currentY_=W};H.quadraticCurveTo=function(c,b,a,Z){var W=this.currentX_+2/3*(c-this.currentX_);var V=this.currentY_+2/3*(b-this.currentY_);var Y=W+(a-this.currentX_)/3;var X=V+(Z-this.currentY_)/3;this.bezierCurveTo(W,V,Y,X,a,Z)};H.arc=function(b,Z,a,Y,W,X){a*=A;var f=X?"at":"wa";var c=b+(U(Y)*a)-I;var e=Z+(L(Y)*a)-I;var V=b+(U(W)*a)-I;var d=Z+(L(W)*a)-I;if(c==V&&!X){c+=0.125}this.currentPath_.push({type:f,x:b,y:Z,radius:a,xStart:c,yStart:e,xEnd:V,yEnd:d})};H.rect=function(X,W,V,Y){this.moveTo(X,W);this.lineTo(X+V,W);this.lineTo(X+V,W+Y);this.lineTo(X,W+Y);this.closePath()};H.strokeRect=function(X,W,V,Y){this.beginPath();this.moveTo(X,W);this.lineTo(X+V,W);this.lineTo(X+V,W+Y);this.lineTo(X,W+Y);this.closePath();this.stroke()};H.fillRect=function(X,W,V,Y){this.beginPath();this.moveTo(X,W);this.lineTo(X+V,W);this.lineTo(X+V,W+Y);this.lineTo(X,W+Y);this.closePath();this.fill()};H.createLinearGradient=function(W,Y,V,X){var Z=new S("gradient");return Z};H.createRadialGradient=function(Y,a,X,W,Z,V){var b=new S("gradientradial");b.radius1_=X;b.radius2_=V;b.focus_.x=Y;b.focus_.y=a;return b};H.drawImage=function(n,Y){var f,c,i,u,l,j,p,x;var g=n.runtimeStyle.width;var m=n.runtimeStyle.height;n.runtimeStyle.width="auto";n.runtimeStyle.height="auto";var e=n.width;var s=n.height;n.runtimeStyle.width=g;n.runtimeStyle.height=m;if(arguments.length==3){f=arguments[1];c=arguments[2];l=j=0;p=i=e;x=u=s}else{if(arguments.length==5){f=arguments[1];c=arguments[2];i=arguments[3];u=arguments[4];l=j=0;p=e;x=s}else{if(arguments.length==9){l=arguments[1];j=arguments[2];p=arguments[3];x=arguments[4];f=arguments[5];c=arguments[6];i=arguments[7];u=arguments[8]}else{throw"Invalid number of arguments"}}}var v=this.getCoords_(f,c);var Z=p/2;var X=x/2;var t=[];var V=10;var b=10;t.push(" <g_vml_:group",' coordsize="',A*V,",",A*b,'"',' coordorigin="0,0"',' style="width:',V,";height:",b,";position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]){var a=[];a.push("M11='",this.m_[0][0],"',","M12='",this.m_[1][0],"',","M21='",this.m_[0][1],"',","M22='",this.m_[1][1],"',","Dx='",O(v.x/A),"',","Dy='",O(v.y/A),"'");var r=v;var q=this.getCoords_(f+i,c);var o=this.getCoords_(f,c+u);var k=this.getCoords_(f+i,c+u);r.x=Math.max(r.x,q.x,o.x,k.x);r.y=Math.max(r.y,q.y,o.y,k.y);t.push("padding:0 ",O(r.x/A),"px ",O(r.y/A),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",a.join(""),", sizingmethod='clip');")}else{t.push("top:",O(v.y/A),"px;left:",O(v.x/A),"px;")}t.push(' ">','<g_vml_:image src="',n.src,'"',' style="width:',A*i,";"," height:",A*u,';"',' cropleft="',l/e,'"',' croptop="',j/s,'"',' cropright="',(e-l-p)/e,'"',' cropbottom="',(s-j-x)/s,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};H.stroke=function(y){var e=[];var d=false;var AB=C(y?this.fillStyle:this.strokeStyle);var u=AB[0];var Y=AB[1]*this.globalAlpha;var X=10;var j=10;e.push("<g_vml_:shape",' fillcolor="',u,'"',' filled="',Boolean(y),'"',' style="position:absolute;width:',X,";height:",j,';"',' coordorigin="0 0" coordsize="',A*X," ",A*j,'"',' stroked="',!y,'"',' strokeweight="',this.lineWidth,'"',' strokecolor="',u,'"',' path="');var h=false;var t={x:null,y:null};var v={x:null,y:null};for(var w=0;w<this.currentPath_.length;w++){var o=this.currentPath_[w];if(o.type=="moveTo"){e.push(" m ");var AA=this.getCoords_(o.x,o.y);e.push(O(AA.x),",",O(AA.y))}else{if(o.type=="lineTo"){e.push(" l ");var AA=this.getCoords_(o.x,o.y);e.push(O(AA.x),",",O(AA.y))}else{if(o.type=="close"){e.push(" x ")}else{if(o.type=="bezierCurveTo"){e.push(" c ");var AA=this.getCoords_(o.x,o.y);var s=this.getCoords_(o.cp1x,o.cp1y);var q=this.getCoords_(o.cp2x,o.cp2y);e.push(O(s.x),",",O(s.y),",",O(q.x),",",O(q.y),",",O(AA.x),",",O(AA.y))}else{if(o.type=="at"||o.type=="wa"){e.push(" ",o.type," ");var AA=this.getCoords_(o.x,o.y);var k=this.getCoords_(o.xStart,o.yStart);var b=this.getCoords_(o.xEnd,o.yEnd);e.push(O(AA.x-this.arcScaleX_*o.radius),",",O(AA.y-this.arcScaleY_*o.radius)," ",O(AA.x+this.arcScaleX_*o.radius),",",O(AA.y+this.arcScaleY_*o.radius)," ",O(k.x),",",O(k.y)," ",O(b.x),",",O(b.y))}}}}}if(AA){if(t.x==null||AA.x<t.x){t.x=AA.x}if(v.x==null||AA.x>v.x){v.x=AA.x}if(t.y==null||AA.y<t.y){t.y=AA.y}if(v.y==null||AA.y>v.y){v.y=AA.y}}}e.push(' ">');if(typeof this.fillStyle=="object"){var n={x:"50%",y:"50%"};var r=(v.x-t.x);var l=(v.y-t.y);var z=(r>l)?r:l;n.x=O((this.fillStyle.focus_.x/r)*100+50)+"%";n.y=O((this.fillStyle.focus_.y/l)*100+50)+"%";var g=[];if(this.fillStyle.type_=="gradientradial"){var x=(this.fillStyle.radius1_/z*100);var m=(this.fillStyle.radius2_/z*100)-x}else{var x=0;var m=100}var V={offset:null,color:null};var Z={offset:null,color:null};this.fillStyle.colors_.sort(function(a,W){return a.offset-W.offset});for(var w=0;w<this.fillStyle.colors_.length;w++){var f=this.fillStyle.colors_[w];g.push((f.offset*m)+x,"% ",f.color,",");if(f.offset>V.offset||V.offset==null){V.offset=f.offset;V.color=f.color}if(f.offset<Z.offset||Z.offset==null){Z.offset=f.offset;Z.color=f.color}}g.pop();e.push("<g_vml_:fill",' color="',Z.color,'"',' color2="',V.color,'"',' type="',this.fillStyle.type_,'"',' focusposition="',n.x,", ",n.y,'"',' colors="',g.join(""),'"',' opacity="',Y,'" />')}else{if(y){e.push('<g_vml_:fill color="',u,'" opacity="',Y,'" />')}else{e.push("<g_vml_:stroke",' opacity="',Y,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',M(this.lineCap),'"',' weight="',this.lineWidth,'px"',' color="',u,'" />')}}e.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",e.join(""))};H.fill=function(){this.stroke(true)};H.closePath=function(){this.currentPath_.push({type:"close"})};H.getCoords_=function(W,V){return{x:A*(W*this.m_[0][0]+V*this.m_[1][0]+this.m_[2][0])-I,y:A*(W*this.m_[0][1]+V*this.m_[1][1]+this.m_[2][1])-I}};H.save=function(){var V={};P(this,V);this.aStack_.push(V);this.mStack_.push(this.m_);this.m_=E(K(),this.m_)};H.restore=function(){P(this.aStack_.pop(),this);this.m_=this.mStack_.pop()};H.translate=function(X,W){var V=[[1,0,0],[0,1,0],[X,W,1]];this.m_=E(V,this.m_)};H.rotate=function(W){var Y=U(W);var X=L(W);var V=[[Y,X,0],[-X,Y,0],[0,0,1]];this.m_=E(V,this.m_)};H.scale=function(X,W){this.arcScaleX_*=X;this.arcScaleY_*=W;var V=[[X,0,0],[0,W,0],[0,0,1]];this.m_=E(V,this.m_)};H.clip=function(){};H.arcTo=function(){};H.createPattern=function(){return new F};function S(V){this.type_=V;this.radius1_=0;this.radius2_=0;this.colors_=[];this.focus_={x:0,y:0}}S.prototype.addColorStop=function(W,V){V=C(V);this.colors_.push({offset:1-W,color:V})};function F(){}G_vmlCanvasManager=G;CanvasRenderingContext2D=J;CanvasGradient=S;CanvasPattern=F})()};
\ No newline at end of file diff --git a/tools/qtestlib/chart/3rdparty/flotr.js b/tools/qtestlib/chart/3rdparty/flotr.js new file mode 100644 index 0000000..80bb506 --- /dev/null +++ b/tools/qtestlib/chart/3rdparty/flotr.js @@ -0,0 +1,2 @@ +//Flotr 0.1.0alpha Copyright (c) 2008 Bas Wenneker, <http://solutoire.com>, MIT License. +var Flotr=(function(){var C=0;function L(M){return M.collect(function(N){return(N.data)?Object.clone(N):{data:N}})}function G(P,N){var M=N||{};for(var O in P){M[O]=(typeof (P[O])=="object"&&!(P[O].constructor==Array||P[O].constructor==RegExp))?G(P[O],N[O]):M[O]=P[O]}return M}function I(Q,P,M,N){var T=(M-P)/Q;var S=H(T);var O=T/S;var R=10;if(O<1.5){R=1}else{if(O<2.25){R=2}else{if(O<3){R=2.5}else{if(O<7.5){R=5}}}}if(R==2.5&&N==0){R=2}R*=S;return R}function E(M){return M.toString()}function F(M){return"("+M.x+", "+M.y+")"}function H(M){return Math.pow(10,Math.floor(Math.log(M)/Math.LN10))}function K(O){var M;if((M=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(O))){return new B(parseInt(M[1]),parseInt(M[2]),parseInt(M[3]))}if((M=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(O))){return new B(parseInt(M[1]),parseInt(M[2]),parseInt(M[3]),parseFloat(M[4]))}if((M=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(O))){return new B(parseFloat(M[1])*2.55,parseFloat(M[2])*2.55,parseFloat(M[3])*2.55)}if((M=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(O))){return new B(parseFloat(M[1])*2.55,parseFloat(M[2])*2.55,parseFloat(M[3])*2.55,parseFloat(M[4]))}if((M=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(O))){return new B(parseInt(M[1],16),parseInt(M[2],16),parseInt(M[3],16))}if((M=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(O))){return new B(parseInt(M[1]+M[1],16),parseInt(M[2]+M[2],16),parseInt(M[3]+M[3],16))}var N=O.strip().toLowerCase();if(N=="transparent"){return new B(255,255,255,0)}M=D[N];return new B(M[0],M[1],M[2])}function A(N){var M;do{M=N.getStyle("background-color").toLowerCase();if(M!=""&&M!="transparent"){break}N=N.up(0)}while(N.nodeName.toLowerCase()!="body");if(M=="rgba(0, 0, 0, 0)"){return"transparent"}return M}function B(S,R,N,P){var Q=["r","g","b","a"];var M=4;while(-1<--M){this[Q[M]]=arguments[M]||((M==3)?1:0)}this.toString=function(){return(this.a>=1)?"rgb("+[this.r,this.g,this.b].join(",")+")":"rgba("+[this.r,this.g,this.b,this.a].join(",")+")"};this.scale=function(V,U,W,T){M=4;while(-1<--M){if(arguments[M]!=null){this[Q[M]]*=arguments[M]}}return this.normalize()};this.adjust=function(V,U,W,T){M=4;while(-1<--M){if(arguments[M]!=null){this[Q[M]]+=arguments[M]}}return this.normalize()};this.clone=function(){return new B(this.r,this.b,this.g,this.a)};var O=function(U,T,V){return Math.max(Math.min(U,V),T)};this.normalize=function(){this.r=O(parseInt(this.r),0,255);this.g=O(parseInt(this.g),0,255);this.b=O(parseInt(this.b),0,255);this.a=O(this.a,0,1);return this};this.normalize()}var D={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]};function J(y,AO,p){var o,S,AL,h,AS;var z="flotr-"+C++;var R=L(AO);var N=y;var u={},c={};var l={left:0,right:0,top:0,bottom:0};var AA=0;var d=0;var AH=0;var U=0;var P=0;var AD=0;var AC=0;var AB=0;g(p);k();AN();q();AK(u,o.xaxis);Z();AK(c,o.yaxis);m(u,o.xaxis);m(c,o.yaxis);Y();AP();AQ();this.getCanvas=function(){return S};this.getPlotOffset=function(){return l};this.clearSelection=M;this.setSelection=AF;function g(AV){o=G(AV,{colors:["#00A8F0","#C0D800","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{ticks:null,noTicks:5,tickFormatter:E,tickDecimals:null,min:null,max:null,autoscaleMargin:0},yaxis:{ticks:null,noTicks:5,tickFormatter:E,tickDecimals:null,min:null,max:null,autoscaleMargin:0},points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff"},lines:{show:false,lineWidth:2,fill:false,fillColor:null},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null},grid:{color:"#545454",backgroundColor:null,tickColor:"#dddddd",labelMargin:3},selection:{mode:null,color:"#B6D9FF",fps:10},mouse:{track:null,position:"se",trackFormatter:F,margin:3,color:"#ff3f19",trackDecimals:1,sensibility:2,radius:3},shadowSize:4});var Ah=R.length;var AT=[];var AZ=[];for(var Ac=0;Ac<R.length;++Ac){var Ag=R[Ac].color;if(Ag!=null){--Ah;if(Object.isNumber(Ag)){AZ.push(Ag)}else{AT.push(K(R[Ac].color))}}}for(var Ab=0;Ab<AZ.length;++Ab){Ah=Math.max(Ah,AZ[Ab]+1)}var AU=[];var AY=0;var Aa=0;while(AU.length<Ah){var Af=(o.colors.length==Aa)?new B(100,100,100):K(o.colors[Aa]);var AW=AY%2==1?-1:1;var Ae=1+AW*Math.ceil(AY/2)*0.2;Af.scale(Ae,Ae,Ae);AU.push(Af);if(++Aa>=o.colors.length){Aa=0;++AY}}var Ad=0;for(var AX=0,Ai;AX<R.length;++AX){Ai=R[AX];if(Ai.color==null){Ai.color=AU[Ad].toString();++Ad}else{if(Object.isNumber(Ai.color)){Ai.color=AU[Ai.color].toString()}}Ai.lines=Object.extend(Object.clone(o.lines),Ai.lines);Ai.points=Object.extend(Object.clone(o.points),Ai.points);Ai.bars=Object.extend(Object.clone(o.bars),Ai.bars);Ai.mouse=Object.extend(Object.clone(o.mouse),Ai.mouse);if(Ai.shadowSize==null){Ai.shadowSize=o.shadowSize}}}function k(){AH=N.getWidth();U=N.getHeight();N.innerHTML="";N.setStyle({position:"relative"});if(AH<=0||U<=0){throw"Invalid dimensions for plot, width = "+AH+", height = "+U}S=$(document.createElement("canvas")).writeAttribute({width:AH,height:U});N.appendChild(S);if(Prototype.Browser.IE){S=$(window.G_vmlCanvasManager.initElement(S))}h=S.getContext("2d");AL=$(document.createElement("canvas")).writeAttribute({width:AH,height:U}).setStyle({position:"absolute",left:"0px",top:"0px"});N.setStyle({cursor:"default"}).appendChild(AL);if(Prototype.Browser.IE){AL=$(window.G_vmlCanvasManager.initElement(AL))}AS=AL.getContext("2d")}function AN(){if(o.selection.mode!=null){AL.observe("mousedown",r)}AL.observe("mousemove",e);AL.observe("click",f)}function q(){c.datamin=u.datamin=0;u.datamax=c.datamax=1;if(R.length==0){return }var AY=false;for(var AV=0;AV<R.length;++AV){if(R[AV].data.length>0){u.datamin=u.datamax=R[AV].data[0][0];c.datamin=c.datamax=R[AV].data[0][1];AY=true;break}}if(!AY){return }for(var AU=0;AU<R.length;++AU){var AX=R[AU].data;for(var AW=0;AW<AX.length;++AW){var AT=AX[AW][0];var AZ=AX[AW][1];if(AT<u.datamin){u.datamin=AT}else{if(AT>u.datamax){u.datamax=AT}}if(AZ<c.datamin){c.datamin=AZ}else{if(AZ>c.datamax){c.datamax=AZ}}}}}function AK(AW,AY){var AV=AY.min!=null?AY.min:AW.datamin;var AT=AY.max!=null?AY.max:AW.datamax;if(AT-AV==0){var AU=(AT==0)?1:0.01;AV-=AU;AT+=AU}AW.tickSize=I(AY.noTicks,AV,AT,AY.tickDecimals);var AX;if(AY.min==null){AX=AY.autoscaleMargin;if(AX!=0){AV-=AW.tickSize*AX;if(AV<0&&AW.datamin>=0){AV=0}AV=AW.tickSize*Math.floor(AV/AW.tickSize)}}if(AY.max==null){AX=AY.autoscaleMargin;if(AX!=0){AT+=AW.tickSize*AX;if(AT>0&&AW.datamax<=0){AT=0}AT=AW.tickSize*Math.ceil(AT/AW.tickSize)}}AW.min=AV;AW.max=AT}function Z(){if(o.xaxis.max==null){var AU=u.max;for(var AT=0;AT<R.length;++AT){if(R[AT].bars.show&&R[AT].bars.barWidth+u.datamax>AU){AU=u.max+R[AT].bars.barWidth}}u.max=AU}}function m(AV,AW){AV.ticks=[];if(AW.ticks){var AZ=AW.ticks;if(Object.isFunction(AZ)){AZ=AZ({min:AV.min,max:AV.max})}for(var AX=0,Aa,AY;AX<AZ.length;++AX){var Ab=AZ[AX];if(typeof (Ab)=="object"){Aa=Ab[0];AY=(Ab.length>1)?Ab[1]:AW.tickFormatter(Aa)}else{Aa=Ab;AY=AW.tickFormatter(Aa)}AV.ticks[AX]={v:Aa,label:AY}}}else{var AT=AV.tickSize*Math.ceil(AV.min/AV.tickSize);for(AX=0;AT+AX*AV.tickSize<=AV.max;++AX){Aa=AT+AX*AV.tickSize;var AU=AW.tickDecimals;if(AU==null){AU=1-Math.floor(Math.log(AV.tickSize)/Math.LN10)}if(AU<0){AU=0}Aa=Aa.toFixed(AU);AV.ticks.push({v:Aa,label:AW.tickFormatter(Aa)})}}}function Y(){var AX="";for(var AW=0;AW<c.ticks.length;++AW){var AU=c.ticks[AW].label.length;if(AU>AX.length){AX=c.ticks[AW].label}}var AT=N.insert('<div style="position:absolute;top:-10000px;font-size:smaller" class="flotr-grid-label">'+AX+"</div>").down(0).next(1);AA=AT.getWidth();d=AT.getHeight();AT.remove();var AY=2;if(o.points.show){AY=Math.max(AY,o.points.radius+o.points.lineWidth/2)}for(var AV=0;AV<R.length;++AV){if(R[AV].points.show){AY=Math.max(AY,R[AV].points.radius+R[AV].points.lineWidth/2)}}l.left=l.right=l.top=l.bottom=AY;l.left+=AA+o.grid.labelMargin;l.bottom+=d+o.grid.labelMargin;P=AH-l.left-l.right;AD=U-l.bottom-l.top;AC=P/(u.max-u.min);AB=AD/(c.max-c.min)}function AP(){V();AR();for(var AT=0;AT<R.length;AT++){AI(R[AT])}}function AE(AT){return(AT-u.min)*AC}function j(AT){return AD-(AT-c.min)*AB}function V(){h.save();h.translate(l.left,l.top);if(o.grid.backgroundColor!=null){h.fillStyle=o.grid.backgroundColor;h.fillRect(0,0,P,AD)}h.lineWidth=1;h.strokeStyle=o.grid.tickColor;h.beginPath();for(var AV=0,AT=null;AV<u.ticks.length;++AV){AT=u.ticks[AV].v;if(AT==u.min||AT==u.max){continue}h.moveTo(Math.floor(AE(AT))+h.lineWidth/2,0);h.lineTo(Math.floor(AE(AT))+h.lineWidth/2,AD)}for(var AU=0,AT=null;AU<c.ticks.length;++AU){AT=c.ticks[AU].v;if(AT==c.min||AT==c.max){continue}h.moveTo(0,Math.floor(j(AT))+h.lineWidth/2);h.lineTo(P,Math.floor(j(AT))+h.lineWidth/2)}h.stroke();h.lineWidth=2;h.strokeStyle=o.grid.color;h.lineJoin="round";h.strokeRect(0,0,P,AD);h.restore()}function AR(){var AZ=0;for(var AY=0;AY<u.ticks.length;++AY){if(u.ticks[AY].label){++AZ}}var AU=P/AZ;var AX='<div style="font-size:smaller;color:'+o.grid.color+'">';for(var AV=0,AW=null;AV<u.ticks.length;++AV){AW=u.ticks[AV];if(!AW.label){continue}AX+='<div style="position:absolute;top:'+(l.top+AD+o.grid.labelMargin)+"px;left:"+(l.left+AE(AW.v)-AU/2)+"px;width:"+AU+'px;text-align:center" class="flotr-grid-label">'+AW.label+"</div>"}for(var AT=0,AW=null;AT<c.ticks.length;++AT){AW=c.ticks[AT];if(!AW.label||AW.label.length==0){continue}AX+='<div style="position:absolute;top:'+(l.top+j(AW.v)-d/2)+"px;left:0;width:"+AA+'px;text-align:right" class="flotr-grid-label">'+AW.label+"</div>"}AX+="</div>";N.insert(AX)}function AI(AT){if(AT.lines.show||(!AT.bars.show&&!AT.points.show)){i(AT)}if(AT.bars.show){v(AT)}if(AT.points.show){w(AT)}}function i(AV){function AU(Ad,Ac){if(Ad.length<2){return }var Ab=AE(Ad[0][0]),Aa=j(Ad[0][1])+Ac;h.beginPath();h.moveTo(Ab,Aa);for(var Ae=0;Ae<Ad.length-1;++Ae){var AZ=Ad[Ae][0],Ag=Ad[Ae][1],AY=Ad[Ae+1][0],Af=Ad[Ae+1][1];if(Ag<=Af&&Ag<c.min){if(Af<c.min){continue}AZ=(c.min-Ag)/(Af-Ag)*(AY-AZ)+AZ;Ag=c.min}else{if(Af<=Ag&&Af<c.min){if(Ag<c.min){continue}AY=(c.min-Ag)/(Af-Ag)*(AY-AZ)+AZ;Af=c.min}}if(Ag>=Af&&Ag>c.max){if(Af>c.max){continue}AZ=(c.max-Ag)/(Af-Ag)*(AY-AZ)+AZ;Ag=c.max}else{if(Af>=Ag&&Af>c.max){if(Ag>c.max){continue}AY=(c.max-Ag)/(Af-Ag)*(AY-AZ)+AZ;Af=c.max}}if(AZ<=AY&&AZ<u.min){if(AY<u.min){continue}Ag=(u.min-AZ)/(AY-AZ)*(Af-Ag)+Ag;AZ=u.min}else{if(AY<=AZ&&AY<u.min){if(AZ<u.min){continue}Af=(u.min-AZ)/(AY-AZ)*(Af-Ag)+Ag;AY=u.min}}if(AZ>=AY&&AZ>u.max){if(AY>u.max){continue}Ag=(u.max-AZ)/(AY-AZ)*(Af-Ag)+Ag;AZ=u.max}else{if(AY>=AZ&&AY>u.max){if(AZ>u.max){continue}Af=(u.max-AZ)/(AY-AZ)*(Af-Ag)+Ag;AY=u.max}}if(Ab!=AE(AZ)||Aa!=j(Ag)+Ac){h.moveTo(AE(AZ),j(Ag)+Ac)}Ab=AE(AY);Aa=j(Af)+Ac;h.lineTo(Ab,Aa)}h.stroke()}function AW(Ac){if(Ac.length<2){return }var AY=Math.min(Math.max(0,c.min),c.max);var Ah,Aa=0;var Ae=true;h.beginPath();for(var Ad=0;Ad<Ac.length-1;++Ad){var Ab=Ac[Ad][0],Ai=Ac[Ad][1],AZ=Ac[Ad+1][0],Ag=Ac[Ad+1][1];if(Ab<=AZ&&Ab<u.min){if(AZ<u.min){continue}Ai=(u.min-Ab)/(AZ-Ab)*(Ag-Ai)+Ai;Ab=u.min}else{if(AZ<=Ab&&AZ<u.min){if(Ab<u.min){continue}Ag=(u.min-Ab)/(AZ-Ab)*(Ag-Ai)+Ai;AZ=u.min}}if(Ab>=AZ&&Ab>u.max){if(AZ>u.max){continue}Ai=(u.max-Ab)/(AZ-Ab)*(Ag-Ai)+Ai;Ab=u.max}else{if(AZ>=Ab&&AZ>u.max){if(Ab>u.max){continue}Ag=(u.max-Ab)/(AZ-Ab)*(Ag-Ai)+Ai;AZ=u.max}}if(Ae){h.moveTo(AE(Ab),j(AY));Ae=false}if(Ai>=c.max&&Ag>=c.max){h.lineTo(AE(Ab),j(c.max));h.lineTo(AE(AZ),j(c.max));continue}else{if(Ai<=c.min&&Ag<=c.min){h.lineTo(AE(Ab),j(c.min));h.lineTo(AE(AZ),j(c.min));continue}}var Aj=Ab,Af=AZ;if(Ai<=Ag&&Ai<c.min&&Ag>=c.min){Ab=(c.min-Ai)/(Ag-Ai)*(AZ-Ab)+Ab;Ai=c.min}else{if(Ag<=Ai&&Ag<c.min&&Ai>=c.min){AZ=(c.min-Ai)/(Ag-Ai)*(AZ-Ab)+Ab;Ag=c.min}}if(Ai>=Ag&&Ai>c.max&&Ag<=c.max){Ab=(c.max-Ai)/(Ag-Ai)*(AZ-Ab)+Ab;Ai=c.max}else{if(Ag>=Ai&&Ag>c.max&&Ai<=c.max){AZ=(c.max-Ai)/(Ag-Ai)*(AZ-Ab)+Ab;Ag=c.max}}if(Ab!=Aj){Ah=(Ai<=c.min)?Ah=c.min:c.max;h.lineTo(AE(Aj),j(Ah));h.lineTo(AE(Ab),j(Ah))}h.lineTo(AE(Ab),j(Ai));h.lineTo(AE(AZ),j(Ag));if(AZ!=Af){Ah=(Ag<=c.min)?c.min:c.max;h.lineTo(AE(Af),j(Ah));h.lineTo(AE(AZ),j(Ah))}Aa=Math.max(AZ,Af)}h.lineTo(AE(Aa),j(AY));h.closePath();h.fill()}h.save();h.translate(l.left,l.top);h.lineJoin="round";var AX=AV.lines.lineWidth;var AT=AV.shadowSize;if(AT>0){h.lineWidth=AT/2;h.strokeStyle="rgba(0,0,0,0.1)";AU(AV.data,AX/2+AT/2+h.lineWidth/2);h.lineWidth=AT/2;h.strokeStyle="rgba(0,0,0,0.2)";AU(AV.data,AX/2+h.lineWidth/2)}h.lineWidth=AX;h.strokeStyle=AV.color;if(AV.lines.fill){h.fillStyle=AV.lines.fillColor!=null?AV.lines.fillColor:K(AV.color).scale(null,null,null,0.4).toString();AW(AV.data,0)}AU(AV.data,0);h.restore()}function w(AU){function AX(Ab,AZ,Ac){for(var Aa=0;Aa<Ab.length;++Aa){var AY=Ab[Aa][0],Ad=Ab[Aa][1];if(AY<u.min||AY>u.max||Ad<c.min||Ad>c.max){continue}h.beginPath();h.arc(AE(AY),j(Ad),AZ,0,2*Math.PI,true);if(Ac){h.fill()}h.stroke()}}function AW(Ab,Ac,AZ){for(var Aa=0;Aa<Ab.length;++Aa){var AY=Ab[Aa][0],Ad=Ab[Aa][1];if(AY<u.min||AY>u.max||Ad<c.min||Ad>c.max){continue}h.beginPath();h.arc(AE(AY),j(Ad)+Ac,AZ,0,Math.PI,false);h.stroke()}}h.save();h.translate(l.left,l.top);var AV=AU.lines.lineWidth;var AT=AU.shadowSize;if(AT>0){h.lineWidth=AT/2;h.strokeStyle="rgba(0,0,0,0.1)";AW(AU.data,AT/2+h.lineWidth/2,AU.points.radius);h.lineWidth=AT/2;h.strokeStyle="rgba(0,0,0,0.2)";AW(AU.data,h.lineWidth/2,AU.points.radius)}h.lineWidth=AU.points.lineWidth;h.strokeStyle=AU.color;h.fillStyle=AU.points.fillColor!=null?AU.points.fillColor:AU.color;AX(AU.data,AU.points.radius,AU.points.fill);h.restore()}function v(AU){function AT(Ab,Ak,AZ,Aj){if(Ab.length<2){return }for(var Ac=0;Ac<Ab.length;Ac++){var Ag=Ab[Ac][0],Af=Ab[Ac][1];var Ai=true,Aa=true,Ad=true;var AY=Ag,Ah=Ag+Ak,AX=0,Ae=Af;if(Ah<u.min||AY>u.max||Ae<c.min||AX>c.max){continue}if(AY<u.min){AY=u.min;Ai=false}if(Ah>u.max){Ah=u.max;Ad=false}if(AX<c.min){AX=c.min}if(Ae>c.max){Ae=c.max;Aa=false}if(Aj){h.beginPath();h.moveTo(AE(AY),j(AX)+AZ);h.lineTo(AE(AY),j(Ae)+AZ);h.lineTo(AE(Ah),j(Ae)+AZ);h.lineTo(AE(Ah),j(AX)+AZ);h.fill()}if(Ai||Ad||Aa){h.beginPath();h.moveTo(AE(AY),j(AX)+AZ);if(Ai){h.lineTo(AE(AY),j(Ae)+AZ)}else{h.moveTo(AE(AY),j(Ae)+AZ)}if(Aa){h.lineTo(AE(Ah),j(Ae)+AZ)}else{h.moveTo(AE(Ah),j(Ae)+AZ)}if(Ad){h.lineTo(AE(Ah),j(AX)+AZ)}else{h.moveTo(AE(Ah),j(AX)+AZ)}h.stroke()}}}h.save();h.translate(l.left,l.top);h.lineJoin="round";var AW=AU.bars.barWidth;var AV=Math.min(AU.bars.lineWidth,AW);h.lineWidth=AV;h.strokeStyle=AU.color;if(AU.bars.fill){h.fillStyle=AU.bars.fillColor!=null?AU.bars.fillColor:K(AU.color).scale(null,null,null,0.4).toString()}AT(AU.data,AW,0,AU.bars.fill);h.restore()}function AQ(){if(!o.legend.show){return }var Aa=[];var AY=false;for(var AX=0;AX<R.length;++AX){if(!R[AX].label){continue}if(AX%o.legend.noColumns==0){Aa.push((AY)?"</tr><tr>":"<tr>");AY=true}var Ac=R[AX].label;if(o.legend.labelFormatter!=null){Ac=o.legend.labelFormatter(Ac)}Aa.push('<td class="flotr-legend-color-box"><div style="border:1px solid '+o.legend.labelBoxBorderColor+';padding:1px"><div style="width:14px;height:10px;background-color:'+R[AX].color+'"></div></div></td><td class="flotr-legend-label">'+Ac+"</td>")}if(AY){Aa.push("</tr>")}if(Aa.length>0){var Ad='<table style="font-size:smaller;color:'+o.grid.color+'">'+Aa.join("")+"</table>";if(o.legend.container!=null){o.legend.container.append(Ad)}else{var Ab="";var AU=o.legend.position,AV=o.legend.margin;if(AU.charAt(0)=="n"){Ab+="top:"+(AV+l.top)+"px;"}else{if(AU.charAt(0)=="s"){Ab+="bottom:"+(AV+l.bottom)+"px;"}}if(AU.charAt(1)=="e"){Ab+="right:"+(AV+l.right)+"px;"}else{if(AU.charAt(1)=="w"){Ab+="left:"+(AV+l.bottom)+"px;"}}var AT=N.insert('<div class="flotr-legend" style="position:absolute;z-index:2;'+Ab+'">'+Ad+"</div>").getElementsBySelector("div.flotr-legend").first();if(o.legend.backgroundOpacity!=0){var AZ=o.legend.backgroundColor;if(AZ==null){var AW=(o.grid.backgroundColor!=null)?o.grid.backgroundColor:A(AT);AZ=K(AW).adjust(null,null,null,1).toString()}N.insert('<div class="flotr-legend-bg" style="position:absolute;width:'+AT.getWidth()+"px;height:"+AT.getHeight()+"px;"+Ab+"background-color:"+AZ+';"> </div>').select("div.flotr-legend-bg").first().setStyle({opacity:o.legend.backgroundOpacity})}}}}var AG={pageX:null,pageY:null};var b={first:{x:-1,y:-1},second:{x:-1,y:-1}};var T=null;var x=null;var t=false;var Q=null;function f(AT){if(t){t=false;return }var AU=AL.cumulativeOffset();N.fire("flotr:click",[{x:u.min+(AT.pageX-AU.left-l.left)/AC,y:c.max-(AT.pageY-AU.top-l.top)/AB}])}function e(AU){if(AU.pageX==null&&AU.clientX!=null){var AX=document.documentElement,AT=document.body;AG.pageX=AU.clientX+(AX&&AX.scrollLeft||AT.scrollLeft||0);AG.pageY=AU.clientY+(AX&&AX.scrollTop||AT.scrollTop||0)}else{AG.pageX=AU.pageX;AG.pageY=AU.pageY}var AV=AL.cumulativeOffset();var AW={x:u.min+(AU.pageX-AV.left-l.left)/AC,y:c.max-(AU.pageY-AV.top-l.top)/AB};if(o.mouse.track&&x==null){n(AW)}N.fire("flotr:mousemove",[AU,AW])}function r(AT){if(!AT.isLeftClick()){return }AM(b.first,AT);if(x!=null){clearInterval(x)}AG.pageX=null;x=setInterval(AJ,1000/o.selection.fps);$(document).observe("mouseup",O)}function a(){var AU=(b.first.x<=b.second.x)?b.first.x:b.second.x;var AT=(b.first.x<=b.second.x)?b.second.x:b.first.x;var AW=(b.first.y>=b.second.y)?b.first.y:b.second.y;var AV=(b.first.y>=b.second.y)?b.second.y:b.first.y;AU=u.min+AU/AC;AT=u.min+AT/AC;AW=c.max-AW/AB;AV=c.max-AV/AB;N.fire("flotr:select",[{x1:AU,y1:AW,x2:AT,y2:AV}])}function O(AT){$(document).stopObserving("mouseup",O);if(x!=null){clearInterval(x);x=null}AM(b.second,AT);M();if(W()||AT.isLeftClick()){X();a();t=true}Event.stop(AT)}function AM(AV,AT){var AU=$(AL).cumulativeOffset();if(o.selection.mode=="y"){AV.x=(AV==b.first)?0:P}else{AV.x=AT.pageX-AU.left-l.left;AV.x=Math.min(Math.max(0,AV.x),P)}if(o.selection.mode=="x"){AV.y=(AV==b.first)?0:AD}else{AV.y=AT.pageY-AU.top-l.top;AV.y=Math.min(Math.max(0,AV.y),AD)}}function AJ(){if(AG.pageX==null){return }AM(b.second,AG);M();if(W()){X()}}function M(){if(T==null){return }var AT=Math.min(T.first.x,T.second.x),AW=Math.min(T.first.y,T.second.y),AU=Math.abs(T.second.x-T.first.x),AV=Math.abs(T.second.y-T.first.y);AS.clearRect(AT+l.left-AS.lineWidth,AW+l.top-AS.lineWidth,AU+AS.lineWidth*2,AV+AS.lineWidth*2);T=null}function AF(AT){M();b.first.y=(o.selection.mode=="x")?0:(c.max-AT.y1)*AB;b.second.y=(o.selection.mode=="x")?AD:(c.max-AT.y2)*AB;b.first.x=(o.selection.mode=="y")?0:(AT.x1-u.min)*AC;b.second.x=(o.selection.mode=="y")?P:(AT.x2-u.min)*AC;X();a()}function X(){if(T!=null&&b.first.x==T.first.x&&b.first.y==T.first.y&&b.second.x==T.second.x&&b.second.y==T.second.y){return }AS.strokeStyle=K(o.selection.color).scale(null,null,null,0.8).toString();AS.lineWidth=1;h.lineJoin="round";AS.fillStyle=K(o.selection.color).scale(null,null,null,0.4).toString();T={first:{x:b.first.x,y:b.first.y},second:{x:b.second.x,y:b.second.y}};var AT=Math.min(b.first.x,b.second.x),AW=Math.min(b.first.y,b.second.y),AU=Math.abs(b.second.x-b.first.x),AV=Math.abs(b.second.y-b.first.y);AS.fillRect(AT+l.left,AW+l.top,AU,AV);AS.strokeRect(AT+l.left,AW+l.top,AU,AV)}function W(){var AT=5;return Math.abs(b.second.x-b.first.x)>=AT&&Math.abs(b.second.y-b.first.y)>=AT}function s(){if(Q){AS.clearRect(AE(Q.x)+l.left-o.points.radius*2,j(Q.y)+l.top-o.points.radius*2,o.points.radius*3+o.points.lineWidth*3,o.points.radius*3+o.points.lineWidth*3);Q=null}}function n(Ae){var AX={dist:Number.MAX_VALUE,x:null,y:null,mouse:null};for(var Ad=0,Ac,AZ,AV;Ad<R.length;Ad++){if(!R[Ad].mouse.track){continue}Ac=R[Ad].data;AZ=(AC*R[Ad].mouse.sensibility);AV=(AB*R[Ad].mouse.sensibility);for(var Aa=0,Af,Ab;Aa<Ac.length;Aa++){Af=AC*Math.abs(Ac[Aa][0]-Ae.x);Ab=AB*Math.abs(Ac[Aa][1]-Ae.y);if(Af<AZ&&Ab<AV&&(Af+Ab)<AX.dist){AX.dist=(Af+Ab);AX.x=Ac[Aa][0];AX.y=Ac[Aa][1];AX.mouse=R[Ad].mouse}}}if(AX.mouse&&AX.mouse.track&&!Q||(Q&&AX.x!=Q.x&&AX.y!=Q.y)){var AU=N.select(".flotr-mouse-value").first();if(!AU){var Ag="",AT=o.mouse.position,AY=o.mouse.margin;if(AT.charAt(0)=="n"){Ag+="top:"+(AY+l.top)+"px;"}else{if(AT.charAt(0)=="s"){Ag+="bottom:"+(AY+l.bottom)+"px;"}}if(AT.charAt(1)=="e"){Ag+="right:"+(AY+l.right)+"px;"}else{if(AT.charAt(1)=="w"){Ag+="left:"+(AY+l.bottom)+"px;"}}N.insert('<div class="flotr-mouse-value" style="opacity:0.7;background-color:#000;color:#fff;display:none;position:absolute;'+Ag+'"></div>');return }if(AX.x!==null&&AX.y!==null){AU.setStyle({display:"block"});s();if(AX.mouse.lineColor!=null){AS.save();AS.translate(l.left,l.top);AS.lineWidth=o.points.lineWidth;AS.strokeStyle=AX.mouse.lineColor;AS.fillStyle="#ffffff";AS.beginPath();AS.arc(AE(AX.x),j(AX.y),o.points.radius,0,2*Math.PI,true);AS.fill();AS.stroke();AS.restore()}Q=AX;var AW=AX.mouse.trackDecimals;if(AW==null||AW<0){AW=0}AU.innerHTML=AX.mouse.trackFormatter({x:AX.x.toFixed(AW),y:AX.y.toFixed(AW)});N.fire("flotr:hit",[AX])}else{if(Q){AU.setStyle({display:"none"});s()}}}}}return{clean:function(M){M.innerHTML=""},draw:function(P,N,M){var O=new J(P,N,M);return O}}})();
\ No newline at end of file diff --git a/tools/qtestlib/chart/3rdparty/prototype.js b/tools/qtestlib/chart/3rdparty/prototype.js new file mode 100644 index 0000000..e580ae5 --- /dev/null +++ b/tools/qtestlib/chart/3rdparty/prototype.js @@ -0,0 +1,8 @@ +/* Prototype JavaScript framework, version 1.6.0.2 + * (c) 2005-2008 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ +eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('G 1g={9D:\'1.6.0.2\',1W:{3X:!!(1A.7b&&!1A.9e),58:!!1A.9e,4u:5e.5d.47(\'hE/\')>-1,7H:5e.5d.47(\'7H\')>-1&&5e.5d.47(\'ch\')==-1,d5:!!5e.5d.1f(/hD.*hC.*ci/)},3U:{72:!!1b.2S,6H:!!1A.6G,7x:1b.43(\'1T\').4U&&1b.43(\'1T\').4U!==1b.43(\'1x\').4U},84:\'<4S[^>]*>([\\\\S\\\\s]*?)<\\/4S>\',cM:/^\\/\\*-hB-([\\s\\S]*)\\*\\/\\s*$/,3q:q(){},K:q(x){o x}};E(1g.1W.d5)1g.3U.7x=1r;G 2b={2p:q(){G 2T=1k,3k=$A(1p);E(M.2w(3k[0]))2T=3k.5i();q 1N(){C.2I.3R(C,1p)}M.15(1N,2b.1d);1N.9Z=2T;1N.d4=[];E(2T){G a0=q(){};a0.1l=2T.1l;1N.1l=1s a0;2T.d4.1h(1N)}17(G i=0;i<3k.O;i++)1N.6a(3k[i]);E(!1N.1l.2I)1N.1l.2I=1g.3q;1N.1l.hA=1N;o 1N}};2b.1d={6a:q(22){G 3b=C.9Z&&C.9Z.1l;G 3k=M.4b(22);E(!M.4b({2H:1u}).O)3k.1h("2H","d3");17(G i=0,O=3k.O;i<O;i++){G 1y=3k[i],I=22[1y];E(3b&&M.2w(I)&&I.d1().3K()=="$4d"){G 1F=I,I=M.15((q(m){o q(){o 3b[m].3R(C,1p)}})(1y).5g(1F),{d3:q(){o 1F},2H:q(){o 1F.2H()}})}C.1l[1y]=I}o C}};G 4Y={};M.15=q(5L,22){17(G 1y 1Q 22)5L[1y]=22[1y];o 5L};M.15(M,{2C:q(Y){2s{E(M.2D(Y))o\'4z\';E(Y===1k)o\'1k\';o Y.2C?Y.2C():24(Y)}2E(e){E(e d2 hz)o\'...\';4q e}},3D:q(Y){G 1B=3Z Y;5y(1B){2r\'4z\':2r\'q\':2r\'hy\':o;2r\'hx\':o Y.2H()}E(Y===1k)o\'1k\';E(Y.3D)o Y.3D();E(M.4j(Y))o;G V=[];17(G 1y 1Q Y){G I=M.3D(Y[1y]);E(!M.2D(I))V.1h(1y.3D()+\': \'+I)}o\'{\'+V.2o(\', \')+\'}\'},4r:q(Y){o $H(Y).4r()},4i:q(Y){o Y&&Y.4i?Y.4i():24.62(Y)},4b:q(Y){G 4b=[];17(G 1y 1Q Y)4b.1h(1y);o 4b},1S:q(Y){G 1S=[];17(G 1y 1Q Y)1S.1h(Y[1y]);o 1S},2A:q(Y){o M.15({},Y)},4j:q(Y){o Y&&Y.3r==1},4x:q(Y){o Y!=1k&&3Z Y=="Y"&&\'hw\'1Q Y&&\'2o\'1Q Y},9G:q(Y){o Y d2 3V},2w:q(Y){o 3Z Y=="q"},3f:q(Y){o 3Z Y=="3h"},53:q(Y){o 3Z Y=="4M"},2D:q(Y){o 3Z Y=="4z"}});M.15(9X.1l,{d1:q(){G 3A=C.2H().1f(/^[\\s\\(]*q[^(]*\\((.*?)\\)/)[1].49(",").7k("3T");o 3A.O==1&&!3A[0]?[]:3A},1L:q(){E(1p.O<2&&M.2D(1p[0]))o C;G 3n=C,21=$A(1p),Y=21.5i();o q(){o 3n.3R(Y,21.20($A(1p)))}},hv:q(){G 3n=C,21=$A(1p),Y=21.5i();o q(1c){o 3n.3R(Y,[1c||1A.1c].20(21))}},7T:q(){E(!1p.O)o C;G 3n=C,21=$A(1p);o q(){o 3n.3R(C,21.20($A(1p)))}},9l:q(){G 3n=C,21=$A(1p),d0=21.5i()*cY;o 1A.hu(q(){o 3n.3R(3n,21)},d0)},5g:q(1K){G 3n=C;o q(){o 1K.3R(C,[3n.1L(C)].20($A(1p)))}},4v:q(){E(C.9Y)o C.9Y;G 3n=C;o C.9Y=q(){o 3n.3R(1k,[C].20($A(1p)))}}});9X.1l.4s=9X.1l.9l.7T(0.ht);hs.1l.3D=q(){o\'"\'+C.hr()+\'-\'+(C.hq()+1).4L(2)+\'-\'+C.hp().4L(2)+\'T\'+C.ho().4L(2)+\':\'+C.hn().4L(2)+\':\'+C.hm().4L(2)+\'Z"\'};G cp={co:q(){G 7d;17(G i=0,O=1p.O;i<O;i++){G cZ=1p[i];2s{7d=cZ();2d}2E(e){}}o 7d}};4k.1l.1f=4k.1l.2L;4k.c3=q(68){o 24(68).1Y(/([.*+?^=!:${}()|[\\]\\/\\\\])/g,\'\\\\$1\')};G aB=2b.2p({2I:q(2X,4c){C.2X=2X;C.4c=4c;C.85=1r;C.6s()},6s:q(){C.3W=ae(C.6N.1L(C),C.4c*cY)},8t:q(){C.2X(C)},8p:q(){E(!C.3W)o;af(C.3W);C.3W=1k},6N:q(){E(!C.85){2s{C.85=1u;C.8t()}hl{C.85=1r}}}});M.15(24,{62:q(I){o I==1k?\'\':24(I)},cQ:{\'\\b\':\'\\\\b\',\'\\t\':\'\\\\t\',\'\\n\':\'\\\\n\',\'\\f\':\'\\\\f\',\'\\r\':\'\\\\r\',\'\\\\\':\'\\\\\\\\\'}});M.15(24.1l,{3m:q(28,3F){G 1q=\'\',22=C,1f;3F=1p.5v.9S(3F);1P(22.O>0){E(1f=22.1f(28)){1q+=22.3B(0,1f.1i);1q+=24.62(3F(1f));22=22.3B(1f.1i+1f[0].O)}1m{1q+=22,22=\'\'}}o 1q},cN:q(28,3F,3x){3F=C.3m.9S(3F);3x=M.2D(3x)?1:3x;o C.3m(28,q(1f){E(--3x<0)o 1f[0];o 3F(1f)})},aN:q(28,W){C.3m(28,W);o 24(C)},hk:q(O,69){O=O||30;69=M.2D(69)?\'...\':69;o C.O>O?C.3B(0,O-69.O)+69:24(C)},3T:q(){o C.1Y(/^\\s+/,\'\').1Y(/\\s+$/,\'\')},cS:q(){o C.1Y(/<\\/?[^>]+>/gi,\'\')},4h:q(){o C.1Y(1s 4k(1g.84,\'cX\'),\'\')},cT:q(){G cW=1s 4k(1g.84,\'cX\');G cU=1s 4k(1g.84,\'hj\');o(C.1f(cW)||[]).2M(q(cV){o(cV.1f(cU)||[\'\',\'\'])[1]})},59:q(){o C.cT().2M(q(4S){o 7u(4S)})},82:q(){G 5J=1p.5v;5J.3Y.7n=C;o 5J.1T.4C},cJ:q(){G 1T=1s J(\'1T\');1T.4C=C.cS();o 1T.3g[0]?(1T.3g.O>1?$A(1T.3g).3H(\'\',q(2O,L){o 2O+L.4f}):1T.3g[0].4f):\'\'},7g:q(cR){G 1f=C.3T().1f(/([^?#]*)(#.*)?$/);E(!1f)o{};o 1f[1].49(cR||\'&\').3H({},q(3w,1H){E((1H=1H.49(\'=\'))[0]){G 1w=9p(1H.5i());G I=1H.O>1?1H.2o(\'=\'):1H[0];E(I!=4z)I=9p(I);E(1w 1Q 3w){E(!M.4x(3w[1w]))3w[1w]=[3w[1w]];3w[1w].1h(I)}1m 3w[1w]=I}o 3w})},3E:q(){o C.49(\'\')},9I:q(){o C.3B(0,C.O-1)+24.hi(C.cP(C.O-1)+1)},7E:q(3x){o 3x<1?\'\':1s 2m(3x+1).2o(C)},95:q(){G 4N=C.49(\'-\'),9W=4N.O;E(9W==1)o 4N[0];G 9V=C.83(0)==\'-\'?4N[0].83(0).2R()+4N[0].5H(1):4N[0];17(G i=1;i<9W;i++)9V+=4N[i].83(0).2R()+4N[i].5H(1);o 9V},6F:q(){o C.83(0).2R()+C.5H(1).2e()},hh:q(){o C.3m(/::/,\'/\').3m(/([A-Z]+)([A-Z][a-z])/,\'#{1}6T#{2}\').3m(/([a-z\\d])([A-Z])/,\'#{1}6T#{2}\').3m(/-/,\'6T\').2e()},hg:q(){o C.3m(/6T/,\'-\')},2C:q(cO){G 9T=C.3m(/[\\hf-\\he\\\\]/,q(1f){G 9U=24.cQ[1f[0]];o 9U?9U:\'\\\\hd\'+1f[0].cP().4L(2,16)});E(cO)o\'"\'+9T.1Y(/"/g,\'\\\\"\')+\'"\';o"\'"+9T.1Y(/\'/g,\'\\\\\\\'\')+"\'"},3D:q(){o C.2C(1u)},9w:q(2h){o C.cN(2h||1g.cM,\'#{1}\')},cK:q(){G 68=C;E(68.4O())o 1r;68=C.1Y(/\\\\./g,\'@\').1Y(/"[^"\\\\\\n\\r]*"/g,\'\');o(/^[,:{}\\[\\]0-9.\\-+hc-u \\n\\r\\t]*$/).2L(68)},60:q(cL){G 3l=C.9w();2s{E(!cL||3l.cK())o 7u(\'(\'+3l+\')\')}2E(e){}4q 1s hb(\'ha h9 c4 3h: \'+C.2C())},1J:q(28){o C.47(28)>-1},8F:q(28){o C.47(28)===0},aO:q(28){G d=C.O-28.O;o d>=0&&C.9L(28)===d},5E:q(){o C==\'\'},4O:q(){o/^\\s*$/.2L(C)},cb:q(Y,28){o 1s 32(C,28).2S(Y)}});E(1g.1W.4u||1g.1W.3X)M.15(24.1l,{82:q(){o C.1Y(/&/g,\'&cI;\').1Y(/</g,\'&cH;\').1Y(/>/g,\'>\')},cJ:q(){o C.1Y(/&cI;/g,\'&\').1Y(/&cH;/g,\'<\').1Y(/>/g,\'>\')}});24.1l.3m.9S=q(3F){E(M.2w(3F))o 3F;G 67=1s 32(3F);o q(1f){o 67.2S(1f)}};24.1l.h8=24.1l.7g;M.15(24.1l.82,{1T:1b.43(\'1T\'),3Y:1b.bm(\'\')});b0(24.1l.82)1T.5O(3Y);G 32=2b.2p({2I:q(67,28){C.67=67.2H();C.28=28||32.cE},2S:q(Y){E(M.2w(Y.9J))Y=Y.9J();o C.67.3m(C.28,q(1f){E(Y==1k)o\'\';G 4R=1f[1]||\'\';E(4R==\'\\\\\')o 1f[2];G 6X=Y,6Y=1f[3];G 28=/^([^.[]+|\\[((?:.*?[^\\\\])?)\\])(\\.|\\[|$)/;1f=28.cF(6Y);E(1f==1k)o 4R;1P(1f!=1k){G cG=1f[1].8F(\'[\')?1f[2].3m(\'\\\\\\\\]\',\']\'):1f[1];6X=6X[cG];E(1k==6X||\'\'==1f[3])2d;6Y=6Y.5H(\'[\'==1f[3]?1f[1].O:1f[0].O);1f=28.cF(6Y)}o 4R+24.62(6X)})}});32.cE=/(^|.|\\r|\\n)(#\\{(.*?)\\})/;G $2d={};G 2G={1E:q(W,1M){G 1i=0;W=W.1L(1M);2s{C.48(q(I){W(I,1i++)})}2E(e){E(e!=$2d)4q e}o C},cD:q(4M,W,1M){W=W?W.1L(1M):1g.K;G 1i=-4M,9R=[],2F=C.3E();1P((1i+=4M)<2F.O)9R.1h(2F.3B(1i,1i+4M));o 9R.9N(W,1M)},88:q(W,1M){W=W?W.1L(1M):1g.K;G 1q=1u;C.1E(q(I,1i){1q=1q&&!!W(I,1i);E(!1q)4q $2d});o 1q},cB:q(W,1M){W=W?W.1L(1M):1g.K;G 1q=1r;C.1E(q(I,1i){E(1q=!!W(I,1i))4q $2d});o 1q},9N:q(W,1M){W=W?W.1L(1M):1g.K;G V=[];C.1E(q(I,1i){V.1h(W(I,1i))});o V},81:q(W,1M){W=W.1L(1M);G 1q;C.1E(q(I,1i){E(W(I,1i)){1q=I;4q $2d}});o 1q},5C:q(W,1M){W=W.1L(1M);G V=[];C.1E(q(I,1i){E(W(I,1i))V.1h(I)});o V},h7:q(2h,W,1M){W=W?W.1L(1M):1g.K;G V=[];E(M.3f(2h))2h=1s 4k(2h);C.1E(q(I,1i){E(2h.1f(I))V.1h(W(I,1i))});o V},1J:q(Y){E(M.2w(C.47))E(C.47(Y)!=-1)o 1u;G 9Q=1r;C.1E(q(I){E(I==Y){9Q=1u;4q $2d}});o 9Q},h6:q(4M,6W){6W=M.2D(6W)?1k:6W;o C.cD(4M,q(3B){1P(3B.O<4M)3B.1h(6W);o 3B})},3H:q(2O,W,1M){W=W.1L(1M);C.1E(q(I,1i){2O=W(2O,I,1i)});o 2O},7k:q(1F){G 21=$A(1p).3B(1);o C.2M(q(I){o I[1F].3R(I,21)})},h5:q(W,1M){W=W?W.1L(1M):1g.K;G 1q;C.1E(q(I,1i){I=W(I,1i);E(1q==1k||I>=1q)1q=I});o 1q},h4:q(W,1M){W=W?W.1L(1M):1g.K;G 1q;C.1E(q(I,1i){I=W(I,1i);E(1q==1k||I<1q)1q=I});o 1q},h3:q(W,1M){W=W?W.1L(1M):1g.K;G 9P=[],9O=[];C.1E(q(I,1i){(W(I,1i)?9P:9O).1h(I)});o[9P,9O]},5u:q(1y){G V=[];C.1E(q(I){V.1h(I[1y])});o V},h2:q(W,1M){W=W.1L(1M);G V=[];C.1E(q(I,1i){E(!W(I,1i))V.1h(I)});o V},aK:q(W,1M){W=W.1L(1M);o C.2M(q(I,1i){o{I:I,6D:W(I,1i)}}).h1(q(2x,5U){G a=2x.6D,b=5U.6D;o a<b?-1:a>b?1:0}).5u(\'I\')},3E:q(){o C.2M()},h0:q(){G W=1g.K,21=$A(1p);E(M.2w(21.2u()))W=21.gZ();G cC=[C].20(21).2M($A);o C.2M(q(I,1i){o W(cC.5u(1i))})},cw:q(){o C.3E().O},2C:q(){o\'#<2G:\'+C.3E().2C()+\'>\'}};M.15(2G,{2M:2G.9N,8l:2G.81,2z:2G.5C,2h:2G.5C,gY:2G.1J,gX:2G.3E,gW:2G.88,gV:2G.cB});q $A(3d){E(!3d)o[];E(3d.3E)o 3d.3E();G O=3d.O||0,V=1s 2m(O);1P(O--)V[O]=3d[O];o V}E(1g.1W.4u){$A=q(3d){E(!3d)o[];E(!(M.2w(3d)&&3d==\'[Y gU]\')&&3d.3E)o 3d.3E();G O=3d.O||0,V=1s 2m(O);1P(O--)V[O]=3d[O];o V}}2m.cr=$A;M.15(2m.1l,2G);E(!2m.1l.9M)2m.1l.9M=2m.1l.4e;M.15(2m.1l,{48:q(W){17(G i=0,O=C.O;i<O;i++)W(C[i])},aH:q(){C.O=0;o C},3K:q(){o C[0]},2u:q(){o C[C.O-1]},gT:q(){o C.2z(q(I){o I!=1k})},cA:q(){o C.3H([],q(2F,I){o 2F.20(M.4x(I)?I.cA():[I])})},6b:q(){G 1S=$A(1p);o C.2z(q(I){o!1S.1J(I)})},4e:q(cz){o(cz!==1r?C:C.3E()).9M()},gS:q(){o C.O>1?C:C[0]},cx:q(cy){o C.3H([],q(2F,I,1i){E(0==1i||(cy?2F.2u()!=I:!2F.1J(I)))2F.1h(I);o 2F})},gR:q(2F){o C.cx().5C(q(66){o 2F.81(q(I){o 66===I})})},2A:q(){o[].20(C)},cw:q(){o C.O},2C:q(){o\'[\'+C.2M(M.2C).2o(\', \')+\']\'},3D:q(){G V=[];C.1E(q(Y){G I=M.3D(Y);E(!M.2D(I))V.1h(I)});o\'[\'+V.2o(\', \')+\']\'}});E(M.2w(2m.1l.cv))2m.1l.48=2m.1l.cv;E(!2m.1l.47)2m.1l.47=q(66,i){i||(i=0);G O=C.O;E(i<0)i=O+i;17(;i<O;i++)E(C[i]===66)o i;o-1};E(!2m.1l.9L)2m.1l.9L=q(66,i){i=gQ(i)?C.O:(i<0?C.O+i:i)+1;G n=C.3B(0,i).4e().47(66);o(n<0)?n:i-n-1};2m.1l.3E=2m.1l.2A;q $w(3h){E(!M.3f(3h))o[];3h=3h.3T();o 3h?3h.49(/\\s+/):[]}E(1g.1W.58){2m.1l.20=q(){G 2F=[];17(G i=0,O=C.O;i<O;i++)2F.1h(C[i]);17(G i=0,O=1p.O;i<O;i++){E(M.4x(1p[i])){17(G j=0,cu=1p[i].O;j<cu;j++)2F.1h(1p[i][j])}1m{2F.1h(1p[i])}}o 2F}}M.15(54.1l,{gP:q(){o C.4L(2,16)},9I:q(){o C+1},7E:q(W){$R(0,C,1u).1E(W);o C},4L:q(O,ct){G 3h=C.2H(ct||10);o\'0\'.7E(O-3h.O)+3h},3D:q(){o gO(C)?C.2H():\'1k\'}});$w(\'gN gM gL gK\').1E(q(1F){54.1l[1F]=gJ[1F].4v()});q $H(Y){o 1s 3V(Y)};G 3V=2b.2p(2G,(q(){q 9K(1w,I){E(M.2D(I))o 1w;o 1w+\'=\'+cs(24.62(I))}o{2I:q(Y){C.4K=M.9G(Y)?Y.6U():M.2A(Y)},48:q(W){17(G 1w 1Q C.4K){G I=C.4K[1w],1H=[1w,I];1H.1w=1w;1H.I=I;W(1H)}},6c:q(1w,I){o C.4K[1w]=I},9F:q(1w){o C.4K[1w]},gI:q(1w){G I=C.4K[1w];8R C.4K[1w];o I},6U:q(){o M.2A(C.4K)},4b:q(){o C.5u(\'1w\')},1S:q(){o C.5u(\'I\')},1i:q(I){G 1f=C.81(q(1H){o 1H.I===I});o 1f&&1f.1w},gH:q(Y){o C.2A().5a(Y)},5a:q(Y){o 1s 3V(Y).3H(C,q(1q,1H){1q.6c(1H.1w,1H.I);o 1q})},4r:q(){o C.2M(q(1H){G 1w=cs(1H.1w),1S=1H.I;E(1S&&3Z 1S==\'Y\'){E(M.4x(1S))o 1S.2M(9K.7T(1w)).2o(\'&\')}o 9K(1w,1S)}).2o(\'&\')},2C:q(){o\'#<3V:{\'+C.2M(q(1H){o 1H.2M(M.2C).2o(\': \')}).2o(\', \')+\'}>\'},3D:q(){o M.3D(C.6U())},2A:q(){o 1s 3V(C)}}})());3V.1l.9J=3V.1l.6U;3V.cr=$H;G cq=2b.2p(2G,{2I:q(4l,5o,65){C.4l=4l;C.5o=5o;C.65=65},48:q(W){G I=C.4l;1P(C.1J(I)){W(I);I=I.9I()}},1J:q(I){E(I<C.4l)o 1r;E(C.65)o I<C.5o;o I<=C.5o}});G $R=q(4l,5o,65){o 1s cq(4l,5o,65)};G 1R={cj:q(){o cp.co(q(){o 1s cf()},q(){o 1s cm(\'gG.cl\')},q(){o 1s cm(\'gF.cl\')})||1r},9H:0};1R.63={6V:[],48:q(W){C.6V.48(W)},ck:q(4m){E(!C.1J(4m))C.6V.1h(4m)},gE:q(4m){C.6V=C.6V.6b(4m)},7X:q(2X,2Q,1Z,3l){C.1E(q(4m){E(M.2w(4m[2X])){2s{4m[2X].3R(4m,[2Q,1Z,3l])}2E(e){}}})}};M.15(1R.63,2G);1R.63.ck({80:q(){1R.9H++},3S:q(){1R.9H--}});1R.9m=2b.2p({2I:q(U){C.U={1F:\'6S\',7Z:1u,6R:\'7V/x-gD-1x-gC\',9C:\'gB-8\',3v:\'\',60:1u,9z:1u};M.15(C.U,U||{});C.U.1F=C.U.1F.2e();E(M.3f(C.U.3v))C.U.3v=C.U.3v.7g();1m E(M.9G(C.U.3v))C.U.3v=C.U.3v.6U()}});1R.50=2b.2p(1R.9m,{9A:1r,2I:q($4d,2U,U){$4d(U);C.1Z=1R.cj();C.2Q(2U)},2Q:q(2U){C.2U=2U;C.1F=C.U.1F;G 2Y=M.2A(C.U.3v);E(![\'9F\',\'6S\'].1J(C.1F)){2Y[\'gA\']=C.1F;C.1F=\'6S\'}C.3v=2Y;E(2Y=M.4r(2Y)){E(C.1F==\'9F\')C.2U+=(C.2U.1J(\'?\')?\'&\':\'?\')+2Y;1m E(/gz|ci|ch/.2L(5e.5d))2Y+=\'&6T=\'}2s{G 2y=1s 1R.9t(C);E(C.U.80)C.U.80(2y);1R.63.7X(\'80\',C,2y);C.1Z.gy(C.1F.2R(),C.2U,C.U.7Z);E(C.U.7Z)C.9B.1L(C).4s(1);C.1Z.77=C.9E.1L(C);C.cg();C.2q=C.1F==\'6S\'?(C.U.gx||2Y):1k;C.1Z.gw(C.2q);E(!C.U.7Z&&C.1Z.ce)C.9E()}2E(e){C.5m(e)}},9E:q(){G 2N=C.1Z.2N;E(2N>1&&!((2N==4)&&C.9A))C.9B(C.1Z.2N)},cg:q(){G 5n={\'X-gv-gu\':\'cf\',\'X-1g-9D\':1g.9D,\'gs\':\'3Y/gr, 3Y/7D, 7V/6P, 3Y/6P, */*\'};E(C.1F==\'6S\'){5n[\'9o-1B\']=C.U.6R+(C.U.9C?\'; gq=\'+C.U.9C:\'\');E(C.1Z.ce&&(5e.5d.1f(/7H\\/(\\d{4})/)||[0,cd])[1]<cd)5n[\'gp\']=\'go\'}E(3Z C.U.cc==\'Y\'){G 64=C.U.cc;E(M.2w(64.1h))17(G i=0,O=64.O;i<O;i+=2)5n[64[i]]=64[i+1];1m $H(64).1E(q(1H){5n[1H.1w]=1H.I})}17(G 1e 1Q 5n)C.1Z.gn(1e,5n[1e])},5l:q(){G 4J=C.6O();o!4J||(4J>=gm&&4J<gl)},6O:q(){2s{o C.1Z.4J||0}2E(e){o 0}},9B:q(2N){G 6Q=1R.50.c8[2N],2y=1s 1R.9t(C);E(6Q==\'9u\'){2s{C.9A=1u;(C.U[\'5t\'+2y.4J]||C.U[\'5t\'+(C.5l()?\'gk\':\'gj\')]||1g.3q)(2y,2y.7W)}2E(e){C.5m(e)}G 6R=2y.61(\'9o-1B\');E(C.U.9z==\'c1\'||(C.U.9z&&C.7U()&&6R&&6R.1f(/^\\s*(3Y|7V)\\/(x-)?(gh|gg)4S(;.*)?\\s*$/i)))C.ca()}2s{(C.U[\'5t\'+6Q]||1g.3q)(2y,2y.7W);1R.63.7X(\'5t\'+6Q,C,2y,2y.7W)}2E(e){C.5m(e)}E(6Q==\'9u\'){C.1Z.77=1g.3q}},7U:q(){G m=C.2U.1f(/^\\s*gf?:\\/\\/[^\\/]*/);o!m||(m[0]==\'#{9y}//#{9x}#{7Y}\'.cb({9y:7h.9y,9x:1b.9x,7Y:7h.7Y?\':\'+7h.7Y:\'\'}))},61:q(1e){2s{o C.1Z.9r(1e)||1k}2E(e){o 1k}},ca:q(){2s{o 7u((C.1Z.3c||\'\').9w())}2E(e){C.5m(e)}},5m:q(9v){(C.U.c9||1g.3q)(C,9v);1R.63.7X(\'c9\',C,9v)}});1R.50.c8=[\'ge\',\'gd\',\'gc\',\'gb\',\'9u\'];1R.9t=2b.2p({2I:q(2Q){C.2Q=2Q;G 1Z=C.1Z=2Q.1Z,2N=C.2N=1Z.2N;E((2N>2&&!1g.1W.3X)||2N==4){C.4J=C.6O();C.9s=C.c6();C.3c=24.62(1Z.3c);C.7W=C.c5()}E(2N==4){G 6P=1Z.c7;C.c7=M.2D(6P)?1k:6P;C.ga=C.c2()}},4J:0,9s:\'\',6O:1R.50.1l.6O,c6:q(){2s{o C.1Z.9s||\'\'}2E(e){o\'\'}},61:1R.50.1l.61,g9:q(){2s{o C.9q()}2E(e){o 1k}},9r:q(1e){o C.1Z.9r(1e)},9q:q(){o C.1Z.9q()},c5:q(){G 3l=C.61(\'X-c4\');E(!3l)o 1k;3l=9p(c3(3l));2s{o 3l.60(C.2Q.U.c0||!C.2Q.7U())}2E(e){C.2Q.5m(e)}},c2:q(){G U=C.2Q.U;E(!U.60||(U.60!=\'c1\'&&!(C.61(\'9o-1B\')||\'\').1J(\'7V/3l\'))||C.3c.4O())o 1k;2s{o C.3c.60(U.c0||!C.2Q.7U())}2E(e){C.2Q.5m(e)}}});1R.bW=2b.2p(1R.50,{2I:q($4d,3C,2U,U){C.3C={5l:(3C.5l||3C),9n:(3C.9n||(3C.5l?1k:3C))};U=M.2A(U);G 3S=U.3S;U.3S=(q(2y,3l){C.bZ(2y.3c);E(M.2w(3S))3S(2y,3l)}).1L(C);$4d(2U,U)},bZ:q(3c){G 5Z=C.3C[C.5l()?\'5l\':\'9n\'],U=C.U;E(!U.59)3c=3c.4h();E(5Z=$(5Z)){E(U.5k){E(M.3f(U.5k)){G 5k={};5k[U.5k]=3c;5Z.3o(5k)}1m U.5k(5Z,3c)}1m 5Z.5a(3c)}}});1R.g8=2b.2p(1R.9m,{2I:q($4d,3C,2U,U){$4d(U);C.3S=C.U.3S;C.4c=(C.U.4c||2);C.5j=(C.U.5j||1);C.9k={};C.3C=3C;C.2U=2U;C.4l()},4l:q(){C.U.3S=C.bY.1L(C);C.6N()},8p:q(){C.9k.U.3S=4z;g7(C.3W);(C.3S||1g.3q).3R(C,1p)},bY:q(2y){E(C.U.5j){C.5j=(2y.3c==C.bX?C.5j*C.U.5j:1);C.bX=2y.3c}C.3W=C.6N.1L(C).9l(C.5j*C.4c)},6N:q(){C.9k=1s 1R.bW(C.3C,C.2U,C.U)}});q $(k){E(1p.O>1){17(G i=0,1V=[],O=1p.O;i<O;i++)1V.1h($(1p[i]));o 1V}E(M.3f(k))k=1b.g6(k);o J.15(k)}E(1g.3U.72){1b.8a=q(1t,71){G V=[];G 9j=1b.2S(1t,$(71)||1b,1k,g5.g4,1k);17(G i=0,O=9j.g3;i<O;i++)V.1h(J.15(9j.g2(i)));o V}}E(!1A.6o)G 6o={};E(!6o.bV){M.15(6o,{bV:1,g1:2,au:3,g0:4,fZ:5,fY:6,fX:7,fW:8,fV:9,fU:10,fT:11,fS:12})}(q(){G k=C.J;C.J=q(1a,2l){2l=2l||{};1a=1a.2e();G 2P=J.2P;E(1g.1W.3X&&2l.1e){1a=\'<\'+1a+\' 1e="\'+2l.1e+\'">\';8R 2l.1e;o J.6M(1b.43(1a),2l)}E(!2P[1a])2P[1a]=J.15(1b.43(1a));o J.6M(2P[1a].fR(1r),2l)};M.15(C.J,k||{})}).8m(1A);J.2P={};J.1d={99:q(k){o $(k).14.3p!=\'7L\'},aa:q(k){k=$(k);J[J.99(k)?\'bU\':\'bT\'](k);o k},bU:q(k){$(k).14.3p=\'7L\';o k},bT:q(k){$(k).14.3p=\'\';o k},a1:q(k){k=$(k);k.1O.6I(k);o k},5a:q(k,18){k=$(k);E(18&&18.3s)18=18.3s();E(M.4j(18))o k.5a().3o(18);18=M.4i(18);k.4C=18.4h();18.59.1L(18).4s();o k},1Y:q(k,18){k=$(k);E(18&&18.3s)18=18.3s();1m E(!M.4j(18)){18=M.4i(18);G 9i=k.fQ.fP();9i.fO(k);18.59.1L(18).4s();18=9i.fN(18.4h())}k.1O.8Z(18,k);o k},3o:q(k,3Q){k=$(k);E(M.3f(3Q)||M.53(3Q)||M.4j(3Q)||(3Q&&(3Q.3s||3Q.4i)))3Q={4Q:3Q};G 18,3o,1a,3g;17(G 1v 1Q 3Q){18=3Q[1v];1v=1v.2e();3o=J.5M[1v];E(18&&18.3s)18=18.3s();E(M.4j(18)){3o(k,18);3G}18=M.4i(18);1a=((1v==\'4R\'||1v==\'75\')?k.1O:k).1a.2R();3g=J.7F(1a,18.4h());E(1v==\'2i\'||1v==\'75\')3g.4e();3g.1E(3o.7T(k));18.59.1L(18).4s()}o k},5g:q(k,1K,2l){k=$(k);E(M.4j(1K))$(1K).6M(2l||{});1m E(M.3f(1K))1K=1s J(1K,2l);1m 1K=1s J(\'1T\',1K);E(k.1O)k.1O.8Z(1K,k);1K.5O(k);o 1K},2C:q(k){k=$(k);G 1q=\'<\'+k.1a.2e();$H({\'1o\':\'1o\',\'1j\':\'6e\'}).1E(q(1H){G 1y=1H.3K(),1U=1H.2u();G I=(k[1y]||\'\').2H();E(I)1q+=\' \'+1U+\'=\'+I.2C(1u)});o 1q+\'>\'},7S:q(k,1y){k=$(k);G 1V=[];1P(k=k[1y])E(k.3r==1)1V.1h(J.15(k));o 1V},5x:q(k){o $(k).7S(\'1O\')},bR:q(k){o $(k).2z("*")},bS:q(k){k=$(k).5D;1P(k&&k.3r!=1)k=k.3M;o $(k)},br:q(k){E(!(k=$(k).5D))o[];1P(k&&k.3r!=1)k=k.3M;E(k)o[k].20($(k).4E());o[]},5Y:q(k){o $(k).7S(\'aY\')},4E:q(k){o $(k).7S(\'3M\')},fM:q(k){k=$(k);o k.5Y().4e().20(k.4E())},1f:q(k,41){E(M.3f(41))41=1s 19(41);o 41.1f($(k))},fL:q(k,1t,1i){k=$(k);E(1p.O==1)o $(k.1O);G 5x=k.5x();o M.53(1t)?5x[1t]:19.5w(5x,1t,1i)},fK:q(k,1t,1i){k=$(k);E(1p.O==1)o k.bS();o M.53(1t)?k.bR()[1t]:k.2z(1t)[1i||0]},fJ:q(k,1t,1i){k=$(k);E(1p.O==1)o $(19.25.6x(k));G 5Y=k.5Y();o M.53(1t)?5Y[1t]:19.5w(5Y,1t,1i)},6B:q(k,1t,1i){k=$(k);E(1p.O==1)o $(19.25.6w(k));G 4E=k.4E();o M.53(1t)?4E[1t]:19.5w(4E,1t,1i)},2z:q(){G 21=$A(1p),k=$(21.5i());o 19.7o(k,21)},55:q(){G 21=$A(1p),k=$(21.5i());o 19.7o(k.1O,21).6b(k)},bt:q(k){k=$(k);G 1o=k.51(\'1o\'),5J=1p.5v;E(1o)o 1o;do{1o=\'fI\'+5J.bs++}1P($(1o));k.6M(\'1o\',1o);o 1o},51:q(k,1e){k=$(k);E(1g.1W.3X){G t=J.3O.7I;E(t.1S[1e])o t.1S[1e](k,1e);E(t.3A[1e])1e=t.3A[1e];E(1e.1J(\':\')){o(!k.2l||!k.2l[1e])?1k:k.2l[1e].I}}o k.91(1e)},6M:q(k,1e,I){k=$(k);G 2l={},t=J.3O.6l;E(3Z 1e==\'Y\')2l=1e;1m 2l[1e]=M.2D(I)?1u:I;17(G 29 1Q 2l){1e=t.3A[29]||29;I=2l[29];E(t.1S[29])1e=t.1S[29](k,I);E(I===1r||I===1k)k.8D(1e);1m E(I===1u)k.bQ(1e,1e);1m k.bQ(1e,I)}o k},b5:q(k){o $(k).5I().3a},b6:q(k){o $(k).5I().2g},6d:q(k){o 1s J.6Z(k)},7s:q(k,1j){E(!(k=$(k)))o;G 7R=k.1j;o(7R.O>0&&(7R==1j||1s 4k("(^|\\\\s)"+1j+"(\\\\s|$)").2L(7R)))},bO:q(k,1j){E(!(k=$(k)))o;E(!k.7s(1j))k.1j+=(k.1j?\' \':\'\')+1j;o k},bP:q(k,1j){E(!(k=$(k)))o;k.1j=k.1j.1Y(1s 4k("(^|\\\\s+)"+1j+"(\\\\s+|$)"),\' \').3T();o k},fH:q(k,1j){E(!(k=$(k)))o;o k[k.7s(1j)?\'bP\':\'bO\'](1j)},fG:q(k){k=$(k);G L=k.5D;1P(L){G bN=L.3M;E(L.3r==3&&!/\\S/.2L(L.4f))k.6I(L);L=bN}o k},5E:q(k){o $(k).4C.4O()},76:q(k,3b){k=$(k),3b=$(3b);G bL=3b;E(k.bM)o(k.bM(3b)&8)===8;E(k.6L&&!1g.1W.58){G e=k.6L,a=3b.6L,5X=3b.3M;E(!5X){do{3b=3b.1O}1P(!(5X=3b.3M)&&3b.1O)}E(5X&&5X.6L)o(e>a&&e<5X.6L)}1P(k=k.1O)E(k==bL)o 1u;o 1r},bK:q(k){k=$(k);G 5W=k.4P();1A.bK(5W[0],5W[1]);o k},2a:q(k,14){k=$(k);14=14==\'97\'?\'7N\':14.95();G I=k.14[14];E(!I){G 9h=1b.fF.fE(k,1k);I=9h?9h[14]:1k}E(14==\'3P\')o I?5R(I):1.0;o I==\'7M\'?1k:I},fD:q(k){o $(k).2a(\'3P\')},5S:q(k,4I){k=$(k);G 9g=k.14,1f;E(M.3f(4I)){k.14.90+=\';\'+4I;o 4I.1J(\'3P\')?k.5Q(4I.1f(/3P:\\s*(\\d?\\.?\\d*)/)[1]):k}17(G 1y 1Q 4I)E(1y==\'3P\')k.5Q(4I[1y]);1m 9g[(1y==\'97\'||1y==\'7N\')?(M.2D(9g.96)?\'7N\':\'96\'):1y]=4I[1y];o k},5Q:q(k,I){k=$(k);k.14.3P=(I==1||I===\'\')?\'\':(I<0.7G)?0:I;o k},5I:q(k){k=$(k);G 3p=$(k).2a(\'3p\');E(3p!=\'7L\'&&3p!=1k)o{2g:k.5q,3a:k.5r};G 44=k.14;G bH=44.9f;G bI=44.1v;G bJ=44.3p;44.9f=\'7j\';44.1v=\'5P\';44.3p=\'fC\';G bG=k.bE;G bF=k.bD;44.3p=bJ;44.1v=bI;44.9f=bH;o{2g:bG,3a:bF}},fB:q(k){k=$(k);G 5W=J.2a(k,\'1v\');E(5W==\'5T\'||!5W){k.9d=1u;k.14.1v=\'6K\';E(1A.9e){k.14.2i=0;k.14.2x=0}}o k},fA:q(k){k=$(k);E(k.9d){k.9d=4z;k.14.1v=k.14.2i=k.14.2x=k.14.4Q=k.14.5U=\'\'}o k},fz:q(k){k=$(k);E(k.5h)o k;k.5h=J.2a(k,\'9c\')||\'7M\';E(k.5h!==\'7j\')k.14.9c=\'7j\';o k},fy:q(k){k=$(k);E(!k.5h)o k;k.14.9c=k.5h==\'7M\'?\'\':k.5h;k.5h=1k;o k},4P:q(k){G 2J=0,2K=0;do{2J+=k.5c||0;2K+=k.5b||0;k=k.3e}1P(k);o J.57(2K,2J)},6h:q(k){G 2J=0,2K=0;do{2J+=k.5c||0;2K+=k.5b||0;k=k.3e;E(k){E(k.1a==\'by\')2d;G p=J.2a(k,\'1v\');E(p!==\'5T\')2d}}1P(k);o J.57(2K,2J)},8g:q(k){k=$(k);E(k.2a(\'1v\')==\'5P\')o;G 9b=k.6h();G 2i=9b[1];G 2x=9b[0];G 2g=k.bE;G 3a=k.bD;k.bB=2x-5R(k.14.2x||0);k.bC=2i-5R(k.14.2i||0);k.bz=k.14.2g;k.bA=k.14.3a;k.14.1v=\'5P\';k.14.2i=2i+\'3i\';k.14.2x=2x+\'3i\';k.14.2g=2g+\'3i\';k.14.3a=3a+\'3i\';o k},8d:q(k){k=$(k);E(k.2a(\'1v\')==\'6K\')o;k.14.1v=\'6K\';G 2i=5R(k.14.2i||0)-(k.bC||0);G 2x=5R(k.14.2x||0)-(k.bB||0);k.14.2i=2i+\'3i\';k.14.2x=2x+\'3i\';k.14.3a=k.bA;k.14.2g=k.bz;o k},8c:q(k){G 2J=0,2K=0;do{2J+=k.4n||0;2K+=k.4p||0;k=k.1O}1P(k);o J.57(2K,2J)},5p:q(k){E(k.3e)o $(k.3e);E(k==1b.2q)o $(k);1P((k=k.1O)&&k!=1b.2q)E(J.2a(k,\'1v\')!=\'5T\')o $(k);o $(1b.2q)},6g:q(9a){G 2J=0,2K=0;G k=9a;do{2J+=k.5c||0;2K+=k.5b||0;E(k.3e==1b.2q&&J.2a(k,\'1v\')==\'5P\')2d}1P(k=k.3e);k=9a;do{E(!1g.1W.58||k.1a==\'by\'){2J-=k.4n||0;2K-=k.4p||0}}1P(k=k.1O);o J.57(2K,2J)},a3:q(k,22){G U=M.15({bx:1u,bw:1u,bv:1u,bu:1u,5c:0,5b:0},1p[2]||{});22=$(22);G p=22.6g();k=$(k);G 5V=[0,0];G 2T=1k;E(J.2a(k,\'1v\')==\'5P\'){2T=k.5p();5V=2T.6g()}E(2T==1b.2q){5V[0]-=1b.2q.5b;5V[1]-=1b.2q.5c}E(U.bx)k.14.2x=(p[0]-5V[0]+U.5b)+\'3i\';E(U.bw)k.14.2i=(p[1]-5V[1]+U.5c)+\'3i\';E(U.bv)k.14.2g=22.5q+\'3i\';E(U.bu)k.14.3a=22.5r+\'3i\';o k}};J.1d.bt.bs=1;M.15(J.1d,{fx:J.1d.2z,fw:J.1d.br});J.3O={6l:{3A:{1j:\'6e\',bo:\'17\'},1S:{}}};E(1g.1W.58){J.1d.2a=J.1d.2a.5g(q(3j,k,14){5y(14){2r\'2x\':2r\'2i\':2r\'5U\':2r\'4Q\':E(3j(k,\'1v\')===\'5T\')o 1k;2r\'3a\':2r\'2g\':E(!J.99(k))o 1k;G 7O=bq(3j(k,14),10);E(7O!==k[\'2V\'+14.6F()])o 7O+\'3i\';G 3k;E(14===\'3a\'){3k=[\'7P-2i-2g\',\'7Q-2i\',\'7Q-4Q\',\'7P-4Q-2g\']}1m{3k=[\'7P-2x-2g\',\'7Q-2x\',\'7Q-5U\',\'7P-5U-2g\']}o 3k.3H(7O,q(2O,1y){G 98=3j(k,1y);o 98===1k?2O:2O-bq(98,10)})+\'3i\';6p:o 3j(k,14)}});J.1d.51=J.1d.51.5g(q(3j,k,1U){E(1U===\'7K\')o k.7K;o 3j(k,1U)})}1m E(1g.1W.3X){J.1d.5p=J.1d.5p.5g(q(3j,k){k=$(k);G 1v=k.2a(\'1v\');E(1v!==\'5T\')o 3j(k);k.5S({1v:\'6K\'});G I=3j(k);k.5S({1v:1v});o I});$w(\'6h 6g\').1E(q(1F){J.1d[1F]=J.1d[1F].5g(q(3j,k){k=$(k);G 1v=k.2a(\'1v\');E(1v!==\'5T\')o 3j(k);G 3e=k.5p();E(3e&&3e.2a(\'1v\')===\'fv\')3e.5S({94:1});k.5S({1v:\'6K\'});G I=3j(k);k.5S({1v:1v});o I})});J.1d.2a=q(k,14){k=$(k);14=(14==\'97\'||14==\'7N\')?\'96\':14.95();G I=k.14[14];E(!I&&k.5f)I=k.5f[14];E(14==\'3P\'){E(I=(k.2a(\'2h\')||\'\').1f(/92\\(3P=(.*)\\)/))E(I[1])o 5R(I[1])/bp;o 1.0}E(I==\'7M\'){E((14==\'2g\'||14==\'3a\')&&(k.2a(\'3p\')!=\'7L\'))o k[\'2V\'+14.6F()]+\'3i\';o 1k}o I};J.1d.5Q=q(k,I){q 93(2h){o 2h.1Y(/92\\([^\\)]*\\)/gi,\'\')}k=$(k);G 5f=k.5f;E((5f&&!5f.fu)||(!5f&&k.14.94==\'ft\'))k.14.94=1;G 2h=k.2a(\'2h\'),14=k.14;E(I==1||I===\'\'){(2h=93(2h))?14.2h=2h:14.8D(\'2h\');o k}1m E(I<0.7G)I=0;14.2h=93(2h)+\'92(3P=\'+(I*bp)+\')\';o k};J.3O={7I:{3A:{\'6e\':\'1j\',\'17\':\'bo\'},1S:{7J:q(k,1U){o k.91(1U,2)},bn:q(k,1U){G L=k.bj(1U);o L?L.I:""},2k:q(k,1U){1U=k.91(1U);o 1U?1U.2H().3B(23,-2):1k},6J:q(k,1U){o $(k).3I(1U)?1U:1k},14:q(k){o k.14.90.2e()},7K:q(k){o k.7K}}}};J.3O.6l={3A:M.15({fs:\'fr\',fq:\'fp\'},J.3O.7I.3A),1S:{3J:q(k,I){k.3J=!!I},14:q(k,I){k.14.90=I?I:\'\'}}};J.3O.8X={};$w(\'fo fn fm fl fk 7i \'+\'fj fi fh fg\').1E(q(29){J.3O.6l.3A[29.2e()]=29;J.3O.8X[29.2e()]=29});(q(v){M.15(v,{aI:v.7J,ad:v.7J,1B:v.7J,5B:v.bn,3u:v.6J,3J:v.6J,ff:v.6J,fe:v.6J,fd:v.2k,ao:v.2k,fc:v.2k,fb:v.2k,fa:v.2k,f9:v.2k,f8:v.2k,f7:v.2k,f6:v.2k,f5:v.2k,f4:v.2k,f3:v.2k,f2:v.2k,f1:v.2k,f0:v.2k,eZ:v.2k,eY:v.2k,eX:v.2k})})(J.3O.7I.1S)}1m E(1g.1W.7H&&/eW:1\\.8\\.0/.2L(5e.5d)){J.1d.5Q=q(k,I){k=$(k);k.14.3P=(I==1)?0.eV:(I===\'\')?\'\':(I<0.7G)?0:I;o k}}1m E(1g.1W.4u){J.1d.5Q=q(k,I){k=$(k);k.14.3P=(I==1||I===\'\')?\'\':(I<0.7G)?0:I;E(I==1)E(k.1a==\'bf\'&&k.2g){k.2g++;k.2g--}1m 2s{G n=1b.bm(\' \');k.5O(n);k.6I(n)}2E(e){}o k};J.1d.4P=q(k){G 2J=0,2K=0;do{2J+=k.5c||0;2K+=k.5b||0;E(k.3e==1b.2q)E(J.2a(k,\'1v\')==\'5P\')2d;k=k.3e}1P(k);o J.57(2K,2J)}}E(1g.1W.3X||1g.1W.58){J.1d.5a=q(k,18){k=$(k);E(18&&18.3s)18=18.3s();E(M.4j(18))o k.5a().3o(18);18=M.4i(18);G 1a=k.1a.2R();E(1a 1Q J.5M.4G){$A(k.3g).1E(q(L){k.6I(L)});J.7F(1a,18.4h()).1E(q(L){k.5O(L)})}1m k.4C=18.4h();18.59.1L(18).4s();o k}}E(\'bl\'1Q 1b.43(\'1T\')){J.1d.1Y=q(k,18){k=$(k);E(18&&18.3s)18=18.3s();E(M.4j(18)){k.1O.8Z(18,k);o k}18=M.4i(18);G 2T=k.1O,1a=2T.1a.2R();E(J.5M.4G[1a]){G 3M=k.6B();G 8Y=J.7F(1a,18.4h());2T.6I(k);E(3M)8Y.1E(q(L){2T.7C(L,3M)});1m 8Y.1E(q(L){2T.5O(L)})}1m k.bl=18.4h();18.59.1L(18).4s();o k}}J.57=q(l,t){G 1q=[l,t];1q.2x=l;1q.2i=t;o 1q};J.7F=q(1a,7D){G 1T=1s J(\'1T\'),t=J.5M.4G[1a];E(t){1T.4C=t[0]+7D+t[1];t[2].7E(q(){1T=1T.5D})}1m 1T.4C=7D;o $A(1T.3g)};J.5M={4R:q(k,L){k.1O.7C(L,k)},2i:q(k,L){k.7C(L,k.5D)},4Q:q(k,L){k.5O(L)},75:q(k,L){k.1O.7C(L,k.3M)},4G:{eU:[\'<4H>\',\'</4H>\',1],7z:[\'<4H><5N>\',\'</5N></4H>\',2],bb:[\'<4H><5N><7B>\',\'</7B></5N></4H>\',3],8V:[\'<4H><5N><7B><bk>\',\'</bk></7B></5N></4H>\',4],bi:[\'<2z>\',\'</2z>\',1]}};(q(){M.15(C.4G,{bd:C.4G.7z,bc:C.4G.7z,ba:C.4G.8V})}).8m(J.5M);J.1d.7y={3I:q(k,1U){1U=J.3O.8X[1U]||1U;G L=$(k).bj(1U);o L&&L.eT}};J.1d.3z={};M.15(J,J.1d);E(!1g.3U.6H&&1b.43(\'1T\').4U){1A.6G={};1A.6G.1l=1b.43(\'1T\').4U;1g.3U.6H=1u}J.15=(q(){E(1g.3U.7x)o 1g.K;G 1d={},3z=J.1d.3z;G 15=M.15(q(k){E(!k||k.7c||k.3r!=1||k==1A)o k;G 2B=M.2A(1d),1a=k.1a,1y,I;E(3z[1a])M.15(2B,3z[1a]);17(1y 1Q 2B){I=2B[1y];E(M.2w(I)&&!(1y 1Q k))k[1y]=I.4v()}k.7c=1g.3q;o k},{7v:q(){E(!1g.3U.6H){M.15(1d,J.1d);M.15(1d,J.1d.7y)}}});15.7v();o 15})();J.3I=q(k,1U){E(k.3I)o k.3I(1U);o J.1d.7y.3I(k,1U)};J.6a=q(2B){G F=1g.3U,T=J.1d.3z;E(!2B){M.15(1C,1C.1d);M.15(1C.J,1C.J.1d);M.15(J.1d.3z,{"eS":M.2A(1C.1d),"eR":M.2A(1C.J.1d),"bi":M.2A(1C.J.1d),"bh":M.2A(1C.J.1d)})}E(1p.O==2){G 1a=2B;2B=1p[1]}E(!1a)M.15(J.1d,2B||{});1m{E(M.4x(1a))1a.1E(15);1m 15(1a)}q 15(1a){1a=1a.2R();E(!J.1d.3z[1a])J.1d.3z[1a]={};M.15(J.1d.3z[1a],2B)}q 7w(2B,5L,7A){7A=7A||1r;17(G 1y 1Q 2B){G I=2B[1y];E(!M.2w(I))3G;E(!7A||!(1y 1Q 5L))5L[1y]=I.4v()}}q b8(1a){G 1N;G 8U={"eQ":"eP","bh":"eO","P":"eN","eM":"eL","eK":"eJ","eI":"eH","eG":"eF","eE":"eD","eC":"5K","eB":"5K","eA":"5K","ez":"5K","ey":"5K","ex":"5K","Q":"ew","ev":"bg","eu":"bg","A":"et","bf":"es","er":"eq","ep":"be","eo":"be","bd":"8W","bc":"8W","7z":"8W","bb":"em","ba":"b9","8V":"b9","el":"ek","ej":"ei"};E(8U[1a])1N=\'8T\'+8U[1a]+\'J\';E(1A[1N])o 1A[1N];1N=\'8T\'+1a+\'J\';E(1A[1N])o 1A[1N];1N=\'8T\'+1a.6F()+\'J\';E(1A[1N])o 1A[1N];1A[1N]={};1A[1N].1l=1b.43(1a).4U;o 1A[1N]}E(F.6H){7w(J.1d,6G.1l);7w(J.1d.7y,6G.1l,1u)}E(F.7x){17(G 8S 1Q J.1d.3z){G 1N=b8(8S);E(M.2D(1N))3G;7w(T[8S],1N.1l)}}M.15(J,J.1d);8R J.3z;E(J.15.7v)J.15.7v();J.2P={}};1b.eh={5I:q(){G 8Q={};G B=1g.1W;$w(\'2g 3a\').1E(q(d){G D=d.6F();8Q[d]=(B.4u&&!1b.2S)?5J[\'eg\'+D]:(B.58)?1b.2q[\'b7\'+D]:1b.4o[\'b7\'+D]});o 8Q},b6:q(){o C.5I().2g},b5:q(){o C.5I().3a},ef:q(){o J.57(1A.a9||1b.4o.4p||1b.2q.4p,1A.a8||1b.4o.4n||1b.2q.4n)}};G 19=2b.2p({2I:q(1t){C.1t=1t.3T();C.b4()},b3:q(){E(!1g.3U.72)o 1r;G e=C.1t;E(1g.1W.4u&&(e.1J("-2t-1B")||e.1J(":5E")))o 1r;E((/(\\[[\\w-]*?:|:3J)/).2L(C.1t))o 1r;o 1u},b4:q(){E(C.b3())o C.b2();G e=C.1t,4g=19.6C,h=19.25,c=19.6D,3y,p,m;E(19.56[e]){C.3N=19.56[e];o}C.3N=["C.3N = q(1n) {","G r = 1n, h = 19.25, c = 1r, n;"];1P(e&&3y!=e&&(/\\S/).2L(e)){3y=e;17(G i 1Q 4g){p=4g[i];E(m=e.1f(p)){C.3N.1h(M.2w(c[i])?c[i](m):1s 32(c[i]).2S(m));e=e.1Y(m[0],\'\');2d}}}C.3N.1h("o h.8E(n);\\n}");7u(C.3N.2o(\'\\n\'));19.56[C.1t]=C.3N},b2:q(){G e=C.1t,4g=19.6C,x=19.2v,3y,m;E(19.56[e]){C.2v=19.56[e];o}C.3N=[\'.//*\'];1P(e&&3y!=e&&(/\\S/).2L(e)){3y=e;17(G i 1Q 4g){E(m=e.1f(4g[i])){C.3N.1h(M.2w(x[i])?x[i](m):1s 32(x[i]).2S(m));e=e.1Y(m[0],\'\');2d}}}C.2v=C.3N.2o(\'\');19.56[C.1t]=C.2v},7p:q(1n){1n=1n||1b;E(C.2v)o 1b.8a(C.2v,1n);o C.3N(1n)},1f:q(k){C.8P=[];G e=C.1t,4g=19.6C,as=19.8J;G 3y,p,m;1P(e&&3y!==e&&(/\\S/).2L(e)){3y=e;17(G i 1Q 4g){p=4g[i];E(m=e.1f(p)){E(as[i]){C.8P.1h([i,M.2A(m)]);e=e.1Y(m[0],\'\')}1m{o C.7p(1b).1J(k)}}}}G 1f=1u,1e,2j;17(G i=0,7t;7t=C.8P[i];i++){1e=7t[0],2j=7t[1];E(!19.8J[1e](k,2j)){1f=1r;2d}}o 1f},2H:q(){o C.1t},2C:q(){o"#<19:"+C.1t.2C()+">"}});M.15(19,{56:{},2v:{4D:"//*",1G:"/*",55:"/6E-4F::*[1]",6A:\'/6E-4F::*\',1a:q(m){E(m[1]==\'*\')o\'\';o"[b1-1e()=\'"+m[1].2e()+"\' 8O b1-1e()=\'"+m[1].2R()+"\']"},1j:"[6f(20(\' \', @6e, \' \'), \' #{1} \')]",1o:"[@1o=\'#{1}\']",5F:q(m){m[1]=m[1].2e();o 1s 32("[@#{1}]").2S(m)},29:q(m){m[1]=m[1].2e();m[3]=m[5]||m[6];o 1s 32(19.2v.6t[m[2]]).2S(m)},6y:q(m){G h=19.2v.2f[m[1]];E(!h)o\'\';E(M.2w(h))o h(m);o 1s 32(19.2v.2f[m[1]]).2S(m)},6t:{\'=\':"[@#{1}=\'#{3}\']",\'!=\':"[@#{1}!=\'#{3}\']",\'^=\':"[ee-b0(@#{1}, \'#{3}\')]",\'$=\':"[5H(@#{1}, (3h-O(@#{1}) - 3h-O(\'#{3}\') + 1))=\'#{3}\']",\'*=\':"[6f(@#{1}, \'#{3}\')]",\'~=\':"[6f(20(\' \', @#{1}, \' \'), \' #{3} \')]",\'|=\':"[6f(20(\'-\', @#{1}, \'-\'), \'-#{3}-\')]"},2f:{\'3K-1G\':\'[4B(8M-4F::*)]\',\'2u-1G\':\'[4B(6E-4F::*)]\',\'6v-1G\':\'[4B(8M-4F::* 8O 6E-4F::*)]\',\'5E\':"[3x(*) = 0 8L (3x(3Y()) = 0 8O ed(3Y(), \' \\t\\r\\n\', \'\') = \'\')]",\'3J\':"[@3J]",\'3u\':"[@3u]",\'aP\':"[4B(@3u)]",\'4B\':q(m){G e=m[6],p=19.6C,x=19.2v,3y,v;G 8N=[];1P(e&&3y!=e&&(/\\S/).2L(e)){3y=e;17(G i 1Q p){E(m=e.1f(p[i])){v=M.2w(x[i])?x[i](m):1s 32(x[i]).2S(m);8N.1h("("+v.5H(1,v.O-1)+")");e=e.1Y(m[0],\'\');2d}}}o"[4B("+8N.2o(" 8L ")+")]"},\'1X-1G\':q(m){o 19.2v.2f.1X("(3x(./8M-4F::*) + 1) ",m)},\'1X-2u-1G\':q(m){o 19.2v.2f.1X("(3x(./6E-4F::*) + 1) ",m)},\'1X-2t-1B\':q(m){o 19.2v.2f.1X("1v() ",m)},\'1X-2u-2t-1B\':q(m){o 19.2v.2f.1X("(2u() + 1 - 1v()) ",m)},\'3K-2t-1B\':q(m){m[6]="1";o 19.2v.2f[\'1X-2t-1B\'](m)},\'2u-2t-1B\':q(m){m[6]="1";o 19.2v.2f[\'1X-2u-2t-1B\'](m)},\'6v-2t-1B\':q(m){G p=19.2v.2f;o p[\'3K-2t-1B\'](m)+p[\'2u-2t-1B\'](m)},1X:q(5G,m){G 42,1I=m[6],8K;E(1I==\'aS\')1I=\'2n+0\';E(1I==\'aR\')1I=\'2n+1\';E(42=1I.1f(/^(\\d+)$/))o\'[\'+5G+"= "+42[1]+\']\';E(42=1I.1f(/^(-?\\d*)?n(([+-])(\\d+))?/)){E(42[1]=="-")42[1]=-1;G a=42[1]?54(42[1]):1;G b=42[2]?54(42[2]):0;8K="[((#{5G} - #{b}) ec #{a} = 0) 8L "+"((#{5G} - #{b}) 1T #{a} >= 0)]";o 1s 32(8K).2S({5G:5G,a:a,b:b})}}}},6D:{1a:\'n = h.1a(n, r, "#{1}", c); c = 1r;\',1j:\'n = h.1j(n, r, "#{1}", c); c = 1r;\',1o:\'n = h.1o(n, r, "#{1}", c); c = 1r;\',5F:\'n = h.5F(n, r, "#{1}", c); c = 1r;\',29:q(m){m[3]=(m[5]||m[6]);o 1s 32(\'n = h.29(n, r, "#{1}", "#{3}", "#{2}", c); c = 1r;\').2S(m)},6y:q(m){E(m[6])m[6]=m[6].1Y(/"/g,\'\\\\"\');o 1s 32(\'n = h.6y(n, "#{1}", "#{6}", r, c); c = 1r;\').2S(m)},4D:\'c = "4D";\',1G:\'c = "1G";\',55:\'c = "55";\',6A:\'c = "6A";\'},6C:{6A:/^\\s*~\\s*/,1G:/^\\s*>\\s*/,55:/^\\s*\\+\\s*/,4D:/^\\s/,1a:/^\\s*(\\*|[\\w\\-]+)(\\b|$)?/,1o:/^#([\\w\\-\\*]+)(\\b|$)/,1j:/^\\.([\\w\\-\\*]+)(\\b|$)/,6y:/^:((3K|2u|1X|1X-2u|6v)(-1G|-2t-1B)|5E|3J|(en|eb)ea|4B)(\\((.*?)\\))?(\\b|$|(?=\\s|[:+~>]))/,5F:/^\\[([\\w]+)\\]/,29:/\\[((?:[\\w-]*:)?[\\w-]+)\\s*(?:([!^$*~|]?=)\\s*(([\'"])([^\\4]*?)\\4|([^\'"][^\\]]*?)))?\\]/},8J:{1a:q(k,2j){o 2j[1].2R()==k.1a.2R()},1j:q(k,2j){o J.7s(k,2j[1])},1o:q(k,2j){o k.1o===2j[1]},5F:q(k,2j){o J.3I(k,2j[1])},29:q(k,2j){G 4f=J.51(k,2j[1]);o 4f&&19.6t[2j[2]](4f,2j[5]||2j[6])}},25:{20:q(a,b){17(G i=0,L;L=b[i];i++)a.1h(L);o a},7q:q(N){G aZ=1g.3q;17(G i=0,L;L=N[i];i++)L.3L=aZ;o N},52:q(N){17(G i=0,L;L=N[i];i++)L.3L=4z;o N},1i:q(1O,4e,6u){1O.3L=1g.3q;E(4e){17(G N=1O.3g,i=N.O-1,j=1;i>=0;i--){G L=N[i];E(L.3r==1&&(!6u||L.3L))L.7r=j++}}1m{17(G i=0,j=1,N=1O.3g;L=N[i];i++)E(L.3r==1&&(!6u||L.3L))L.7r=j++}},8E:q(N){E(N.O==0)o N;G V=[],n;17(G i=0,l=N.O;i<l;i++)E(!(n=N[i]).3L){n.3L=1g.3q;V.1h(J.15(n))}o 19.25.52(V)},4D:q(N){G h=19.25;17(G i=0,V=[],L;L=N[i];i++)h.20(V,L.4a(\'*\'));o V},1G:q(N){G h=19.25;17(G i=0,V=[],L;L=N[i];i++){17(G j=0,1G;1G=L.3g[j];j++)E(1G.3r==1&&1G.1a!=\'!\')V.1h(1G)}o V},55:q(N){17(G i=0,V=[],L;L=N[i];i++){G 6B=C.6w(L);E(6B)V.1h(6B)}o V},6A:q(N){G h=19.25;17(G i=0,V=[],L;L=N[i];i++)h.20(V,J.4E(L));o V},6w:q(L){1P(L=L.3M)E(L.3r==1)o L;o 1k},6x:q(L){1P(L=L.aY)E(L.3r==1)o L;o 1k},1a:q(N,1n,1a,26){G aX=1a.2R();G V=[],h=19.25;E(N){E(26){E(26=="4D"){17(G i=0,L;L=N[i];i++)h.20(V,L.4a(1a));o V}1m N=C[26](N);E(1a=="*")o N}17(G i=0,L;L=N[i];i++)E(L.1a.2R()===aX)V.1h(L);o V}1m o 1n.4a(1a)},1o:q(N,1n,1o,26){G 31=$(1o),h=19.25;E(!31)o[];E(!N&&1n==1b)o[31];E(N){E(26){E(26==\'1G\'){17(G i=0,L;L=N[i];i++)E(31.1O==L)o[31]}1m E(26==\'4D\'){17(G i=0,L;L=N[i];i++)E(J.76(31,L))o[31]}1m E(26==\'55\'){17(G i=0,L;L=N[i];i++)E(19.25.6x(31)==L)o[31]}1m N=h[26](N)}17(G i=0,L;L=N[i];i++)E(L==31)o[31];o[]}o(31&&J.76(31,1n))?[31]:[]},1j:q(N,1n,1j,26){E(N&&26)N=C[26](N);o 19.25.aW(N,1n,1j)},aW:q(N,1n,1j){E(!N)N=19.25.4D([1n]);G aV=\' \'+1j+\' \';17(G i=0,V=[],L,6z;L=N[i];i++){6z=L.1j;E(6z.O==0)3G;E(6z==1j||(\' \'+6z+\' \').1J(aV))V.1h(L)}o V},5F:q(N,1n,29,26){E(!N)N=1n.4a("*");E(N&&26)N=C[26](N);G V=[];17(G i=0,L;L=N[i];i++)E(J.3I(L,29))V.1h(L);o V},29:q(N,1n,29,I,aU,26){E(!N)N=1n.4a("*");E(N&&26)N=C[26](N);G 2c=19.6t[aU],V=[];17(G i=0,L;L=N[i];i++){G 4f=J.51(L,29);E(4f===1k)3G;E(2c(4f,I))V.1h(L)}o V},6y:q(N,1e,I,1n,26){E(N&&26)N=C[26](N);E(!N)N=1n.4a("*");o 19.2f[1e](N,I,1n)}},2f:{\'3K-1G\':q(N,I,1n){17(G i=0,V=[],L;L=N[i];i++){E(19.25.6x(L))3G;V.1h(L)}o V},\'2u-1G\':q(N,I,1n){17(G i=0,V=[],L;L=N[i];i++){E(19.25.6w(L))3G;V.1h(L)}o V},\'6v-1G\':q(N,I,1n){G h=19.25;17(G i=0,V=[],L;L=N[i];i++)E(!h.6x(L)&&!h.6w(L))V.1h(L);o V},\'1X-1G\':q(N,1I,1n){o 19.2f.1X(N,1I,1n)},\'1X-2u-1G\':q(N,1I,1n){o 19.2f.1X(N,1I,1n,1u)},\'1X-2t-1B\':q(N,1I,1n){o 19.2f.1X(N,1I,1n,1r,1u)},\'1X-2u-2t-1B\':q(N,1I,1n){o 19.2f.1X(N,1I,1n,1u,1u)},\'3K-2t-1B\':q(N,1I,1n){o 19.2f.1X(N,"1",1n,1r,1u)},\'2u-2t-1B\':q(N,1I,1n){o 19.2f.1X(N,"1",1n,1u,1u)},\'6v-2t-1B\':q(N,1I,1n){G p=19.2f;o p[\'2u-2t-1B\'](p[\'3K-2t-1B\'](N,1I,1n),1I,1n)},aQ:q(a,b,aT){E(a==0)o b>0?[b]:[];o $R(1,aT).3H([],q(2O,i){E(0==(i-b)%a&&(i-b)/a>=0)2O.1h(i);o 2O})},1X:q(N,1I,1n,4e,6u){E(N.O==0)o[];E(1I==\'aS\')1I=\'2n+0\';E(1I==\'aR\')1I=\'2n+1\';G h=19.25,V=[],8H=[],m;h.7q(N);17(G i=0,L;L=N[i];i++){E(!L.1O.3L){h.1i(L.1O,4e,6u);8H.1h(L.1O)}}E(1I.1f(/^\\d+$/)){1I=54(1I);17(G i=0,L;L=N[i];i++)E(L.7r==1I)V.1h(L)}1m E(m=1I.1f(/^(-?\\d*)?n(([+-])(\\d+))?/)){E(m[1]=="-")m[1]=-1;G a=m[1]?54(m[1]):1;G b=m[2]?54(m[2]):0;G 8I=19.2f.aQ(a,b,N.O);17(G i=0,L,l=8I.O;L=N[i];i++){17(G j=0;j<l;j++)E(L.7r==8I[j])V.1h(L)}}h.52(N);h.52(8H);o V},\'5E\':q(N,I,1n){17(G i=0,V=[],L;L=N[i];i++){E(L.1a==\'!\'||(L.5D&&!L.4C.1f(/^\\s*$/)))3G;V.1h(L)}o V},\'4B\':q(N,41,1n){G h=19.25,e9,m;G 8G=1s 19(41).7p(1n);h.7q(8G);17(G i=0,V=[],L;L=N[i];i++)E(!L.3L)V.1h(L);h.52(8G);o V},\'aP\':q(N,I,1n){17(G i=0,V=[],L;L=N[i];i++)E(!L.3u)V.1h(L);o V},\'3u\':q(N,I,1n){17(G i=0,V=[],L;L=N[i];i++)E(L.3u)V.1h(L);o V},\'3J\':q(N,I,1n){17(G i=0,V=[],L;L=N[i];i++)E(L.3J)V.1h(L);o V}},6t:{\'=\':q(2Z,v){o 2Z==v},\'!=\':q(2Z,v){o 2Z!=v},\'^=\':q(2Z,v){o 2Z.8F(v)},\'$=\':q(2Z,v){o 2Z.aO(v)},\'*=\':q(2Z,v){o 2Z.1J(v)},\'~=\':q(2Z,v){o(\' \'+2Z+\' \').1J(\' \'+v+\' \')},\'|=\':q(2Z,v){o(\'-\'+2Z.2R()+\'-\').1J(\'-\'+v.2R()+\'-\')}},49:q(1t){G 4A=[];1t.aN(/(([\\w#:.~>+()\\s-]+|\\*|\\[.*?\\])+)\\s*(,|$)/,q(m){4A.1h(m[1].3T())});o 4A},aM:q(1V,1t){G 2j=$$(1t),h=19.25;h.7q(2j);17(G i=0,V=[],k;k=1V[i];i++)E(k.3L)V.1h(k);h.52(2j);o V},5w:q(1V,1t,1i){E(M.53(1t)){1i=1t;1t=1r}o 19.aM(1V,1t||\'*\')[1i||0]},7o:q(k,4A){4A=19.49(4A.2o(\',\'));G V=[],h=19.25;17(G i=0,l=4A.O,41;i<l;i++){41=1s 19(4A[i].3T());h.20(V,41.7p(k))}o(l>1)?h.8E(V):V}});E(1g.1W.3X){M.15(19.25,{20:q(a,b){17(G i=0,L;L=b[i];i++)E(L.1a!=="!")a.1h(L);o a},52:q(N){17(G i=0,L;L=N[i];i++)L.8D(\'3L\');o N}})}q $$(){o 19.7o(1b,$A(1p))}G 1C={8y:q(1x){$(1x).8y();o 1x},aL:q(1V,U){E(3Z U!=\'Y\')U={3w:!!U};1m E(M.2D(U.3w))U.3w=1u;G 1w,I,8C=1r,4Z=U.4Z;G 7n=1V.3H({},q(1q,k){E(!k.3u&&k.1e){1w=k.1e;I=$(k).2W();E(I!=1k&&(k.1B!=\'4Z\'||(!8C&&4Z!==1r&&(!4Z||1w==4Z)&&(8C=1u)))){E(1w 1Q 1q){E(!M.4x(1q[1w]))1q[1w]=[1q[1w]];1q[1w].1h(I)}1m 1q[1w]=I}}o 1q});o U.3w?7n:M.4r(7n)}};1C.1d={6q:q(1x,U){o 1C.aL(1C.5z(1x),U)},5z:q(1x){o $A($(1x).4a(\'*\')).3H([],q(1V,1G){E(1C.J.5A[1G.1a.2e()])1V.1h(J.15(1G));o 1V})},e8:q(1x,7l,1e){1x=$(1x);G 7m=1x.4a(\'4y\');E(!7l&&!1e)o $A(7m).2M(J.15);17(G i=0,8B=[],O=7m.O;i<O;i++){G 4y=7m[i];E((7l&&4y.1B!=7l)||(1e&&4y.1e!=1e))3G;8B.1h(J.15(4y))}o 8B},8x:q(1x){1x=$(1x);1C.5z(1x).7k(\'8x\');o 1x},8w:q(1x){1x=$(1x);1C.5z(1x).7k(\'8w\');o 1x},aJ:q(1x){G 1V=$(1x).5z().5C(q(k){o\'7j\'!=k.1B&&!k.3u});G 8A=1V.5C(q(k){o k.3I(\'7i\')&&k.7i>=0}).aK(q(k){o k.7i}).3K();o 8A?8A:1V.8l(q(k){o[\'4y\',\'2z\',\'8v\'].1J(k.1a.2e())})},e7:q(1x){1x=$(1x);1x.aJ().aG();o 1x},2Q:q(1x,U){1x=$(1x),U=M.2A(U||{});G 2Y=U.3v,5B=1x.51(\'5B\')||\'\';E(5B.4O())5B=1A.7h.aI;U.3v=1x.6q(1u);E(2Y){E(M.3f(2Y))2Y=2Y.7g();M.15(U.3v,2Y)}E(1x.3I(\'1F\')&&!U.1F)U.1F=1x.1F;o 1s 1R.50(5B,U)}};1C.J={8z:q(k){$(k).8z();o k},2z:q(k){$(k).2z();o k}};1C.J.1d={6q:q(k){k=$(k);E(!k.3u&&k.1e){G I=k.2W();E(I!=4z){G 1H={};1H[k.1e]=I;o M.4r(1H)}}o\'\'},2W:q(k){k=$(k);G 1F=k.1a.2e();o 1C.J.5A[1F](k)},e6:q(k,I){k=$(k);G 1F=k.1a.2e();1C.J.5A[1F](k,I);o k},aH:q(k){$(k).I=\'\';o k},e5:q(k){o $(k).I!=\'\'},aG:q(k){k=$(k);2s{k.8z();E(k.2z&&(k.1a.2e()!=\'4y\'||![\'8q\',\'8y\',\'4Z\'].1J(k.1B)))k.2z()}2E(e){}o k},8x:q(k){k=$(k);k.e4();k.3u=1u;o k},8w:q(k){k=$(k);k.3u=1r;o k}};G e3=1C.J;G $F=1C.J.1d.2W;1C.J.5A={4y:q(k,I){5y(k.1B.2e()){2r\'ay\':2r\'ax\':o 1C.J.5A.aF(k,I);6p:o 1C.J.5A.8v(k,I)}},aF:q(k,I){E(M.2D(I))o k.3J?k.I:1k;1m k.3J=!!I},8v:q(k,I){E(M.2D(I))o k.I;1m k.I=I},2z:q(k,1i){E(M.2D(1i))o C[k.1B==\'2z-e2\'?\'aD\':\'aC\'](k);1m{G 3t,I,aE=!M.4x(1i);17(G i=0,O=k.O;i<O;i++){3t=k.U[i];I=C.7f(3t);E(aE){E(I==1i){3t.8u=1u;o}}1m 3t.8u=1i.1J(I)}}},aD:q(k){G 1i=k.e1;o 1i>=0?C.7f(k.U[1i]):1k},aC:q(k){G 1S,O=k.O;E(!O)o 1k;17(G i=0,1S=[];i<O;i++){G 3t=k.U[i];E(3t.8u)1S.1h(C.7f(3t))}o 1S},7f:q(3t){o J.15(3t).3I(\'I\')?3t.I:3t.3Y}};4Y.8s=2b.2p(aB,{2I:q($4d,k,4c,2X){$4d(2X,4c);C.k=$(k);C.4w=C.2W()},8t:q(){G I=C.2W();E(M.3f(C.4w)&&M.3f(I)?C.4w!=I:24(C.4w)!=24(I)){C.2X(C.k,I);C.4w=I}}});1C.J.aA=2b.2p(4Y.8s,{2W:q(){o 1C.J.2W(C.k)}});1C.aA=2b.2p(4Y.8s,{2W:q(){o 1C.6q(C.k)}});4Y.6r=2b.2p({2I:q(k,2X){C.k=$(k);C.2X=2X;C.4w=C.2W();E(C.k.1a.2e()==\'1x\')C.az();1m C.6s(C.k)},8r:q(){G I=C.2W();E(C.4w!=I){C.2X(C.k,I);C.4w=I}},az:q(){1C.5z(C.k).1E(C.6s,C)},6s:q(k){E(k.1B){5y(k.1B.2e()){2r\'ay\':2r\'ax\':1D.4t(k,\'e0\',C.8r.1L(C));2d;6p:1D.4t(k,\'dZ\',C.8r.1L(C));2d}}}});1C.J.6r=2b.2p(4Y.6r,{2W:q(){o 1C.J.2W(C.k)}});1C.6r=2b.2p(4Y.6r,{2W:q(){o 1C.6q(C.k)}});E(!1A.1D)G 1D={};M.15(1D,{dY:8,dX:9,dW:13,dV:27,dU:37,dT:38,dS:39,dR:40,dQ:46,dP:36,dO:35,dN:33,dM:34,dL:45,2P:{},8o:q(1c){G k;5y(1c.1B){2r\'dK\':k=1c.dJ;2d;2r\'dI\':k=1c.3s;2d;6p:o 1k}o J.15(k)}});1D.1d=(q(){G 4W;E(1g.1W.3X){G aw={0:1,1:4,2:2};4W=q(1c,4X){o 1c.8q==aw[4X]}}1m E(1g.1W.4u){4W=q(1c,4X){5y(4X){2r 0:o 1c.7e==1&&!1c.av;2r 1:o 1c.7e==1&&1c.av;6p:o 1r}}}1m{4W=q(1c,4X){o 1c.7e?(1c.7e===4X+1):(1c.8q===4X)}}o{dH:q(1c){o 4W(1c,0)},dG:q(1c){o 4W(1c,1)},dF:q(1c){o 4W(1c,2)},k:q(1c){G L=1D.15(1c).73;o J.15(L.3r==6o.au?L.1O:L)},5w:q(1c,1t){G k=1D.k(1c);E(!1t)o k;G 1V=[k].20(k.5x());o 19.5w(1V,1t,0)},4V:q(1c){o{x:1c.aq||(1c.dE+(1b.4o.4p||1b.2q.4p)),y:1c.ap||(1c.dD+(1b.4o.4n||1b.2q.4n))}},dC:q(1c){o 1D.4V(1c).x},dB:q(1c){o 1D.4V(1c).y},8p:q(1c){1D.15(1c);1c.ar();1c.at();1c.dA=1u}}})();1D.15=(q(){G 2B=M.4b(1D.1d).3H({},q(m,1e){m[1e]=1D.1d[1e].4v();o m});E(1g.1W.3X){M.15(2B,{at:q(){C.dz=1u},ar:q(){C.7d=1r},2C:q(){o"[Y 1D]"}});o q(1c){E(!1c)o 1r;E(1c.7c)o 1c;1c.7c=1g.3q;G 4V=1D.4V(1c);M.15(1c,{73:1c.dy,8o:1D.8o(1c),aq:4V.x,ap:4V.y});o M.15(1c,2B)}}1m{1D.1l=1D.1l||1b.6n("aj").4U;M.15(1D.1l,2B);o 1g.K}})();M.15(1D,(q(){G 2P=1D.2P;q 8k(k){E(k.8n)o k.8n[0];1p.5v.1o=1p.5v.1o||1;o k.8n=[++1p.5v.1o]}q 8j(1z){E(1z&&1z.1J(\':\'))o"ai";o 1z}q 79(1o){o 2P[1o]=2P[1o]||{}}q 7a(1o,1z){G c=79(1o);o c[1z]=c[1z]||[]}q am(k,1z,2c){G 1o=8k(k);G c=7a(1o,1z);E(c.5u("2c").1J(2c))o 1r;G 1K=q(1c){E(!1D||!1D.15||(1c.1z&&1c.1z!=1z))o 1r;1D.15(1c);2c.8m(k,1c)};1K.2c=2c;c.1h(1K);o 1K}q 8i(1o,1z,2c){G c=7a(1o,1z);o c.8l(q(1K){o 1K.2c==2c})}q ak(1o,1z,2c){G c=79(1o);E(!c[1z])o 1r;c[1z]=c[1z].6b(8i(1o,1z,2c))}q an(){17(G 1o 1Q 2P)17(G 1z 1Q 2P[1o])2P[1o][1z]=1k}E(1A.7b){1A.7b("ao",an)}o{4t:q(k,1z,2c){k=$(k);G 1e=8j(1z);G 1K=am(k,1z,2c);E(!1K)o k;E(k.78){k.78(1e,1K,1r)}1m{k.7b("5t"+1e,1K)}o k},4T:q(k,1z,2c){k=$(k);G 1o=8k(k),1e=8j(1z);E(!2c&&1z){7a(1o,1z).1E(q(1K){k.4T(1z,1K.2c)});o k}1m E(!1z){M.4b(79(1o)).1E(q(1z){k.4T(1z)});o k}G 1K=8i(1o,1z,2c);E(!1K)o k;E(k.al){k.al(1e,1K,1r)}1m{k.dx("5t"+1e,1K)}ak(1o,1z,2c);o k},5s:q(k,1z,2O){k=$(k);E(k==1b&&1b.6n&&!k.ah)k=1b.4o;G 1c;E(1b.6n){1c=1b.6n("aj");1c.dw("ai",1u,1u)}1m{1c=1b.dv();1c.ag="du"}1c.1z=1z;1c.2O=2O||{};E(1b.6n){k.ah(1c)}1m{k.dt(1c.ag,1c)}o 1D.15(1c)}}})());M.15(1D,1D.1d);J.6a({5s:1D.5s,4t:1D.4t,4T:1D.4T});M.15(1b,{5s:J.1d.5s.4v(),4t:J.1d.4t.4v(),4T:J.1d.4T.4v(),6m:1r});(q(){G 3W;q 6k(){E(1b.6m)o;E(3W)1A.af(3W);1b.5s("ds:6m");1b.6m=1u}E(1b.78){E(1g.1W.4u){3W=1A.ae(q(){E(/6m|ab/.2L(1b.2N))6k()},0);1D.4t(1A,"dr",6k)}1m{1b.78("dq",6k,1r)}}1m{1b.6l("<4S 1o=ac 4s ad=//:><\\/4S>");$("ac").77=q(){E(C.2N=="ab"){C.77=1k;6k()}}}})();3V.4r=M.4r;G dp={3p:J.aa};J.1d.dn=J.1d.76;G dm={dl:q(k,18){o J.3o(k,{4R:18})},dk:q(k,18){o J.3o(k,{2i:18})},dj:q(k,18){o J.3o(k,{4Q:18})},di:q(k,18){o J.3o(k,{75:18})}};G $3G=1s dh(\'"4q $3G" dg df, de "o" dd\');G 8f={a7:1r,8e:q(){C.a5=1A.a9||1b.4o.4p||1b.2q.4p||0;C.a4=1A.a8||1b.4o.4n||1b.2q.4n||0},dc:q(k,x,y){E(C.a7)o C.a6(k,x,y);C.6i=x;C.6j=y;C.2V=J.4P(k);o(y>=C.2V[1]&&y<C.2V[1]+k.5r&&x>=C.2V[0]&&x<C.2V[0]+k.5q)},a6:q(k,x,y){G 8h=J.8c(k);C.6i=x+8h[0]-C.a5;C.6j=y+8h[1]-C.a4;C.2V=J.4P(k);o(C.6j>=C.2V[1]&&C.6j<C.2V[1]+k.5r&&C.6i>=C.2V[0]&&C.6i<C.2V[0]+k.5q)},db:q(74,k){E(!74)o 0;E(74==\'da\')o((C.2V[1]+k.5r)-C.6j)/k.5r;E(74==\'d9\')o((C.2V[0]+k.5q)-C.6i)/k.5q},4P:J.1d.4P,6h:J.1d.6h,8g:q(k){8f.8e();o J.8g(k)},8d:q(k){8f.8e();o J.8d(k)},d8:J.1d.8c,3e:J.1d.5p,d7:J.1d.6g,2A:q(22,73,U){U=U||{};o J.a3(73,22,U)}};E(!1b.70)1b.70=q(a2){q 8b(1e){o 1e.4O()?1k:"[6f(20(\' \', @6e, \' \'), \' "+1e+" \')]"}a2.70=1g.3U.72?q(k,1j){1j=1j.2H().3T();G 89=/\\s/.2L(1j)?$w(1j).2M(8b).2o(\'\'):8b(1j);o 89?1b.8a(\'.//*\'+89,k):[]}:q(k,1j){1j=1j.2H().3T();G 1V=[],6d=(/\\s/.2L(1j)?$w(1j):1k);E(!6d&&!1j)o 1V;G N=$(k).4a(\'*\');1j=\' \'+1j+\' \';17(G i=0,1G,cn;1G=N[i];i++){E(1G.1j&&(cn=\' \'+1G.1j+\' \')&&(cn.1J(1j)||(6d&&6d.88(q(1e){o!1e.2H().4O()&&cn.1J(\' \'+1e+\' \')}))))1V.1h(J.15(1G))}o 1V};o q(1j,71){o $(71||1b.2q).70(1j)}}(J.1d);J.6Z=2b.2p();J.6Z.1l={2I:q(k){C.k=$(k)},48:q(W){C.k.1j.49(/\\s+/).2z(q(1e){o 1e.O>0}).48(W)},6c:q(1j){C.k.1j=1j},d6:q(87){E(C.1J(87))o;C.6c($A(C).20(87).2o(\' \'))},a1:q(86){E(!C.1J(86))o;C.6c($A(C).6b(86).2o(\' \'))},2H:q(){o $A(C).2o(\' \')}};M.15(J.6Z.1l,2G);J.6a();',62,1095,'||||||||||||||||||||element||||return||function||||||||||||this||if||var||value|Element||node|Object|nodes|length||||||options|results|iterator||object||||||style|extend||for|content|Selector|tagName|document|event|Methods|name|match|Prototype|push|index|className|null|prototype|else|root|id|arguments|result|false|new|expression|true|position|key|form|property|eventName|window|type|Form|Event|each|method|child|pair|formula|include|wrapper|bind|context|klass|parentNode|while|in|Ajax|values|div|attribute|elements|Browser|nth|replace|transport|concat|args|source||String|handlers|combinator||pattern|attr|getStyle|Class|handler|break|toLowerCase|pseudos|width|filter|top|matches|_getEv|attributes|Array||join|create|body|case|try|of|last|xpath|isFunction|left|response|select|clone|methods|inspect|isUndefined|catch|array|Enumerable|toString|initialize|valueT|valueL|test|map|readyState|memo|cache|request|toUpperCase|evaluate|parent|url|offset|getValue|callback|params|nv||targetNode|Template||||||||height|ancestor|responseText|iterable|offsetParent|isString|childNodes|string|px|proceed|properties|json|gsub|__method|insert|display|emptyFunction|nodeType|toElement|opt|disabled|parameters|hash|count|le|ByTag|names|slice|container|toJSON|toArray|replacement|continue|inject|hasAttribute|checked|first|_countedByPrototype|nextSibling|matcher|_attributeTranslations|opacity|insertions|apply|onComplete|strip|BrowserFeatures|Hash|timer|IE|text|typeof||selector|mm|createElement|els|||indexOf|_each|split|getElementsByTagName|keys|frequency|super|reverse|nodeValue|ps|stripScripts|toHTML|isElement|RegExp|start|responder|scrollTop|documentElement|scrollLeft|throw|toQueryString|defer|observe|WebKit|methodize|lastValue|isArray|input|undefined|expressions|not|innerHTML|descendant|nextSiblings|sibling|tags|table|styles|status|_object|toPaddedString|number|parts|blank|cumulativeOffset|bottom|before|script|stopObserving|__proto__|pointer|isButton|code|Abstract|submit|Request|readAttribute|unmark|isNumber|Number|adjacent|_cache|_returnOffset|Opera|evalScripts|update|offsetLeft|offsetTop|userAgent|navigator|currentStyle|wrap|_overflow|shift|decay|insertion|success|dispatchException|headers|end|getOffsetParent|offsetWidth|offsetHeight|fire|on|pluck|callee|findElement|ancestors|switch|getElements|Serializers|action|findAll|firstChild|empty|attrPresence|fragment|substring|getDimensions|self|Heading|destination|_insertionTranslations|tbody|appendChild|absolute|setOpacity|parseFloat|setStyle|static|right|delta|pos|nextAncestor|previousSiblings|receiver|evalJSON|getHeader|interpret|Responders|extras|exclusive|item|template|str|truncation|addMethods|without|set|classNames|class|contains|viewportOffset|positionedOffset|xcomp|ycomp|fireContentLoadedEvent|write|loaded|createEvent|Node|default|serialize|EventObserver|registerCallback|operators|ofType|only|nextElementSibling|previousElementSibling|pseudo|nodeClassName|laterSibling|next|patterns|criteria|following|capitalize|HTMLElement|ElementExtensions|removeChild|_flag|relative|sourceIndex|writeAttribute|onTimerEvent|getStatus|xml|state|contentType|post|_|toObject|responders|fillWith|ctx|expr|ClassNames|getElementsByClassName|parentElement|XPath|target|mode|after|descendantOf|onreadystatechange|addEventListener|getCacheForID|getWrappersForEventName|attachEvent|_extendedByPrototype|returnValue|which|optionValue|toQueryParams|location|tabIndex|hidden|invoke|typeName|inputs|data|findChildElements|findElements|mark|nodeIndex|hasClassName|token|eval|refresh|copy|SpecificElementExtensions|Simulated|TBODY|onlyIfAbsent|tr|insertBefore|html|times|_getContentFromAnonymousElement|00001|Gecko|read|_getAttr|title|none|auto|cssFloat|dim|border|padding|elementClassName|recursivelyCollect|curry|isSameOrigin|application|headerJSON|dispatch|port|asynchronous|onCreate|detect|escapeHTML|charAt|ScriptFragment|currentlyExecuting|classNameToRemove|classNameToAdd|all|cond|_getElementsByXPath|iter|cumulativeScrollOffset|relativize|prepare|Position|absolutize|offsetcache|findWrapper|getDOMEventName|getEventID|find|call|_prototypeEventID|relatedTarget|stop|button|onElementEvent|TimedObserver|execute|selected|textarea|enable|disable|reset|focus|firstByIndex|matchingInputs|submitted|removeAttribute|unique|startsWith|exclusions|indexed|indices|assertions|predicate|and|preceding|exclusion|or|tokens|dimensions|delete|tag|HTML|trans|TD|TableSection|has|fragments|replaceChild|cssText|getAttribute|alpha|stripAlpha|zoom|camelize|styleFloat|float|val|visible|forElement|offsets|overflow|_madePositioned|opera|visibility|elementStyle|css|range|query|updater|delay|Base|failure|Content|decodeURIComponent|getAllResponseHeaders|getResponseHeader|statusText|Response|Complete|exception|unfilterJSON|domain|protocol|evalJS|_complete|respondToReadyState|encoding|Version|onStateChange|get|isHash|activeRequestCount|succ|toTemplateReplacements|toQueryPair|lastIndexOf|_reverse|collect|falses|trues|found|slices|prepareReplacement|escapedString|character|camelized|len|Function|_methodized|superclass|subclass|remove|instanceMethods|clonePosition|deltaY|deltaX|withinIncludingScrolloffsets|includeScrollOffsets|pageYOffset|pageXOffset|toggle|complete|__onDOMContentLoaded|src|setInterval|clearInterval|eventType|dispatchEvent|dataavailable|HTMLEvents|destroyWrapper|removeEventListener|createWrapper|destroyCache|onunload|pageY|pageX|preventDefault||stopPropagation|TEXT_NODE|metaKey|buttonMap|radio|checkbox|registerFormCallbacks|Observer|PeriodicalExecuter|selectMany|selectOne|single|inputSelector|activate|clear|href|findFirstElement|sortBy|serializeElements|matchElements|scan|endsWith|enabled|getIndices|odd|even|total|operator|needle|byClassName|uTagName|previousSibling|_true|with|local|compileXPathMatcher|shouldUseXPath|compileMatcher|getHeight|getWidth|client|findDOMClass|TableCell|TH|TR|TFOOT|THEAD|TableCol|IMG|Mod|TEXTAREA|SELECT|getAttributeNode|td|outerHTML|createTextNode|_getAttrNode|htmlFor|100|parseInt|immediateDescendants|counter|identify|setHeight|setWidth|setTop|setLeft|BODY|_originalWidth|_originalHeight|_originalLeft|_originalTop|clientHeight|clientWidth|originalHeight|originalWidth|originalVisibility|originalPosition|originalDisplay|scrollTo|originalAncestor|compareDocumentPosition|nextNode|addClassName|removeClassName|setAttribute|descendants|firstDescendant|show|hide|ELEMENT_NODE|Updater|lastText|updateComplete|updateContent|sanitizeJSON|force|_getResponseJSON|escape|JSON|_getHeaderJSON|getStatusText|responseXML|Events|onException|evalResponse|interpolate|requestHeaders|2005|overrideMimeType|XMLHttpRequest|setRequestHeaders|KHTML|Safari|getTransport|register|XMLHTTP|ActiveXObject||these|Try|ObjectRange|from|encodeURIComponent|radix|arrayLength|forEach|size|uniq|sorted|inline|flatten|any|collections|eachSlice|Pattern|exec|comp|lt|amp|unescapeHTML|isJSON|sanitize|JSONFilter|sub|useDoubleQuotes|charCodeAt|specialChar|separator|stripTags|extractScripts|matchOne|scriptTag|matchAll|img|1000|lambda|timeout|argumentNames|instanceof|valueOf|subclasses|MobileSafari|add|page|realOffset|horizontal|vertical|overlap|within|instead|use|deprecated|is|Error|After|Bottom|Top|Before|Insertion|childOf||Toggle|DOMContentLoaded|load|dom|fireEvent|ondataavailable|createEventObject|initEvent|detachEvent|srcElement|cancelBubble|stopped|pointerY|pointerX|clientY|clientX|isRightClick|isMiddleClick|isLeftClick|mouseout|fromElement|mouseover|KEY_INSERT|KEY_PAGEDOWN|KEY_PAGEUP|KEY_END|KEY_HOME|KEY_DELETE|KEY_DOWN|KEY_RIGHT|KEY_UP|KEY_LEFT|KEY_ESC|KEY_RETURN|KEY_TAB|KEY_BACKSPACE|change|click|selectedIndex|one|Field|blur|present|setValue|focusFirstElement|getInputs|selectorType|abled|dis|mod|translate|starts|getScrollOffsets|inner|viewport|IFrame|IFRAME|FrameSet|FRAMESET|TableRow||COLGROUP|COL|TableCaption|CAPTION|Image|Anchor|DEL|INS|Quote|H6|H5|H4|H3|H2|H1|Directory|DIR|DList|DL|OList|OL|UList|UL|FieldSet|FIELDSET|Paragraph|TextArea|OptGroup|OPTGROUP|INPUT|FORM|specified|TABLE|999999|rv|onchange|onselect|onreset|onsubmit|onkeyup|onkeydown|onkeypress|onblur|onfocus|onmouseout|onmousemove|onmouseover|onmouseup|onmousedown|ondblclick|onclick|onload|multiple|readonly|longDesc|readOnly|maxLength|encType|accessKey|dateTime|vAlign|rowSpan|colSpan|cellSpacing|cellspacing|cellPadding|cellpadding|normal|hasLayout|fixed|childElements|getElementsBySelector|undoClipping|makeClipping|undoPositioned|makePositioned|block|getOpacity|getComputedStyle|defaultView|cleanWhitespace|toggleClassName|anonymous_element_|previous|down|up|siblings|createContextualFragment|selectNode|createRange|ownerDocument|cloneNode|NOTATION_NODE|DOCUMENT_FRAGMENT_NODE|DOCUMENT_TYPE_NODE|DOCUMENT_NODE|COMMENT_NODE|PROCESSING_INSTRUCTION_NODE|ENTITY_NODE|ENTITY_REFERENCE_NODE|CDATA_SECTION_NODE|ATTRIBUTE_NODE|snapshotItem|snapshotLength|ORDERED_NODE_SNAPSHOT_TYPE|XPathResult|getElementById|clearTimeout|PeriodicalUpdater|getAllHeaders|responseJSON|Interactive|Loaded|Loading|Uninitialized|https|ecma|java||Failure|Success|300|200|setRequestHeader|close|Connection|charset|javascript|Accept||With|Requested|send|postBody|open|Konqueror|_method|UTF|urlencoded|www|unregister|Microsoft|Msxml2|merge|unset|Math|floor|ceil|round|abs|isFinite|toColorPart|isNaN|intersect|reduce|compact|NodeList|some|every|entries|member|pop|zip|sort|reject|partition|min|max|inGroupsOf|grep|parseQuery|formed|Badly|SyntaxError|Eaeflnr|u00|x1f|x00|dasherize|underscore|fromCharCode|im|truncate|finally|getUTCSeconds|getUTCMinutes|getUTCHours|getUTCDate|getUTCMonth|getUTCFullYear|Date|01|setTimeout|bindAsEventListener|splice|boolean|unknown|RangeError|constructor|secure|Mobile|Apple|AppleWebKit'.split('|'),0,{}))
\ No newline at end of file diff --git a/tools/qtestlib/chart/benchmark_template.html b/tools/qtestlib/chart/benchmark_template.html new file mode 100644 index 0000000..11efd92 --- /dev/null +++ b/tools/qtestlib/chart/benchmark_template.html @@ -0,0 +1,192 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <title>Title</title> + <! Javascript Here> + + <script type="text/javascript"> + +function offsetLabels(labels, offset) +{ + var copy = new Array(); + for (key in labels) { + copy[key] = new Array(labels[key][0] + 0.25, labels[key][1]); + } + return copy; +} + +function createLogDataSet(inDataSet) +{ + var logDataSet = {}; + logDataSet.label = inDataSet.label; + logDataSet.data = []; + + if (!inDataSet.data) + return logDataSet; + + var length = inDataSet.data.length; + + for (var i = 0; i < length; i++) { + logDataSet.data[i] = []; + logDataSet.data[i][0] = inDataSet.data[i][0]; + logDataSet.data[i][1] = Math.log(inDataSet.data[i][1]); + } + return logDataSet; +} + + +function createLogData(inData) +{ + var logData = []; + + // foreach data set; + var length = inData.length; + for (var i = 0; i < length; ++i) { + logData[i] = createLogDataSet(inData[i]); + } + return logData; +} + +function createChart() { +// alert("create chart" + this.chartId) + + var dataSet; + + if (this.useLinearScale) + dataSet = this.selectedDataset; + else + dataSet = createLogData(this.selectedDataset); + + if (this.useLineChart) { + var f = Flotr.draw($(this.chartId), + dataSet, + { legend:{ backgroundColor: '#D2E8FF' } + , xaxis: { ticks: this.labels, noTicks : 10 } + , mouse: { + track: true, + lineColor: 'purple', + sensibility: 1, + trackDecimals: 2, + trackFormatter: function(obj){ return 'x = ' + obj.x +', y = ' + obj.y; } + } + }); + + } else { + var f = Flotr.draw($(this.chartId), + dataSet, + { legend:{ backgroundColor: '#D2E8FF'} + , bars: { show: true, lineWidth: 1, barWidth: this.barWidth } + , xaxis: { ticks: offsetLabels(this.labels, chartOptions.tickOffset), noTicks : 10 } + }); + } +} + +function checkform() +{ +// alert("check form " + this.form.id + " " + this.chartId); + var field = this.form.list + + // Apparently list of lenght one is not a list... + // Display the entire chart if there is only one data series. + if (!field.length) { + this.createChart(); + return; + } + + this.selectedDataset = []; + var data = []; + var index = 0; + + for (i = 0; i < field.length; i++) { + if (field[i].checked == true) { + this.selectedDataset[index++] = this.dataset[i]; + } else { + this.selectedDataset[index++] = []; + } + } + this.createChart(); +} + +function createFormSelector(form, value, text, type) +{ + var selector = document.createElement('input'); + form.appendChild(selector); + selector.type = type; + selector.name = 'list'; + selector.defaultChecked = true; + selector.value = value; + + form.appendChild(document.createTextNode(text)); + form.appendChild(document.createElement("BR")); +} + +function createCheckBox(form, value, text) +{ + createFormSelector(form, value, text, "checkbox"); +} + +function createRadioButton(form, value, text) +{ + createFormSelector(form, value, text, "radio"); +} + +function buildSeriesSelector(form, chartOptions) +{ +// alert("form" + form.id + " " + chartOptions.chartId); + var series = chartOptions.seriesLabels; + form.onclick = function() { /*alert("fn " + chartOptions.chartId);*/ chartOptions.checkform() }; + for (s = 0; s < series.length; ++s) { + createCheckBox(form, s, series[s]); + } +} + +function buildChartTypeSelector() +{ + createRadioButton(this.chartTypeForm, 0, "Bar Chart"); + createRadioButton(this.chartTypeForm, 1, "Line Chart"); + + var field = this.chartTypeForm.list; + if (this.useLineChart) + field[1].checked = true; + else + field[0].checked = true; + + var chartOptions = this; + this.chartTypeForm.onclick = function() { + var field = chartOptions.chartTypeForm.list; + + chartOptions.useLineChart = (field[1].checked == true); + chartOptions.checkform(); + }; +} + +function buildScaleSelector() +{ + createRadioButton(this.scaleForm, 0, "Linear Scale"); + createRadioButton(this.scaleForm, 1, "Logarithmic Scale"); + + var field = this.scaleForm.list; + field[0].checked = true; + field[1].checked = false; + + var chartOptions = this; + this.scaleForm.onclick = function() { + var field = chartOptions.scaleForm.list; + + chartOptions.useLinearScale = (field[0].checked == true); + chartOptions.checkform(); + }; +} + + + </script> + </head> + <body> + <h2> + <! Title Here> + </h2> + <! Description Here> + <! Chart Here> + </body> +</html> diff --git a/tools/qtestlib/chart/chart.pro b/tools/qtestlib/chart/chart.pro new file mode 100644 index 0000000..6f6e6d5 --- /dev/null +++ b/tools/qtestlib/chart/chart.pro @@ -0,0 +1,16 @@ +HEADERS += $$PWD/database.h $$PWD/reportgenerator.h +SOURCES += $$PWD/database.cpp $$PWD/reportgenerator.cpp +SOURCES += main.cpp +RESOURCES = $$PWD/chart.qrc + +QT += sql xml +CONFIG += console release +CONFIG -= app_bundle + + +TEMPLATE = app +DEPENDPATH += . +INCLUDEPATH += . +TARGET = chart + + diff --git a/tools/qtestlib/chart/chart.qrc b/tools/qtestlib/chart/chart.qrc new file mode 100644 index 0000000..90f782e --- /dev/null +++ b/tools/qtestlib/chart/chart.qrc @@ -0,0 +1,9 @@ + <!DOCTYPE RCC><RCC version="1.0"> + <qresource> + <file>chart_template.html</file> + <file>benchmark_template.html</file> + <file>3rdparty/excanvas.js</file> + <file>3rdparty/flotr.js</file> + <file>3rdparty/prototype.js</file> + </qresource> + </RCC>
\ No newline at end of file diff --git a/tools/qtestlib/chart/chart_template.html b/tools/qtestlib/chart/chart_template.html new file mode 100644 index 0000000..0a4b81a --- /dev/null +++ b/tools/qtestlib/chart/chart_template.html @@ -0,0 +1,110 @@ + <div> + <h3> + <! Test Name Here> + </h3> + <div id= + <! Chart ID Here> + style="width:900px;height:350px;"></div> + + <table cellspacing = "10"><tr> + + <td valign = "top"> + <form id= + <! Form ID Here> + <b> Data series </b><br> + </form> + </td> + + <td valign = "top"> + <form id= + <! ChartTypeForm ID Here> + <b> Chart Type </b><br> + </form> + </td> + + <td valign = "top"> + <form id= + <! ScaleForm ID Here> + <b> Scale </b><br> + </form> + </td> + + </tr></table> + + </div> + <script type="text/javascript"> + var chartId = + <! Chart ID Here> + ; + + var chartType = + <! Chart Type Here> + ; + + var seriesLabels = + <! Series Labels Here> + + var dataset = []; + <! Data Goes Here> + + var labels = [ + <! Labels Go Here> + ]; + + var colors = new Hash({ + <! ColorScheme Here> + }); + + var shouldFill = + <! Fill Setting Here> + ; + + var form = document.getElementById( + <! Form ID Here> + ); + + var chartTypeForm = document.getElementById( + <! ChartTypeForm ID Here> + ); + + var scaleForm = document.getElementById( + <! ScaleForm ID Here> + ); + + + + var chartOptions = new Object(); + chartOptions.chartId = chartId; + chartOptions.chartType = chartType; + chartOptions.dataset = dataset; + chartOptions.colors = colors; + chartOptions.shouldFill = shouldFill; + chartOptions.labels = labels; + chartOptions.seriesLabels = seriesLabels; + chartOptions.useLineChart = true; + chartOptions.useLinearScale = true; + chartOptions.createChart = createChart; + + chartOptions.ticks = labels; + chartOptions.barWidth = 0.5; + chartOptions.tickOffset = 0.25; + + chartOptions.useLineChart = + <! Use Line Chart Here> + + chartOptions.chartTypeForm = chartTypeForm; + chartOptions.buildChartTypeSelector = buildChartTypeSelector; + chartOptions.buildChartTypeSelector(); + + chartOptions.scaleForm = scaleForm; + chartOptions.buildScaleSelector = buildScaleSelector; + chartOptions.buildScaleSelector(); + + chartOptions.selectedDataset = dataset; + chartOptions.checkform = checkform; + chartOptions.form = form; + chartOptions.buildSeriesSelector = buildSeriesSelector; + chartOptions.buildSeriesSelector(form, chartOptions); + chartOptions.checkform(); + </script> + diff --git a/tools/qtestlib/chart/database.cpp b/tools/qtestlib/chart/database.cpp new file mode 100644 index 0000000..5abfe50 --- /dev/null +++ b/tools/qtestlib/chart/database.cpp @@ -0,0 +1,321 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications 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 "database.h" +#include <QtGui> +#include <QtXml> + +// Database schema definition and open/create functions + +QString resultsTable = QString("(TestName varchar, TestCaseName varchar, Series varchar, Idx varchar, ") + + QString("Result varchar, ChartType varchar, Title varchar, ChartWidth varchar, ") + + QString("ChartHeight varchar, TestTitle varchar, QtVersion varchar, Iterations varchar") + + QString(")"); + +void execQuery(QSqlQuery query, bool warnOnFail) +{ + bool ok = query.exec(); + if (!ok && warnOnFail) { + qDebug() << "FAIL:" << query.lastQuery() << query.lastError().text(); + } +} + +void execQuery(const QString &spec, bool warnOnFail) +{ + QSqlQuery query; + query.prepare(spec); + execQuery(query, warnOnFail); +} + +QSqlDatabase openDataBase(const QString &databaseFile) +{ +// qDebug() << "open data base"; + QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); + db.setDatabaseName(databaseFile); + bool ok = db.open(); + if (!ok) + qDebug() << "FAIL: could not open database"; + return db; +} + +QSqlDatabase createDataBase(const QString &databaseFile) +{ +// qDebug() << "create data base"; + QSqlDatabase db = openDataBase(databaseFile); + + execQuery("DROP TABLE Results", false); + execQuery("CREATE TABLE Results " + resultsTable); + + return db; +} + +struct Tag +{ + Tag(QString key, QString value) + : key(key.trimmed()), value(value.trimmed()) + { + + } + + QString key; + QString value; +}; + +QList<Tag> parseTag(const QString &tag) +{ + // Format: key1=value ; key2=value + // key1=value key2=value + // value--value + + QList<Tag> keyValues; + + QString keyValuePairSeparator(""); + if (tag.contains(";")) + keyValuePairSeparator = ';'; + if (tag.contains("--")) + keyValuePairSeparator = "--"; + + foreach (QString keyValue, tag.split(keyValuePairSeparator)) { + if (keyValue.contains("=")) { + QStringList parts = keyValue.split("="); + keyValues.append(Tag(parts.at(0), parts.at(1))); + } else { + keyValues.append(Tag(QString(), keyValue)); // no key, just a value. + } + } + + return keyValues; +} + +void loadXml(const QStringList &fileNames) +{ + foreach(const QString &fileName, fileNames) { + QFileInfo fi( fileName ); + loadXml(fileName, fi.fileName()); + } +} + +void loadXml(const QString &fileName, const QString &context) +{ + QFile f(fileName); + f.open(QIODevice::ReadOnly); + loadXml(f.readAll(), context); +} + +void loadXml(const QByteArray &xml, const QString& context) +{ + QDomDocument doc; + + int line; + int col; + QString errorMsg; + if (doc.setContent(xml, &errorMsg, &line, &col) == false) { + qDebug() << "dom setContent failed" << line << col << errorMsg; + } + + // Grab "Value" from <Environment><QtVersion>Value</QtVersion></Environment> + QString qtVersion = doc.elementsByTagName("Environment").at(0).toElement().elementsByTagName("QtVersion") + .at(0).toElement().childNodes().at(0).nodeValue(); + QString testCase = doc.elementsByTagName("TestCase").at(0).toElement().attributeNode("name").value(); + +// qDebug() << "qt version" << qtVersion; +// qDebug() << "test case" << testCase; + + DataBaseWriter writer; + writer.testName = testCase; // testCaseName and testName is mixed up in the database writer class + writer.qtVersion = qtVersion; + + QDomNodeList testFunctions = doc.elementsByTagName("TestFunction"); + for (int i = 0; i < testFunctions.count(); ++i) { + QDomElement function = testFunctions.at(i).toElement(); + QString functionName = function.attributeNode("name").value(); + writer.testCaseName = functionName; // testCaseName and testName is mixed up in the database writer class + +// qDebug() << "fn" << functionName; + + QDomNodeList results = function.elementsByTagName("BenchmarkResult"); + for (int j = 0; j < results.count(); ++j) { + QDomElement result = results.at(j).toElement(); + QString tag = result.attributeNode("tag").value(); + + Q_UNUSED(context); +// if (!context.isEmpty()) +// tag += QString(" (%1)").arg(context); + + QString series; + QString index; + + // By convention, "--" separates series and indexes in tags. + if (tag.contains("--")) { + QStringList parts = tag.split("--"); + series = parts.at(0); + index = parts.at(1); + } else { + series = tag; + } + + QString resultString = result.attributeNode("value").value(); + QString iterationCount = result.attributeNode("iterations").value(); + double resultNumber = resultString.toDouble() / iterationCount.toDouble(); + writer.addResult(series, index, QString::number(resultNumber), iterationCount); +// qDebug() << "result" << series << index << tag << resultString << iterationCount; + } + } +} + +void displayTable(const QString &table) +{ + QSqlTableModel *model = new QSqlTableModel(); + model->setTable(table); + model->select(); + QTableView *view = new QTableView(); + view->setModel(model); + view->show(); +} + +void printDataBase() +{ + QSqlQuery query; + query.prepare("SELECT TestName, TestCaseName, Result FROM Results;"); + bool ok = query.exec(); + qDebug() << "printDataBase ok?" << ok; + + query.next(); + qDebug() << ""; + qDebug() << "Benchmark" << query.value(0).toString(); + query.previous(); + + while (query.next()) { + // QString country = query.value(fieldNo).toString(); + // doSomething(country); + qDebug() << "result for" << query.value(1).toString() << query.value(2).toString(); + } +} + +// TempTable implementation + +static int tempTableIdentifier = 0; +TempTable::TempTable(const QString &spec) +{ + m_name = "TempTable" + QString::number(tempTableIdentifier++); + execQuery("CREATE TEMP TABLE " + m_name + " " + spec); +} + +TempTable::~TempTable() +{ + // ref count and drop it? +} + +QString TempTable::name() +{ + return m_name; +} + +// DataBaseWriter implementation + +DataBaseWriter::DataBaseWriter() +{ + disable = false; + chartSize = QSize(800, 400); + databaseFileName = ":memory:"; + qtVersion = QT_VERSION_STR; +} + +void DataBaseWriter::openDatabase() +{ + db = openDataBase(databaseFileName); +} + +void DataBaseWriter::createDatabase() +{ + db = createDataBase(databaseFileName); +} + +void DataBaseWriter::beginTransaction() +{ + if (db.transaction() == false) { + qDebug() << db.lastError(); + qFatal("no transaction support"); + } +} + +void DataBaseWriter::commitTransaction() +{ + db.commit(); +} + +void DataBaseWriter::rollbackTransaction() +{ + db.rollback(); +} + +void DataBaseWriter::addResult(const QString &result) +{ + return addResult(QString(), QString(), result); +} + +void DataBaseWriter::addResult(const QString &series, const QString &index, const QString &result, const QString &iterations) +{ + if (disable) + return; + + QSqlQuery query; + + query.prepare("INSERT INTO Results (TestName, TestCaseName, Series, Idx, Result, ChartWidth, ChartHeight, Title, TestTitle, ChartType, QtVersion, Iterations) " + "VALUES (:TestName, :TestCaseName, :Series, :Idx, :Result, :ChartWidth, :ChartHeight, :Title, :TestTitle, :ChartType, :QtVersion, :Iterations)"); + query.bindValue(":TestName", testName); + query.bindValue(":TestCaseName", testCaseName); + query.bindValue(":Series", series); + query.bindValue(":Idx", index); + query.bindValue(":Result", result); + query.bindValue(":ChartWidth", chartSize.width()); + query.bindValue(":ChartHeight", chartSize.height()); + query.bindValue(":Title", chartTitle); + query.bindValue(":TestTitle", testTitle); + query.bindValue(":QtVersion", qtVersion); + query.bindValue(":Iterations", iterations); + + + if (chartType == LineChart) + query.bindValue(":ChartType", "LineChart"); + else + query.bindValue(":ChartType", "BarChart"); + execQuery(query); +} diff --git a/util/install/win/globalinformation.h b/tools/qtestlib/chart/database.h index 843dac6..448a44f 100644 --- a/util/install/win/globalinformation.h +++ b/tools/qtestlib/chart/database.h @@ -3,7 +3,7 @@ ** 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. +** This file is part of the tools applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage @@ -38,56 +38,62 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#ifndef GLOBALINFORMATION_H -#define GLOBALINFORMATION_H -#include <qstring.h> +#ifndef DATABASE_H +#define DATABASE_H -class GlobalInformation +#include <QtCore> +#include <QtSql> + +extern QString resultsTable; +QSqlDatabase openDataBase(const QString &databaseFile = "database"); +QSqlDatabase createDataBase(const QString &databaseFile = "database"); + +void loadXml(const QStringList &fileNames); +void loadXml(const QString &fileName, const QString &context=QString::null); +void loadXml(const QByteArray &xml, const QString &context=QString::null); + +void execQuery(QSqlQuery query, bool warnOnFail = true); +void execQuery(const QString &spec, bool warnOnFail = true); +void printDataBase(); +void displayTable(const QString &table); + +class TempTable { 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 + TempTable(const QString &spec); + ~TempTable(); + QString name(); +private: + QString m_name; +}; - 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 ChartType { BarChart, LineChart }; +class DataBaseWriter +{ +public: + DataBaseWriter(); + QString databaseFileName; + QString testTitle; + QString testName; + QString testCaseName; + ChartType chartType; + QSize chartSize; + QString chartTitle; + QString qtVersion; + bool disable; + + void openDatabase(); + void createDatabase(); - enum Text { - MakeTool, - IDE, - Mkspec - }; + void beginTransaction(); + void commitTransaction(); + void rollbackTransaction(); - QString text(Text t) const; + void addResult(const QString &result); + void addResult(const QString &series , const QString &index, const QString &result, const QString &iterations = QLatin1String("1")); -private: - bool _reconfig; - QString _qtVersionStr; -#if defined(QSA) - QString _qsaVersionStr; -#endif - SysId _sysId; + QSqlDatabase db; }; -extern GlobalInformation globalInformation; -#endif // GLOBALINFORMATION_H +#endif diff --git a/util/install/win/resource.h b/tools/qtestlib/chart/main.cpp index 791edfe..9bb937c 100644 --- a/util/install/win/resource.h +++ b/tools/qtestlib/chart/main.cpp @@ -3,7 +3,7 @@ ** 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. +** This file is part of the tools applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage @@ -38,40 +38,45 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#ifndef RESOURCE_H -#define RESOURCE_H +#include <QtCore> +#include <QtSql> +#include <database.h> +#include <reportgenerator.h> + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); -#include <qcstring.h> -#include <qstring.h> + QSqlDatabase db = createDataBase(":memory:"); -class ResourceLoader -{ -public: - ResourceLoader( char *resourceName, int minimumSize=0 ); - ~ResourceLoader(); + if (argc < 2) { - bool isValid() const; - QByteArray data(); + // Try stdin + QFile in; + in.open(stdin, QIODevice::ReadOnly); + QByteArray xml = in.readAll(); -private: - bool valid; - int arSize; - char *arData; - QByteArray ba; -}; + if (xml.isEmpty()) { + qDebug() << "Usage: chart xml-file [xml-file2 xml-file3 ...]"; + qDebug() << "See also QTestLib's \"-chart\" option"; + return 0; + } else { + loadXml(xml, QString()); + } + } -#if defined(Q_OS_WIN32) -class ResourceSaver -{ -public: - ResourceSaver( const QString& appName ); - ~ResourceSaver(); + QStringList files; + for (int i = 1; i < argc; i++) { + QString file = QString::fromLocal8Bit(argv[i]); + files += file; + } + + if (files.isEmpty() == false) + loadXml(files); - bool setData( char *resourceName, const QByteArray &data, QString *errorMessage=0 ); + ReportGenerator reportGenerator; + reportGenerator.writeReports(); -private: - QString applicationName; -}; -#endif + db.close(); +} -#endif // RESOURCE_H diff --git a/tools/qtestlib/chart/reportgenerator.cpp b/tools/qtestlib/chart/reportgenerator.cpp new file mode 100644 index 0000000..bf5bf94 --- /dev/null +++ b/tools/qtestlib/chart/reportgenerator.cpp @@ -0,0 +1,562 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications 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 "reportgenerator.h" + +// Report generator file utility functions + +QList<QByteArray> readLines(const QString &fileName) +{ + QList<QByteArray> lines; + QFile f(fileName); + f.open(QIODevice::ReadOnly | QIODevice::Text); + while(!f.atEnd()) + lines.append(f.readLine()); + return lines; +} + +void writeLines(const QString &fileName, const QList<QByteArray> &lines) +{ + QFile f(fileName); + f.open(QIODevice::WriteOnly | QIODevice::Text); + foreach(const QByteArray line, lines) + f.write(line); +} + +void writeFile(const QString &fileName, const QByteArray &contents) +{ + QFile f(fileName); + f.open(QIODevice::WriteOnly | QIODevice::Append); + f.write(contents); +} + +// Report generator database utility functions + +QStringList select(const QString &field, const QString &tableName) +{ + QSqlQuery query; + query.prepare("SELECT DISTINCT " + field +" FROM " + tableName); + bool ok = query.exec(); + Q_UNUSED(ok); +// if (!ok) +// qDebug() << "select unique ok" << ok; + + QStringList values; + while (query.next()) { + values += query.value(0).toString(); + } + return values; +} + +QStringList selectUnique(const QString &field, const QString &tableName) +{ + QSqlQuery query; + query.prepare("SELECT DISTINCT " + field +" FROM " + tableName); + bool ok = query.exec(); + Q_UNUSED(ok); +// if (!ok) +// qDebug() << "select unique ok" << ok; + + QStringList values; + while (query.next()) { + values += query.value(0).toString(); + } + return values; +} + +QSqlQuery selectFromSeries(const QString &serie, const QString &column, const QString &tableName, const QString &seriesName) +{ + QSqlQuery query; + if (serie == QString()) + query.prepare("SELECT " + column + " FROM " + tableName); + else + query.prepare("SELECT " + column + " FROM " + tableName + " WHERE " + seriesName + "='" + serie + "'"); + /*bool ok =*/ query.exec(); + + +// qDebug() << "selectDataFromSeries ok?" << ok << query.size(); + return query; +} + +int countDataFromSeries(const QString &serie, const QString &tableName, const QString &seriesName) +{ +// qDebug() << "count" << serie << "in" << tableName; + QSqlQuery query; + query.prepare("SELECT COUNT(Result) FROM " + tableName + " WHERE" + seriesName + "='" + serie + "'"); + bool ok = query.exec(); + if (!ok) { + qDebug() << "query fail" << query.lastError(); + } + + qDebug() << "countDataFromSeries ok?" << ok << query.size(); + query.next(); + return query.value(0).toInt(); +} + +// Report generator output utility functions + +QList<QByteArray> printData(const QString &tableName, const QString &seriesName, const QString &indexName) +{ + QList<QByteArray> output; + QStringList series = selectUnique(seriesName, tableName); +// qDebug() << "series" << series; + if (series.isEmpty()) + series+=QString(); + + foreach (QString serie, series) { + QSqlQuery data = selectFromSeries(serie, "Result", tableName, seriesName); + QSqlQuery labels = selectFromSeries(serie, indexName, tableName, seriesName); + + QByteArray dataLine = "dataset.push({ data: ["; + int i = 0; + while (data.next() && labels.next()) { + QString label = labels.value(0).toString(); + + QString labelString; + bool ok; + label.toInt(&ok); + if (ok) + labelString = label; + // else + labelString = QString::number(i); + + dataLine += ("[" + labelString + ", " + data.value(0).toString() + "]"); + + ++i; + if (data.next()) { + dataLine += ", "; + data.previous(); + } + } + dataLine += "], label : \"" + serie + "\" });\n"; + output.append(dataLine); + } + return output; +} + +// Determines if a line chart should be used. Returns true if the first label is numerical. +bool useLineChart(const QString &tableName, const QString &seriesName, const QString &indexName) +{ + QList<QByteArray> output; + QStringList series = selectUnique(seriesName, tableName); + if (series.isEmpty()) + return false; + + QSqlQuery data = selectFromSeries(series[0], indexName, tableName, seriesName); + + if (data.next()) { + QString label = data.value(0).toString(); + bool ok; + label.toDouble(&ok); + return ok; + } + + return false; +} + +int countLabels(const QString &tableName, const QString &seriesName, const QString &indexName) +{ + QStringList series = selectUnique(seriesName, tableName); + if (series.isEmpty()) + return 0; + QSqlQuery data = selectFromSeries(series[0], indexName, tableName, seriesName); + int count = 0; + while (data.next()) + count++; + + return count; +} + + +QList<QByteArray> printLabels(const QString &tableName, const QString &seriesName, const QString &indexName) +{ + QList<QByteArray> output; + QStringList series = selectUnique(seriesName, tableName); + if (series.isEmpty()) + return QList<QByteArray>(); + + QSqlQuery data = selectFromSeries(series[0], indexName, tableName, seriesName); + + int count = 0; + while (data.next()) + count++; + + data.first(); data.previous(); + + const int labelCount = 10; + int skip = count / labelCount; + + QByteArray dataLine; + int i = 0; + while (data.next()) { + dataLine += ("[" + QByteArray::number(i) + ",\"" + data.value(0).toString() + "\"]"); + ++i; + if (data.next()) { + dataLine += ", "; + data.previous(); + } + + // skip labels. + i += skip; + for (int j = 0; j < skip; ++j) + data.next(); + } + dataLine += "\n"; + output.append(dataLine); + return output; +} + +QByteArray printSeriesLabels(const QString &tableName, const QString &seriesColumnName) +{ + QByteArray output; + QStringList series = selectUnique(seriesColumnName, tableName); + if (series.isEmpty()) + return "[];\n"; + + output += "["; + + foreach(const QString &serie, series) { + output += "\"" + serie.toLocal8Bit() + "\", "; + } + output.chop(1); //remove last comma + output += "]\n"; + return output; +} + +void addJavascript(QList<QByteArray> *output, const QString &fileName) +{ + output->append("<script type=\"text/javascript\">\n"); + (*output) += readLines(fileName); + output->append("</script>\n"); +} + +void addJavascript(QList<QByteArray> *output) +{ + addJavascript(output, ":3rdparty/prototype.js"); + addJavascript(output, ":3rdparty/excanvas.js"); + addJavascript(output, ":3rdparty/flotr.js"); +} + +TempTable selectRows(const QString &sourceTable, const QString &column, const QString &value) +{ + TempTable tempTable(resultsTable); + + QSqlQuery query; + query.prepare("INSERT INTO " + tempTable.name() + " SELECT * FROM " + sourceTable + + " WHERE " + column + "='" + value + "'"); + execQuery(query); + +// displayTable(tempTable.name()); + + return tempTable; +} + +TempTable mergeVersions(const QString &) +{ + +// QtVersion - As series +// Result - (free) +// Idx - match +// TestName - match +// CaseName - match + +// (Series - average) +/* + TempTable tempTable(resultsTable); + QStringlist versions = selectUnique("QtVersions", sourceTable); + + QSqlQuery oneVersion = select(WHERE QtVersions = versions.at(0)) + while (oneVersion.next) { + QSqlQuery otherversions = selectMatches(QStringList() << "TestName" << "TestCaseName" << "Idx") + while (otherversions.next) { + insert(temptable + } + } +*/ + return TempTable(""); +} + +QStringList fieldPriorityList = QStringList() << "Idx" << "Series" << "QtVersion"; + +struct IndexSeriesFields +{ + QString index; + QString series; +}; + +IndexSeriesFields selectFields(const QString &table) +{ + IndexSeriesFields fields; + foreach (QString field, fieldPriorityList) { +// qDebug() << "unique" << field << selectUnique(field, table).count(); + QStringList rows = selectUnique(field, table); + + if (rows.count() <= 1 && rows.join("") == QString("")) + continue; + + if (fields.index.isEmpty()) { + fields.index = field; + continue; + } + + if (fields.series.isEmpty()) { + fields.series = field; + break; + } + } + return fields; +} + +TempTable selectTestCase(const QString &testCase, const QString &sourceTable) +{ + return selectRows(sourceTable, QLatin1String("TestCaseName"), testCase); +} + +QString field(const QSqlQuery &query, const QString &name) +{ + return query.value(query.record().indexOf(name)).toString(); +} + +QSqlQuery selectAllResults(const QString &tableName) +{ + QSqlQuery query; + query.prepare("SELECT * FROM " + tableName); + execQuery(query); + return query; +} + +void printTestCaseResults(const QString &testCaseName) +{ +// QStringList testCases = selectUnique("TestCaseName", "Results"); + qDebug() << ""; + qDebug() << "Results for benchmark" << testCaseName; + TempTable temptable = selectTestCase(testCaseName, "Results"); + QSqlQuery query = selectAllResults(temptable.name()); + if (query.isActive() == false) { + qDebug() << "No results"; + return; + } + + query.next(); + + if (field(query, "Idx") == QString()) { + do { + qDebug() << "Result:" << field(query, "result"); + } while (query.next()); + } else if (field(query, "Series") == QString()) { + do { + qDebug() << field(query, "Idx") << " : " << field(query, "result"); + } while (query.next()); + } else { + do { + qDebug() << field(query, "Series") << " - " << field(query, "Idx") << " : " << field(query, "result"); + } while (query.next()); + } + + qDebug() << ""; +} + + +// ReportGenerator implementation + +ReportGenerator::ReportGenerator() +{ + m_colorScheme = QList<QByteArray>() << "#a03b3c" << "#3ba03a" << "#3a3ba0" << "#3aa09f" << "#39a06b" << "#a09f39"; +} + + +void ReportGenerator::writeReport(const QString &tableName, const QString &fileName, bool combineQtVersions) +{ + QStringList testCases = selectUnique("TestCaseName", tableName); + QList<QByteArray> lines = readLines(":benchmark_template.html"); + QList<QByteArray> output; + + foreach(QByteArray line, lines) { + if (line.contains("<! Chart Here>")) { + foreach (const QString testCase, testCases) { + TempTable testCaseTable = selectTestCase(testCase, tableName); + output += writeChart(testCaseTable.name(), combineQtVersions); + } + } else if (line.contains("<! Title Here>")) { + QStringList name = selectUnique("TestName", tableName); + output += "Test: " + name.join("").toLocal8Bit(); + } else if (line.contains("<! Description Here>")) { + output += selectUnique("TestTitle", tableName).join("").toLocal8Bit(); + } else if (line.contains("<! Javascript Here>")){ + addJavascript(&output); + } else { + output.append(line); + } + } + + m_fileName = fileName; + + writeLines(m_fileName, output); + qDebug() << "Wrote report to" << m_fileName; +} + +void ReportGenerator::writeReports() +{ +/* + QStringList versions = selectUnique("QtVersion", "Results"); + + // qDebug() << "versions" << versions; + + foreach (QString version, versions) { + QString fileName = "results-" + version + ".html"; + TempTable versionTable = selectRows("Results", "QtVersion", version); + writeReport(versionTable.name(), fileName, false); + } +*/ + writeReport("Results", "results.html", false); + qDebug() << "Supported browsers: Firefox, Safari, Opera, Qt Demo Browser (IE and KDE 3 Konqueror are not supported)"; +} + +QString ReportGenerator::fileName() +{ + return m_fileName; +} + +QList<QByteArray> ReportGenerator::writeChart(const QString &tableName, bool combineQtVersions) +{ + QSqlQuery query; + query.prepare("SELECT TestName, Series, Idx, Result, ChartWidth, ChartHeight, Title, TestCaseName, ChartType, QtVersion FROM " + tableName); + execQuery(query); + + QString seriesName; + QString indexName; + + if (combineQtVersions) { + IndexSeriesFields fields = selectFields(tableName); + seriesName = fields.series; + indexName = fields.index; + } else { + seriesName = "Series"; + indexName = "Idx"; + } + + QList<QByteArray> data = printData(tableName, seriesName, indexName); + QList<QByteArray> labels = printLabels(tableName, seriesName, indexName); + QByteArray seriesLabels = printSeriesLabels(tableName, seriesName); + QByteArray useLineChartString = useLineChart(tableName, seriesName, indexName) ? "true" : "false" ; + + query.next(); + QString testName = query.value(0).toString(); + QSize size(query.value(4).toInt(), query.value(5).toInt()); +// QString title = "Test Function: " + query.value(7).toString() + " - " + query.value(6).toString(); + QString title = "Test Function: " + query.value(7).toString(); + QString chartId = "\"" + query.value(7).toString() + "\""; + QString formId = "\"" + query.value(7).toString() + "form\""; + QString chartTypeFormId = "\"" + query.value(7).toString() + "chartTypeform\""; + QString scaleFormId = "\"" + query.value(7).toString() + "scaleform\""; + QString type = query.value(8).toString(); + + // Skip chart generation if there isn't enough data. + if (countLabels(tableName, seriesName, indexName) < 2) { + qDebug() << title.toAscii() << "No chartable data. (See the \"series\" test function" + << "in examples/qtestlib/tutorial5 for an example.) "; + return QList<QByteArray>() << title.toAscii() << " (no chartable data)"; // TODO: genrate text table here. + } + +// QString qtVersion = query.value(9).toString(); + query.previous(); + + QString sizeString = "height=\"" + QString::number(size.height()) + "\" width=\"" + QString::number(size.width()) + "\""; + + QString fillString; + if (type == "LineChart") + fillString = "false"; + else + fillString = "true"; + + QByteArray colors = printColors(tableName, seriesName); + + QList<QByteArray> lines = readLines(":chart_template.html"); + QList<QByteArray> output; + + foreach(QByteArray line, lines) { + if (line.contains("<! Test Name Here>")) { + output.append(title.toLocal8Bit()); + } else if (line.contains("<! Chart ID Here>")) { + output += chartId.toLocal8Bit(); + } else if (line.contains("<! Form ID Here>")) { + output += formId.toLocal8Bit(); + } else if (line.contains("<! ChartTypeForm ID Here>")) { + output += chartTypeFormId.toLocal8Bit(); + } else if (line.contains("<! ScaleForm ID Here>")) { + output += scaleFormId.toLocal8Bit(); + } else if (line.contains("<! Size>")) { + output += sizeString.toLocal8Bit(); + } else if (line.contains("<! ColorScheme Here>")) { + output += colors; + } else if (line.contains("<! Data Goes Here>")) { + output += data; + } else if (line.contains("<! Labels Go Here>")) { + output += labels; + } else if (line.contains("<! Use Line Chart Here>")) { + output += useLineChartString + ";"; + } else if (line.contains("<! Chart Type Here>")) { + output += "\"" + type.toLocal8Bit() + "\""; + } else if (line.contains("<! Fill Setting Here>")) { + output += fillString.toLocal8Bit(); + } else if (line.contains("<! Series Labels Here>")) { + output += seriesLabels; + } else { + output.append(line); + } + } + + return output; +} + +QByteArray ReportGenerator::printColors(const QString &tableName, const QString &seriesName) +{ + QByteArray colors; + int i = 0; + QStringList series = selectUnique(seriesName, tableName); + foreach (const QString &serie, series) { + colors.append("'" + serie.toLocal8Bit() + "': '" + m_colorScheme.at(i % m_colorScheme.count()) + "',\n"); + ++ i; + } + colors.chop(2); // remove last comma + colors.append("\n"); + return colors; +} + diff --git a/util/install/win/dialogs/folderdlgimpl.h b/tools/qtestlib/chart/reportgenerator.h index 25e13b5..bb69d1a 100644 --- a/util/install/win/dialogs/folderdlgimpl.h +++ b/tools/qtestlib/chart/reportgenerator.h @@ -3,7 +3,7 @@ ** 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. +** This file is part of the tools applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage @@ -38,28 +38,26 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#ifndef FOLDERDLGIMPL_H -#define FOLDERDLGIMPL_H +#ifndef REPORTGENERATOR_H +#define REPORTGENERATOR_H -#include "folderdlg.h" +#include "database.h" -class WinShell; - -class FolderDlgImpl : public FolderDlg +class ReportGenerator { - 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(); +public: + ReportGenerator(); + QByteArray printColors(const QString &tableName, const QString &seriesName); + QList<QByteArray> writeChart(const QString &tableName, bool combineVersions); + void writeReport(const QString &tableName, const QString &filename, bool combineVersions = false); + void writeReports(); + QString fileName(); private: - void ScanFolder( QString folderPath, QListViewItem* parent ); + QList<QByteArray> m_colorScheme; + QString m_fileName; }; -#endif // FOLDERDLGIMPL_H +void printTestCaseResults(const QString &testCaseName); + +#endif + diff --git a/tools/qtestlib/qtestlib.pro b/tools/qtestlib/qtestlib.pro index da94e81..9ff7360 100644 --- a/tools/qtestlib/qtestlib.pro +++ b/tools/qtestlib/qtestlib.pro @@ -1,4 +1,4 @@ TEMPLATE = subdirs -!wince*: SUBDIRS += updater +!wince*: SUBDIRS += updater chart wince*: contains(QT_CONFIG, cetest): SUBDIRS += wince CONFIG += ordered 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 <qdatastream.h> -#include <qfileinfo.h> -#include <qdir.h> -#include <qapplication.h> -#include "../../../src/3rdparty/zlib/zlib.h" -#include "../keygen/keyinfo.h" -#ifdef Q_OS_UNIX -# include <sys/stat.h> -# include <unistd.h> -# include <sys/types.h> -# include <utime.h> -#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 <qstring.h> -#include <qfile.h> -#include <qstringlist.h> -#include <qobject.h> - -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<QString,QString> 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 <qregexp.h> - -#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 <qdatetime.h> -#include <qstring.h> - -/* - 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 <qfile.h> - -#include <stdio.h> -#include <stdlib.h> - -#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 <key>\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 <key>\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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>LicenseDialog</class> -<widget class="QDialog"> - <property name="name"> - <cstring>LicenseDialog</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>582</width> - <height>531</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="caption"> - <string>License Agreement</string> - </property> - <property name="sizeGripEnabled"> - <bool>true</bool> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QTextView"> - <property name="name"> - <cstring>licenseText</cstring> - </property> - <property name="text"> - <string>License text goes here</string> - </property> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout1</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <spacer> - <property name="name" stdset="0"> - <cstring>Horizontal Spacing2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QPushButton"> - <property name="name"> - <cstring>buttonReject</cstring> - </property> - <property name="text"> - <string>Reject</string> - </property> - <property name="accel"> - <number>0</number> - </property> - <property name="autoDefault"> - <bool>true</bool> - </property> - <property name="default"> - <bool>true</bool> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>buttonAccept</cstring> - </property> - <property name="text"> - <string>Accept</string> - </property> - <property name="accel"> - <number>0</number> - </property> - <property name="autoDefault"> - <bool>true</bool> - </property> - </widget> - </hbox> - </widget> - </vbox> -</widget> -<connections> - <connection> - <sender>buttonReject</sender> - <signal>pressed()</signal> - <receiver>LicenseDialog</receiver> - <slot>reject()</slot> - </connection> - <connection> - <sender>buttonAccept</sender> - <signal>clicked()</signal> - <receiver>LicenseDialog</receiver> - <slot>reject()</slot> - </connection> - <connection> - <sender>buttonAccept</sender> - <signal>pressed()</signal> - <receiver>LicenseDialog</receiver> - <slot>accept()</slot> - </connection> -</connections> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 <qfile.h> -#include <qtextview.h> - -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 <qapplication.h> -#include <qdir.h> -#include <qfileinfo.h> - -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 Binary files differdeleted file mode 100644 index 20139b9..0000000 --- a/util/install/mac/unpackage.icns +++ /dev/null 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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>UnpackDlg</class> -<widget class="QDialog"> - <property name="name"> - <cstring>UnpackDlg</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>678</width> - <height>337</height> - </rect> - </property> - <property name="caption"> - <string>Install unpacking tool</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout24</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel"> - <property name="name"> - <cstring>pixmapLabel</cstring> - </property> - <property name="pixmap"> - <pixmap>image0</pixmap> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>AlignAuto|AlignTop</set> - </property> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout23</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel"> - <property name="name"> - <cstring>headerLabel</cstring> - </property> - <property name="font"> - <font> - <bold>1</bold> - </font> - </property> - <property name="text"> - <string>Open Qt/CD Package</string> - </property> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout22</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout21</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout19</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel"> - <property name="name"> - <cstring>destLabel</cstring> - </property> - <property name="text"> - <string>Destination path:</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>Spacer12</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>1</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QLineEdit"> - <property name="name"> - <cstring>destPath</cstring> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>destButton</cstring> - </property> - <property name="text"> - <string></string> - </property> - <property name="pixmap"> - <pixmap>image1</pixmap> - </property> - </widget> - </hbox> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout20</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel"> - <property name="name"> - <cstring>TextLabel1</cstring> - </property> - <property name="text"> - <string>License Key:</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>Spacer13</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Fixed</enum> - </property> - <property name="sizeHint"> - <size> - <width>24</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QLineEdit"> - <property name="name"> - <cstring>srcKey</cstring> - </property> - </widget> - </hbox> - </widget> - </vbox> - </widget> - <widget class="QTextView"> - <property name="name"> - <cstring>logOutput</cstring> - </property> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout4</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <spacer> - <property name="name"> - <cstring>Spacer1</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QPushButton"> - <property name="name"> - <cstring>unpackButton</cstring> - </property> - <property name="text"> - <string>Unpack</string> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>cancelButton</cstring> - </property> - <property name="text"> - <string>Cancel</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>Spacer2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </hbox> - </widget> - </vbox> - </widget> - </vbox> - </widget> - </hbox> - </widget> - </vbox> -</widget> -<images> - <image name="image0"> - <data format="XPM.GZ" length="30371">789cdd7c594f23cbb6e6fbf9155b27de8e5a716d8c01abd50f600633786286abfb105366da608cb10dc657fddf7bc51ac269a04e517b975abbbb5096fd919991b1e62122f98f7ffd71db6bfff1affff8c774666603f7872bcccb1ffff2f3d1e8fd3fffeb7ffdf73ffe59ad54fe88c7d646e58f8d7ffe8f7ffc53cdff707fa80afe43dc4f782762a30457f1bc394b18cfab19e34dbebf9730ddff2e98eeb72b4cf74f19efd0fdd6248ce77d5730df5f3076747d6811aef2fc3d3fbfcaf3b123c43b429f794a98e6f72898c7cf12a6f97519f378669430ddaf05f3fd2a61babfc398e9332661ba7f2998ef6f244cf4df0bdea0f33963a6df0e13a6f17605d378be92309ecf64fe8ec653fc3ce15fe8264ce38d198b7c5f18333de18cb1cce736e26a925fa831e6f3d95ec278de6ac134df704f58e6935f0ba6f3ee2561baff5c30d1631e18f37cf384f9fe5dc63c7f25f7f3fc4c9bf0063fdf0e180bfd743ed16b4e09cbf5ca3296eb0d63799e62ccf717680f1b69fcbc9730c9eb5630db5f83318f97df244cfab2c758e4b1245c93f9bd32e6e76533c63c9ea7f934d2f58eb15c7f9f30e9478db1e8f73963b14f7a5e6393c7731b11d7aae9fa2163996f3f611aff96b0dcaf7cc278de7519cbfc91dfb586dcef2784e5fe2c4b18cf177b8299bf0bc64caf9b264cf67c2698ae57323e3fdf2d13a6f9cbf8c28f9384c93e503f37abc25ff3cc58c6d38465bce25030db4b9b318faf2e1226fa2f05b37fb9215c677ee846c244df1be33af3eb4130dd5ff0fcea0dd63ff4a79b46e6af34639e8fa3f99a3af3d7e78cebec8f9a8c793c95254cf2ed0866fb1d11deaa32fde8bfeb1b222f7b40b8eed97eee046f3470fea784b7aa3cfebd60a66f91309d7f124cfea5088c991fe199313f2f3f466c923ce8fa447f7e4578ab5aabe2f88e318f674e12a6f17605d3f39d67ccfc513b8299bf4a305d9f3f32e6f915fb82f9fa8b84495f3a82f9fe82f036f3c7d884c9fff604d3f5d99c31cfdf22ffb622bf895f0709d3f3d279a6f79031df1f3619376a28bf7cc998e71b2e05f3f3657c4fd79b09e134df8560be7e85f1fac0e36fb33cec3861badf0a667d183166fdcd0682999f7dc1cc4f94d7569257a810deaed27cb30ee33acd27ef0a267db1778c797cbd2d98c6f7af09d3787dc1747fd64d18cfab0563d607fb9030f1775f308d1f2e12267eed08e6f15b8477449efb82597ff1feed9ae89f191016f9e81dc6cc6fffc058ec792998edf55130c7ff3bc2f2bc6012c6f9fa53c1345fb3c198e5998784897fcf82f9fa2663e66f2ef7337f3deacbb615f9e409f3f89631cfd70f09efb07db93bc1ac9f26619acf89e04d7c5ede66ccf32d0ac63c1fbbcb58f8f396305eef2682e9fa624ab8c1f2c85e04d3f5f655305d1fd0de776a22ff901396f9fbbb8489ff4782999f3b8c99ff99dccffcf655c144af4dd76f1a9caf8cc7fc0e0973be7c4138cdff50308f7fc258ec6b9f31cb571582f97c3761a207ed6fc726fadf0927fd538c79fcec5430d1137a09233de1867183ce671b09e3f9ec9c31dba7ca05337d6f82e97e759a30deef7705d7b1fecb1e090b3f4c9f31d39b6f3266fad43861d2b71661c3fc35178299bf3709d3f58e31f3a358264cfc467b83f4899f5f78c6a2af81b03ccfdf32167db109133f268299dfe709233f6c87b161792e04d3f9fc8471e0e769c1747d1809a6f1dd3161bbc1f16e2298ed7f85e9fe5dc1ccdf47c65b9ccf5e274cfe50c6dfe27c82e76f0d3f6f2b61b2df84e9fa8cf8e7c41ecc0d63d68f6c4ad8883fda13ccf6dc14ccfabe4818c7d35b82693c2798e3697ecf98f96d3a8c997f393f5ff851d88469fcba60f607b384c91f9c31667e8553c11c2f2682891e7d2198e7e304b3fd1c3166fe9aed84299f7a124ce3eb56c2943fee0be6e79d0ba6e7b903c681f3f1b784291e2e05f3f8bb09537d91eee7f8ba9d308d5f25ec581ff553c2347e5330d733370913ffe47ad647779d30c5b7b960be5f9e27fa87f1c26c8abf7433c2a23ff65930f9a3d04998ecafce98edd96f3236ac2f2f8c597fc21be1646f23c12ccf9384493f9560f687d78c591fc28660badf5f254cfe54c6dfa2fb2dcf4ff4c1e582391e68c1accf321ed3139a09533c180ae6f9ed30667df13e61f20f9960ce2f5dc224cf3bc13c9f743fe98bee09667e0f0433fd8709e3fc4c9570d2af79c2a45f23c1acbfd384e9fc9160b68f76c2c4ff743dfbf715a6f3db82997f45c2383f2df363fdd579c2f47c2598e7e712a6f30bc1ccaf9784499fdf0573bc64fe3bf617fa24611a6f28989f374998e2f9bd60ce876a8c59deea3661b2bf9660d6b746c2647f581f1927f1d1927c92ffcc170993bd9d0b26fb53ef8c99beec4a30eb7f4d305def041b8e0fb70953fc6f0b66fdae0a66fd3e4b98e27385b1c487ad84e9f9424fa0fb0be27ff267619630f1e34830e7871b09533ebf2d98e3f1306192f75830ebdb0ad37cde04d37c8ccc87f5cdbd0a6679bd254cf2ac08e67cbd9e30c5a7749ee6a7bb0953feb414ccf9c8ad609a8f67fe893eaa03c1ac8f0f09537ce909e67e712b61f217f78259bf9a09d37cae04d37cf44dc2649fc78cc57f05c1cc9fab8469be323ff657f99e60eea76c264cfac6fcf6ec8f544530c7e71bc19cdfa17ddb941f1686b0f87ff79830e97b8f31d3afb61326ff742598ef3f12ccfafe9630f9537ebef85f35104cd7ab4dc2e25fb34230fb9f61c2c41f2f98f3a5c098fda1bd4a98f44f09e67cad9630e53b5dc1dcff90e7b1feb9b9608e17fb09933dcb7cc43f1e244cf2d910ccfab897303d7f2c98fd914b98eca32598f9bdc224af07c1ccffe384e97c9db1c4d7f384c91e847fac9fc52c61ea0f3d0ae678b69130f1c70ae67a2b4f98e63f15ccfeee2c61cacf593e9ee36d3e4898e6772598e3e546c2d43f60fa3cfb138ffec27ad14f7bcd38b03e1e0bde227eed124efef34530fbc346c2144faa82d93f7704d378f96dc2e43feb8c59ffb271c294bf5c0be6783c4898fc515f30e7579782b99e3e14ccf9da5430cd47a5eb693ec51b63d657b59f30d99f16ccfdac79c2a40f35c1eccf3705b37c9b0993fe9d32967ae03561ca1f841f520fbc244ce7df05b3fe9d254cfe2017ccfeba2598f3efc38449fe5b8445df7425617a9e17ccf30909933def09e6fa649130e9df8e60f65f078c255f2b12a6e76582b9de68264cfe4b0b667f83f1c9d545dfb21bc6e2bf2f05b33e9a84c9deb61973bcb32782b93e550993bf7e12cccf3f12ccfa9f274cfa95c6a3e7bb016396afad274cf1aa10ccf1789430c59b3dc1ec5f2e1326fb9f08667b6f274cf27e15ccf9cb7dc234df343fe65743f0760dcfcf098bbeb8938469fe6782595f6cc224df8160b697a384c97fb60573fed34998ecfd5030e71bd70993bc8d60a24f6f0a66fd784f98e8ed31667d34d709d37c653cd6c7fe2c613aff2898eb519730e9d3a960b6c7b384c95ed378ec5fb384293fdf124cf4e4321efb2bdf4e98e6b32f98eda796309d7f16ccfe238dc7fd50a19ff53d7f154cf32b8e0573be72c798f5d9cc1226ff89fec3adfc4f5f30cbc3264cf181f897fc85ad264cfa9109667fdf10ccf5c4b6601e7f9830c9fb4030e973088c25ffd182b93eab08e678db4a98e623e38bfc6cc2444f2198edad9b30c9f75830cdd79f254cfe49e89778b32798ede730619acfb360b69fbb8429fff082397f6a264cf97a4d30d713070913ff7605733c95e74b3edf4f98f46d2698fb8b8d8469be3b82d9bfcaf8e2bfb612267e907ec3edecefb0bfe7933fc813a6f986bae01d9477fece98e553bc0866fa9a82595f1e0493be646dc13b16714f706313e77bcc58facb7dc12cff4230f1cfba8469bee97e7a5efe96303e4f093decfffd4c30dbc366c224cf5bc1f47c5711ccf6f64c38883fde17ccfafb2898f5f14930cf4fee97fa09f3691f84defc5270c321be232ce3db4bc17cfd91601abf3fd34a1badfeeca7b6dac1f1f1f36707dd5b3afeea3c50164afbdf7c846f1cf1ba4ce770fca6e7525cfccb3cc94b47fa3d9eb33f91e96f9249fcfc2d72c97581fc2d1ff4fbdf2def9fcae577f024c9c17c3ecae759562bbb1968f73b9eff1bede5a31df84f32fad1f5ae74cfdfc15e4abee947b2e1e3935dfdedece56b1ff599df24a7e2837dfdddec65283e0b3e1ff4236ace28da027eb7681378c4dfc3e7283e9d3f1ffe66f6e2f5931ec3cca22ce4f311a87ad613b689917e81c3027ed6d3f81da90e7ceddfc75e6630434fb3433cd673b48348e1ab7ec3dfd1aca3df5ac031d5ef48d192a9fa3bd98b476d899a3644cba6dfcd35c598b7282bd4b017bdabf79092056b6213cefd8dec05789feb7da022cefa000ecec970f616671ced66a10ff51150d142b944998cf1bee3dfe5cb7e8b5c4e60462738a338eb5398f1996eeb8eeec2ec7bbaafcfe1b8d097fa4a5feb1b7d0bbfbfd3f72897785fe577f9b2df622ffbba0a335260d51bba0633ddd475bda5b7f58e6e28ad9432cac26194535e0595a95c156aa086fa4e81f5abc7ffabf18562b7c4ef726c9798f1aa976aa4bbea498dd5b39ac0ac5fd454cdf098a979e988bf9bc2d957f5a616ea5d2dd5ae3e52d186c287677cf46f3ff577dfb11778c2091c43d564dda71c6aa4f6d5813a54477aac5aea589da85375a6da30db0ece79a6bafcd9537d38e678ac288ac7b9bad0dbea525da96b75a35fd5adbad34f30f654eda97ba0700972ab94ea2255ce2dfe84bd60ac56d5c833a1466d002535fda636e1b3aeb6d4b6da01593460f6f338b85130fb3eccba7cccf1137fe07ccf18a42ad2a38c35ce78bd3001bcb8070fff883ecf81d62a93e9efe414dfb517960b5343779a181b4c6e0a5d370333340f2403a4e4118e11ccb49b6413bfa34ccc53a4847fb4c8c88ccdb399981733057b6b452a805371c631875896e5f117ed252bd90b1d2706ee34733534afe6cd2c505f70e6c86b91c3ec8b036563de8916f8a6cdc82ccd2e52f462f64c13e4b36f0ed05bc7383506591dfe8a1ffb99bd4459c801387ad13773645ae6d89c9853a06004735ac2ff239e6dd4b4b25cc45e84a2a865ac89789c01654b944f5bef988ee9aa163c1ba85107fad1f47e947bffb9f892342b03ef5ba82373a896a6af1b668c1cc5d9e00c4dc96fad66bfb29fd5b9deca76e02752f30ebf07eb31e7e6c25c9a2b98e113cc70887941f69dbcfa3bf6122d5e6462aee1730094dc80ad47ddea1a93ac7d8e728832e927bbd125fb50289fbed9859f25caa7079f4857f4064cfdd4dc9a3b736f2a603773736daa5fd53c7fd25ec47f88dd0c74d76c40f48b966cd8024630ab51b215f155fd0f3f2b5bead12752326759aeec6c666a60399ba60e165f355b9f7a09f9a7f97d3fbe440f1933156fb6cd11c864c734924f026aac260aac688b42ea66e2bb30de4cd9cf81fb055b5fd1d7b3265d471c204fddb6d63ad5b21ef3b5396a9bd14f36fc457b89f12466816f68271bca20254bd479b48028934883cdc04769f9ad9adadc16aa61dacada0148f25c35387ac28f1db2cdf430d64ca3ada1762ae4d05439fb602eeda32ddb6d8d8ebf908f3d42461f7d4ad4ae1ba6e4294a0564429ad5b3620fa8253607ffe6ec931ddb673bb12fc6d9a99dd9b97db56f76616a4015c9a967dfc9ee8d66fbd1384e0fa95dda5d885f475cd5c5fae74162cc47dff66d7b79b37bb12eb44dbb0f163fa3d89e62f99cf88bf612e7d780391cd8437b645bf6580ded896e8307afdb537d6fcf74d7b66dc7766dcff6416630963d8f1187c763ef069862e8d05ed84ba02670f6142bba55bd937f96cbcfecc55ec108efa662afed0df033ca44a34c6e55274615e0e4083406754a4dec9dbdb7155bb51bb666376d5d3f002762351cabe8784ced9699da6d90d70ee46fe7e4b36d2346a8e401a2d67560b4a903057706a889d967ac8106a6f7b117fd4bf632b457ceea6be7209ecc536c8fb1503c30ccc216a611d7df5ce67257c08ceb7ae40668b5944f57b0ff7282f8c51cb8a17b708f6e14a36d1c0dc6eda16f331c69e7400b48d93db9b17bc67a7481f9f473c977adf5dfbe155f208b50c76e824fed925f8a76021683f6e25ee273ddd4cddcdc1e47db72affd191eb1c68cd573dea75ecd10e354cced82ba710bf76e5ba6e3966e173517e502f18af30763306b38777bfade35dd3ed4a447585d7fd187fb81bdace7a040b73b5075c82c16e82b3bc94ae66c231da4e4d01db996adb96377e20edca99ebb33d4ed68b1f3943bc4fa3e56d219c6f337d554f7ae0dd474d0766664779441a36f1c459fe8baae67725b03d9bc60b5fdb1b6ca3fdb0b1e94933eb87e9c01f8ae421dd8ba3b77179839aeb214e05ab49b2813c87227ee522df5a17b5bd365a93b629efdecae8092a1de77d7b15ae8cfb8fb3a7637a0bdb7ee2e5203f9c03bc7a6197be8c7c84177ef2a2013b07ae0d0c3daf8d917f6427ac7311ecfbee293ab1021eb6adb6dc47c9e231965f0e2c71ac6ba9adb3447d88d7883fb3efa981357d74f989d6ec0358faae5b6dcb6dbd1bbaae91afa006475e68171187d7a6b791be70bde78eb9df7baa20e809a3c1e31eeadd5a25fc9c521f67aae6a3ee8579f9942ed407d12a3631fe36017eb14f2c01d9fdba9db744db04abfaec3c9de6af0f43ec8057c982ffcc00fcdb97fd057ba03b50a7a5875e31ffdc83fb1a6f5487b25af032ddbf56337078f32f2cfd47beb539f54f2c4757b59e95d406b7d420d83ac01f85dc7a8d2659e75390644ad9efa897ff150d1629f0b3b4bcc89728f1fb20f5581dfeffa999ffb57ec059c5bebdfa0d66fd93d770df71de96bbf70cb186739cef456725133ffee97906d0e40c324beacf2c47f2317b86292f0a369f95d947e47ea77ce8b418ffd9e6ffa7d7dc8bd2eeef2f178abdc76df1d80262dfc813ff4471851a217797177eec1b7fcb1aef80079560b6473e2f7906b7db61b3c50171afed49f41b63976afe5f59b28971fd80bd1dbc4fe6306b20990ddb521a249cdd8e17ae5318e0f1ab1035eb806a3beeadcb7c1b65eb93f1c3ef4f35fc13676fd9befc48a2766291e46f43ddfd757ae0d9ca8b8aa3f572d90cd05663752ddb06ca2c7f197fe0a28bfc67cccb2adacf56b3eca85fdcb84fac2a607fa7d13bd3f669233ae4f204d8cb49885bfd5b7661be24995ebcd917e4e7139875a872263ec9dd56026775126d6f87ba0a50299c254195f051fd65637a0655011fb0d5f3398aba1ec4729e644cfd6f69ba02375b47ea2866a5e27f9d95a7c117b71c8570ffc3a055b78c6917bab5e0a771d1af6ce0d21b69ff82d8ce9867b282f3c56116b501ef35d5ff96db013a024d53694dbbfd80568da0e7021cab6114015b87f20754e4fea9a604015dd9a0ffb54bf7c8aa3312fae20ed6dbda926907529e9ad48561eadd1de071fc2aaee13df82b5fabe3e8e72018d7021b39590636cefa53c9fabaea8a9ee2e146e07e45bd10f611086e101ad739ee2ff0873804e78f4fb9019e51885b98e11b994ec25acc518879960fc7e1646d187a56cbe97783a855cb8e20ab0c44ac967d138735d094f668becc7b5c3d82ed0e2a977b694aa2cc65ea4c886e710d76580dfe1c56c3acc2ab99f26fd9b1ed6002f7aea4e308f18fd582ea2e3bcb2e0c8a785a9de420fba92c923ca680e75dfa1ad8659085fac41eeebaa6f433d089484cc8dc31c2999c6f824b5096792317e4c6d115ec31b64afc04de3752f2c4c1b3d739f7d18710146b1d16752a6bada37f0d15e42d2f1f87d17b48c74b2e3fba8bdc29f3e575c51c38eec86b6ee15f5777d0df2186af413ec06dec1ccded1a3a74a9a7361c98d63e6d50ecbb0abcf30568cc25e68725f64955bcca94b13f621c68c29bf13fb4e3d22918bec4f21dec61a215e39801c6b0746eda69e17c9e509463d0887e08d69edd1acc513f202d10b6f8571a078b2aa4b34e5c258ffe8c8f3d0b26ffa1c72805dd4fb03530fc75827cd52a48cf97f23d20279d9d0676cfdd223fa185f5672c9d15e9e5d5c8570fa309cacf5ea492e9017db853d0ea7509f288ec3ebebf96390ed9d3f349370861e76c4d9e8aada22cb9e9953bbf0037b165ef400b21cef6277af65261fe4d2a72810da6e6ce6b4729b8eec47f60287c3fa3aae750d744fe9558715e3f163d4319b878e1b834f99637d62573a8bf6f6a8a721f383701429095dee6f18d632d219ccb3cc69e8f937a89e15f790632c72c0fb138ca95ce5518f07fe9f9a5ae8bbc8ede8cbe479c32fea9750f663c09f0cb2c53e752a520f92e5a21ae1dc9eb8377706b9ebf843fc0dfa28ecf9c37011bd46e8a2adcf57f2e0efd12f15e112b470007695e926f67ab0e60cd370156351eaf3cc531c005b0ad72897951ffbaaae74124bd977cff500bed8d298e2913ba66d8e751beaf89c471baa1a64a2b462a7205778f347d89f8db5dbaa53f4245dc068296e37dc845bb0b9f8ec26e8fd84c601ca0ef59569f3733b29fb47efed2ec31dead000e79a7faa5f441ed3241bf2110b7d6907eb7acb5e32ae971c81740bc871e15a7f4ef527d62eefb692e2c988fd955af531639f42f5c37da884aaadc62e2bd635919a3713ab35d050b389b4248fac648dc0860d35c28a2ce6e68a7de75772615a396b8ffb262e14adf890a58a5c80163b05ef48757cd4f327904b0572e1a52ff455c8a91f917afd7d96498f7a9d51f7432d6c86ba83fc0ae49f61a536d1e3b015edc61c85ed923ecc1225605fe638468275b9acd98be4612297b8badd8c7a6f5fd85ee66b7201fee8d8ef7a028d8add8809d4ed077165cef8b01176205b99829dee52fe51f65da9d3ba5473b76b17a1117ca6dd75a6dcb5012b06b92cd51ef8b44b940bd9a9746823771aba0e7975e4f49473f12fea17c9a522addce574516fb10a5bb37efc3cb7737d1f7d9dd4ed99864aebc0bf6506b36a8331fec92ce3ac4526b246063876d267e6c12e329b454f53852a3aae50417e0eb1edda76504729779ba57c3946e829cbc5fec05ec4ffb8642f16f7af1c41ede2d7ec85bec7dee4ab3d83da9ef28421e8fbd4ec43a5c573b0641bd2fbef97ee979e7e0fbd024497ccab56d452b2393d527ba69285d0c23ae99db8881519dc9d65901390bda8926d7f968b4bb4e2dea1e0f4bb7b5081abafa7922f03bd8358dd056f7c021a36027e36a3efcaf2e849e37a0c75c8b9472c3e6cae646d997cfb082bbb76b8cc0a15fbc5b1eb01f9023cb7930d62af9cf3a555be305517d990fc5869cdeeabfa6525972718d9417cddd5b7d90366aca9eec6181cabbc8e6deb26f820a01c7cd93344c60baab4b86fdfe3da6396a2c3aabfd251abd5898e2dcc4656e87bf44b316f18b8b1da89fd25be66657553d7710f1c5fcaf5d65775a54d7e6c14d75c60f46ef6489911d65f31f3884f889588331dd7a44a1a34e4de0f5126ef19d5e71df263e493b15b2c729aa7be1755da5dccc8c6d91368d61862d4abe9857eacfa639f9a7433c5ff69f69c4df451796fed0fea7d5fb21792d1d29e652f54a1336f7b69d5e5458d6d136b4888d9d934c3d5225ecb33680b86b57cce1e6dc9155869ed2c5597e7d91c624aecb32ccd912a40c273a99295746566669cbd8266bfa3bdacf5f3d6e3cb87ded824f62ea1deaf676f7609baab793dbec73d32f0b9d9227b87ba33a0576e674bf0a253dff515f23d7668a81ad6e4b1c23df2b7875c794c3d96b9f428d5b9996443d0835d37771750d38c582fbbc88579b617bd58d8f04558ed39a73ecc677b29d7d04ddc21528b39ab9f664deebeaed61fe77185c2f6ed04eafddd787d063eccda2841388319b1352c8ba853e350c90e541b65d043cdfab0fe8ff9e73968da21d84303fb4a587db15ce2d51de0df5bb0196958d956febd5ce27e87107517e47397b5386b2f5113addf1676273b768bd879028a3aee363b092d8c92185da43e518dec343bcbda5927eecd40aee8b49eb9ea81c61d3f8dac9bf5b27e94a1ea82bd3c81749eb8dee982269c6717e0911e925c065ff4c7a4672972910a0b6a18d5ca2ed38a0279d7a5e4b9ea2cbb72efd8bb0fba65b7dc83b5907b507f4b6ac653d0c56b5b75adec06b2b4f65ac495b57ed65ad0a4dbec2ebb4fde4e5610694de6d4df6615b39d5591eb71be94937d5cafcccb7d798e3539d4ec55fde2c6fe926c99b30feca5609d77ee46b615ed4ac5cab565cf20d3bfc1fc784e76a26cb611c6b1fef475bb9159a4a6c375ea6a5502e41c3f2daf21dbf89dd7a171ad3a7eeff84bbb1d3b4aa02f2bb92c3ef593cbbde4d551c96a66cb5f679b5907fd8ae1ce03ae609977177d703be647591db2ca273dcbb6eca9bb858ab340df14b5700111745b2b739ded649048678d70b956a74aff6b1ebd0266d0144f9e56392073a5611739a457b1f64c75ac43b97c692f5fadd1c2f7766ec01aa7e099240e477fcbeb24666167fa1ad74162edd2f43bee36b77600740c2037b8ca1ddb2079d0fbdce741d68dd2ea395394728bd5aa2e69d83b543b4bdbd135ea11c5fe9bb9ce33ac81eda7fed8bfdb0bb3e7e6507f377005ff4cc9ea1b652173f3e03a61accf621755dd466af2dc1fe64578cd0b7de176f4301f60cd18f3ad984fdce7431b57fa67f9431c09d76ce71f7e66bc262d786a8bfc517720371ee37e67de97f355dcffc97aa5f3ad7c943fc59eb239438f3ac79c8b346266f37c6c3bfe512f6c8027eceb51fe9c4ff2977c9acf207b1fc7da249f47bd066a9af9ab6de66f26faef6959db64f6a55ee58c8fe819cff385b9d2afae1afba0e5b5b75fdc0f6383cbdff325ae26d18e84954fa3194cf35d3f024ddbc5950bf035fa31df833a6317f78a7bcc748690819e00356f20e7f7bc692631b67247efa35c5639f99cc7dfb7d15756f3038c00e26fffc4fa3e2866dd2f9d46be3d96e2367a68dcfb31ce0ffd223f522d3d7655ebb16e1f415d72e5fa9cad56f29699e1ea858218719f0d7d1fb3a325f6db3ec946aaebf89bfc383ff10d57cd4fb117baaa5dfec4fabedf32f3fc2c6fa7ae9d64f39c57c55cd316609daffadae4b8feeeb1e68c4f8b1d9f937c90774026201f57c59a27f65a1a7937ef7177f58b1fee6dcea0fe9ce833983dad1b0cd7d6773ed52f3f5bdf071b98e7fdec5aeff09a56bfbc36127d90c5d565bfe73bf979d0612fee61716fdaab235ac1cd5b489d41b9c41ed8c86ce617f9657e8571eb0b7b419b8433f9757e93df86a95404257bc97fdd5edc993b7067603377f9bda9513ce6b58719c750ac35719744ecc6297f05b54d17eabf297618e23a7e8d570e21f7d683bc12776ee5d5bccb31fe4b4b61aaa05acb376c3b4cf31aae70ad7a969fde79fae67efe870c94df17f9a69f8864d866651db3c73a1ebd9376f7793ddfb2ceb55c966fd37b30aa15ac6dbaa16965d6f4f31dbf0779d78c7a66dca3e5ff45e6c96e629c6ca865cc1fb06f67535cc9b11a34dfb7173d2d347c8ef34aa1cc5d5ce9a748873b2464ef7479271b3c5d5933b437766c0f0b53d8b8a73ff7852b7c5e140122efb9dc93fce267c994f69a9b36d4b147660a5ee309bc89f48c547acfe9dbf1450fb2a3108a4c5b0741ab2828a78abb7153964879f43b579f1df4b610e1a0fe7d80cc14324e13a93bc5a88254f07e1aea03947b2df33599509c891c3bcf16c5c0e4295f5cbdff97ff4a7cc92b51ba50cb8174a192857cd7d3feaeceaa5faf569dc08f3d97d52751bd4499aa5437764be70c57f6eb72e96176709e0db289e9adadef97d7bfbfb7df12ac1577509df9cccc8b61f1503cc60c4d7520475baed6e1d3a1a973b1c220b1f7555d2c14a34c70df56c956cc67b9c40a0f57fd4c3102aeaef6c39472c8efda4bf1640edd1ba4a5afd8d7b7c5389bd85d3354ab370f64cd57e423bb3ffac98ed6f6c2727642f5c957d1fed39e73c84741678be762f2e3f72fbe135fc02bbfe94198e18ade89aeda601f8b177b01c1f701ede691a36757a5fdc93273a89687f0437d8c1eea3ef668d25adb135fc7ab4df9f5ca76d6fa01408d392fa621d3cbd27af52fc7976266afccb68dd1ead5548b79f15abc4134bcb5b3624135e79a5c64c5a4b4237e8dc7e2f7a45b245dc0598cf1c53bbe75f2c18f41ec2fecd2765d139ebbeae5add6e3be6f2feb07af69066f5e6dc5edb92e76034b3ba4d63cacac3ab0ccb8e2ed49bdc2fe2feee19de6c77692df1605afdca4ddbfe0e121532e96c56eecfbb8abd2bcd6d6afbff9bed8873ddbd8c11ee823b793efe5c322147bf8ce08e51dbd354ad67a2ed8555a96282699a1fee4fbf9893e0bdeb66d0f3ba043eccecca21f377be602df9c1bf3be832fdf77feeefb626bc718fb9a0bc82a5aa0bfdda2e9ad1fbb0d7e07866a68b8d036e0476a51a62cfe1e7e4cb60776d3c1cca7e196c57ebeb04ddf88556f981607be1375379e233afd4d7e84fbfb2771cfc5c7daf717e2cbea28d70bf89661dc03696b7925abb87161fc6b71684eb19335fb20978fbe8adf1b330d7f691750fd76a0d28a6ba49043e73575658f7c07f7484c43cb2efd8d3e044af64a7bc6bf7a9fecdbef579679c1fb8da75071c5aea9cba02cd01093ad0bd5bcee5fc3a35de2cef0cf6fbf51be36552fa696358ba3a265b78b634dbbb6a03e811a3ed30fb666a6c5897d500a65728276f2cefb6c3cf661d6de49ff95f8f28907f8562eee9d7cc1b7d30edc89f7902bb57dcbb4f2bedfb72f763fec17a7a16d6a10552de62f0dbf9765eac27582c95ec3866b9a695681fc5bc55c1a2aad83ac1673ab980b63b5362946104fa6d177018e32996325365e9b4fbe2e979fda4be96f8cd0de08de0bfe8c3dc4d81f3bf0cff6d1d68b335ff719e408d3a8156ea896a15fb4dd65d8283af9c84ef3ad6ce81eec76dc091fee62050db1eb153e1f78a6588fe2f717bd28ba6e1fbd70c03d0443f23af4fed89fb4972ffe860856c0633d51b8a21d77a7d13a7ffc1ebd2444d4b8b30d321e9787eb70a74676c3b5ed861a853b5b8bab54402d7720788d4bdebec6bd9eb8a3788cbb8097f15335b1371af7342fb97bbfeecbbe1f5f3efcfd971ffa384b33e3fd2ab2cf6b547a3772fdefc394df975cffbdfba0176bf7fd689ebf602f3ffefb2eb8a383726afc8cbc9d970ea1eed367ead9afafa5acf759fedddfc658c3bff43ef217b259eb8508ef429a256910bdb35fbeaf1caf655fe62aa7b069afc1577f0ba8ac2b097f3bbee45fcac77f88bbab73eb7f2b21603f7efae93e1977d5835cf556567b3ecbfb6cdc9a4e7c8a31dfccc7f28fb25993cb0ffe46d257f1794d8683d55e8f8fcff918db4a357e19af8dfb4db9145ff0bf2cb3affe3eccc7fb0b5d5e4f7022aff535948fbee9836d7c96c9afd5fbf1f3447f5ea359f1245b7b3756d610e327fdd588d21bc072be7c7cf25bf4bc75b9969e9be402d7153decf7ff8abdacf3f48b7764b42af9a2c873c76fedacbfcffc950c3ffba7b2dd7c96fd4a4e701d50b22697efe6c8bf92b77dd4f9ef9effd1f3beb4a1b2effb7e7cf97fe2f84d7f7fec6ff1f9ff955cfef7fffcc7ff011f3a1368</data> - </image> - <image name="image1"> - <data format="XPM.GZ" length="1085">789c5dd0cd6ee2301000e03b4f11911b5ad1189290a8da0324a5e90f29941e2aadf6e0d84ea10d1020849ad5befb7a3cceaa29e2e06f663c33ce55cf7a9dcfacde55e758d16acd2cb6a207abc74f9b8dfcf5fbe79f4e97f896fabb8145ba3f3addbec5ac74b715704ed5d9769c01cb73e0423368f80224c190e53e70091c389e83d98366e83942679f0c43cc7e0087c4f3307b63c8b1d559337459c6810f48df137aab49436c750f748917320f78418e4cf65993fa04b33572c4313b067a039f333de80e39e238680ff4d5d2581c69d2c0c3ad8e0db1f30619127cd1dcd00c7a4452824c80a321359d73cd8c129c1b1b0acc726030a414b31299f9989d1952a4d0ccc23073819f861c973c2133d3b904aacf6ceeda9a8c12bc5b219929de21f9005900a99bf9f8e9a8a159728a5477f5d77847367719305373b1788b14668d4c9337d95b2437ef5d03b9c84df10a28fc866fc05c9522fbf0b369c6b8d0c7ffb1fc6db57effb0bfc68acd7657ee0fedba63599dea73d18a7dca525ec6ed3aa16293a81d2bf232beb1bfc578d58a416731ad641da95381b1e3f496ca939432c9f3bb7b8c450f8fb39994b18c93493a36fda2a7b9aa8ae3e4b278b69b192aa822499dc2d6cddc68b94ff697f46c7fdd255ad6f5e2dbdbfac7c3cbd8ecf7f7baf30f538f0154</data> - </image> -</images> -<connections> - <connection> - <sender>cancelButton</sender> - <signal>clicked()</signal> - <receiver>UnpackDlg</receiver> - <slot>reject()</slot> - </connection> - <connection> - <sender>destButton</sender> - <signal>clicked()</signal> - <receiver>UnpackDlg</receiver> - <slot>clickedDestButton()</slot> - </connection> - <connection> - <sender>unpackButton</sender> - <signal>clicked()</signal> - <receiver>UnpackDlg</receiver> - <slot>clickedUnpack()</slot> - </connection> -</connections> -<slots> - <slot>clickedDestButton()</slot> - <slot>clickedUnpack()</slot> - <slot>destroy()</slot> - <slot>init()</slot> -</slots> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 <qdir.h> -#include <qfiledialog.h> -#include <qlineedit.h> -#include <qtextview.h> -#include <qpushbutton.h> -#include <qarchive.h> -#include <qmessagebox.h> -#include <qregexp.h> -#include <qapplication.h> -#include <unistd.h> -#include <stdlib.h> - -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 <qapplication.h> -#include <qfileinfo.h> -#include "keyinfo.h" -#if defined(Q_OS_WIN32) -#include <windows.h> -#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<QString,QString> 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<QString,QString>::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 <qfile.h> -#include <qmessagebox.h> -#include <windows.h> - -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 <qstring.h> -#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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>FolderDlg</class> -<widget class="QDialog"> - <property name="name"> - <cstring>FolderDlg</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>323</width> - <height>369</height> - </rect> - </property> - <property name="caption"> - <string>Select installation folder</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QListView"> - <column> - <property name="text"> - <string>Start menu folder tree</string> - </property> - <property name="clickable"> - <bool>true</bool> - </property> - <property name="resizeable"> - <bool>true</bool> - </property> - </column> - <property name="name"> - <cstring>folderTree</cstring> - </property> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel"> - <property name="name"> - <cstring>nameLabel</cstring> - </property> - <property name="text"> - <string>Folder name</string> - </property> - </widget> - <widget class="QLineEdit"> - <property name="name"> - <cstring>folderName</cstring> - </property> - </widget> - </hbox> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout1</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <spacer> - <property name="name" stdset="0"> - <cstring>Spacer1</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QPushButton"> - <property name="name"> - <cstring>okButton</cstring> - </property> - <property name="text"> - <string>Ok</string> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>cancelButton</cstring> - </property> - <property name="text"> - <string>Cancel</string> - </property> - </widget> - <spacer> - <property name="name" stdset="0"> - <cstring>Spacer2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </hbox> - </widget> - </vbox> -</widget> -<connections> - <connection> - <sender>okButton</sender> - <signal>clicked()</signal> - <receiver>FolderDlg</receiver> - <slot>accept()</slot> - </connection> - <connection> - <sender>cancelButton</sender> - <signal>clicked()</signal> - <receiver>FolderDlg</receiver> - <slot>reject()</slot> - </connection> - <connection> - <sender>folderTree</sender> - <signal>expanded(QListViewItem*)</signal> - <receiver>FolderDlg</receiver> - <slot>expandedDir(QListViewItem*)</slot> - </connection> - <connection> - <sender>folderTree</sender> - <signal>collapsed(QListViewItem*)</signal> - <receiver>FolderDlg</receiver> - <slot>collapsedDir(QListViewItem*)</slot> - </connection> - <connection> - <sender>folderTree</sender> - <signal>selectionChanged(QListViewItem*)</signal> - <receiver>FolderDlg</receiver> - <slot>selectedDir(QListViewItem*)</slot> - </connection> - <slot access="public" language="C++">collapsedDir( QListViewItem* )</slot> - <slot access="protected" language="C++">destroy()</slot> - <slot access="public" language="C++">expandedDir( QListViewItem* )</slot> - <slot access="public" language="C++">selectedDir( QListViewItem* )</slot> - <slot access="protected" language="C++">init()</slot> -</connections> -<tabstops> - <tabstop>folderTree</tabstop> - <tabstop>folderName</tabstop> - <tabstop>okButton</tabstop> - <tabstop>cancelButton</tabstop> -</tabstops> -</UI> 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 <qlineedit.h> -#include <qlistview.h> -#include <qpixmap.h> -#include <qdir.h> - -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/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 <qnamespace.h> -#include <qfile.h> -#include <qtextstream.h> -#include <qfileinfo.h> -#include <qdir.h> -#include <qsettings.h> -#if defined(Q_OS_WIN32) -#include <windows.h> -#endif -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -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 <qstring.h> - -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/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 Binary files differdeleted file mode 100644 index b996fb7..0000000 --- a/util/install/win/install.ico +++ /dev/null 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 <qapplication.h> -#include <qmessagebox.h> -#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 @@ -<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> -<class>BuildPage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>BuildPage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>462</width> - <height>276</height> - </rect> - </property> - <property name="caption"> - <string>Form11</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>layout13</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QTextView"> - <property name="name"> - <cstring>outputDisplay</cstring> - </property> - <property name="font"> - <font> - <family>Courier</family> - </font> - </property> - <property name="vScrollBarMode"> - <enum>AlwaysOn</enum> - </property> - <property name="hScrollBarMode"> - <enum>AlwaysOn</enum> - </property> - <property name="textFormat"> - <enum>LogText</enum> - </property> - <property name="wordWrap"> - <enum>NoWrap</enum> - </property> - <property name="autoFormatting"> - <set>AutoNone</set> - </property> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>layout12</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QProgressBar"> - <property name="name"> - <cstring>compileProgress</cstring> - </property> - <property name="percentageVisible"> - <bool>false</bool> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>restartBuild</cstring> - </property> - <property name="text"> - <string><Replace></string> - </property> - </widget> - </hbox> - </widget> - </vbox> - </widget> - </hbox> -</widget> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>ConfigPage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>ConfigPage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>460</width> - <height>284</height> - </rect> - </property> - <property name="caption"> - <string>Form9</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout3</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QCheckBox" row="1" column="3"> - <property name="name"> - <cstring>rebuildInstallation</cstring> - </property> - <property name="text"> - <string>Rebuild Qt after reconfiguration</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="QTextView" row="0" column="2" rowspan="1" colspan="2"> - <property name="name"> - <cstring>explainOption</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>200</width> - <height>0</height> - </size> - </property> - <property name="palette"> - <palette> - <active> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>233</red> - <green>231</green> - <blue>227</blue> - </color> - <color> - <red>106</red> - <green>104</green> - <blue>100</blue> - </color> - <color> - <red>141</red> - <green>138</green> - <blue>133</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>10</red> - <green>36</green> - <blue>106</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>255</blue> - </color> - <color> - <red>255</red> - <green>0</green> - <blue>255</blue> - </color> - </active> - <disabled> - <color> - <red>128</red> - <green>128</green> - <blue>128</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>243</red> - <green>239</green> - <blue>230</blue> - </color> - <color> - <red>106</red> - <green>104</green> - <blue>100</blue> - </color> - <color> - <red>141</red> - <green>138</green> - <blue>133</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>128</red> - <green>128</green> - <blue>128</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>10</red> - <green>36</green> - <blue>106</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>255</blue> - </color> - <color> - <red>255</red> - <green>0</green> - <blue>255</blue> - </color> - </disabled> - <inactive> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>243</red> - <green>239</green> - <blue>230</blue> - </color> - <color> - <red>106</red> - <green>104</green> - <blue>100</blue> - </color> - <color> - <red>141</red> - <green>138</green> - <blue>133</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>212</red> - <green>208</green> - <blue>200</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - <color> - <red>10</red> - <green>36</green> - <blue>106</blue> - </color> - <color> - <red>255</red> - <green>255</green> - <blue>255</blue> - </color> - <color> - <red>0</red> - <green>0</green> - <blue>255</blue> - </color> - <color> - <red>255</red> - <green>0</green> - <blue>255</blue> - </color> - </inactive> - </palette> - </property> - </widget> - <widget class="QLabel" row="1" column="0"> - <property name="name"> - <cstring>currentInstLabel</cstring> - </property> - <property name="text"> - <string>Active Qt installation</string> - </property> - </widget> - <widget class="QLabel" row="1" column="1" rowspan="1" colspan="2"> - <property name="name"> - <cstring>currentInstallation</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>1</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="frameShape"> - <enum>StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>Sunken</enum> - </property> - <property name="text"> - <string></string> - </property> - </widget> - <widget class="QTabWidget" row="0" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>configTabs</cstring> - </property> - <widget class="QWidget"> - <property name="name"> - <cstring>installTab</cstring> - </property> - <attribute name="title"> - <string>Install</string> - </attribute> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QListView"> - <column> - <property name="text"> - <string>Installation options</string> - </property> - <property name="clickable"> - <bool>true</bool> - </property> - <property name="resizeable"> - <bool>false</bool> - </property> - </column> - <property name="name"> - <cstring>installList</cstring> - </property> - </widget> - </vbox> - </widget> - <widget class="QWidget"> - <property name="name"> - <cstring>generalTab</cstring> - </property> - <attribute name="title"> - <string>General</string> - </attribute> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QListView" row="0" column="0"> - <column> - <property name="text"> - <string>Qt Library configuration</string> - </property> - <property name="clickable"> - <bool>true</bool> - </property> - <property name="resizeable"> - <bool>false</bool> - </property> - </column> - <property name="name"> - <cstring>configList</cstring> - </property> - </widget> - </grid> - </widget> - <widget class="QWidget"> - <property name="name"> - <cstring>advancedTab</cstring> - </property> - <attribute name="title"> - <string>Advanced</string> - </attribute> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QListView"> - <column> - <property name="text"> - <string>Advanced options</string> - </property> - <property name="clickable"> - <bool>true</bool> - </property> - <property name="resizeable"> - <bool>true</bool> - </property> - </column> - <property name="name"> - <cstring>advancedList</cstring> - </property> - </widget> - </hbox> - </widget> - </widget> - </grid> - </widget> - </hbox> -</widget> -<tabstops> - <tabstop>configTabs</tabstop> - <tabstop>configList</tabstop> - <tabstop>explainOption</tabstop> - <tabstop>rebuildInstallation</tabstop> - <tabstop>advancedList</tabstop> -</tabstops> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>FinishPage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>FinishPage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>444</width> - <height>284</height> - </rect> - </property> - <property name="caption"> - <string>Form12</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout1</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QTextView"> - <property name="name"> - <cstring>finishText</cstring> - </property> - </widget> - <widget class="QCheckBox"> - <property name="name"> - <cstring>showReadmeCheck</cstring> - </property> - <property name="text"> - <string>Show README file</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </vbox> - </widget> - </hbox> -</widget> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>FoldersPage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>FoldersPage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>443</width> - <height>284</height> - </rect> - </property> - <property name="caption"> - <string>Form8</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout15</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QGroupBox" row="0" column="0"> - <property name="name"> - <cstring>folderBox</cstring> - </property> - <property name="title"> - <string>Folders and paths</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel" row="0" column="0"> - <property name="name"> - <cstring>folderLabel</cstring> - </property> - <property name="text"> - <string>Program &folder</string> - </property> - <property name="buddy" stdset="0"> - <cstring>folderPath</cstring> - </property> - </widget> - <widget class="QLayoutWidget" row="0" column="1" rowspan="1" colspan="2"> - <property name="name"> - <cstring>Layout2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLineEdit"> - <property name="name"> - <cstring>folderPath</cstring> - </property> - <property name="frameShape"> - <enum>StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>Sunken</enum> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>folderPathButton</cstring> - </property> - <property name="text"> - <string></string> - </property> - <property name="pixmap"> - <pixmap>image0</pixmap> - </property> - </widget> - </hbox> - </widget> - <widget class="QLabel" row="1" column="0"> - <property name="name"> - <cstring>qtDirLabel</cstring> - </property> - <property name="text"> - <string>Set &QTDIR</string> - </property> - <property name="buddy" stdset="0"> - <cstring>qtDirCheck</cstring> - </property> - </widget> - <widget class="QLabel" row="2" column="0"> - <property name="name"> - <cstring>devSysLabel</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>1</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>&Path</string> - </property> - <property name="buddy" stdset="0"> - <cstring>devSysPath</cstring> - </property> - </widget> - <widget class="QLayoutWidget" row="2" column="1" rowspan="1" colspan="2"> - <property name="name"> - <cstring>Layout3</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLineEdit"> - <property name="name"> - <cstring>devSysPath</cstring> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>devSysPathButton</cstring> - </property> - <property name="text"> - <string></string> - </property> - <property name="pixmap"> - <pixmap>image0</pixmap> - </property> - </widget> - </hbox> - </widget> - <widget class="QLabel" row="3" column="0"> - <property name="name"> - <cstring>groupLabel</cstring> - </property> - <property name="text"> - <string>Folder &group</string> - </property> - <property name="buddy" stdset="0"> - <cstring>folderGroups</cstring> - </property> - </widget> - <widget class="QComboBox" row="3" column="1" rowspan="1" colspan="2"> - <property name="name"> - <cstring>folderGroups</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - <widget class="QCheckBox" row="1" column="1"> - <property name="name"> - <cstring>qtDirCheck</cstring> - </property> - <property name="text"> - <string></string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <spacer row="1" column="2"> - <property name="name" stdset="0"> - <cstring>Spacer8</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </grid> - </widget> - <spacer row="1" column="0"> - <property name="name" stdset="0"> - <cstring>Spacer2</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </grid> - </widget> - </hbox> -</widget> -<images> - <image name="image0"> - <data format="XPM.GZ" length="379">789c5d8ecb0a02310c45f7fd8ad0ec069907f531207e82e252101769b5388b51d07121e2bf6b1f195b6f28cd3d24b7ad0ad86dd75054e23ed0d0193067ba41717cf4fd737f58bd846ce6d028984123274296606073bd9c5c8fdf1eeba92b678db36dddaa60c959abec2258cdd62a9fc3424477a50cfdc18cc5d9c0e20eaffbbf90260c2a390f35c54a1823fa9bc39fc63cc3429e4b51cccb5060398a6c5478f7bd141fb90a5251</data> - </image> -</images> -<tabstops> - <tabstop>folderPath</tabstop> - <tabstop>folderPathButton</tabstop> - <tabstop>qtDirCheck</tabstop> - <tabstop>devSysPath</tabstop> - <tabstop>devSysPathButton</tabstop> - <tabstop>folderGroups</tabstop> -</tabstops> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 @@ -<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> -<class>LicenseAgreementPage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>LicenseAgreementPage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>440</width> - <height>284</height> - </rect> - </property> - <property name="caption"> - <string>Form3</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>layout4</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>countryLayout</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>spacer4</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>31</width> - <height>21</height> - </size> - </property> - </spacer> - <widget class="QLabel"> - <property name="name"> - <cstring>countryLabel</cstring> - </property> - <property name="text"> - <string>Please choose your region:</string> - </property> - </widget> - <widget class="QComboBox"> - <item> - <property name="text"> - <string>North or South America</string> - </property> - </item> - <item> - <property name="text"> - <string>Anywhere outside North and South America</string> - </property> - </item> - <property name="name"> - <cstring>countryCombo</cstring> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer3</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>51</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="QTextView"> - <property name="name"> - <cstring>introText</cstring> - </property> - <property name="text"> - <string>The license could not be found in the package. The package might be corrupted.
-Please contact support@trolltech.com to resolve the problem.</string> - </property> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout3</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <spacer> - <property name="name"> - <cstring>Spacer1_3</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>156</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QButtonGroup"> - <property name="name"> - <cstring>licenceButtons</cstring> - </property> - <property name="frameShape"> - <enum>NoFrame</enum> - </property> - <property name="title"> - <string></string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QRadioButton"> - <property name="name"> - <cstring>acceptLicense</cstring> - </property> - <property name="text"> - <string>I agree</string> - </property> - </widget> - <widget class="QRadioButton"> - <property name="name"> - <cstring>rejectLicense</cstring> - </property> - <property name="text"> - <string>I disagree</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </vbox> - </widget> - <spacer> - <property name="name"> - <cstring>Spacer3</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>155</width> - <height>20</height> - </size> - </property> - </spacer> - </hbox> - </widget> - </vbox> - </widget> - </hbox> -</widget> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>LicensePage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>LicensePage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>445</width> - <height>284</height> - </rect> - </property> - <property name="caption"> - <string>Form2</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout6</cstring> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel" row="3" column="0"> - <property name="name"> - <cstring>licenseeLabel</cstring> - </property> - <property name="text"> - <string>Licensee</string> - </property> - </widget> - <widget class="QLabel" row="5" column="0"> - <property name="name"> - <cstring>expiryLabel</cstring> - </property> - <property name="text"> - <string>Support and upgrade expiry</string> - </property> - </widget> - <widget class="QLineEdit" row="5" column="1"> - <property name="name"> - <cstring>expiryDate</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - <widget class="QLineEdit" row="2" column="1"> - <property name="name"> - <cstring>licenseID</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - <widget class="QLabel" row="1" column="0"> - <property name="name"> - <cstring>customerIDLabel</cstring> - </property> - <property name="text"> - <string>Customer ID</string> - </property> - </widget> - <widget class="QLineEdit" row="6" column="1"> - <property name="name"> - <cstring>key</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - <widget class="QLabel" row="4" column="0"> - <property name="name"> - <cstring>productsLabel</cstring> - </property> - <property name="text"> - <string>Products</string> - </property> - <property name="buddy" stdset="0"> - <cstring>productsString</cstring> - </property> - </widget> - <widget class="QLineEdit" row="3" column="1"> - <property name="name"> - <cstring>licenseeName</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>licenseInfoHeader</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>1</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Enter the supplied license information here, all fields except Licensee are mandatory. -Alternatively, the installation wizard may read them from a license file.</string> - </property> - <property name="alignment"> - <set>WordBreak|AlignVCenter</set> - </property> - </widget> - <widget class="QComboBox" row="4" column="1"> - <item> - <property name="text"> - <string>qt-professional</string> - </property> - </item> - <item> - <property name="text"> - <string>qt-enterprise</string> - </property> - </item> - <property name="name"> - <cstring>productsString</cstring> - </property> - </widget> - <spacer row="8" column="1"> - <property name="name"> - <cstring>Spacer7</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - </spacer> - <widget class="QLabel" row="2" column="0"> - <property name="name"> - <cstring>licenseIDLabel</cstring> - </property> - <property name="text"> - <string>License ID</string> - </property> - </widget> - <widget class="QLayoutWidget" row="7" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>Layout5</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <spacer> - <property name="name"> - <cstring>Spacer5</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - </spacer> - <widget class="QPushButton"> - <property name="name"> - <cstring>readLicenseButton</cstring> - </property> - <property name="text"> - <string>Read from file...</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>Spacer6</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - </spacer> - </hbox> - </widget> - <widget class="QLineEdit" row="1" column="1"> - <property name="name"> - <cstring>customerID</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - <widget class="QLabel" row="6" column="0"> - <property name="name"> - <cstring>keyLabel</cstring> - </property> - <property name="text"> - <string>Product key</string> - </property> - </widget> - </grid> - </widget> - </hbox> -</widget> -<tabstops> - <tabstop>customerID</tabstop> - <tabstop>licenseID</tabstop> - <tabstop>licenseeName</tabstop> - <tabstop>productsString</tabstop> - <tabstop>expiryDate</tabstop> - <tabstop>key</tabstop> - <tabstop>readLicenseButton</tabstop> -</tabstops> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 @@ -<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> -<class>OptionsPage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>OptionsPage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>413</width> - <height>372</height> - </rect> - </property> - <property name="caption"> - <string>Form7</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>layout8</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QGroupBox"> - <property name="name"> - <cstring>optionsGroup</cstring> - </property> - <property name="title"> - <string>Installation options</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>pathLabel</cstring> - </property> - <property name="text"> - <string>Destination &path (appr. 1Gb free space required)</string> - </property> - <property name="buddy" stdset="0"> - <cstring>installPath</cstring> - </property> - </widget> - <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>pathLayout</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLineEdit"> - <property name="name"> - <cstring>installPath</cstring> - </property> - <property name="frameShape"> - <enum>LineEditPanel</enum> - </property> - <property name="frameShadow"> - <enum>Sunken</enum> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>installPathButton</cstring> - </property> - <property name="text"> - <string></string> - </property> - <property name="pixmap"> - <pixmap>image0</pixmap> - </property> - </widget> - </hbox> - </widget> - <widget class="QCheckBox" row="2" column="1"> - <property name="name"> - <cstring>installExamples</cstring> - </property> - <property name="text"> - <string>Build &Examples</string> - </property> - <property name="accel"> - <string>Alt+E</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="QCheckBox" row="2" column="0"> - <property name="name"> - <cstring>installTools</cstring> - </property> - <property name="text"> - <string>Build &Tools</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="QCheckBox" row="3" column="0"> - <property name="name"> - <cstring>installExtensions</cstring> - </property> - <property name="text"> - <string>Build E&xtensions</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="QCheckBox" row="3" column="1"> - <property name="name"> - <cstring>installTutorials</cstring> - </property> - <property name="text"> - <string>Build T&utorials</string> - </property> - <property name="accel"> - <string>Alt+U</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - <widget class="QCheckBox" row="4" column="1"> - <property name="name"> - <cstring>skipBuild</cstring> - </property> - <property name="text"> - <string>&Skip Build Step</string> - </property> - <property name="accel"> - <string>Alt+S</string> - </property> - </widget> - <widget class="QCheckBox" row="4" column="0"> - <property name="name"> - <cstring>installDocs</cstring> - </property> - <property name="text"> - <string>Install &documentation</string> - </property> - <property name="accel"> - <string>Alt+D</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </grid> - </widget> - <widget class="QButtonGroup"> - <property name="name"> - <cstring>sysGroup</cstring> - </property> - <property name="title"> - <string>Compiler options</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget" row="0" column="1"> - <property name="name"> - <cstring>layout13</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QCheckBox"> - <property name="name"> - <cstring>installIDEIntegration</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>&Integrate with IDE</string> - </property> - <property name="accel"> - <string></string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - <property name="buttonGroupId"> - <number>99</number> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer7_2</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>40</width> - <height>40</height> - </size> - </property> - </spacer> - </vbox> - </widget> - <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>layout21</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>layout20</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QRadioButton"> - <property name="name"> - <cstring>sysOther</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Other</string> - </property> - <property name="buttonGroupId"> - <number>4</number> - </property> - </widget> - <widget class="QComboBox"> - <item> - <property name="text"> - <string>win32-watcom</string> - </property> - </item> - <property name="name"> - <cstring>sysOtherCombo</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="duplicatesEnabled"> - <bool>false</bool> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer9</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>121</width> - <height>21</height> - </size> - </property> - </spacer> - </hbox> - </widget> - <widget class="QLabel"> - <property name="name"> - <cstring>noteLabel</cstring> - </property> - <property name="text"> - <string>Note: The compilers specified in the 'Other' section are not officially supported.</string> - </property> - </widget> - </vbox> - </widget> - <widget class="QLayoutWidget" row="0" column="0"> - <property name="name"> - <cstring>layout7</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QRadioButton"> - <property name="name"> - <cstring>sysMsvcNet</cstring> - </property> - <property name="text"> - <string>Microsoft Visual C++ .&NET</string> - </property> - <property name="accel"> - <string>Alt+N</string> - </property> - <property name="buttonGroupId"> - <number>0</number> - </property> - </widget> - <widget class="QRadioButton"> - <property name="name"> - <cstring>sysMsvc</cstring> - </property> - <property name="text"> - <string>Microsoft &Visual C++</string> - </property> - <property name="accel"> - <string>Alt+V</string> - </property> - <property name="buttonGroupId"> - <number>1</number> - </property> - </widget> - <widget class="QRadioButton"> - <property name="name"> - <cstring>sysBorland</cstring> - </property> - <property name="text"> - <string>&Borland C++</string> - </property> - <property name="accel"> - <string>Alt+V</string> - </property> - <property name="buttonGroupId"> - <number>2</number> - </property> - </widget> - <widget class="QRadioButton"> - <property name="name"> - <cstring>sysMinGW</cstring> - </property> - <property name="text"> - <string>MinGW32</string> - </property> - <property name="buttonGroupId"> - <number>3</number> - </property> - </widget> - <widget class="QRadioButton"> - <property name="name"> - <cstring>sysIntel</cstring> - </property> - <property name="text"> - <string>Intel C++</string> - </property> - <property name="buttonGroupId"> - <number>6</number> - </property> - </widget> - </vbox> - </widget> - - </grid> - </widget> - <spacer> - <property name="name"> - <cstring>spacer6</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>64</height> - </size> - </property> - </spacer> - </vbox> - </widget> - </hbox> -</widget> -<images> - <image name="image0"> - <data format="XPM.GZ" length="379">789c5d8ec10ac2300c86ef7d8ad0dc8a6cad4e3b101f41f1288887b43ae6610a3a0f22bebb766de6e65f4af27f247f9b2bd86dd7a072716fa93d7bf035dd401d1f4df3dc1f562f21cd02cc0ce660e444c80c3c6cae9753e8f1dba3d6bad03a581f6c5994d36829d8ca56365ac7b6b25d0e0b11431932ec2e8e589a8d2cedf07af71772845119e7a1a374068c11fdcde14f7d9e6721cf0d51ca1ba1c8c628b15ef1ddf7527c00b6995250</data> - </image> -</images> -<connections> - <connection> - <sender>sysOther</sender> - <signal>toggled(bool)</signal> - <receiver>sysOtherCombo</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>sysBorland</sender> - <signal>toggled(bool)</signal> - <receiver>installIDEIntegration</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>sysMsvcNet</sender> - <signal>toggled(bool)</signal> - <receiver>installIDEIntegration</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>sysMsvc</sender> - <signal>toggled(bool)</signal> - <receiver>installIDEIntegration</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>sysOther</sender> - <signal>toggled(bool)</signal> - <receiver>installIDEIntegration</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>sysMinGW</sender> - <signal>toggled(bool)</signal> - <receiver>installIDEIntegration</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>sysIntel</sender> - <signal>toggled(bool)</signal> - <receiver>installIDEIntegration</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>skipBuild</sender> - <signal>toggled(bool)</signal> - <receiver>installTools</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>skipBuild</sender> - <signal>toggled(bool)</signal> - <receiver>installTutorials</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>skipBuild</sender> - <signal>toggled(bool)</signal> - <receiver>installExtensions</receiver> - <slot>setDisabled(bool)</slot> - </connection> - <connection> - <sender>skipBuild</sender> - <signal>toggled(bool)</signal> - <receiver>installExamples</receiver> - <slot>setDisabled(bool)</slot> - </connection> -</connections> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 <qcombobox.h> -#include <qlineedit.h> -#include <qcheckbox.h> -#include <qlabel.h> -#include <qvalidator.h> -#include <qdir.h> -#include <qbuttongroup.h> -#include <qpushbutton.h> -#include <qradiobutton.h> -#include <qmultilineedit.h> -#include <qfiledialog.h> -#include <qtabwidget.h> -#include <qmessagebox.h> -#include <setupwizardimpl.h> -#include <qtextbrowser.h> -#include <qtextview.h> -#include <qlayout.h> - -#if defined(Q_OS_WIN32) -#include <windows.h> -#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( "<p>This program installs Qt and QSA.</p>" + textBrowser->text() ); -#else - textBrowser->setText( "<p>This program installs Qt.</p>" + 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 <qvalidator.h> - -#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 @@ -<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> -<class>ProgressPage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>ProgressPage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>440</width> - <height>286</height> - </rect> - </property> - <property name="caption"> - <string>Form10</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>layout2</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QTextEdit"> - <property name="name"> - <cstring>filesDisplay</cstring> - </property> - <property name="vScrollBarMode"> - <enum>AlwaysOn</enum> - </property> - <property name="hScrollBarMode"> - <enum>AlwaysOff</enum> - </property> - <property name="textFormat"> - <enum>LogText</enum> - </property> - <property name="linkUnderline"> - <bool>false</bool> - </property> - <property name="wordWrap"> - <enum>NoWrap</enum> - </property> - <property name="undoDepth"> - <number>0</number> - </property> - <property name="autoFormatting"> - <set>AutoNone</set> - </property> - </widget> - <widget class="QProgressBar"> - <property name="name"> - <cstring>operationProgress</cstring> - </property> - <property name="centerIndicator"> - <bool>false</bool> - </property> - <property name="percentageVisible"> - <bool>false</bool> - </property> - </widget> - </vbox> - </widget> - </hbox> -</widget> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>SideDecoration</class> -<widget class="QWidget"> - <property name="name"> - <cstring>SideDecoration</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>122</width> - <height>156</height> - </rect> - </property> - <property name="caption"> - <string>Form1</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel"> - <property name="name"> - <cstring>logoPixmap</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="pixmap"> - <pixmap>image0</pixmap> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>AlignTop</set> - </property> - <property name="vAlign" stdset="0"> - </property> - </widget> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>Layout1</cstring> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>0</number> - </property> - <property name="spacing"> - <number>0</number> - </property> - <widget class="QLabel"> - <property name="name"> - <cstring>versionLabel</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Installing Qt</string> - </property> - </widget> - <widget class="QLabel"> - <property name="name"> - <cstring>editionLabel</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>(Clear me)</string> - </property> - </widget> - </vbox> - </widget> - </vbox> -</widget> -<images> - <image name="image0"> - <data format="XPM.GZ" length="55092">789cccbd47b7eb38b2ef397f9fa2d6e5ecae5e7cf266d0035266cb6da7ed77af1ed07b2f1aa9bf7c83883f704c56d5cd7c75bb5f95d6c9ca5f8a22114044202200f0fccffffcdbe7d3fddffef37ffe8fea625c02eb6f966f947ffb4fbb4e92ebfff57fff9fffcffff88fe160f0b7fecf68389bfe6df41fffc7fff80febf96fd6df9401ff5fcff64232ffde36244f7a762ac953fefd56f29cf35cf2a267f3072ff9f733c906e7836493f35eb2c59fd74ab6797b1f243bfcfb46b2cb7fef0a1e72799c5af2907f7f94cce5732cc963fefd483297cf3a8387d43f992999ffde0c25f3dfb79a64de5f662099dfcfe924cf386f24f3fe4a44ff0fd17e5b327f9e772799dfcfb8078fa87d662499cbebbb9249de6fc9bcbd9d2f99dab795ccc7b31a48e6e3b71a4ae6e315ed25f3f1b04f82a93f0dc1636a9ff32999daf32599f757a54ae6fde17e48e6fae23892b97e78a2bd63ea1f438cef849e97e892f9f7652b99b76f3d91cce53763f0947e6f08fd9c1137b664de5e43c83fc7f53bf0022cf475499c8be719c4f113d824de5cc01671fd0eb6895dbaff50d8ab174ae6f2ad3ac9a47f63c924df4832d73f732a99f777f324998fb73993ccfb5f7f96ccc7df3a49e6e3514592b9bd3aa664ae1fd6bd646eaf9a2b98f4ddf52573fdb58e60d89f6d49e6df9b13c97c3c1d45326fbf634826ffb2934cfee40086fdf88164de7ff65232d9eb9b646e1fa607867e9bbe641a8f816092cf14f2423f4d070c7d8b9f25f3e7bbaf60e89fb791ccfb3b15df43ffe22f30f42f13f240ffea1b18fab716bf877ee967b043dc92bf1f0ea16fdd9af3a8f740bc3dbe64f2f70bc9bcbfcd2fc9bcbfbd4432f90b4730f5cff55e3297bfc9c0187f732899f4772099c6e35b321f7f6b0fc6f8daa6649aff7692f9f3724d32d7f7cb4932ef6ffb4e32e9b302c6f86723c9dcdefc50326f9ff32e99f7975382a10fd75c32d7e795906742fdd3bd49e6df67a2bdd09ff20886beb89164fefcd54932ef9ffa2c98fca72bda0b7d6a9f25f3feb0c4f842bf9a07b0d02fd13fd0afe2090cffd6c660e85b24ae87be05a40f63e1df8277c9bc7debab643e5e575732efef6e2799cb1bfcf89ecbdbed2573fd5cfd781e1fcf952d98fa3b91cf277f74cd24f3fe0f3ec08807ba8d64ae9fc54232e98f27993faff9f13df787ae680ff4d57995cce57103c95c7fac3bc97c7c7c5f308d67b8028bf9f72299cbd3dc49e6f2981f92797fd69664de5f7e2499dbb33b92ccdb6f2dc1d067772099fca72e99b7ff6a49a6f946f437f4b9bd48267934b0d0ef77c9bc7dad68df9cee9fee25f3fe69447fcc31df88f1843eaf6e92f9f3da89649a0fee25f3f1cb85be41ff0331bed07f5f8ca7f0a7d43f13a1df9d2a99f777f32899dfffea80111faeae92b93cee41f090f7effa0c463ce77f48a6f9ee51321fafeb4930f547bb01433fecb164fe7cff5b321f2f2f92ccfb3f93d793bd745b30f421ae2593bfd94be6fd1b2692b93cde4e32b79fda164ced8ddec1d017e74332f9dbb564de5e772899e299140c7dcaa692b93db8df92797fe61d18fe3117e303fd59b792e979b164de3f8918ff05f5cf46f40ff4c715e301fdb9bd80e13f57f792797fad4a30fce906bf17f3f51ae331c4fc19a13d43f89780e693a9f0a7ed028cebfd4e321fafe6198c7cc00b2473f9bc77c95cdf4a4ff0908fc75a5c8f78bfb52553fcf02999ebbfdf08a6f10e5ec1c2bfdc49a6f97c2b99e6ff27c9642f3fbee7fab416f2407fc299643efe912f99ec692099cbd3b492b9bc9ab8ff94c63711fd0bfdb2a792c93e2ac9140f689229df5125f3feed5660e85ffd2a99fce34432efdfee00867e5e14c9941f8ec0d0bfcc904cf9572a99b7a76e25f3fe73c760a1afaa646ebf99e85fe86f2ec61bfaea0b79e11f0ba12f2eda8bfb4b7d267b98897c64dd81a1cfeb503297afbd934cf1d45e30fc93f81ef363b896ccefbf3a4a26793dc1149fae7d30f247ff2a99ea1d3fbee7fed68b05a31eb1924cf9c2083ca5f6076bc9542fd948e6fa900e2473fdbbbc09463d630246be1a6692f9f84481643edef95532b73f5df01cfd7993ccdb7be92453beb5924cf3c14432efbf5cfc7e01fffa2999e6bfb1646e5f9b022ce2cba364de3e37114cfec132c0d047f74d32f9e37b30f26b2f05431f5763c9bc7f42c1d04797e6cf99d0c71be41fc21fa52a18fe24207d9f0bfd5a1d04d3f8570fe009d573dca3642e7fbb054f697ca237c1246f3a944cf53a5b32c5a72f60f81bd796ccaf4f2bc994af2d2593be6f2453bea682e7345eed4e32d5ff14c9bcbf2f57c95cff7dd15ef8a35097ccdb93cd25537e2bfa6b3124fffd055ec2bfcc24537c548045fe518331decda7647ebd2eda6ba37fc478c01f6d44ffb8d43e1ded17e3af3960cc97f5022cf481e257a6dd149fd96bf08cc6ffe64aa6f92604c35eec4032b7efab2799e2375b30e94b2aae5f50ff58aa642e6fe148a67ce1065e927fb80d2553bd2494cc9fdf3e49a6fc45c863c07e1dc97cfcd3a3606a5f7d05633e887682497faf4bb08df8e2030cfb2bc9de17a2ff4bf49f886762f4cf10f666bd80618f3e8dff92f5177f5e914be6ed2f36e005c91b5f24533cf22598ecafeec04be467ae64f28757b041bfaf5f040f29fe68c0268d9726da63917e14a2bdd0c7f424998f5f44fdb314fd91bf83a18f8105467fdc4660e86783e789fee94a30e215e3118c78a3a0f9dc60fd45fa34072f491fc329d8a0f685a964aae7dfc0265d5f2f05537f568f60d86bb091ccfbe36248e6fad988dfbba85f8e24533e48f66f88fe892b30fa67634ba6f97508467f6d1cb0a827435ed11f35fa6388f9c9a7f8c814f157fd065e92fe5f6e6083e42f5cb0897ac417d8227dca3fc036f55fb305431fba77c1747f3b02bba4df3ad9ab29e42f669229df46fb647fe460d8d3aa0243fecd2758d4bbefc0a21eb403a33f2a8a772c263f6fff35055ba827d1f85aa2bf2f1a58f4f70a8cfb252a18febdf1c0f02701f58f2dda7f5d48a6fe9b8071fff21d2cfc83603caf51c1b87fb106433f4b1a1f87fd17eebf1b17ec903efbd43e46b0f71a0c79cb2d58c4e72d18cf2f1bb078be0dc6f3339abf5cd11f8906c6f5de1a8cf846e3f6c1cbe724df068cf6548964ae3f1b130c7f9096608c7f7603a3bde90e8ce7bb2f60b4d77e00c39f075c9f98f639e47fa34832d7e7f84c2c9eb7ba80216ffb08c6f3cc042cd64f1a30e42f9760d88fe382d19e1ced19c11e42aebf0cf17cd306435ecb04a33d610e16f20b16f1470a16ed3981457cf9443c82bdae2660e19f79bc341c8be7d70e18cfd71ec022df8ac178feaa05e379d72bf108e3df70ff369cc8fe1d8345bc9c81d1fe60452cfaeb7a03c3be74ba7e2adbd382f1fbcb3b18e3910dc1689f4df24e657fd4603cafb2c168bffb0cc6f32b1ebf0c67e2fe01e9d34cdcef1283e12faa6f30ee67f860e1ffe660a1efdc7f0ee7e2fed58c58b6e70cc6ef8d002cd6173db0a83f2dc0d0b78edbf77021e5bd078bf6aec1f87d41fabd14f2155bb0f8fd108cdfeb2330da93de83f1fc8ac6d310f2ac1a309ed772ff3734c5fdb48d64ee0fb72e58d4e75ec0f87d7202a33f0d713df4a5237bb7e4782a60b11ee681d15eed112cee1782a1cf158f4f86b6b8bf6581c5fa2af5a733823f762d30eed7d2efdd11f2efcd1d18d76bdc5e468311f2a3c007e379f5082cea75f760e8fbfa8d782cf49dfba3d150fcbebc030b7bdc83a17f099faf472371ffe64c2ceed73460e883cefb6b3416f7ab4fc463e10f2c30e46b8927e279b94b2cee6f6cc1d087ec092cec4930c6f342f24f85fc46442caef75660e8cf85fb93d18cfd9ec783f1162ceaa37cfe19cdc5fd3ceabfb990d79d80d13eeb152cd64fe9fa85f8de7c05a33df9188cf66cbec0d0c7f50d0c7df3b8ff1f2d85bcce002ce227078ceb1d0f2cfca54e3c41fb6f74bd21ef5780f17c5d058bf53beeaf46e618ebd77a2299c77f5bba9f25c6b7f4c1c2bfbd80d19eeb07f104fda1933cb678de2603e37eba01c6ef6f57b0a8ff71ff3d72c6a8b7e8d47faee88fb507c6effd188cdf3bdc1ec67d38c739e2e3c5a63393e21723269e60fde4f22c99d677b93e307577285eb7b8fd8f27ecfe9cf50e0c7d8a79ff8ca7ec7bfefb6b412cc627db81c57e823730ead9eb1158d43fb8bce399b8fe7a0716eb5d7330c663c3fb733c67eda1fa484d2cc6c39a83a11fed193ca57a651282b13e16f3f96ebc9860bdc8d880c5fe810c2cf21bae8fe3e544d4cb23c93c5ed30a30ea071b170cff92d0f81813d443d71730eaed9a07c6f53eb7b7b1c9bee7fa117c49a6f5024b30c5b3760cb6b19ec9e3adb13331e8face93ccfbaf3883f13c23013ba8a72e05d3fd0d1b8c7c734df23b53d8df86facf9da03e7e1b80f1fc82f7e76430813e6d63e229fa3be5e333194e4cd40b52b04ded31b8fe4e4653110ff2fa0a73a736f28d9a788afd67fa180cfd6a1db0588fe3fe7f32610accfb77c3f59721f2c77c493cc5fe0aaf00e37eb731788afa4e059ed1f8361f60d48f6dde1f93d914ebc7460a46bd2fe4fd37994fc7940f6cbec1e89f98cf5f93a578def5013c433d86da6f4c51bf09b9bd4dcce982f2b39cebcbc49a22fff6b83e4dec29ea15d95932adb704c433acffebf43c776ad1fd039d7886f5d315bf3f5356f09acf77d3d1d4a5fa65734f3cc3fe035d134cf7372c30ec355b824dc413dc3fb0e9906574dcdf79c4e2f74501c6fa5b74104cdfb73c3e9d4ea6d6887f7fdb10b3e791bef1f9940ddf1ceb078fe005f5b7c5e7e3e96c86f58f8d0246fd3a76c1f311f9b377b043e31bf07c693a9fa1de19df816dec07f804bb584fa3fe5accc47a86069e517b82002cd6f775b043f39bc6e3dde9923d8eeb7332035bd47f3705ec60ff824d3cc7fecf84ebefd498c19e2faf609bfa2be6f9f0d49c2d51cff5c016e5fb2b176c8f78fb8b15d8a5fa99c9e7d7a93543fdab1b831dfafde6287844f5d10e8cf1af49bfac39c63bff024f499e98ee6fb3fb937f7d023bd4fed407bb435aafb124d37e2d5d30b53f03cf87d43eeb0d8cf5dd7803c67cb7e1f63d75587f707df1e9fece7c30a2fd5d7b30f6b3469f9269fdc792cce5594dc1587fba52ffb84c1edebecd5e326f7f41faebceb19f2cda8271bfa6133ca2e727e0118d4fb2164cfa9c2892f978af4c30eca1f1c19321d7bf2bff7e3660e34ff5e53bb043cfaf5dc174bf6c0076a97fdb929805acfcfb6d0446bdbee4ed9f0d857eddd660f89b6e2298da5f05c4ac3f687e6bc0c311ad87e07a263f9f0fda77f094da537f8067245fc5f569369a1963d29f2b31eb5fdabfe20ba6e7a777e0d188ff3eb9815906c29fa78227d04f053ca3f6b65c3f6663260fd553a93d2cfca4fec91bc95cfeea041e517f5fb8fece2662fcdd023c86ff33c1d31167cd06cf21cf5c308d679d8017d41f0df72fb3e9cc1ef3ebab14ec8c69bfc05432ed47d38885fe5d4cc9b4fe37028fc8fecb37c9649f25784cf6ebbf82e7f47dbc042fe87e05f5cf4ce8936b82e7f4fb36113ca6f17a002fe8f986b8de80fe8bef4dd28fc292cce52fa68269fc4d1effb0db2f49decd0c0c7fdc92fe2ce6131a3f6d2d98fcb7bf02cf49bf370330d68fea5a30fdde38831dfabea3fe59b2fea178b0009bd41e4f03db23aeff37713decb5f00593fc2df5a7c1ee47eb6f2330eadd17156c8ea87ff7609bfc45590b267f78d5c02e714bfa6ab2f1207ff80136c87ef22918f34dfe06c67cd186c48b018dafcee3cd99c5ee47faa48217647f99609bf4c7a0f1b2160392afa3f6da6cfc68bcd69279ff949f6093daef4ec1f067f5817831a4e76de8f70ebb9ece177c806d6abfb3235ec0dfba2bc9b4df9bc6d7ed1376ae5f5c3fe703263f6f4f520a1e53fc99102f66d4be8cf7cf7cc8e4e3d7673e784c7cdd82a7d4de5a03c3fe751e9f3265c2fca09be009d94fc2e397394b87c99f186bf08cfa4fe3fd3b9fb0e7717dacc792e97c0b8f5f58f8bb20d6793d613e5f2cc7b49fc5005bd49e35b56fb1c4fcecf1fe9e2fd9f7743dfdde582ca83f8267b049ed59f3f9686eb2eb69fd782699d62fa83de67244f67de1fa3eb79643b237ef2698f4ab9e8347d4feb0008fc99e1c6a8fbd70d05f4762261e6f9f46e3e730a6f3160618fdbbe6f9c6dc5d0ea8bd0df5bf6b88f89aebdfa25f00a5f8ff4e32edd749c0636aff66019ee17939780e7de2f92a73f643e8bb031e537b7c133c237bf5dec073ba7f44f71f1a225ea3e78f447f79dfe011ddcfe3f22dc68c29feff06e379ba0e9ed2ef0b1effb1747d44f3b1fd0d5ed2f78d0236c65cdf367c7e5fb0009858bf07cfd15f7bf082f4a3492473f96f19d8257b6df8f82e66cb05f55fbe223630ff6f797cbc98b3f67079527afe82319d17e1f6b7581a03fafdc693ccc7d7a0fb194b97da7bbb111b63f2af1bae9f0bd31810eb7cbd61612d1dd2bf94da671943c8cfe7af856d8c69be6e0563be594f2573fdd7b8bd2c1c763ded0f53c01392c7bb4ae6fdd3717d5db8c684fa4bbb134cdfa767f094e28180fba3e5c080fff15fc0b309f5ef9764d24ff13dfc43cae7a3e5d0807d6cf8782d47acbdfcfeed0b783ea1fad50ebca0ef6f3ed82079a32f30f2c5644f6c627f5acce7df655fd0e1e3930460a662dc3f1cc14beaaf40133ca178a8069bf47cdf90ccc74ff3c10e8de78dfa676c8afd09b564daff5982b1ff36a6f64c58ffd2fed40b7836a1fac504bc9c50fd6101c6fc97abc426e2b3700fc67911f3018cf33ac99d643e1edd198cf3176e07463da4fa0063bf8826be47bd53e7fe773965e345fded806db217eb1d8c78f29612b3f6923ea9603cbffb0663bf4949d7b38083c663b3022f68fceb7bb043f6118682a9ff8c02ec92bfcbe9fe7dba49f5c30d18fb636c9e2f2ce7ecf7144f2a6097e4bbe5c4ecf7140fcdc0b0b734018bfde03a784af3c53504cfb15f47dc0ffb0bbb8160ecbffc002fa95e58edc1d8bf1a4dc1163d2f36c1a8575495609c5f1a4aa6f3a134febd83e2ed2f376093faafa3e72fcc01f1f50b3c217ddd5660ac37ad63f00cfe5407cf69beef5230ea35c6026c60bfe55532e55b39d8a4eb6f73b0d8df20ee6f637fe04a32cdff03b043fd757b904cf9d9168c7ae7ed2299ce7b3692697fc898d8c2f99ddb128cf3b317f49f85fa6348f75f1a06d9afb604c37ff817b04dfa1c0ec10ee9bb4ef22ecd015d7fdd8047345eb5079e907e598e60d2d7b40363ffe3762598e2d5750e16e703d692297ffc128cf35768af897afb36108cfaee5c32d56b0f9269fe2e24f3f61731d880ff5125d37ed80558ac974c25d37ec09d64de7fe64132f73fea27d8a2f15732c9b4bea008a6f655a23fb1dfb28c24d3fe470d8c7ae1ed5132e95b2099cf8fa6e82fd4e3c32fc9b4bee3125b38ef7723ff641816d99b7d03dbe48fc22bd8a1f9f95a825d9adf4af28706eb1ede5eaf060fe97aaf133ca1fc5605237e6d8ee009e5bbd5198cf58b4efc1efb6fb71730f67bae66e025c5df8a09c6fecae020998fafd248a6f3ba909fd93b6f4f71025bb0af52329ddf9849e6cf533fc036e993924ba6f96726993f2fcec00ef57ff12e99e2c34a32ed7f0cc1f017d5bb649aef7cc9bc3f22f13c97fa4fc3f859388f5a6d25f3f69443c1d86f3b06e37c4be54ae6edd354c9bc7dd791643aefdc4aa67acf2b18e7f134f13dced325a4ef26d3379affc95f9826e2cb952a99c6f7153ca57835fd0463ff691108267fb579028b78c2001b34dee14532bf7f62814df88b4832d52f2ab085f59d0118eba3752899ecff2699eae307c9b43fb405431f9454329d2fbb97ccdb938cc02ee95b2adaebd2f8b590dfc279e448974ce3f12998e67b4d30ce074713c934ff403e0be72d2dba9fc5e607defeca014fc85f5413f094e2313b954cfea0114cfe467901233fd41792a99e6a49a6f527c198afd71bc9549fb9822dea8fba944cf9502799dad782b17e6d7592c9be6782495fea42321fdff8c7f77cbcb477b043fa1deb9229ff4904e37cc697641a7f0decd27828aa647abfc45032ade7b982495f13b25fcbc2fb0c944032d9cb93606abf5949a6f314cf60bc4fc00a24f3f6b79960d29f5a914cf11dfa53d87bf82999d6df303e16ceb755a4cf369b3fc8ff7660ec3f57de04933ff0f760ac5f665bc114df2b67c1a44f57156c507f5f1cc9b49ff3198cfdc69bab60aac7ac4f601be7fd22c1781fc95132ddaf95ccdbabd492b93e794f60e883229e87fd9ef959326fbf3a964cf9e00318fe5d9d4be6fda192fed916ce83a92f92a93dbe64ca8fd11f229e4c6f92f9f3938164ca1f4f82b1fe994ae6df871f60acf79a6bc9bc7f62f49785f3b1b75230d95775914cf30bfacfc279b22df90f47c413a621995f9f7be011f99b6d2b98e2136d021e4f683d63059e4cb83e7ae2fa19dd4f3b83e734df943118f581f22099cba33c8397549f592dc026d69b8f9279fb6f9f60e453d6156c537f5a63c9644f8160aa47695330fc8dee0aa6e7c5b964f28791648a6fe692297e580aa6fa6628da8bf8c3bc974cf9642118fa38954cf58f89649acf1692e93c27e9936361ffbdd149e6df2b9e609c1f7d96ccf549ad24d37974e887d0676721998f8fba924cf1fa9364b247713df687754f92e9fc672399ea45a23d581f35af92f9f7b9f81eef13885ac1181f4b32d5dfa10f16f6a3044bc974dee9158cfd3f892399fcbb2d993fff26fa6786fd3ba23f711ef146d7bbcc7e283f7b944ce7995ec0639aafab25784af671db0a9e52feb200cfc9fe320f2cec650f5e52beae7d49a6f319e2fe4bd457766083f453bf80b11fa878154cf6b2adc1585f37c4fde0af235530f251717fc45b9e90d7c17ca848a67add5530ad1f74a160aa8f76e279c8e7c34630f97f3b174cf2379a645abf247fe35a781f90ff2818f3c1443297571d49a67cfd4930cd87da1b58e8ff5630ece74b32cd1fa564aaef7982697dc87900633f73694ae6faa0be4aa6fd789a648aa724637fd25a32ed3f79924ceb3d3330f6f325ad64de1fd98364927f2598facbd42553fd3594ccafcf311e16cecbdf22c95c5e652a99de7f267e8ff3c9e1bb641a6f4732bf3efb008bfd812f92297eb32473794b31bec87fa30a2ccea3ee0493ff30f79269bfe23718f53e6b2099ea0377609c7f34be2453fc7b914cf91c1f2f63c0e6478a0fb6e019d58be207c1538aff8fe039e503712b99e6eb5c3297a750c04b1afff22618fb1922c1347fc73bc9b47f4630f2f9eda360b2efab2e98fcd1ea158cfd83452598f47f6b48e6cf8feec1a8b7a40bc1f05f3bc9bcffb61918f596f85d32d5e3447fbaa48ff94030f6ffdc24737bf267c416f6a7ac3f2453fe580bc67e99122cceeb9c24533d6b2299f4ad108cfce30773fd500cc9341f7792a9fe6b0ba6f5da6b2399ce372ec1d85f1d9d25f3efd59b60f89f3bc9bc3fd4a364f22f6f60ec97543792797fa8a960d8c74d32f9932918f61ed49269ff832d99e44d24f3f61a23c1d43f96fc1ef1fe1c8cf763448e645a3f16cfc3fe3d632899e2955832cdafd01f0be7d5ad4a32ad9f3792b9fcc64030ced3d792b93e9723c9b41feb02c6fe67732b99f68b7c4aa6faa3180f9c17f6499ffa032dc46bf098ec5d8f24d3fe08133ca1f530ed049e527eb7f50593ffb83c48a6fd570a7846f7d36b30e6fff25b32d5ab73c1145f28ef82299ed1e660d473b64f92a9def92698fcdd5a3cdf46fd24914cfbcd74c9b43e21e445fda611f7437cb1fe124cf65edcc02edd3f7225d3fb001e05d3fc5ebd108b7879bb93ccfbc72f05937e66a9605abf538e92493f56e021d99f6249a6fa5b2b98fc9f72914cedc3785a789f52f12698e42943c964ef17c9e40fe792697e1849e6f2648e60ac470660bc9f243b4aa6fd3fa1647ebda20826f9d24c32ef0ff55e32d5d7447f60fe2f9f25933f5a4aa6f8e62c18f9502299f40ffa61e1fd4b4a2899f6279492495ed19e29e297028cf795048d64dedef05530e29137c9e47fe4efb19f740cc6fed152134ced0f55c9fcfb488c17dedf74b9934cf64dfa3c326754ffab0cc1643f510ac67a78ba04633e77466083ecb309c026cdffa921998f476582b19fa7ba0aa6f93e5e0ba6fca6188051bf4b447bb1bf4aff00237ff60f92e9fd41f792e9bc7d2599e6f717c1d8cf247e8f7a5d160ba6fecf23c1b4bf21a0f86264e13c72f82499f2fd57c1f06727c954bfcec098df755b30d9ef7a2e98ecdf78974cf54cb447d47b3d5330e2cb0fc9b4df47dc0ffbd12ea9647a9fec1e2cde07f92e99f60b1c05239e3e4ba6f9df974cf9d74932ed9ffff17b2e5f70014f90ef288261df8664b25f5332bd6f0ae36be1fc4ef92499f22d4b3297ff593c0fefb7525dc9e4df3c30de5fa53a9229feb12553bc2ec66f46f2565f92c97f37609ca7b4df25d37e825a32adff89fba39eaafb92293fea24f3ebb7627cb13ebbfd944cfbadbf2453fe37154cf287a664d257d15e715e80fa6fcce673f2af117846f94076075e503d2188c1d88f9a9b82c91f2457c954cf38832df2279ba9647adfe70a8cfaecf62098e2ef6e2699ce27ed04533cb2d5c0d8efaa3c09a6fa46f12199ec5d3c0feba51dcd9f63517f5dbd0886bd3f4be6d76f7f30d59b62c164afde5432d5271f2453bdf0118c7abd77124ced4f1ac914afae2553bd5edc0ff3b9f32498ec6d1308a6f66c55c9341fdd83313f9ba23da8ef46a564dabf664aa6fd21f27b8a37e291643abfe249a6f9ce174cfb13a2028cf78b25b9647a1fd4a364f20fdf92c97f0c25d37a512599d607a03f22bf375ac994ffa49229ff78944cf94a2618fe48fe1ef59e4632bd3f270163becf2ac994bf8beb71fe4b0d2453bd27964cf552d13fa807da2f9269ff612499e627d13ed40f424330b55f13d763bfc6ed4332c50f37c1f0f78a64daff3d964cfb43c578637daf7a138cfd39429f719e6745fa30314df21f590ec6fedd32134cfbb10c5d30f98bcb8b64da2f3c01dbd87fbc174cf5c92001e37c4d25eee760fff1b7605a0fc8b792e9fc81b8bf43f149740263ff68fe2a989eb722fb9c8878201849a6f75f9e25d3f37cc974fee15532bdaf752898ecdd0904d37a475080512faf7e30e9432e18e7f56e82914f5482c91e0bf13ce4ff7e2698c627fb924cebcfe2f7d8ff1b3e80719eaa934cfaee3992491e717ff80f6f2699f22ff13dcecfa753c9e4bf0e92293f394aa6fd139660b2cfc8904cf9df4230e68b4a32add78bf1c0feda740ec6fbebcab3648a8f2792c95fd492299e1848a67ccd164cf25b2d58f887ab64f2379d64de3fea4132bd6f4efc7e8e7827944cfb7f1e2553bd4f134cfa6c799269ffb6781eea8df14432b57f2718ebe591645a2f8b05231f15bfc77e0f652699e229f13cbc7faa9a4ba6f361427fb03f5013fa8cf5e2c495ccbfd73dc924af180fec0fd33e24737922f17c9c6f6cc91ea626f69b5e13f082fccfe64d32d547bfc0385f565ec0886fba1cecd07a663394ccfb237b05633d627b144cf6779949a6f75fd682c93f06349f4dc5fa433d154cfaace982697d721b4aa6f3c11918f585742299fce5bd64aa67958229be5ac560ac27ac12c178bfd79b64da0ff1e37b7adf95fc3dcef70592a95ebb174cfe3a10cf47fda01c08c67e1b5f32bdcfb0134cfde12a92493ed17f585fc81f25d378dc49a6f8e253308d57249e3f417c7a904cfbcd7e30c5d382b11e982592797f24df82b1de954ba67aa6907f4af69baec138af6c8d24533d692f99ea733bc1e4ff3c0b2cde37be944cfe712499f2b1b964b2675732c52bd0670bfb45d54832e58fba64da0fb301e3fd8d4a2499d67f857ee0fc72f82d99be5f81713e3e194aa6fd49e27e588fb89ec1884fae13c9d4ffa27fb0bff0229e67537fae481f66e612fb2d776083ec3debc026eaa53618f18a3b0323fe580f04d3f5c98b64da7f63825df217852e99ce77907c33113f6c4dc134df6f1f24d37c9982b17ee04f05537b9a77c9148f88dfa3deb07a92ccfb7f73168cf365778229be48bf25537d19f28bf501e55e309d4fc94f92c97fcec158cf2b12c1e41fbb4fc9b43e3d104cf3f7f6158cf87ebb170cffe448267942c1e47fba05187f1f455049a6f5614330f4ff0d8cf3b88ab83fde3770d94ba6fafc12bca0f6a557c1c80f6dc9644fb964aa7f1492a99eb1934cf3f718bc44fd632199f2ab67c914bfd782518f16e389f78346a23dd8bfa58c25d379ba4030c95b5f2453fc5c824deacfec2299f6eb6c25d37ae74630e2b94632ad170bf9b13fb87b964cf514713df61bd4aa643a9f0f7bb31cecbf10fa28f6e3f89269bd83e2adb9399f52bd33032fa6fcfef9086cd07e8d95f81eeb1b97a964b2bf0dd8a2f958ff02dbb41fbbbb825d9a3f2eb5608a3fe28560caafb6141fcd45fdb11a83b11e180f05d37e5c5f114cfe669d8051ef6f3dc1a40fab108cf3d9e55a30ce3b1a60d4d78bab649a5fe5f7645f978364dededbb360f247452899ea616730d6e7d6779269fdfb4330f9bbd4148cf8e7058cf5b8e44932bdffe25e30f6835c24d3f9d1b964b27f713decdd16ed9b937fd2f792a99ed2082679a247b0380f33964cf3ab18af05c52f57d1df381f5baf2453bcff0046fcacfe60daaf6a4aa6f9ed4b30ce7fce25d3fedd1918f65f8af1c37e6d4f954cf9cf5a32c927fa17fbede254326faf22aec77c1bd582a9fd971d58ecef3524d3fe5ea1bfd84f97d1f82ec47a83be124cf5c8ca07dba4efbab8de9df2dffba44f0b51afeb5cc1747d32154cf61eecc043ccf74f9269ffd3098cf7495c1e25d3f9c14a30ad9f281f92693de2001ee3bcf34430e94f71114cfe259883f17ef6b52599de2f36144cfaa23c4aa6fafd188cfa79d60a267de832c1345f1786649a3f7e30cd97a2bdc86ff55232c54fb9648a6fc4f367e44fbaa1649a5f669269ffb7f87e4ef6915f2453beaf4ba6f9443c1feb655a2c99e47b944cfb532493ff6bef25d3f86ec1e2bc532318ef1712fa82f3cdc55e32b5ff1b0c7b5acd25d3df9fa04ba67ac25e32bd0f44b4cfc0f95ad13f787f759c08c6fb8f34c9141f6e2453fee80b46fe22fac7c2fbafef24933f17fa8efdf9590dc6fb8d4a8a079626ceb3d513b04bfa5a527cb664f645eb65067848f359fd8369bfec063cc27ae45532d5e31f25f3f15c3d83315f5d12c9544f740553fe1e6592a93f3dc158bfb88127145ffb9560b2873a96cce5d75f25537ce90ba6fa62f283a95e2ae49bd2f82b0f82c93ef385645a6f17ed453d39984aa6fac04c32fdfd5607c1a42ff14a30cdb7b74232e5a76f60e483fe5132cdafb960c4fb5f60c4aba52218ebaf7b30d69fb6e27b9c1f0ceec1d82f962b92c95f1d24537da7148cf93d05239f534f92e9bc8bb81fcefb1547c9544fabc1383fe68af1c67e92f807d3fe43213ff6af7662fcb19fdaa37cc410f5ebfc5e30cd1f6b07ecd2f85a347e06332faa8f1cc0d0efdb17784cf6e91a82499ff44ff004eb318f92693fdebd649adf5f05937efa67c1347fe91618e7bb6e7782112faa60ac8736a1601a8fac00a31ee98c05e37d155bc1347ff8aa647a1fc009bca0f1f21682c99f9ae2fe0b6acf360763fd62bb168cfcb0148cf7790879f1be9ad4954cf53cd17fd8bfe49f24533db1164cfdbd7d07e33cd346fc1efb17b789643a4f300423bf303760bcdfec42f669b27885ee47f38169e1bc977e124cf18d3706e3fd11fa163c22fdda9482a7b43e7805c3ff058660ba9f2b9e87f364d14632d5fb4792e9ef37fe02e33cd926028bf364efe039c9b712f747fdd9ad24d3f58231fee58b601affdb9b648a6f7230dedfe12d25d3fa760a467d3817f218145fd99f9269bda1924cefdf93df23fe7e009b349f98623c2c1a5ffb2298ee97d8609c3f32e6609c3f8b2cc9646f0bc914cf3f4aa6786607c6fe958ee20f8bcdafb43f81e20b165e93fe5c3e25d37e30f13dea3ddd093cc27ede2d18f5983804e3fd1d9a25989ed7168269ff61fa089e223f9e8167d47f862699d6f39e25d3fe68152ce2b70318e7c9ec67c9f4fe12138cf70f252918f1932b9e67507caf08f9f1be9938069b648fc15e308dbf32108cf7df88e7637f627c150cff7a0163ff42f000c6f99c88ec9b4d37a867d1fc62b3f1a3fd3c743f5b8c5ff102463cb2da82117fb4df9269bde12498ec510f25d3fef01c8cfcb8b425d37eaa5232bd5f2506235ed85a9269bda4154ce31d89f6cef17ea8037841f76b447b17d84fb6012fa9fd6b211fea49978b608a4f0c156c423f3bc9b49f3602c31e6f7bc1d0bf4a32c50fe44f6c1bfb3be22918e7e93a6287d907adb70ec063eacfd51b784afdb3d1c0c85f8a5232cd97afe0398ddf652d99fcf75130e5879d09c67c961482c97eae7bb049f74b3ac9349e86649a4f2692b93cb978be8df749b88229be509660eca7f39f24d3f922713dd6afaedf8269bcd690c7c6f9d755001e52bc5b533ceb5a63d29fab2199ce63edc1139a9f82083c25f9f5068cf745dd2cf082c6238d25d3fb1d378229bf503ec178dfce6a0946fce9bd0aa6fe5ccf04e37d0af27aca77ac1bd8a2e747df9229fe2dc136f98ffc4530e9f34a934cf9f10fa6e78be739387f48fde9daa8f7273c3e310716f67b260f9269ffde1318efefb91e24537dcd06e3fd79f6156ca0deb1904cf6a080d1fe6a2199e67b5f303d4fbb801dd8fb0a8cf8f9a611db78ff5dac8211df745f60d413133e7e2c389be17ccc183c27ff97459279ffac4b30de27947e0826f94c4532bd7f5d032fa9fd6d2a784af58e21d8a0f9e1aa48a6f53f5b30d58ffd6730de5f94ad89ed01d9ef86eb2b0b2eb0feac6fc04b92af7525d3fbcd8f6093fccde64532d9cb4d30c57fe1128cfd33eb77c1a41feb028cf7355a1f82e9f9ee1cec62ffea9b60f227892918e785f0bd8dfdafe9b3601a4f270463fda81980f17ea59adbbf3966fd41ef472dc14bf2075b1b6c60fdec4132d50f0bc9944f1cc126c693dad7bf5e9ff2075c6f63bd6b45fd33b1e6549fb8adc0580fdc7682c97fdd5ab035a5f74309c67961e50bec523c1de2f736eaf7f11c3ca4feaba8bfa6d664467fffdc080c7f53b492a97e6f08a6f686776013fab4964cf69982717ed224ff30b5b15fe81608c6fbd3ce60c48b2d8dd78cdd8ff2eb5430c5839b5730f2dff60086be74a4af33d6ff148fdd8391ff6a74bf390b30693de808b6917f64c436ce8fdf1230f6bfb7345e0b6b3a27fbe9c0f319bdaf8bfcc782a5f7e43f0f60cc4705f99f256b3fedf71c826d92ef3625b627349f68dcdf9b2c9f9b927f237d3458ffd1fc5b8327f007241f530f1aaf6b00467cad51ffb2f8674efd41fed5b6711ed0e4fac192cf39b57733022fe97ecf977feda32abf7d8c9f3e26ffa7827fa74fcf0afb9da5daaac3fe58ff6a0be8f3df21cb2f72b9ecf3bb5c0afe9b90afff77f7df5116d62247f5d81ffad87ddba87590cbfd87bfb3f1f9779605f20899fa6be8cfffb79fff167b71e9f393743ffadc1663f4e33aa96fbdedf8eccf3f18b9ffff65e16dfbc90e6009240d1fa9bf2b3bc9439ee0df4d1661eb3f64f9313a3f24f3e4e717cbfa7791e5379fecfefa91d758f05a8e94457a8a7f2b590235542335561335553335570b364ea55aa917b5669f86e951ab76ec7365b2de544dd5d99f15ff9dc67eb1fe379365a3aed827652391a85bf6b963d2ecd43dfbec982c07464726dd91fdfb4e3da9f74cce7bf5817d0c76e53ff4daff5b6479e43dfdc446e699fddb597d515fb94ebda9efea87faa906ec9a9449f8c524f85607ea501da96375a24ed5993a67d2fc1bc9c25a7a5637ec9f91ba607f02d8fd92c9f2cafe6929aafaa4284cc7be15431d2ba662b18fad380af31a8aa7f8ff3d92fcf7cc954aa0844aa4c44aa2a44aa6e44ccf5ca63d2dfbf4b6622a059b45064aa954ca45a9954669954eb92a3745537465a5acffe8b5ff37cab251b6ca9db253cf8aa2ec95036bf1513929f7ca83f2a83c29cfca5979515e9537e55df9503e952ff6dfbf9581325446ca589928d37f23596c65a6cc9505d3b393b26413cd83f261288661b044c0b00dc7700dcff08dc0088dc8888dc4488dccc88dc2288dcab8a87746fddf23c99f9345b58ca6ff23a390df6677a3353ae36adc0ccdd08d95b13636c6d6b83376c69efd391847e364dcb3cf897d8e8c1fd8e7d178329e8db3f162bc1a6fc6bbf1c1b4b0cf02685e757f9b797f9aadfe999ff8af6561527c1a5feccfb7313086c6c818315fd4186363624c8d194b9916c6b2370ad3304dd3326de3683aa68b8fc73ebe19b04f684666c465eaa53a9a31936a6726666a66666e16666956e6c5accdc66ccdcebc9a375333757365aecdcd2f33b1f2eb1cfcd764311a736bde3169becd9db9e7b21ccc8379344fe6bdf9603e9a4fe6b379365fcc57f3cd7c373fcc4ff38b7dbecd8139c467648ed967c23e63736aceccb9b960992a3334e3de322cd3b22cdb722cd7f22cdf0aacd08aacd84aacd4caacdc2aac12b9dc2f91c5ffaa2c56655dac4b3f2e566d0cad5a3d5b8dd55a9d75b56e9666e9d6ca5a5b1bd6d3f7ccd96ead3bd6522689b5b3f61677bfd6019f2393666a9dac7beb817d1ead27ebd93ab351da592fd6abf566bd5b1fd6274b98bf5884b0601e3d61b3e9c0faeea3cf1fd1d1bfa2634cb31a8bfe82f001fff74a89aca135b2c6d6c49a5a336b6e2d7acdb196cc74fa4a9ed18f85b5b34d48f2439643bf4c614e6ddb766cd77ab03ddbb7033bb42326cfc178b4633bb1533bb37336abda766197ea935dd997de92fecce74fc932307756cdc6646055aa67d77663b776675fed9badd9ba71303fec95bdb6376c249ef9676fed9924625414662bcc5e602bf766681bf6d6beb377f6de3eb0cfde3eda27fb9e8debde7eb01fed27fbd93eb319d7b35fec57656fbfb1d1b07efffcafc9f27cb16a66274cb78cc6f8b4df992c1ff6a7fd657fdb037bc8faf3c47a7864bbe6dc1edb137b6a2db924bb7e64fab161ff9cb1f6ce85fd9b91bdb0972c485698ddcc1dc3311d662c8eed384cd2bde33a9ee33b8113b218f5dd89545df17fcdecfe155954d7183ab113333bb1edda499cd4c9ec2f27778a5e0ea7640ff0ed3d6b55653d3b17361acf4cc706cc6216dc6ed8ff3b356b6be3b44ca6b9d3998173756e8e66f7938feeac9cb5b3b1b7ecf78eb365d21c8d9d73e7ec9cbd73708ecec9b9771e7ec9107ecb7a7eb6a03f234b2f09f3c683fe7ecea3f3e43c3b67e7c58cadb33db1ced6b33d6656cc3ece2b6b5dc5dab5c0a7f765ec63cfe9e374f8bc39efbd24f6d20e9d0f66fd47e7d3f9ea7fe954ce379366dffff5f6cec8e9ff5acca933b3eb9fe4f8576599ab9db3b05f9c25fba1e21a6ce2b08c23f34accd3bab6ebb8aebd702a73e17ab66b1f5d9ff9a8931b981fccdacfaca5f76ec86c2ae673e6d18ddcd84d98bde0e3746e6a7acc73b02b594fbcd93336be67377373b7704bb7722f6e6d176e63356e6b358ae67656f3afe8987a70afaaeddeecd6d55cdd5db96b3626cfeec6dd9a43f7ceddb97b3622dbde86dd837bb4576e6031ed331df7e4debb0feea3fbe43e1b817b765fdc472195fbeabeb9efec5707f7c3f9703fdd2ff7db1db84377c474f1c0fe7dec4edca93b73e7eec25daabd2f6091b8a7aa81f70fbdda9f91c533d8f46d79b6e778ae937b9e71b2179eef055ec8e4601fdbf0222ff612e6030eb6d1eb8c977a99977b85577a9577f16aaff15aaff3aedecdd33cdd5b796b36e7c7c6c9db785befce7a70471ebb0b1b5d9dfd3ff36fde8e59cec1db7b07efe89dbc7bb5f01e58467af31ebcc71f5af5bb1ff853b23c79cfded97bf15ebd37a730637362dbde3bd32f2e099368cbe6f229b39ae7de76bd0fefd3fbf2bebd8137f446ded89b78536fe6cdbd85b76441d7a3aff8866ffa966ffb8e71f45ddfb31e7c9ff9e8ad6df8811ff663e547ee8069e4831ffb899ffa198bd6be51bffd523c9189fe75599e2f7eee177ee957fec5af0d6603e6d46f7a49fc967d3aff6acead27ffd6cf77bee6ebfeca5ffb1b7febdff93b7fef1ffca37f62f966a2bef8f78aea3ff88ffe93ffec9ffd17ffd57ff3df8da3bdf03ffc4fff8bf9f485bd30c74ee57ffb037fe88f8cbd3ff627fed49ff9737fa1382c27fd6679f70f597ea97dfc99d8d25f066aa004060b112da65f6aff97c0f7fae5b7811d38fe3570cd0fe31478811f04411844411c24411a64411e14411954c14509839a7d1afb3d68838ee59af3e06a3f07b7400bf460c5fc48ef0d9560ddeb99ad30d906f6c27a0e36ecaedbe02ed8057ba50e0e4a191c8353708f0af54f35ab3f2d8b1d3c048fc153f01c9ccdd829ad73f012bcf6da15bc05ef81137c049fccf38c83afe03b1804c360148c8309fb330d66c19c49b47016c1325443253442d3188416fbc39c71e8865ee88741188651c86cc73a8709f3cb4698f29881c50f61d6fbfc300f8bb00cabf012d661e32fd421d3b41fb2387f94e5e77af6cf63d25f1db661175ec39b19875aa8b3bbafac636f27e13a5c33795e8c7b2f0d37e136bc0b77e13e3c84c7f014de870fe163f8143e8767f52d7c095fc337ab08dfc38ff033fc62d2982c22f6d97ff90e07e1301c8563e3184ed82cb40dd6e1943d63e6ee99fd7c9b53f6dfe7e1225c466aa428456444e68fcacdaf5a46b288ff862c28f1d4c8525fd5d7c88e1c7f19b9e673e41987c8376751c02375a61351c8e2f7cf88e524511c25511a65c62dca8347ab65f369cafe3c4645f01895aa1255d125aaa3266a5910d345d7e8166966678ccc75d4467ab48ad6d126da4677c629da452c82f0039ef778d68ecdb40bf6bc7d74888ed129ba77d2e8217aecefcdabed866af4d1eeaff6f2932c068fb043b77516ca2e7a8a9ea373f4629ea357f6a437e6750d16a79ca37773c2e6e8aad7eae823fa8cbea2ef68a0ce153f1a2aea8f2a2c7f9e1b8da27134096d2b8ca6d1cc8aa379b48896b11a2b56111b319bac629b85166eccbc3d9f73962c7f93b29843e33ef6e3200ea3fb388ae3f081f554cadbcafc5a1f25fe2c0b7ff68f7131d4f8f9e22cd4f73889d3388bf3b888cbb86277bcb0f87111d7d6dedd5b4f7c2639b959dcc46ddcc557ff515dfdb4f662cb3bbaca5875e25bacc5ba3f8b57f13adec4dbf82edec57ba5890fea323ec6a7f83e7e881fe327e3143fb3d866c9bc7380b86e689de373fc120ce2d76011bfc5effd88736b3055a38fdeff992c0ad34726cb6b9cb8adba8a3f4c23fe649db7641ec6b09ee3da665ed3fc0c33f6dcaff83b1ec4c378a456eaca7e51ee94713c862c3c1eecff9dfdb7493c55f57816cfe345bc4c54e3c17e4894c448ccc44aecc449dcc44bfc24484263efde9b3e8bd8d887e7a42c3b65f3d6d17c4da2244e92244db2a84872b1baf07765b1c886f8155b36bbb2fe65914fa2b8499194e69b71f26fd69e8dc9d9b998dff6c13ad953e39054c925a99326d6d5f7beea9db4ccca52f40d55c1d97d95bb385332bb4abae49adc12cd38252ceb4956c93ad924dbe42eba26bb641f1c9243724cd82c657a8ec272014364d94c9b4b2f4dee9387e4d158264f09b34ab146d2e722ff4c96e499f5e198e50e2bf6efe7e4257935dfad3e3f3f276f56ff8afa7df26ece8dfb709c7c249fc957f29d0c143d192a8b64c4abe3bdc7b4fbac8dc9c264b2df93713231de9269324be6c63159d8c76469c6a99a2aa9919aa995daa9e3dfa76eeaa5bef1603a2cbfe1b2f45910cb54b769601cd3308dd2384dd294cbc2d76dfa7cc4180aaff6932c96b0fe3453466e6b97cc8e9d344f8bb4343fd22a4c98f75a5afdfe8687f4621becee75daa46ddaa5d7d451f4a04b6fa996ea91c9fd3f978549c3644957e93adda4dbf42eddb15fedd3837d4c8fe9c9d8a7f7e943fa18fae953642b7a344c9fd373fa92bed2c8902c2ca7db4681719fbea5efe947fa997ef5feb197a56f7f9f5bfd2acb8f91e17a78607dbb5412ff2139a7dfce9069eb673ae86da5f7c54ee5fa696f8f553a4ac7e9249da6b3a4b50b65c3f42c5177fe23ef31361a7d0edad724d379ba4897999a29c63163f971b4efb3e3ccecb3e2649559999d39ea57ea0475e6665ee66781e9fa81a3a06ab0eb675096e1c5599845599c25ce23b3172e8b6af5b9d52fb2889a9add3f99d14efd4a064ccf952c553eb2cc74cc2fe61b077dcecbf477613d982316e37efaeb2ccf8aaccc2a61e7e45b98b34db24b56678d5dc763f53b6bb32ebb662c62f343d6df6ff6c2fd66de9c652c99661ce3a74ccf56d93adb306bd3b36d76e74efa5999c53363a603cf76bfcd8445369691edb23d93e5901db313d31d85db7491ddff268bf28b2ca67a973d3032b24743c99eb82ccc37f67d642ebcc4661146f69c9db397ec357bcbde852c1855577d4bdaec23fb8c9e93419a655fd97736c8d8e866a36cec8eb24936355da7cc66d9bcf7ebacbf17d93257734509552b377233b7723b77d8377d3d6dc29edad74398b7cedddccbfdec900779a828ff4496be024a7dabf8bd36f63edacc23c330ee982cbd97efed70c024619219f7799c27fe364ff32c3c30597eac4172bf95e779919779a556f925aff3266f8d63dee5d75eb7dc613f1ef9cdfdeeb3e25cb316f153aee7ab7cad9eed32dfe4dbfcced67396c1b09879c8729a4bafd9feb7719f29f93e3fe4c73cc88e4c9b1392c52afe812cbd0f559209d332db2ed5263f1926f32baed05ca6678eed5877ecbfbce6f7fe5dfe104cf347a3fd690d92d97afe943f671725cecff94bfe9abfe5ef7dd4937ff49909af719cddaf6cca73628dcd8871fe997fe5dff9404d9cc833f3613ecac7f1579ff1997dbc4c51b4cfee30c9a7f92cc9988e1d59a699f47e377c0bdffe200bb75792259fab7b854d65ea77be302c63cfd2fb1dd5bc481673943bf9b2500b8545f5b3e8814547b6dcabc0575793b1fa919f0ba33059b7d9ac557d2cbfe8f312ebaeb7e4c2e96b1785cb62ad53e1157e111461112923d52ee22229d22233f67d5ec365611ac6aecdd98cb92f8aa22caa3c2459faf6b398f5f597f9e5375958c6b34f6fcc62be8b0b7be4ce74a97227646177ae8ba6688b2e288a6b714bf25f7684303d53fc645268855eac8ab5710835e7b597a5d8b06cabaf6a7ef4d5be60cd243916dbe2aed815fbe2a0d8c5317b284ec57df1503c16cc3efa1a279764614e0b268f7128cec54bf15abcfd248b1aaa7f57164fcab22bde59fe742a3ed894b5efa33c5420875c9645f1597c15dfc5a01806398ba2c90bffd8555114a3625c4c8a692f4931ebd72c989ea8c5bc8f467b5b6677e03163b12cd5ecbb544287c540d7d250c2d22cadd22e9dd2354ebc22c2ae36c7f6a1f498cdc6a55f06e1ae64290dd731f7efc822d654c40cf3adb665c472b053191b2ecbef852cfb5e16f3cb3a9749999659996749745f163f564a7824669465599597b22e9b5e92b2cd34661b565f3b6371dc985bb4e10ffaaca7ecca6b79b3be4acd0a4a9d8d67c4a45995eb72536e992cbabdeda326368e5bebbecf64cabb7257ee7b591425cd7a6d28b552fb45961fd13ef773ea8dcd103b75c56439183e1bebc81c5b7d3d2cb0674e63cfcb63792aefcb87f2b17c6271ce86e527a398c594ca9d5d97cfe5b97c295fcbb7f29d79d12eef32adafee9bb3bebec13f337b5f7eb079bc2c3fcbaff2bb1c985d392c47e5b89c94d3c42d67e5bc5c944be3c45c7d156a7c4c0f665f1939564a655466d06746a7e0d4ef2ab2aadf62fedefb3059d8b7663f36c8d834bbaa2c26cbbd19b2deec97483a264b6b06c6a1b22bc79bc5e3a00996e5c4dc562e538ba86236cfa29545e5574115329fca66bb3ea736471513d73a313946fd9a4515dbdb2aa9d22aabf2aaa84a2bacaaea52d55553b5556745c1b1ba062b362e5ba7a355b57ebda3aff254b74aabf42467b21c83a36ad9f51f641151a5cf6571d488e9e246bd315559556b264bc4662c268b193269f64c96a37bf65a6fae2e2387e9eb5bb5a9b6d55db5abf6cab53a54c7ea54f575e17be6c717d681c5d5233e26a3fe2ebd3d570f4c96c7eaa97af646d5b97ab1aaead5dc556fd57bf5517d565ff128afabef5e966ac07ac2e5f5cf678bddb11a56a36a9ce4ce23c6c5339adf627e4bca6270efba60d1ee539ac5a36a524db98e912c51af654c965335f33a8f656bca3c34ccae9a87af9eaac6ac3f17d5f2a26637f7f5a25cb81fb615f38349d17f26b406c3ee7570377d7e75312fd6c5be38e1cbc5bd78179f8d897f092e6134b8449798c9d2b91fccbadefb159cde673059946a7449823e47f6d9c7fea32ca859283c96225912f549bdbfa4ec9e593fc6fdfa9c6df523d4af3d18a774e75d2fb9925e8ad0c8eefbbcfd525eaacbe5525f9a4b6b9c2edde56a6fcdd1e5165f98bd93244764f10773e445d68e5da55df4cbeab2b6c2cbe6b2bddc5d7655a7b697fde57039ba2fbd2c173633b1d8cde27fd5d684fde2fef27079e4b2a0adfd5add3f95256071f24d29c2faf27479eeb585d61bfb95a07ecd81e9d8a377f35545b3df7975c88ca6feec72bebc5c5ecdc4383afae58daf136d8235f75dbd7e8db92c7c3d96f5f196c5dd5333bebc5f3e2e9f97afcb777cbcf06a13d388e16578195dc66c869ddb6c66cd466c967db5ee7adbbf4c2ed3cb8ccba2f0bcc2fe5d16392f4096545373b5cdcf97f9657159f6eb90bdcdb2d8b85fd50accc08d8c83a7298f8a1fb4c620fca8d55a49b6b5519bc98ac9f9565bb56def1cc38bfaf99ecd8d336ef74cc7b8341e9b3146e6dcdef82cdeac9ddaadbddaaf83484b46e9ad0eeba88eeb84e5ca9fcce3796c6e9db008f4c9dd32590e755a67756e325990875bfd0aeaeff9cbcfb2287eaa2b6e5dd4a5f25557c68149c0bc0fb3dfa8978569716cc69eee2b6aa9cc422bfc8caa9a4590ec7f0d6b5beb7eb84347cdaf2c63af9cd73063f67faa22f6ebdeaff7d27875c746f9cbfc626d5cd6d7fa566bb55eafea35d36ca77c8af27a536fcdd8b9b23cdceb6318d6239bdec2eabb7a57efcb3d932515759e3fe695d8112074cc55efd44370523ae5b13e184cb3597e7f6fdbbc12cfda581f599b4ff57dfde0b6a1556d13b77eac9fea67e3549feb17a65b8bfab59f159cd728b02d1691ceeb37bfb1b7fe376fd994b220ca89acbdfb5abfd71ff56738a8bfeaef7a500fcba01e992ed3c27db17077aec3f29881cb324b63578feb493de5b2507ef20f7264f6a797a59ffb13f6ff0d9bfda7f5ac9ed70b9657b2fc8bc52e5b7b592f9d779bcdc98dda288de13f5a35f3ca1f8dd958c64363db47f6d9374e3f438693be6ed3fbb2c665ff34a2d0def09a9af1cb1ae0d074eb5be3357e1334a1f3d4444ddc244dcafae291e54977eeaec9ac2dfb158b429bbc299ab2a9b8bdd09ca8f42b763fcb42732397c5e4b364aa8cd2cc99c77a7369eaa6316377c3eefb7039352d0b8359d6e186c6aee99a6b738badd0b48a466b74fbc18c9b557aecc7c57c6fd64cdfc76c2c3efa5cbdd9345bebdcdcb9dbbe8283d53fac9c9b5ebfb3a4d935fbe6604d9a63736aee9b0726c363f3d43c3799bbeb6be64c2fe3e6dcbc34afcd9b948559c51f65a1d95ecaa2f1959bb5faa138cd7bf3c1a22ac7ff609e89d973bfa6686f9b4fe3e0dbcd57f31dbae167ad3483669828d60b7bde283359ae356bc66c961b46611f41369366dacc9ab971b296eeb6e1e3815566167d9b9ed3354b63efad5bb5555aa3355bcbe8ebd581396efb15c45d9f2b87ba71689dd66dbdd6ef63181e7719aadfaf09ff365752a5cfa4bdc2fdfa937a8bc76de03dc65d1b1afd4afdb658703fbbed6dba8d8c531bb7499b865ef5de666d9e9fdaa22ddbcad8370fed85595585fce4beaddba66ddbaebd5e5876dfded8bcf3ddd70ee4eabfefed5aaddf1de36baddeaeda755bb35f6dda6df0dede056f5ec89eb7734a63d7eedb437b6c4f52163f38fd41161bd97abff39945bc2c951e313ddbe5b9a2b7f7ed43fbc8b4f7686ffa9d05b5d53ef55adf326fdf9edb97f6d518861f4e5c44ed5bb269df59ccb3cf3b7bc9645ef5f949fbd17eb65fed773b6887eda865b3068b697aed123b19f67e906bf6b69db0acf8d44edb593b6751cb397875ed76d12e3bb59fdbeace38754a67746667c571922779af472c8e39fe4116e75759d84c99a94967770e93e6dab99d67192cd770d89cb063be56ef7c7b5b9f7d3753baa00bbba8da767197746997b1b0b8e8ca7e6dc8db75157bfea5abbbc6df756dd775d7eed6699ddeadfaac8e723b5ec95b326b687b8fe2fb4e65dce75db7ee36eeaedb76776c02d875fbe6397aef0eddb13b75f7dd43f7f8ab2cbfc563b40fdae2fbb87b59fabdb76ef7d43de7cfddb97be95e6bc738b9ae7de8ff1a4166c38eb3eddeba77964f9cba8feeb3fbeabe9d85fad80dba6137eac6d19d195b0b33f6b56ed24dbb5937ef16ddf2aa5e95ab71358d9dfbca7763f9bd1ce6d00ffa99fd6ad97bc7bada4cbe73b7bb322bb18ee1cadd5d5deffdea3109dfaffe35b886d7280fa302b66ffe1d1d13eb0b72bf196a7fdcef5de36b52b2d65d53ebe19ab119ef6c9dddcf7eb5f79ab3ff5a5ccb6bc5e29897ebe55a5bfeb5b9b6d7ee7acd27d7db55bb321d5533b30bdf8da69c5c57d7f57573dde6937efe655aa8f4750ce623a2be06c6f7638dd87c74ecfd38d515ade7de5aaa8171bcde5d77d7bdda3847b5edab2c5993353c07367f9c07f8afd7f89ca7ebe17a8cd953afa7eb3d3dddbf998b6641d1eef5e1fa787dba3e5fcfd797eb6bad3069deaeefd78febe7f5ebfa5d75d74139bc0eafa3eb987d26d7e975769d7b6bd60b8bcccccceb92dba2f5f327f2dd7d73c7fc1c27ebcc52c3a79b7263f955348c4c36f3b9aa6dbf33591cbebef31764b99937eb66df1cd6379ecb66877edf8bad140b2fb9b139d0b8f7b51b0b346f8152ddc25b748bd5db2db9a5b7ec96df8a68d025e15755df4a7377ab6e97f0e3c626c65b5bac6e9db1ef772df0fd16d6af1f5eafb0d86cc4246aee7236b3dcaeb7db4d4bc6d133cb2d44fefb87ddf3ffb52ce6e34dbfad6eeb86c5860d1b0d663515f3f8ecff6d8fc5eecc9fe593dbe6b6bdddd5a5fa62d7cae2b65386b7fdeda0d4ea58dd869f55773bde4eb7fbcbddede1f6787bba3ddfce51623f180fb71733643e7af24759983454afa4fbbfdede54f7f67efb48068a226ac97f7d7d3f2a6e9fb7afdbf76dc02b565f2cb35c58776c86d89a73162f6d6e43e3741bddc6b7c96d9abab759eadce6f1241ef77bf56f8bc80a5fa2eab6d4d4a8d394a85202f5ac199aa9599aadb1b16e5acdedade4e78fbbef3396c82759cc58f3345f0bb4508bf242d1d20ce3f287d3597fc25e1eb5584bb454cbfad981dd7b617e7a119385f624cdedad96f733a75668a5566917ad564325615ed0b65fe289b25322add15aadd3aedacdf84c1dd573979aa6e9da4a5b6b1b7ba16da99af0ebc8b03f2a8bb1ad7667dada9db653bba0b9bddbef2c7f37642dcfa1f8f22fc8926a7beda01db59376af3db008efce9cfa1f2c3bda71eb6451633568f92e43ed517bd29eb5b3f6a2bd46b935d2de8c85f61e4fb40f36269f2c216e94246ccb2767e999da97f6ad0d3436a6edeeefd98bf5dcee2c35f2b59136d6260a8bd955d72eed525db37111f562ef2fcbf2a84db59936d716da52578d7da8318f79673d9993b86e6fecb363518056b6bac26c79a71bbad92a9dab5bc64db77527327457c97596ee844e7fe622ce597e32d4033dd4233dd6133dedc7e0d74f98f5b2447e2f95bbd7333dcfebb2d20bf6fbfe0c84266b797c86ff2b3a16157aa957fa45aff5466ff5aedf11c3f2de39af8f322fa45ffb798faffbfaa6ebbe66817ed3355dd757fa5adfe85bfdcef850bff59dbe77c6d5413fe847fda4dfeb0ffaa3fe14bd07aece722db28dde4ef86e0bf3e78fe9e8e764adbfe8af4aa36ead86cdca34abf4f6eff075c43fbd8724c9f537fdbdb8ea1ffaa7fea57febcc07588affed6ed3ca56a3f7beea637afd3a561f4733895c33d687fa888dd0589fe8537da6cff585be5ca92b6565accc95e5eddd3c7ded778d38d5ca5e39b6e1eec90f0b0ff68b2cae7170dc95bbf2567e3c535f56415f310a4e2cdeea57df6a5a7bfb73b2048fab701505b355bc4a56e92a5be5ed78555807166b6efa5ccb3afe248bc9b28265dee5ceed8565b4b755b9aa5697555dcd568d3e5ab5b1c7f7c23129dcddaaeb76abab395e752c5bbbe3f66e626ef955166f7533e3b261f9d270a5b1f178e335567efeafaf2afd9571311f57fa6ab55a6bb362b8daacb6abbbcbc76ad75767d2a05f79b0b67d0ecf64796372ec983c0adfc570cff7819ef85efea3d8cf6bdcbbdf76e87ff8cd6abf3aac8ead1d7cb84edffa7e9e679aa6b63b6627bfcae2af4eab7b9643ad570fcdfbea919fce727f3a052c4f69fca971795a3dafceab176db67ad5ebd5dbea7df5b1fa8cbff26ef595f615a31fbbddf98749f7c177bc0f9d57f6795b7daf06d17e35147b2cfbbdbccd9339ee7739b58bd5a8d72e173b9358e3acdf65b1ceab717d67ec5693d574355bcd51c3b7708ec1fdf3314c92af16abe55a5d2b6b439badcdb5b5b6d7ceda5d7bc69e45cffb1f7bdefb489eaffb32097a7b62b3105fc7e3fba9f9beea7e36627e6318266b7f1dacc3c0091cbecb91452c6431bd17f85d967e7473dbd8d7efeb681dab77e20c2d9745f9b16be9cff8b1f03198af933c5d5bc1789daeb375be2ed6e5ba5a5fd6b5b5b437741601fbf7fbd5b30fbe57a25f6bb15a16fc34ceba757416dfb3e83e9ce9d77ecd807df6ebceefd6cc62bc50c8d2eeb411f366bfd90bd7d26374b7beadb53573e4b2fee5fed5793f628aba5eaf37ebedfa6ebd5befd787f5717d5adfaf1fd68feba790c5fdd69eef5ac1b8b04fbf9ef76a7e704b3e584bbedb9f5950bffba8f7e2eb7e97fcb1df83b63eaf5f02d736cc28effa73246c8e1feb193f73d2e7373edfafe4b23c69bb7e5dbf35cafa7dfdc1e617c8f2f7f78ffdf38ff3283f69566595d196e7f5e7fa6bfdbd1eac87eb11d335bea38c568b980e4db0afbf8fa6c6acc7cffc04c6b2dfadd7cbe90f7a7bea77569a43967505d5e0a69a713e6171d79d36d1f3f5b8f776eb49bfa3b61f93cb389f38de7aba9eade7eabdd8d32b674be7afc8f2d3d9621ecf798f6a11dcaf179774bdcc5f36ea46d9181bb37faead164ebf368979c230a77db5439cb4602336661ab91436d3dc39174ba1fd0a2caa7f6511e4ae0f0b36569fdfacc6cce59f8ce3c6c9271b77e36dfc4d607da94f56f35b9bfed2b8fc7eb6381a2a9ee2da55972acd26dc449b78936cd24db6c9f9aa0bcb6eac27ffdbf68bbc782effdf76ae6549552488eee733a6f615fdba7dbb6356a899203e5a6db51f3b4444f0c14b1489987f9faa8202a4bd37b457331113b9d010943a661645669d93b6d9e37b5a6207f5ce54d90a7b630ee6244ed8f3c2d4532060d9afca32ad349d280e4d481246103617866ae8b10a11c3b2b36c86248e1fe983506f36cb7bd7f59cde1344592e9dd23decc91c0e90c0115250a0014d680104cf80a691efb672cf7c667bc1191af13a6a6c8d2ed758790ea8a041fba8a546ca6681e23a2c67047dffd9b4a1130fb9e20cbad0833e2ce34747a706bc2c0e85fef98baee722bfd4f4404187dc51957668dcd0c2d0b660004318c12b8c61025378f3347fb13bb0acbe5df0f8ab3a31cdd0e01d3ee0136ee036e9c2ddb1ed7437f7e95459c13d7169c0bcfd003fe0117eb2bb700a4ff08c94def1b9eef5e9337dca1557dfc052a8ea8aefae6ed98c216b9d45ef4ffa485524aebeeaa181333471eeaa5edbb7f71bff47100423b4421517519a70a1686ff7106f632dbe471b97ebe0a027b3a4874ec8a276354cdffc603e255ca59dee228325a4b8c2354b719e8d29bbca113774bcb961e319c8f15c1f6327bd3884873ca043ee1bdcda7dce35430f7d0c30740718e10e636fed2f7ddd7f0cc2861b3aa1161991827b3cecfa8d66ec6112bce2115354f693204dfadb96d559cd6ccab25f967cd21655d61b3627a2d61336b0892d72a03dc20e53978ef868d8fa229f5faee75a7fe935c07eb745b764495b08ec7d0311d5f514356ca3bffd70224ff774bfb3f1822818bb5ad8461d3bd8c5de6e837df6fe0507fb088787258ef015c7d68bd0fa1a7cc79ef3f0a8623d21573237714a0f6bb636061dba66de58d0211dac1b76bfe293ef6039b59ad281736c393795d713791dceebf80ee712f96e3009ddd07544a5d179e13613e6e4967d435ca3ec245389a0cad56bfd58aad7bf7aee9fc122ff178e852391e3f3ba9c7d9399eff23a234758aeb7d96b869def6fe7fb0f468e60216ac18678a2378b9890bd31a42ee18c42f1d27b720dcf09969c1fb0909d7904e76ec356026184f0baafc89d66956e3da5fecbf6f6f369d67545d6b5c5d924df135a7ec542cb5e26e49a7cbfc201afa191da8093df3604f79408ae9ab0ad576031ca9ca3caca1635c83935653d22cfb448ce3bcf6adc752c32e62a9eb9443352aa19aaaae7e288acea1ab4729f2cb50e052bf5d4871cf952b02732ae47d9db635ea9689b453c57bc2062244752ad5f5e84c592fcc3e1ee4c949995795bc152fdbea830d827ffc84c20e9088f91d2fb395e4b665b520152c3422492ebf27dce3a1163b10a2cc60916c11710bad85b6ed69a7320cdc09db863ceee0a1533e20c1ccef6c814cd995eb334f9fc9ecf4b7ebda988b5c23b67b1108e04dff03d63da7fc32f8b9a5f4caeec2fc7c9c7e6f5bc5e154b795ce2e596e3679fca7dd222b624e3bc58134fe3a1e0bbcd199677fcb81c4b3d6a7ea7d6aeb0fb7e71ceb9a3f5738b7cbeda2ba7de3ba79caf57e52fff15fb1fcbbfd3fefcfbaf3ffe0193cc32fd</data> - </image> -</images> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 <qlabel.h> -#include <qlayout.h> -#include <qgrid.h> -#include <qregexp.h> - -/* 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<Page>& li ) -{ - QBoxLayout *lay = 0; - Q_ASSERT( layout() != 0 ); - if ( layout()->inherits("QBoxLayout") ) { - lay = (QBoxLayout*)layout(); - } else { - return; - } - QPtrList<Page> 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)activeBullet<bullets.count() ) { - if ( a < activeBullet ) - bullets.at(activeBullet)->clear(); - 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 <qpixmap.h> -#include <qlabel.h> - -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<Page>& ); - void wizardPageShowed( int ); - void wizardPageFailed( int ); - -private: - QPixmap checkPix; - QPixmap arrowPix; - QPixmap crossPix; - QPtrList<QLabel> 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 @@ -<!DOCTYPE UI><UI version="3.0" stdsetdef="1"> -<class>WinIntroPage</class> -<widget class="QWidget"> - <property name="name"> - <cstring>WinIntroPage</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>387</width> - <height>228</height> - </rect> - </property> - <property name="caption"> - <string>Form1</string> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QTextBrowser"> - <property name="name"> - <cstring>textBrowser</cstring> - </property> - <property name="text"> - <string><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></string> - </property> - </widget> - </hbox> -</widget> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 <qfile.h> -#include <qfileinfo.h> -#include <qapplication.h> - -#ifdef Q_OS_WIN32 -#include <windows.h> -#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/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 <qfiledialog.h> -#include <qlineedit.h> -#include <qlabel.h> -#include <qprogressbar.h> -#include <qtextview.h> -#include <qmultilineedit.h> -#include <qbuttongroup.h> -#include <qsettings.h> -#include <qlistview.h> -#include <qlistbox.h> -#include <qapplication.h> -#include <qcheckbox.h> -#include <qtextstream.h> -#include <qpushbutton.h> -#include <qradiobutton.h> -#include <qcombobox.h> -#include <qmessagebox.h> -#include <qregexp.h> -#include <qtabwidget.h> -#include <qarchive.h> -#include <qvalidator.h> -#include <qdatetime.h> -#include <qlayout.h> - -#include <keyinfo.h> -#if defined(Q_OS_WIN32) - -#include <process.h> -#endif - -#if defined(EVAL) || defined(EDU) || defined(NON_COMMERCIAL) -#include <check-and-patch.h> -#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<Page>&)), \ - sideDeco, SLOT(wizardPages(const QPtrList<Page>&)) ); \ - 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<Page> 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 = "<Environment variable empty>"; - } - 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=<d->unicode,su> len=<d->len,u>" << endl; - outstream << "QCString =<shd->data, s>" << endl; - outstream << "QPoint =x=<xp> y=<yp>" << endl; - outstream << "QRect =x1=<x1> y1=<y1> x2=<x2> y2=<y2>" << endl; - outstream << "QSize =width=<wd> height=<ht>" << endl; - outstream << "QWMatrix =m11=<_m11> m12=<_m12> m21=<_m21> m22=<_m22> dx=<_dx> dy=<_dy>" << endl; - outstream << "QVariant =Type=<d->typ> value=<d->value>" << endl; - outstream << "QValueList<*> =Count=<sh->nodes>" << endl; - outstream << "QPtrList<*> =Count=<numNodes>" << endl; - outstream << "QGuardedPtr<*> =ptr=<priv->obj>" << endl; - outstream << "QEvent =type=<t>" << endl; - outstream << "QObject =class=<metaObj->classname,s> name=<objname,s>" << 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 <qprocess.h> -#include <qtimer.h> -#include <qmap.h> -#include <qptrdict.h> -#include <qwizard.h> -#include <qlistview.h> - -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<Page>& ); - 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<QString,QString> 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 <qfiledialog.h> -#include <qlineedit.h> -#include <qlabel.h> -#include <qprogressbar.h> -#include <qtextview.h> -#include <qmultilineedit.h> -#include <qbuttongroup.h> -#include <qsettings.h> -#include <qlistview.h> -#include <qlistbox.h> -#include <qapplication.h> -#include <qcheckbox.h> -#include <qtextstream.h> -#include <qpushbutton.h> -#include <qcombobox.h> -#include <qmessagebox.h> -#include <qregexp.h> -#include <qtabwidget.h> -#include <qarchive.h> -#include <qvalidator.h> -#include <qdatetime.h> -#include <qpainter.h> - -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 + "<br>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("<p>The option '%1' is <b>not verified</b> by the installer. One or more of the following " - "files could not be located on the system:" - "<p>%2" - "<p>Continuing with this option selected might <b>break the installation</b> process.") - .arg(text(0)).arg(required_files.join(", ")); - if (!file_location.isEmpty()) { - message += QString("<p>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 + "<p>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<SetupWizardImpl*>(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." - "<p><font color=\"red\">Choosing this option requires " - "that the DB2 Client is installed and set up. " - "The driver depends on the db2cli.dll.</font></p>" - ), 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). " - "<p><font color=\"red\">Choosing this option requires " - "that the ntwdblib.dll is available.</font></p>" - ), configPage->explainOption ); - - item = new CheckListItem( folder, "Oracle (OCI)", QCheckListItem::CheckBox ); - item->addRequiredFiles( "oci.dll" ); - ociPluginInstall = item; - ociPluginInstall->setHelpText( tr( - "<p>Installs the Oracale Call Interface (OCI) driver.</p> " - "<p><font color=\"red\">Choosing this option requires " - "that the Oracle Client is installed and set up. " - "The driver depends on the oci.dll.</font></p>" - ), 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("<p>Some of these modules are optional." - "<p>You can deselect the modules that you " - "don't require for your development." - "<p>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("<p>Build the Qt library with or without thread support." - "<p>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("<p>Build a shared or a static Qt library." - "<p>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." - "<p>All applications created with a static " - "library will be at least 1.5MB big. " - "<font color=\"red\">It is not possible to " - "build or use any components or plugins with a " - "static Qt library!</font>"), configPage->explainOption); - entry = settings.readEntry( "/Trolltech/Qt/Library", "Shared", &settingsOK ); - staticItem = new CheckListItem( folder, "Static", QCheckListItem::RadioButton ); - staticItem->setOn( entry == "Static" ); - staticItem->setWarningText("<p>It will not be possible to build components " - "or plugins if you select the static build of the Qt library." - "<p>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("<p>Single-threaded, shared configurations " - "may cause instabilities because of runtime " - "library conflicts.", singleThreaded); - singleThreaded->setWarningText("<p>Single-threaded, shared configurations " - "may cause instabilities because of runtime " - "library conflicts.", item); - - folder = new CheckListItem ( configPage->configList, "Build" ); - folder->setHelpText(tr("<p>Build a Qt library with or without debug symbols." - "<p>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("<p>Qt ships with support for a wide range of common image formats. " - "<p>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("<p>Support for GIF images in Qt." - "<p><font color=\"red\">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.</font>"), - 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("<p>Qt can support the \"Multiple-Image Network Graphics\" format." - "<p>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("<p>Qt can support the \"Joint Photographic Experts Group\" format." - "<p>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("<p>Qt can support the \"Portable Network Graphics\" format." - "<p>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("<p>Select the SQL Drivers you want to support." - "<p>SQL Drivers can be built into Qt or built as plugins to be more flexible " - "for later extensions." - "<p><font color=#FF0000>You must have the appropriate client libraries " - "and header files installed correctly before you can build the Qt SQL drivers.</font>"), - 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:" - "<p>http://www.microsoft.com/msdownload/platformsdk/sdkupdate/<p>"); - - 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("<p>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 <qnamespace.h> -#include <qdir.h> -#include <qlibrary.h> -#if defined(Q_OS_WIN32) -#include <windows.h> -#include <shlobj.h> -#else -#include <sys/param.h> -#include <sys/mount.h> -#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 <qstring.h> -#include <qstringlist.h> -#include <qpixmap.h> -#if defined(Q_OS_WIN32) -#include <windows.h> -#include <shlobj.h> -#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 @@ -<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> -<class>UninstallDlg</class> -<widget class="QDialog"> - <property name="name"> - <cstring>UninstallDlg</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>527</width> - <height>365</height> - </rect> - </property> - <property name="caption"> - <string>Uninstalling Qt</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QLabel" row="0" column="0" rowspan="2" colspan="1"> - <property name="name"> - <cstring>sideBar</cstring> - </property> - <property name="pixmap"> - <pixmap>image0</pixmap> - </property> - <property name="scaledContents"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>AlignTop</set> - </property> - </widget> - <widget class="QGroupBox" row="0" column="1"> - <property name="name"> - <cstring>progressBox</cstring> - </property> - <property name="title"> - <string>Uninstallation progress</string> - </property> - <vbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <property name="margin"> - <number>11</number> - </property> - <property name="spacing"> - <number>6</number> - </property> - <widget class="QTextView"> - <property name="name"> - <cstring>filesDisplay</cstring> - </property> - <property name="font"> - <font> - <family>Courier</family> - </font> - </property> - <property name="wordWrap"> - <enum>NoWrap</enum> - </property> - </widget> - </vbox> - </widget> - <widget class="QLayoutWidget" row="1" column="1"> - <property name="name"> - <cstring>layout2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <spacer> - <property name="name"> - <cstring>Spacer1</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>90</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QPushButton"> - <property name="name"> - <cstring>cleanRegButton</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Clean Registry</string> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>okButton</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>OK</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>Spacer2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>100</width> - <height>20</height> - </size> - </property> - </spacer> - </hbox> - </widget> - </grid> -</widget> -<images> - <image name="image0"> - <data format="XPM.GZ" length="26835">789ced5c595323bb927e3fbfa2e3e8edc6842ed8982526e601b0318bd97726e62125956df0868d59cc8df9ef93ca452e6f34f4e1ccf4c37405747fae2a293fe5a24c49ee7ffee3c7cdc9e18f7ffcf38fa7210ceffd0fdf84c18f7f84e74e67f49ffff51ffffae3cfe5a5a51ff1a7b8b1f1a3f0e7bffdf1a7811ffe8759a23f842b09af13be51bcccf78de015797e27617efe5ab13c6f05afcbf3eb09d3f3f0a0989ff7cd84f9fea360cfef879030dfef335e16f9bd172cf2c125e1f524ef6dc22cef9a62e9ff30616eff4ab0ca5f4d98efaf2a96f7af13e6fb15c122bfbf4f98fbbf532ce355669cf81c27cced9d28e6f68d132cfcec86609117b6044bff8efac7d6a43f7fc358fb0be78af9beeb09d6f1eb0bd6f1180896f6cd2ae382b467af04cbfb595bb0bcef6b84d7f579680896e7c32061e26b2f056bffbb82d53e2e222e2cebfbb02158c7635bb03c6faf1917d5febd6079df497b45ed8fdfdfd0e7c36dc2ac9f4cb0eae342b0f67f2c58ede18d319a1ff747fe541cf7772258f5779430f75767acefdb9b84d93eae0497e4fd52c2743ff4148bbedf046fc8f3649fc5241f5c0bd6f61e12e6fe1e15737b765db0b4679e12e6e797040791ff3c61baef8b8ab9bdb0c1b824fd7b8a072b056dcfef0a96f6fc4ac2ccf75531b707cf8c4bcacf254ccfbb8162f14fe92ff55f4a989fbf51cccf674dc1c2dfde26cccf9f12067d1e7604ebfd57c5c27f59b0f07119e35591cf913d940aa5c0f1213c292e6c90bc7b8c57d53e8e158bbece048b3ce12061eeef50716199da7b16acfadd502cf25c0ad6f1e7f651de22bdefac60b59f9262894f2058ed654bb1c8e7046bfb7a5ff4ebd37d89c79b8a597e77ce784dc7634fb1c8ff9e30bf7fa498df0f6b82d51eb61366794031bfefc9de578bab1b45d6c750b0c8e7cf14cbf8de2ae6f10a59c2f47e28325679a19530b7b7af58f8ae254cefc3bd60912f5414f3f3504a98fb6b286679b28e60d1bfdf51ccedd953c5dc5ea6f2a93ec85f565deaff5eb18c6f2b61eebfad58fad7e7c51e7c3b61e67fa958c6f324616acf6482351e0c1266f9de15cbfbdd84599e3ae3f582f0bd532ccfaf27ccfd51bc5d2beafb6e55b1e8b7c038bd6f13e6f79705aff27dbb9630cb73ad98db83a66090fb778aa5bf15c199d8073fefd2f325c5d25e59b03c6f2e13667b0a8ac5bf1f196fc8f86446b1f02b24ccef8f14f3fbf644b0f009f23e1464fe23fb5a5f49efbf28e6e7fd51c274df2e0996f18243c5624f8d84d93fdf05cb78002816796cc23c5ebb82753cf719abbc7ea458f8937daffbf4fe9260194fbbaa58ee737b1e94af572c7cb384f9f9a160b58fae62d1e75bc26c8f34be1b2bda7e962996f1a80b96f7dd71c22ccfabe215aa2fc263c240f6a2efeb78d6144bff4131bfef5612a6f7dd48b08ecfb26296c79c26ccf755be4cda1b32760589572f8a25de541366be65c5a2ef31e6f6453eb72af9d046c2acef55c532de5630c87c799830c7bf9162997f760567d2de9d62c947683edbf03a7efe5cb1f07d4a98c60f2e04cbf89815c5fc7cc6e3ef95af394a989fef2a16fd5e264cedfb8660198ff09230cb7fa058e66f9f30c707ab58e2db96628907db09b33cfb8a459ee384499e50535ce27af741b08eff5bc21cbf1f154b3e344c98e5bf502cfedb4f98ed6153b1f8632f61bedf129c493ed84b98fbd7f115fdda4ec29c9f14154b7c394898fd27bd2fe3c5f6e57d51fa6b24ccfdd5154b7fed8439dfeb2816ffd84e98f948ff7e4dc6f33e6196f755b1d86b53b093f84df90d94923ddd24ccf6baa698f517fa82355e9d29e6f7cd30618e17d78af97d58162cfa74a058f479a558f455562cfeb49930dbfb4031b7ef2a82459f50502cfeec12e6feb57dd127ec25ccf1f149b1e8f33d6196afa498e5f3a97fe19ffa17f99e19277b6826ccf610148b3db884f9fe9362f1cfd784599e37c5226f2161e673a098e5b535c1623f1612a6fe4e878a451e9330cbd3572ce3b79f30dbc78b62f1c76ac23c1fea7838e97f9030b7ef154bff59c27c5ffb73e28f7b09733c5e532cfdeb78d5a5bfe784d95f54debad8cb56c21c7f78fc83eadf9f2ae6f1846ac26c9f5b8a59ff9eed37a8fe602961d6cf9d6289ffe709b37e2b8ac5df2e12667b2b2a167b6b0b16fd413161f68f8e62c927d3f3228ff62ffab3a384f9be512cfc571266fe0f8a85bff627fa75278a45bff709b37e5f14cb78f512e6f1d8532cf2ed26ccf3d3b362b1f79d8479bcd6154b7cea0a16fbf08f09b37db4148bbc0f09f3fd9a62f1cfa384595e1dffbae46fd58459de03c5920fb0ff8720f1c12d2996f8b5ad58e687a384d9ff68be7125d58f3709f3fcbcaa58f4b3ac78d5d1fd75c132deaea558f2b1f78459fe8e62b18776c23cde5eb1cc27cd84e97e0682653c61a858f4aff2c8f89946c2dcff9962d17735616ebfae58fadf4b98e5bb659cc6b7af58eabf9162d15f2d611e9f65c5325f5d25cce3fd2658fc2bec2816f90b8ae579b22f17923e3a8ad78a844f05bb35ba0fbb8295df49c2cc9fc73fa83c70a658f4bf9130f77f2558ec276c26ccf70f154b7e47f6e05715670f8245dfa7c3bfefb226ff6fbe1206bdbea7afbf9bcb873c7f3b2e6389f2d7d7defbbdb94c4a19fffe2e89ff4e2e3f67b7f0b9e83d2eef51bf1f9769361f3c67be8fc9ff0e97cf58e1efcbe56bec7e372ed6d3ef803f99cdf0771d2f379e51d49a6cc0cf3dfe3408d51167bf1717dbb40dbc82c857174ef77865c22590dc863ee57f33e7f05d4cbe878b7dd091c6bf513fc42b5a4f64d8b22d7a263047d154db76f0a74bd7b7b1f9361b6b3213e2a29ed0144ebda83389c01dfb88bf9dede365488b8ddf870bca1a251e208f28355eb97b461844cf89d23f219721fe76a88ff86c7ceff9b79af7077479b224635f50d627fb6adfec08af77bb89d796ddc6ab6c2b76c756f1d35dbb67f7f1598fef1dfc665c6af610ff756f8f50c6114a7c6c4feca93db3e7f6c25eda2bba2eedb5bdc14f6eed9d5db2cbb6608bf87cb02bdfc3e4735c16cd03b939a28136f3842c4a76d5aed975947a038dcbd08f31902e439f59e38c37c164a66e47a64136e7c62dfe7d5c62eba6893ff78464c6c088da340f76605af8bb6bdaa663baa6671e4ddfe4ffc082cb08ab8179b2a766689e519f6df49f8179c17189712e4687f849dd3e7c3717bceecdab796526e60d6de3017b5ab1c18cccbbd9345b66db9449fa8a5cf359e8dd1d53256c91fdaed933fbe600a5c788877d64e44b6deca7763a34877f0797a9cf7b18938aa88f23736c4e8407a08c1f311973613e207ca2cded99537386fa79b45d8aef4d9a6f8d7dfc3e2e910deae45e6c2c5a345a16feab63cecd85b93457288bdacdce420e7936d7e6062f66738bfab9a3b79d5932cb76db144c112d4bfd9074f37d5c50cfaf631de175883a79428dac989259257d5c9bb54ff198af9fc86c9dc66260363006eedabef4e52503fa543efa152ed44acd0258fb82e200b8e4213acef33d7e9ed5ed4c71b9a127908dbd006f0b6684f6d520368dcfe6d65f995f948b7d4261026424355bd6acacd3e39e8f0855bc7684d10ebd0de91e4637a8e30cf46e62bed68833d7dfc605305a8eec1d348409cbcd32cdf298c479a620acc6ade4e23564d0b465d3c63ebf990bc5e1a8e926c6e2275b817b7b99fa372411244b1beb607a36512daec3c384eceb53fae4c8368016b4a1631ea01b638048d28b59c25fe3821cc0b46c0f7ad8cd9d30614de4b513795ce335b69647bcfa6695b31894af9f63b54eefb39759c910d48bf0137b0d037882a191b99233f158612c92f3937a0914f19d39473f6924bb998cb3636d187844b93378c6b17d81579c81f6f1eac21b8ce01d368d872d923d8ec7383aabff2832b00d65d3414b88594686b3f3540d3a6d6f9fe2d2c339be8133e3ae5d128fbf9e60b233c1a38223ba831caab08b71fb1cf630677e857d9c0563de398203a8c1211cc13132c6c7e184343a393215eac5e233a77046f99ae64e58d1fd152e1883bbd6c1395cc0738ac131285fc2a530d9812bd6075cc30ddcda77b8832558b68f508022e6cf5c6dc68aa58bd21c9906acc02b94306fde9016d76035c727d91db6b786d583c36ca013ab37bcee7f9d0be5f42bb06e2eec19ce27b9a8434c40626a1cc50d4c778d1d3970b1fa8a36d1c46b1c7d6a78c54a07301b2dda5de75d7099ccb69022a17a21406cb7ecea186d7a54c3f5a9aa7b99643266f3192e3163710dd7a45e351ae5628fbb8f4cdc03bcd88a6bd9e0dae38b183562fea31534e7429841765cc7beb9ae3d866bd74b3151a322a47efaeed1ee219b2155a59db4a2b390cbfc3827cfb65c1fedab2e79faa45d9304f0e806ee09da76e886f4fc336924c895f25264508fb646ccf8efccbd9815f74abe63a83dcea04dcab98d7b7358e5a0263be437d98c7c135ca62d0f7b7aa0d5141fad020a98d51f4b5fe319f136f61475027df7ee36cd798c38d33dc41acbdcdb81dbc2485427ddc4567beac7b6e1b63132acb8776403e4339319048fd6b1adbab2abd07a889f9275ca5fe6cda6d4a7c759b78995d6a6db99885e791b2b9b3d3772558c545df6ef311f696980ad34a256dc2e3eb3eff6dcbe3b7035db41dbddc2cfeaf6d59cba43f2c6e90c957a7447ee18ce5dc53dbb13f5405d3f9cf5fd692e512bf89eb72ddb8536565a65b2e44a9a1d53ede14edd1946eb23b29eb13ef2baf1d1e7b0b55e8c86b6e4cedd85bbb4658c4f435a8b69d8babb72d7ee862cd8cce1d2335bb612e389bb8dda1119a7d6d5e771a19991b8c4bf016739ac19c7d589915c9066007707afb680d6554f2b4b7e0e97815bc2df1db7ec0af694d6020670e48a587be13c8e36e863beea565c89e65998b90c4ab082e3e030be371745a9b95ceae358807adc75ab512b3c83249fa7fc1e67e65317d71e7aa293c3b4129bcf0407a8dd1eb5b4e9d6900979b6dd4036eb68391bf8ce3356db43388391e44733191d3ce22099983b2f8eb8f3b990a7504687b1b0e41e482bf9e842f334b60f18abcb927946af68e98aea049798eb764cc315bdc3ead1c4bc05f34be33d66a965f782b3cd7dacefb0af0a3e61139bc405c7d1f86086381a1bd15a66ed6b968be822482dd7b37d38f71945ff9d892c728dc6aaeeebb0ee1b1421984b8357c3a7b99c4629cedc1aadd2ecf8267259f5f7d842c39efa07f49b3aaf7aba1abcd98b592e64dd03dfc2ececf1e75cf29a49b27471a40ad09c8ac540d930c62fdf76719db8e63bc2a541ab0d7569ad46751bb588ba2bfb2ee52beb390b224bf3ce791be71d6cc3d47ccfdba499299f895606058d6193f178924bce4732f1e410ab15bb4e5cf2b912fd1b33c85b8cf96d9c1761721c38eff18fc40545432b2f430b7532ae4fc6d50fd271efb6644698f51d5aeffb7e60af932de73583f5266671059a63781eceb15ac8c5c4bc23fe1b73dc636a79ba468cd9d78e7f722ecf25f95b13a53ac08b2201ce1d177e680624dd0d6998ffac4b1566ec957ff62ff625b680b35419b3ecc789fc42ac0c2539c248f6352e7564136533c8e5842c23af15cecf0798d5df59e432e1191ab70efc2b45af3aeaa4847e32c8555a9c3bdae47b7189fccd8f6c912478c1faeb0533bf692ed827dae3bbdf642e7979177121a61db432e2825e799a7a555fb9a178bcedb76029e691b35cd0ba0e69a6e9da2266ffef34cf82bfcf79b4b6c9bc56fdb62fbb3249807a749b5825cdd10b0ef000e798e698cb22dfcf718933127319619e6f66b8c4569f6117eb93c8a539473387942f9cfb8adfc11a723a1bd55c987e63cdf38e1e5fb5d1b6c13cd8bef37e773a17e7c8e9b19a438f69ce9f2fe772c17a876cdda0e79fcfd14b9c59f6a1ed0f629b5098994f6256d2715564e290c958aaea4c9c35bee687b68439fd3e56270fb427d8c76a744ff492bcd41f92069750a238677c854b866dc6d5a37789f6d35c2afe08abdf3842017f4fed38e2db9477d9d3c8c41f27265593d750b4bb9a3f3117d08bb500e76d3886680de831e5296f21cbb617fef4ab5cf087b8f85e6ef548b950b58715ee1356bf8099deccde2946f2375b82f71835fcf18cb568348eda3d33170e682dbc213b7ed163defc39653aa9c214ebc49c09e7a90baa5703658d33be9f8f07c42748ad14b95c4d8d0f676203d3c5f9ed9eaca919eb13ca7a0632c7efa1846b98ade8cad8e42a66bcee62eeeb2ffd55f439aa64d016503b9e6a9b27bb8d3d68ed92e30f0dcc1eca24a7a3e83c91dde7b950d536ced963fbdb73b850e431fb36f65c8bbb326419547fc69d3e57f6a738330ee4f97c362a6bad1eb3067fe36f3d4525df31affe8e6cac473553166d1b7b48fa1b5fbef6552eb46ad2a4597f5b56c326ed1c6737b38fde4a5a20ff68989669d17acd9e3b8396afcd5421f919ea9a3c6ec92f9b4e8c1f51bba4939e39a4117cb225e132a5196c17ed81463a71996f63b19e652e34ef13177b39870b604f2835ad5c7baec089bfc3aa7c1fbd39669096e693d93a91dbd8211bdb47de7bf63166c9a8df17b2af9e6dc7b97f3e171cd92e2c7dc425f98ae694bc9a15b9948d9fcba58ff9ec1ef6cb5c62dd1e57be767d45ea135d1f9a8c5dd3ad386841d58e5027713e8a7b95b1e73eec432dd9e824976d64cf5ccc4fe6fddc7d64e2ec93b9b03773a290813ec4bdfb5eb4b1681d58b33bb71ce713ca5676644556198ded6b1cd3382b1bf87d8c137bb4e3daa295278c0438c716a03f6399f1ed13cc09f6347e7d860bb61bada66b3b381f1693f7e6e3a9c1883bc2e706317b4349ea581f16a12459fde4eaf26495388eb13b340bf7fd99ddc2da621f47a6c5f9821df91dcad8c66fc93abc5f714517a3f657b8dca3e520175bf5a539352b5601b00907685903b4f506feecdb12fac94098e47763e654bc546d4b4484b8dbb9ec57fd9a6d4bef31db38a33a769a0be6e638ba179c214f3359646314f3a3778dfc3a6513158e3e867328e482f9f729f468ed0be328f41ccf6ed7fe7ac2c6c5c66095b2b87ced32b12b00f77e036b65ac196d0b3a18d3b74d7eb7ad223fb430825e1ce631c9d7c853fe1253f1981d16bc97fa85d7c36505db6e046b77a586ac07e32ec862388baeca1ca9bab9a3dfb713316d3ce3c4bd968d0058b79cd3999f57ff2e33a572d9911f0760474ea3ed4fb8089b40d598b1bd1851a816d35d09b59db84f74845e5b8e953ace8f0781bdfe5ab8b2eda4f8eb6f40a59a7792816a65cc272fcc79f080d970b285c425ae5ea02438ba792e9355ff78dd32c7a54e3b3731bfecdb8209c976930c013f83637835cfe85371a5aee62bc8cda177de8b4759d105c5de90858c6ae4f1a84c44465ac7d8827b3374de0cc9c2c69625f6859f05da594a6b563c23cece95e2757a263272f174f66837d48d31d3e729e2483d864668ba0e9d5979c47cf001eb80be548cb9fac494c3bdbb0e0fa145eb49f35625a4d2c416dba1e34f2447ce5b24a9ce64a6813d8dcf4cb80fb938e16288cb01d6dfbdd095550765531564422f3cba17591b1cba65b70ef7b4bf9cab1931ab3f0b7dcce2dbee0ce792c1148bf1dc110712c2203c996d33b32f12239faf852156076fb2a6c435e34fb968c61c9e914dd756cc13594c75c263aea3ffbbcc75e94cc1033ef74875e4258dbe445168f813a8622edc0c2fb0075564d39f5b01ac139f9b5c9c9bcaf671705f6dc5391b7ce7335c267dc9367ccc2d56dc55e0f520e5c2b6738dd189727fd80f6f9855229f30827358c15af2912d8deb139ea7d1f71ec3bb2be227d367cad4ce62a45ccb696aacb5e87565bf1f36dd068e5a3355b1661197e90897f83d61deb04d5e2d71992c425794eb66c5be9957136b9903f49d57f41b17d751ec15d6f157710e42e1b12e88b5a35f3347762db706336b6bf36dd0982b8ca87b719e10d9682551e3d5ec5c39ffc24cab1178cfe246b9a0fd5634db75a7e6226cdb36fa57b4c93ad6352577e9dfdca5dd76555a9fad637dd2c0bf0fd11ef7423954c6b5b3c4bdc96b5a6fd17de3690f8763a52bbcc265d1fad8222e582776692ffc36ed5d731c208b404b7250735718bf57ec8169d910764235ecfa327a7cdc5fea51ce1635d742a6fbbe1af6bca319787ef59ce724cce038ecbb3e8d869fb49a4539cc022ec139ac998654f3e6aac3fcbc1d0e420d87af432bb787e60df3b322f2883ba571353766f21e3350debb6863b65272716eb733ab60f3195918d85d6ca386d1a8c12bf7f9959fcf7389b52b2c99158c66d32710d9ce622470eec6ad844388b514d52274923c9e637c88a7e87844cd4bccdeb0bdb82fbc82f19b56fd930fceea43d1921b8523db0acf188d7a93fb3b5fd40bf80e143063b6a93e9aae2beea2a59927ac692a389bbd9ceaf96bde278b3bfa8714e978cd08fbc7d8fa168e431b6b5e909c75f6d2334c58f741f4fa1a5d1336f62b5c5cc5b542df94d25afdf45e2fcd8bf612fd20b3dbd833ed286335f0403a1aa41d70a0b5aa26ce1217e1249c86b3dcf8cf6a07d984f370112e319e681696fd35bd60ff4d28842bb34911c08ca5cff9afe159c55e846b33c40a64944eb1c4d3ee9eeacf8c90818e7d05136e3063b99dcbc44cfcee873b5ba27dda8c2cb79ee7b2a8de5f74b9b6bd376f387b8fc29239c9d51ff99ec7d114f9986338c4f93e9e5a3ea7d32c2656f1a68d33c42e3e7401876119f80c703aef30e327a94dac6f8efc168e0e674b8df1ac32c9e753beefa018d78da1034fa1202795389b3126bff39776bba00f0d7b01cfa1c867aeecb6efd9edd00d2b98d91fc3b6ecc6c4eb26c76591ad617e019b7e60ce62a4744bb23ae67e89cb13edb3c4b5e3755b0e258aa6e3b596492e12a5f942bb73e863ab66151a98750e481379b9179f63ce5f96779d7d05e75e23fb152ebf2bfa697f09d089395ddc298022d67e9819718501bca6397bce72d2eea7adb06ac6275fa76bb2ea825c2d66775b7ec716ec4bfefb32bf30bf38bfc967745c0596e13cacc23bd0770fa0924e5c4df63d89afa7e49ec7587fcf5d4fa33d3fccf0c29a1dcaded02fc5319adb5e502385b8328b6c8a61dd3f41597633ccbc3a51fc293fa74eea6c71f6b2e0f31825b156dbc8ec787dff97b8c4dd2f172300fe8df39579806178cf0c5c93fd7f7c823f56fe553927fa310bba1bce17446964622fdc23c6423e3bf4933df1455706e60173ac389ff7dcb3ad650e671c97f970e9ea0b6aab8f477ad2fb75a5c9d05c7221df3a99e0819eff68af83b5551cd37a9ecb97e3d8cc7e646ccb95e10973c447f7f65336d30ca6b954e47b3f4bf0162ec3ddc4c95f5af18d7316bc99675a1b7b9895ead7b9d02ec50b7d93ad688b59b067eec8f5a4ef49df9d97edec4c31a281876318b811d6d17b31878ef50dd612c774d7114b0f712fa39b4e5dc3f770a1959718581eed10f6b12e6e6759d8c25830fe0e0c9d8d356bfe70e6b42eafcfc673b3fcc7e25b57c1857dbb8bb9705c2d7d7345d8a49569cb1e1fbfad8039f879acf778de9f94ec2bfe32c988a3017d5faf4f15ca10f38173730e711ff50933dfc9aa645e54d075166b2fc36bace4ecc8c56f89b4688770689efd80d858ca20b63d3a2c32c17e4deb23097fe57b7c5895189a6f0cd999336ff19c3f46b6badbcce2ca4b3d7df76dba7634921338c8b266768fdaa8640f98a539ac0562a555a34c7868776d296b656dd2c921f9499b7aa66f917c2b178e8a3dfd0eae3b89fbc958e33ca17e3ad0861573e4df61e0f7cc12cab20d0d5ff335cc62b6cd895f811d2c63c09d61e6d9809e8ba7a84dace0a8d2e2d34021ee15da42d6c99a188523932e8d6083f2ca6fb0b1f185759527dddcd3faa6c1eae6c4dde22721bc8417db45569829a0558cc0f8535b7667eecc744d17e5afbaa2f358b19ddb5757768ecf06d82e65f371573ceebcd6716c1ae891fd80c510f42876d573f2f7266dfe6bbe3f473319ed686696ce50b35e62ce879c4e520f58f3a0b50cfd054a5dc62abb0d4bc4009ce373e52a91ec30f08e7da073be4b74a2f881b4dfa3bff99bdb916ff6bd5c26753ca969cb67a29ae3d3d6136fcc7c92eecc9cd4fbf9b746ffba8d7dc4843e6f4e5ed3cfce709f7edf8cbf053bf1e94ffe6f8cefe52265cbc4c8d32e2e5f33e7f0e5d23548c5462bad31afefe2323b72935c663e5fc065fe08d87432339757b8f1897065f01d5ce6dbd124978fff97a485d625dafac8fabe32ce5fe1f2c1fab9997dfe6326b2b7bb405f133afa80d157e3d867b87cae8585f7276a11f120c8e3c5ed86e7f0fc9d5ce6c42133fdd4873d4c7d5f624a83dfc8e5e7e3faddd767fb9b1ec9ffcbff7fecbbafffe7f27b5e7ffef7bffff13fdcf4c93e</data> - </image> -</images> -<connections> - <connection> - <sender>okButton</sender> - <signal>clicked()</signal> - <receiver>UninstallDlg</receiver> - <slot>accept()</slot> - </connection> - <connection> - <sender>cleanRegButton</sender> - <signal>clicked()</signal> - <receiver>UninstallDlg</receiver> - <slot>cleanRegistry()</slot> - </connection> -</connections> -<slots> - <slot access="protected">init()</slot> - <slot access="protected">destroy()</slot> - <slot>cleanRegistry()</slot> -</slots> -<layoutdefaults spacing="6" margin="11"/> -</UI> 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 <qapplication.h> -#include <qlabel.h> -#include <qdir.h> -#include <qtextview.h> -#include <qpushbutton.h> -#include <qmessagebox.h> -#include "uninstallimpl.h" -#include "../environment.h" - -#ifdef Q_OS_WIN32 -#include <windows.h> -#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 <qsettings.h> -#include <qmessagebox.h> - -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 -} |