# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1272881854 -10800 # Node ID fcece45ef507e087a274919687a7b7a9bed24786 # Parent 2f34d5167611cc4673e3a11ca3f44f490a4dd917 Revision: 201015 Kit: 201018 diff -r 2f34d5167611 -r fcece45ef507 .hgignore --- a/.hgignore Fri Apr 16 15:50:13 2010 +0300 +++ b/.hgignore Mon May 03 13:17:34 2010 +0300 @@ -1,3 +1,2 @@ syntax: glob - .git diff -r 2f34d5167611 -r fcece45ef507 VERSION.SHA1 --- a/VERSION.SHA1 Fri Apr 16 15:50:13 2010 +0300 +++ b/VERSION.SHA1 Mon May 03 13:17:34 2010 +0300 @@ -1,1 +1,1 @@ -8c75a52bed9945c3263bfefb5b996982918fe29b +364597fa4f043db390f1c64462f4d2338d5b1d2b diff -r 2f34d5167611 -r fcece45ef507 configure.exe Binary file configure.exe has changed diff -r 2f34d5167611 -r fcece45ef507 configure_symbian --- a/configure_symbian Fri Apr 16 15:50:13 2010 +0300 +++ b/configure_symbian Mon May 03 13:17:34 2010 +0300 @@ -669,7 +669,8 @@ CFG_LIBFREETYPE=no CFG_SQL_AVAILABLE= QT_DEFAULT_BUILD_PARTS="libs tools examples demos docs translations" -CFG_BUILD_PARTS="" +#QTP change for lRelease app. Need for Symbian +CFG_BUILD_PARTS="translations" CFG_NOBUILD_PARTS="" CFG_RELEASE_QMAKE=no CFG_PHONON=yes @@ -7559,7 +7560,7 @@ case "$part" in tools) PART_ROOTS="$PART_ROOTS tools" ;; libs) PART_ROOTS="$PART_ROOTS src" ;; - translations) PART_ROOTS="$PART_ROOTS tools/linguist/lrelease translations" ;; + translations) PART_ROOTS="$PART_ROOTS tools/linguist/lrelease" ;; examples) PART_ROOTS="$PART_ROOTS examples demos" ;; *) ;; esac diff -r 2f34d5167611 -r fcece45ef507 confml/qtwebkit.confml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/confml/qtwebkit.confml Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,16 @@ + + + + QT Webkit settings + + To enable QT Webkit usage + + + + + true + + + \ No newline at end of file diff -r 2f34d5167611 -r fcece45ef507 content/apps/qtwebkit.sisx --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/apps/qtwebkit.sisx Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,1 @@ +1 \ No newline at end of file diff -r 2f34d5167611 -r fcece45ef507 content/apps/qtwebkit_stub.sis Binary file content/apps/qtwebkit_stub.sis has changed diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/anomaly.pro --- a/demos/embedded/anomaly/anomaly.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/anomaly/anomaly.pro Mon May 03 13:17:34 2010 +0300 @@ -27,7 +27,7 @@ TARGET.UID3 = 0xA000CF71 include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/qftp/sym_iap_util.h - LIBS += -lesock -linsock -lconnmon + LIBS += -lesock -linsock -lconnmon -lcommdb TARGET.CAPABILITY = NetworkServices TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 } diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/src/AddressBar.cpp --- a/demos/embedded/anomaly/src/AddressBar.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/anomaly/src/AddressBar.cpp Mon May 03 13:17:34 2010 +0300 @@ -64,9 +64,9 @@ AddressBar::AddressBar(QWidget *parent) : QWidget(parent) { - m_lineEdit = new LineEdit(this); + m_lineEdit = new LineEdit(parent); connect(m_lineEdit, SIGNAL(returnPressed()), SLOT(processAddress())); - m_toolButton = new QToolButton(this); + m_toolButton = new QToolButton(parent); m_toolButton->setText("Go"); connect(m_toolButton, SIGNAL(clicked()), SLOT(processAddress())); } diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/src/BrowserView.cpp --- a/demos/embedded/anomaly/src/BrowserView.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/anomaly/src/BrowserView.cpp Mon May 03 13:17:34 2010 +0300 @@ -71,7 +71,7 @@ m_zoomLevels << 100; m_zoomLevels << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300; - initialize(); + QTimer::singleShot(0, this, SLOT(initialize())); } void BrowserView::initialize() diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/src/BrowserWindow.cpp --- a/demos/embedded/anomaly/src/BrowserWindow.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/anomaly/src/BrowserWindow.cpp Mon May 03 13:17:34 2010 +0300 @@ -93,12 +93,12 @@ { // we use a ratio to handle resize corectly const int pos = -qRound(slideRatio * width()); - m_slidingSurface->scroll(pos - m_browserView->x(), 0); + m_slidingSurface->scroll(pos - m_homeView->x(), 0); - if (qFuzzyCompare(slideRatio, static_cast(0.0f))) { + if (qFuzzyCompare(slideRatio, static_cast(1.0f))) { m_browserView->show(); m_homeView->hide(); - } else if (qFuzzyCompare(slideRatio, static_cast(1.0f))) { + } else if (qFuzzyCompare(slideRatio, static_cast(0.0f))) { m_homeView->show(); m_browserView->hide(); } else { @@ -110,13 +110,13 @@ qreal BrowserWindow::slideValue() const { Q_ASSERT(m_slidingSurface->x() < width()); - return static_cast(qAbs(m_browserView->x())) / width(); + return static_cast(qAbs(m_homeView->x())) / width(); } void BrowserWindow::showHomeView() { m_animation->setStartValue(slideValue()); - m_animation->setEndValue(1.0f); + m_animation->setEndValue(0.0f); m_animation->start(); m_homeView->setFocus(); } @@ -124,7 +124,7 @@ void BrowserWindow::showBrowserView() { m_animation->setStartValue(slideValue()); - m_animation->setEndValue(0.0f); + m_animation->setEndValue(1.0f); m_animation->start(); m_browserView->setFocus(); @@ -140,7 +140,7 @@ ? QAbstractAnimation::Forward : QAbstractAnimation::Backward; m_animation->setDirection(direction); - } else if (qFuzzyCompare(slideValue(), static_cast(0.0f))) + } else if (qFuzzyCompare(slideValue(), static_cast(1.0f))) showHomeView(); else showBrowserView(); @@ -151,16 +151,16 @@ void BrowserWindow::resizeEvent(QResizeEvent *event) { const QSize oldSize = event->oldSize(); - const qreal oldSlidingRatio = static_cast(qAbs(m_browserView->x())) / oldSize.width(); + const qreal oldSlidingRatio = static_cast(qAbs(m_homeView->x())) / oldSize.width(); const QSize newSize = event->size(); m_slidingSurface->resize(newSize.width() * 2, newSize.height()); m_homeView->resize(newSize); - m_homeView->move(newSize.width(), 0); + m_homeView->move(0, 0); m_browserView->resize(newSize); - m_browserView->move(0, 0); + m_browserView->move(newSize.width(), 0); setSlideValue(oldSlidingRatio); } diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/src/ControlStrip.cpp --- a/demos/embedded/anomaly/src/ControlStrip.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/anomaly/src/ControlStrip.cpp Mon May 03 13:17:34 2010 +0300 @@ -75,23 +75,22 @@ } if (x > width() - h) { - emit closeClicked(); - event->accept(); - return; - - } + emit closeClicked(); + event->accept(); + return; + } if ((x < width() - 2 * h) && (x > width() - 3 * h)) { - emit forwardClicked(); - event->accept(); - return; - } + emit forwardClicked(); + event->accept(); + return; + } if ((x < width() - 3 * h) && (x > width() - 5 * h)) { - emit backClicked(); - event->accept(); - return; - } + emit backClicked(); + event->accept(); + return; + } } void ControlStrip::paintEvent(QPaintEvent *event) @@ -99,14 +98,13 @@ int h = height(); int s = (h - menuPixmap.height()) / 2; + QPainter p(this); + p.fillRect(event->rect(), QColor(32, 32, 32, 192)); + p.setCompositionMode(QPainter::CompositionMode_SourceOver); + p.drawPixmap(s, s, menuPixmap); + p.drawPixmap(width() - h + s, s, closePixmap); + p.drawPixmap(width() - 3 * h + s, s, forwardPixmap); + p.drawPixmap(width() - 5 * h + s, s, backPixmap); - QPainter p(this); - p.fillRect(event->rect(), QColor(32, 32, 32, 192)); - p.setCompositionMode(QPainter::CompositionMode_SourceOver); - p.drawPixmap(s, s, menuPixmap); - p.drawPixmap(width() - h + s, s, closePixmap); - p.drawPixmap(width() - 3 * h + s, s, forwardPixmap); - p.drawPixmap(width() - 5 * h + s, s, backPixmap); - - p.end(); + p.end(); } diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/src/ControlStrip.h --- a/demos/embedded/anomaly/src/ControlStrip.h Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/anomaly/src/ControlStrip.h Mon May 03 13:17:34 2010 +0300 @@ -58,7 +58,7 @@ void menuClicked(); void backClicked(); void forwardClicked(); - void closeClicked (); + void closeClicked(); protected: void paintEvent(QPaintEvent *event); diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/src/HomeView.cpp --- a/demos/embedded/anomaly/src/HomeView.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/anomaly/src/HomeView.cpp Mon May 03 13:17:34 2010 +0300 @@ -51,16 +51,12 @@ : QWidget(parent) , m_addressBar(0) { - m_addressBar = new AddressBar(this); + m_addressBar = new AddressBar(parent); connect(m_addressBar, SIGNAL(addressEntered(QString)), SLOT(gotoAddress(QString))); - m_bookmarks = new BookmarksView(this); + m_bookmarks = new BookmarksView(parent); connect(m_bookmarks, SIGNAL(urlSelected(QUrl)), SIGNAL(urlActivated(QUrl))); - QPalette pal = m_bookmarks->palette(); - pal.setBrush(QPalette::Base, Qt::white); - m_bookmarks->setPalette(pal); - QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(4); layout->setSpacing(4); diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/src/anomaly.qrc --- a/demos/embedded/anomaly/src/anomaly.qrc Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/anomaly/src/anomaly.qrc Mon May 03 13:17:34 2010 +0300 @@ -5,6 +5,6 @@ images/edit-find.png images/list-add.png images/list-remove.png - images/button-close.png + images/button-close.png diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/anomaly/src/images/button-close.png Binary file demos/embedded/anomaly/src/images/button-close.png has changed diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/desktopservices/contenttab.cpp --- a/demos/embedded/desktopservices/contenttab.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/desktopservices/contenttab.cpp Mon May 03 13:17:34 2010 +0300 @@ -114,20 +114,6 @@ void ContentTab::keyPressEvent(QKeyEvent *event) { switch (event->key()) { - case Qt::Key_Up: - if (currentRow() == 0) { - setCurrentRow(count() - 1); - } else { - setCurrentRow(currentRow() - 1); - } - break; - case Qt::Key_Down: - if (currentRow() == (count() - 1)) { - setCurrentRow(0); - } else { - setCurrentRow(currentRow() + 1); - } - break; case Qt::Key_Select: openItem(currentItem()); default: diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/flightinfo/flightinfo.pro --- a/demos/embedded/flightinfo/flightinfo.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/flightinfo/flightinfo.pro Mon May 03 13:17:34 2010 +0300 @@ -9,7 +9,7 @@ TARGET.UID3 = 0xA000CF74 include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/qftp/sym_iap_util.h - LIBS += -lesock -lconnmon -linsock + LIBS += -lesock -lcommdb -linsock # For IAP selection TARGET.CAPABILITY = NetworkServices } diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/fluidlauncher/fluidlauncher.pro --- a/demos/embedded/fluidlauncher/fluidlauncher.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/fluidlauncher/fluidlauncher.pro Mon May 03 13:17:34 2010 +0300 @@ -164,10 +164,12 @@ mifs.sources += \ $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/anomaly.mif - # Since Fluidlauncher itself doesn't link webkit, we won't get dependency automatically - executables.pkg_prerules += \ - "; Dependency to Qt Webkit" \ - "(0x200267C2), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION}, {\"QtWebKit\"}" + isEmpty(QT_LIBINFIX) { + # Since Fluidlauncher itself doesn't link webkit, we won't get dependency automatically + executables.pkg_prerules += \ + "; Dependency to Qt Webkit" \ + "(0x200267C2), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION}, {\"QtWebKit\"}" + } } contains(QT_CONFIG, phonon) { diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/lightmaps/lightmaps.pro --- a/demos/embedded/lightmaps/lightmaps.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/lightmaps/lightmaps.pro Mon May 03 13:17:34 2010 +0300 @@ -6,7 +6,7 @@ TARGET.UID3 = 0xA000CF75 include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/qftp/sym_iap_util.h - LIBS += -lesock -lconnmon -linsock + LIBS += -lesock -lcommdb -linsock # For IAP selection TARGET.CAPABILITY = NetworkServices TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 } diff -r 2f34d5167611 -r fcece45ef507 demos/embedded/weatherinfo/weatherinfo.pro --- a/demos/embedded/weatherinfo/weatherinfo.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/embedded/weatherinfo/weatherinfo.pro Mon May 03 13:17:34 2010 +0300 @@ -8,7 +8,7 @@ TARGET.UID3 = 0xA000CF77 include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/qftp/sym_iap_util.h - LIBS += -lesock -lconnmon -linsock + LIBS += -lesock -lcommdb -linsock # For IAP selection TARGET.CAPABILITY = NetworkServices } diff -r 2f34d5167611 -r fcece45ef507 demos/sqlbrowser/browser.cpp --- a/demos/sqlbrowser/browser.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/sqlbrowser/browser.cpp Mon May 03 13:17:34 2010 +0300 @@ -146,7 +146,7 @@ { QSqlTableModel *model = new QSqlTableModel(table, connectionWidget->currentDatabase()); model->setEditStrategy(QSqlTableModel::OnRowChange); - model->setTable(t); + model->setTable(connectionWidget->currentDatabase().driver()->escapeIdentifier(t, QSqlDriver::TableName)); model->select(); if (model->lastError().type() != QSqlError::NoError) emit statusMessage(model->lastError().text()); diff -r 2f34d5167611 -r fcece45ef507 demos/symbianpkgrules.pri --- a/demos/symbianpkgrules.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/demos/symbianpkgrules.pri Mon May 03 13:17:34 2010 +0300 @@ -10,6 +10,7 @@ ":\"Nokia, Qt\"" \ " " -default_deployment.pkg_prerules += vendorinfo +demos_deployment.pkg_prerules += vendorinfo +DEPLOYMENT += demos_deployment isEmpty(ICON):ICON = $$QT_SOURCE_TREE/src/s60installs/qt.svg diff -r 2f34d5167611 -r fcece45ef507 dist/changes-4.5.4 --- a/dist/changes-4.5.4 Fri Apr 16 15:50:13 2010 +0300 +++ b/dist/changes-4.5.4 Mon May 03 13:17:34 2010 +0300 @@ -9,12 +9,12 @@ Applications compiled for 4.4 will continue to run with 4.5. Some of the changes listed in this file include issue tracking numbers -corresponding to tasks in the Task Tracker: +corresponding to tasks in the Qt Bug Tracker, the (now obsolete) Task +Tracker, or the Merge Request queue of the public source repository. - http://www.qtsoftware.com/developer/task-tracker - -Each of these identifiers can be entered in the task tracker to obtain more -information about a particular change. +Qt Bug Tracker: http://bugreports.qt.nokia.com +Task Tracker: http://qt.nokia.com/developer/task-tracker +Merge Request: http://qt.gitorious.org **************************************************************************** * General * diff -r 2f34d5167611 -r fcece45ef507 dist/changes-4.6.3 --- a/dist/changes-4.6.3 Fri Apr 16 15:50:13 2010 +0300 +++ b/dist/changes-4.6.3 Mon May 03 13:17:34 2010 +0300 @@ -138,6 +138,14 @@ - +Qt for Symbian +-------------- + + - [QT-567] Implementation of QtMultimedia QAudio* APIs + - [QTBUG-8919] Modified Phonon MMF backend to support video playback on + platforms which use graphics surfaces (i.e. platforms using the + New Graphics Architecture a.k.a. ScreenPlay) + **************************************************************************** * Tools * **************************************************************************** diff -r 2f34d5167611 -r fcece45ef507 examples/animation/animatedtiles/animatedtiles.pro --- a/examples/animation/animatedtiles/animatedtiles.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/animation/animatedtiles/animatedtiles.pro Mon May 03 13:17:34 2010 +0300 @@ -6,3 +6,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS animatedtiles.pro images sources.path = $$[QT_INSTALL_EXAMPLES]/animation/animatedtiles INSTALLS += target sources + +symbian { + TARGET.UID3 = 0xA000D7D1 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff -r 2f34d5167611 -r fcece45ef507 examples/animation/appchooser/appchooser.pro --- a/examples/animation/appchooser/appchooser.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/animation/appchooser/appchooser.pro Mon May 03 13:17:34 2010 +0300 @@ -6,3 +6,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS appchooser.pro sources.path = $$[QT_INSTALL_EXAMPLES]/animation/appchooser INSTALLS += target sources + +symbian { + TARGET.UID3 = 0xA000E3F5 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff -r 2f34d5167611 -r fcece45ef507 examples/animation/easing/easing.pro --- a/examples/animation/easing/easing.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/animation/easing/easing.pro Mon May 03 13:17:34 2010 +0300 @@ -12,3 +12,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS easing.pro images sources.path = $$[QT_INSTALL_EXAMPLES]/animation/easing INSTALLS += target sources + +symbian { + TARGET.UID3 = 0xA000E3F6 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff -r 2f34d5167611 -r fcece45ef507 examples/animation/moveblocks/moveblocks.pro --- a/examples/animation/moveblocks/moveblocks.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/animation/moveblocks/moveblocks.pro Mon May 03 13:17:34 2010 +0300 @@ -5,3 +5,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS moveblocks.pro sources.path = $$[QT_INSTALL_EXAMPLES]/animation/moveblocks INSTALLS += target sources + +symbian { + TARGET.UID3 = 0xA000E3F7 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff -r 2f34d5167611 -r fcece45ef507 examples/animation/states/states.pro --- a/examples/animation/states/states.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/animation/states/states.pro Mon May 03 13:17:34 2010 +0300 @@ -6,3 +6,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS states.pro sources.path = $$[QT_INSTALL_EXAMPLES]/animation/states INSTALLS += target sources + +symbian { + TARGET.UID3 = 0xA000E3F8 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff -r 2f34d5167611 -r fcece45ef507 examples/animation/stickman/stickman.pro --- a/examples/animation/stickman/stickman.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/animation/stickman/stickman.pro Mon May 03 13:17:34 2010 +0300 @@ -17,3 +17,8 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS stickman.pro sources.path = $$[QT_INSTALL_EXAMPLES]/animation/stickman INSTALLS += target sources + +symbian { + TARGET.UID3 = 0xA000E3F9 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff -r 2f34d5167611 -r fcece45ef507 examples/gestures/imagegestures/imagegestures.pro --- a/examples/gestures/imagegestures/imagegestures.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/gestures/imagegestures/imagegestures.pro Mon May 03 13:17:34 2010 +0300 @@ -14,3 +14,8 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/gestures/imagegestures INSTALLS += target \ sources + +symbian { + TARGET.UID3 = 0xA000D7D0 + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff -r 2f34d5167611 -r fcece45ef507 examples/multimedia/audioinput/audioinput.cpp --- a/examples/multimedia/audioinput/audioinput.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/multimedia/audioinput/audioinput.cpp Mon May 03 13:17:34 2010 +0300 @@ -76,6 +76,7 @@ case QAudioFormat::SignedInt: m_maxAmplitude = 127; break; + default: ; } break; case 16: @@ -86,6 +87,7 @@ case QAudioFormat::SignedInt: m_maxAmplitude = 32767; break; + default: ; } break; } diff -r 2f34d5167611 -r fcece45ef507 examples/multimedia/audioinput/audioinput.h --- a/examples/multimedia/audioinput/audioinput.h Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/multimedia/audioinput/audioinput.h Mon May 03 13:17:34 2010 +0300 @@ -119,8 +119,8 @@ QPushButton *m_suspendResumeButton; QComboBox *m_deviceBox; + QAudioDeviceInfo m_device; AudioInfo *m_audioInfo; - QAudioDeviceInfo m_device; QAudioFormat m_format; QAudioInput *m_audioInput; QIODevice *m_input; diff -r 2f34d5167611 -r fcece45ef507 examples/multimedia/audioinput/audioinput.pro --- a/examples/multimedia/audioinput/audioinput.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/multimedia/audioinput/audioinput.pro Mon May 03 13:17:34 2010 +0300 @@ -12,5 +12,6 @@ symbian { TARGET.UID3 = 0xA000D7BF + TARGET.CAPABILITY += UserEnvironment include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) } diff -r 2f34d5167611 -r fcece45ef507 examples/network/fortuneclient/fortuneclient.pro --- a/examples/network/fortuneclient/fortuneclient.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/network/fortuneclient/fortuneclient.pro Mon May 03 13:17:34 2010 +0300 @@ -12,7 +12,7 @@ symbian { include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/qftp/sym_iap_util.h - LIBS += -lesock + LIBS += -lesock -lcommdb -linsock # For IAP selection TARGET.CAPABILITY = "NetworkServices ReadUserData WriteUserData" TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 } diff -r 2f34d5167611 -r fcece45ef507 examples/network/fortuneserver/fortuneserver.pro --- a/examples/network/fortuneserver/fortuneserver.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/network/fortuneserver/fortuneserver.pro Mon May 03 13:17:34 2010 +0300 @@ -13,7 +13,7 @@ TARGET.UID3 = 0xA000CF71 include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/qftp/sym_iap_util.h - LIBS += -lesock + LIBS += -lesock -lcommdb -linsock # For IAP selection TARGET.CAPABILITY = "All -TCB" TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 } diff -r 2f34d5167611 -r fcece45ef507 examples/network/network-chat/network-chat.pro --- a/examples/network/network-chat/network-chat.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/network/network-chat/network-chat.pro Mon May 03 13:17:34 2010 +0300 @@ -21,7 +21,8 @@ symbian { include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/qftp/sym_iap_util.h - LIBS += -lesock -lconnmon -lcharconv -linsock + LIBS += -lesock -lcommdb -linsock # For IAP selection + LIBS += -lcharconv TARGET.CAPABILITY = "NetworkServices ReadUserData WriteUserData" TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 } diff -r 2f34d5167611 -r fcece45ef507 examples/network/qftp/sym_iap_util.h --- a/examples/network/qftp/sym_iap_util.h Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/network/qftp/sym_iap_util.h Mon May 03 13:17:34 2010 +0300 @@ -60,6 +60,7 @@ //#include _LIT(KIapNameSetting, "IAP\\Name"); // text - mandatory +_LIT(KIapTableIdField, "IAP\Id"); _LIT(KIapDialogPref, "IAP\\DialogPref"); // TUnit32 - optional _LIT(KIapService, "IAP\\IAPService"); // TUnit32 - mandatory _LIT(KIapServiceType, "IAP\\IAPServiceType"); // text - mandatory @@ -367,20 +368,25 @@ CleanupClosePushL(connection); socketServ.Connect(); + + TCommDbConnPref prefs; + prefs.SetDialogPreference(ECommDbDialogPrefPrompt); + connection.Open(socketServ); - connection.Start(); + connection.Start(prefs); connection.GetDesSetting(TPtrC(KIapNameSetting), iapName); - //connection.Stop(); iapName.ZeroTerminate(); QString strIapName((char*)iapName.Ptr()); int error = 0; - if(!qt_SetDefaultIapName(strIapName, error)) { - //printf("failed setdefaultif @ %i with %s and errno = %d \n", __LINE__, strIapName.toUtf8().data(), error); - strIapName = QString(""); + if(!strIapName.isEmpty()) { + if(!qt_SetDefaultIapName(strIapName, error)) { + //printf("failed setdefaultif @ %i with %s and errno = %d \n", __LINE__, strIapName.toUtf8().data(), error); + strIapName = QString(""); + } } CleanupStack::PopAndDestroy(&connection); diff -r 2f34d5167611 -r fcece45ef507 examples/openvg/star/starwidget.cpp --- a/examples/openvg/star/starwidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/openvg/star/starwidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -93,8 +93,9 @@ // and prepare to perform raw OpenVG calls. painter.beginNativePainting(); - // Cache the path if we haven't already. - if (path == VG_INVALID_HANDLE) { + // Cache the path if we haven't already or if the path has + // become invalid because the window's context has changed. + if (path == VG_INVALID_HANDLE || !vgGetPathCapabilities(path)) { path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, // scale diff -r 2f34d5167611 -r fcece45ef507 examples/sql/masterdetail/masterdetail.pro --- a/examples/sql/masterdetail/masterdetail.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/sql/masterdetail/masterdetail.pro Mon May 03 13:17:34 2010 +0300 @@ -15,4 +15,7 @@ sources.path = $$[QT_INSTALL_EXAMPLES]/sql/masterdetail INSTALLS += target sources -symbian: include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +symbian { + TARGET.UID3 = 0xA000D7CF + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) +} diff -r 2f34d5167611 -r fcece45ef507 examples/sql/sql.pro --- a/examples/sql/sql.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/sql/sql.pro Mon May 03 13:17:34 2010 +0300 @@ -1,17 +1,16 @@ TEMPLATE = subdirs SUBDIRS = drilldown - -symbian: SUBDIRS += masterdetail - !symbian: SUBDIRS += cachedtable \ relationaltablemodel \ sqlwidgetmapper +!wince*: SUBDIRS += masterdetail + !wince*:!symbian: SUBDIRS += \ querymodel \ - tablemodel \ - masterdetail + tablemodel + # install sources.files = connection.h sql.pro README diff -r 2f34d5167611 -r fcece45ef507 examples/symbianpkgrules.pri --- a/examples/symbianpkgrules.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/symbianpkgrules.pri Mon May 03 13:17:34 2010 +0300 @@ -10,6 +10,7 @@ ":\"Nokia, Qt\"" \ " " -default_deployment.pkg_prerules += vendorinfo +examples_deployment.pkg_prerules += vendorinfo +DEPLOYMENT += examples_deployment isEmpty(ICON):ICON = $$QT_SOURCE_TREE/src/s60installs/qt.svg diff -r 2f34d5167611 -r fcece45ef507 examples/widgets/softkeys/softkeys.cpp --- a/examples/widgets/softkeys/softkeys.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/widgets/softkeys/softkeys.cpp Mon May 03 13:17:34 2010 +0300 @@ -70,6 +70,12 @@ toggleButton->setContextMenuPolicy(Qt::NoContextMenu); toggleButton->setCheckable(true); + modeButton = new QPushButton(tr("Loop SK window type"), this); + modeButton->setContextMenuPolicy(Qt::NoContextMenu); + + modeLabel = new QLabel(tr("Normal maximized"), this); + modeLabel->setContextMenuPolicy(Qt::NoContextMenu); + pushButton = new QPushButton(tr("File Dialog"), this); pushButton->setContextMenuPolicy(Qt::NoContextMenu); @@ -87,6 +93,8 @@ layout->addWidget(toggleButton, 2, 0); layout->addWidget(pushButton, 2, 1); layout->addWidget(comboBox, 3, 0, 1, 2); + layout->addWidget(modeButton, 4, 0, 1, 2); + layout->addWidget(modeLabel, 5, 0, 1, 2); central->setLayout(layout); fileMenu = menuBar()->addMenu(tr("&File")); @@ -97,6 +105,7 @@ connect(pushButton, SIGNAL(clicked()), this, SLOT(openDialog())); connect(exit, SIGNAL(triggered()), this, SLOT(exitApplication())); connect(toggleButton, SIGNAL(clicked()), this, SLOT(setCustomSoftKeys())); + connect(modeButton, SIGNAL(clicked()), this, SLOT(setMode())); pushButton->setFocus(); } @@ -133,6 +142,35 @@ } } +void MainWindow::setMode() +{ + if(isMaximized()) { + showFullScreen(); + modeLabel->setText(tr("Normal Fullscreen")); + } else { + Qt::WindowFlags flags = windowFlags(); + if(flags & Qt::WindowSoftkeysRespondHint) { + flags |= Qt::WindowSoftkeysVisibleHint; + flags &= ~Qt::WindowSoftkeysRespondHint; + setWindowFlags(flags); // Hides visible window + showFullScreen(); + modeLabel->setText(tr("Fullscreen with softkeys")); + } else if(flags & Qt::WindowSoftkeysVisibleHint) { + flags &= ~Qt::WindowSoftkeysVisibleHint; + flags &= ~Qt::WindowSoftkeysRespondHint; + setWindowFlags(flags); // Hides visible window + showMaximized(); + modeLabel->setText(tr("Normal Maximized")); + } else { + flags &= ~Qt::WindowSoftkeysVisibleHint; + flags |= Qt::WindowSoftkeysRespondHint; + setWindowFlags(flags); // Hides visible window + showFullScreen(); + modeLabel->setText(tr("Fullscreen with SK respond")); + } + } +} + void MainWindow::exitApplication() { qApp->exit(); diff -r 2f34d5167611 -r fcece45ef507 examples/widgets/softkeys/softkeys.h --- a/examples/widgets/softkeys/softkeys.h Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/widgets/softkeys/softkeys.h Mon May 03 13:17:34 2010 +0300 @@ -57,21 +57,24 @@ void okPressed(); void cancelPressed(); void setCustomSoftKeys(); + void setMode(); public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: QGridLayout *layout; QWidget *central; - QTextEdit* textEditor; + QTextEdit *textEditor; QLabel *infoLabel; - QPushButton* toggleButton; - QPushButton* pushButton; - QMenu* fileMenu; - QAction* addSoftKeysAct; - QAction* exit; - QAction* ok; - QAction* cancel; + QPushButton *toggleButton; + QPushButton *pushButton; + QPushButton *modeButton; + QLabel *modeLabel; + QMenu *fileMenu; + QAction *addSoftKeysAct; + QAction *exit; + QAction *ok; + QAction *cancel; }; //! [0] diff -r 2f34d5167611 -r fcece45ef507 examples/widgets/wiggly/dialog.cpp --- a/examples/widgets/wiggly/dialog.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/widgets/wiggly/dialog.cpp Mon May 03 13:17:34 2010 +0300 @@ -57,15 +57,16 @@ setLayout(layout); #ifdef QT_SOFTKEYS_ENABLED + QAction *exitAction = new QAction(tr("Exit"), this); + exitAction->setSoftKeyRole(QAction::NegativeSoftKey); + connect (exitAction, SIGNAL(triggered()),this, SLOT(close())); + addAction (exitAction); - QAction *exitAction = new QAction(tr("Exit"), this); - exitAction->setSoftKeyRole(QAction::NegativeSoftKey); - connect (exitAction, SIGNAL(triggered()),this, SLOT(close())); - addAction (exitAction); - + Qt::WindowFlags flags = windowFlags(); + flags |= Qt::WindowSoftkeysVisibleHint; + setWindowFlags(flags); #endif - connect(lineEdit, SIGNAL(textChanged(QString)), wigglyWidget, SLOT(setText(QString))); if (!smallScreen){ diff -r 2f34d5167611 -r fcece45ef507 examples/widgets/windowflags/controllerwindow.cpp --- a/examples/widgets/windowflags/controllerwindow.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/examples/widgets/windowflags/controllerwindow.cpp Mon May 03 13:17:34 2010 +0300 @@ -58,7 +58,7 @@ bottomLayout->addStretch(); bottomLayout->addWidget(quitButton); - QVBoxLayout *mainLayout = new QVBoxLayout; + QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addWidget(typeGroupBox); mainLayout->addWidget(hintsGroupBox); mainLayout->addLayout(bottomLayout); diff -r 2f34d5167611 -r fcece45ef507 implml/qtwebkit_copy.implml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/implml/qtwebkit_copy.implml Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,10 @@ + + + + + + + + + diff -r 2f34d5167611 -r fcece45ef507 mkspecs/common/symbian/symbian.conf --- a/mkspecs/common/symbian/symbian.conf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/common/symbian/symbian.conf Mon May 03 13:17:34 2010 +0300 @@ -26,10 +26,13 @@ QMAKE_CFLAGS_DEBUG = QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses + +VERSION_FLAGS.ARMCC = ARMCC_4_0 QMAKE_CXX = g++ QMAKE_CXXFLAGS = $$QMAKE_CFLAGS QMAKE_CXXFLAGS.CW = -QMAKE_CXXFLAGS.ARMCC = --visibility_inlines_hidden +QMAKE_CXXFLAGS.ARMCC = --visibility_inlines_hidden +QMAKE_CXXFLAGS.ARMCC_4_0 = --import_all_vtbl QMAKE_CXXFLAGS.GCCE = -fvisibility-inlines-hidden QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON @@ -111,6 +114,7 @@ load(qt_config) load(platform_paths) +load(add_mmp_rules) symbian-abld { # Versions of abld prior to Symbian^3 have a bug where you cannot remove something from the command line without replacing it @@ -123,16 +127,25 @@ MMP_RULES += $$MMP_RULES_DONT_EXPORT_ALL_CLASS_IMPEDIMENTA SYMBIAN_PLATFORMS = WINSCW GCCE ARMV5 ARMV6 -# Legacy support requires some hardcoded stdapis paths. INCLUDEPATH = \ $$[QT_INSTALL_PREFIX]/mkspecs/common/symbian/stl-off \ $$[QT_INSTALL_PREFIX]/mkspecs/common/symbian \ $${EPOCROOT}epoc32/include \ $$OS_LAYER_LIBC_SYSTEMINCLUDE \ $$INCLUDEPATH - + +# Ensure '.' directory is the first in include path. +# RVCT seems to do this automatically, but WINSCW compiler does not, so add it here. +MMP_RULES += "USERINCLUDE ." + +# pkg_depends_webkit, pkg_depends_core, and pkg_platform_dependencies can be removed by developer +# if multiple languages need to be supported by pkg file. In that case the developer should declare +# multiple language compatible dependency statements him/herself. + +default_deployment.pkg_prerules += pkg_depends_webkit pkg_depends_qt pkg_platform_dependencies + # Supports S60 3.0, 3.1, 3.2 and 5.0 by default -default_deployment.pkg_prerules = \ +pkg_platform_dependencies = \ "; Default HW/platform dependencies" \ "[0x101F7961],0,0,0,{\"S60ProductID\"}" \ "[0x102032BE],0,0,0,{\"S60ProductID\"}" \ @@ -168,3 +181,4 @@ } } } + diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/default_post.prf --- a/mkspecs/features/default_post.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/default_post.prf Mon May 03 13:17:34 2010 +0300 @@ -6,6 +6,20 @@ CONFIG = incredibuild_xge $$CONFIG } -#QTP: to remove the INCLUDE env variable headers -#QMAKE_INCDIR += $$QMAKE_INCDIR_POST} -#QMAKE_LIBDIR += $$QMAKE_LIBDIR_POST} +QMAKE_INCDIR += $$QMAKE_INCDIR_POST +QMAKE_LIBDIR += $$QMAKE_LIBDIR_POST + +# Let every project have a standard GNU `check' target +!contains(QMAKE_EXTRA_TARGETS, check) { + # `make check' should iterate through all subdirs + contains(TEMPLATE, subdirs) { + check.CONFIG = recursive + check.recurse = $$SUBDIRS + check.recurse_target = check + } + # `make check' should imply building the project + else { + check.depends = first + } + QMAKE_EXTRA_TARGETS += check +} diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/qttest_p4.prf --- a/mkspecs/features/qttest_p4.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/qttest_p4.prf Mon May 03 13:17:34 2010 +0300 @@ -27,7 +27,7 @@ QMAKE_EXTRA_TARGETS += check !debug_and_release|build_pass { - check.depends = $(DESTDIR_TARGET) + check.depends = first } else { check.CONFIG = recursive # In debug and release mode, only run the test once. diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/symbian/add_mmp_rules.prf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mkspecs/features/symbian/add_mmp_rules.prf Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,33 @@ +# Arg1: List of conditions to generate block for +# Arg2: List of variables containing rules to add +defineTest(addMMPRules) { + unset(myConditions) + unset(myVariables) + unset(myIfDef) + + myConditions = $$eval($$1) default + myVariables = $$eval($$2) + myIfDef = if + + for(condition, $$list($$myConditions)) { + contains(condition, default) { + libBlock = "$${LITERAL_HASH}else" + } else { + libBlock = "$${LITERAL_HASH}$${myIfDef} defined($${condition})" + myIfDef = elif + } + + for(var, $$list($$myVariables)) { + varVal = $$eval($${var}.$${condition}) + isEmpty(varVal) { + # No value defined for current condition, so use default + varVal = $$eval($${var}.default) + } + !isEmpty(varVal): libBlock += "$$join(varVal,$$escape_expand(\n))" + } + + MMP_RULES += $$libBlock + } + MMP_RULES += "$${LITERAL_HASH}endif" + export(MMP_RULES) +} diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/symbian/application_icon.prf --- a/mkspecs/features/symbian/application_icon.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/symbian/application_icon.prf Mon May 03 13:17:34 2010 +0300 @@ -3,7 +3,7 @@ # If no_icon keyword exist, the S60 UI app is just made hidden. This because S60 app FW # requires the registration resource file to exist always contains( CONFIG, no_icon ) { - symbian:RSS_RULES ="hidden = KAppIsHidden;" + symbian:RSS_RULES += "hidden = KAppIsHidden;" CONFIG -= no_icon } else { # There is no point in compiling the MIF icon if no_icon CONFIGS is set diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/symbian/data_caging_paths.prf --- a/mkspecs/features/symbian/data_caging_paths.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/symbian/data_caging_paths.prf Mon May 03 13:17:34 2010 +0300 @@ -74,7 +74,7 @@ BOOTDATA_DIR = /resource/bootdata } -isEmpty(QT_PLUGINS_BASE_DIR): QT_PLUGINS_BASE_DIR = /$$RESOURCE_FILES_DIR/qt/plugins +isEmpty(QT_PLUGINS_BASE_DIR): QT_PLUGINS_BASE_DIR = /$$RESOURCE_FILES_DIR/qt$${QT_LIBINFIX}/plugins isEmpty(HW_ZDIR): HW_ZDIR = epoc32/data/z isEmpty(REG_RESOURCE_DIR): REG_RESOURCE_DIR = /private/10003a3f/apps isEmpty(REG_RESOURCE_IMPORT_DIR): REG_RESOURCE_IMPORT_DIR = /private/10003a3f/import/apps \ No newline at end of file diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/symbian/def_files.prf --- a/mkspecs/features/symbian/def_files.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/symbian/def_files.prf Mon May 03 13:17:34 2010 +0300 @@ -25,3 +25,4 @@ } } + diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/symbian/default_post.prf --- a/mkspecs/features/symbian/default_post.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/symbian/default_post.prf Mon May 03 13:17:34 2010 +0300 @@ -5,7 +5,7 @@ QMAKE_LIBS += } else:contains(QT, gui):contains(CONFIG,qt) { S60MAIN_LIBS = -leuser - QMAKE_LIBS += -lqtmain.lib $$S60MAIN_LIBS + QMAKE_LIBS += -lqtmain$${QT_LIBINFIX}.lib $$S60MAIN_LIBS } else { QMAKE_LIBS += $$QMAKE_LIBS_QT_ENTRY } diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/symbian/platform_paths.prf --- a/mkspecs/features/symbian/platform_paths.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/symbian/platform_paths.prf Mon May 03 13:17:34 2010 +0300 @@ -230,33 +230,6 @@ OS_LAYER_LIBUTILITY_SYSTEMINCLUDE = $$OS_LAYER_PLATFORM_EXPORT_PATH(stdapis/utility) - # --------------------------------------- - # Definitions to export IBY files to different folders where they will be taken - # to ROM image - # --------------------------------------- - - defineReplace(CORE_APP_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/core/app/$$1) - } - defineReplace(CORE_MW_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/core/mw/$$1) - } - defineReplace(CORE_OSEXT_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/core/os/$$1) - } - defineReplace(CORE_OS_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/core/os/$$1) - } - defineReplace(CORE_ADAPT_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/$$1) - } - - # You need to define the following in pro-file, if you are using the stllib: - # QMAKE_CXXFLAGS.CW *= $$STLLIB_USAGE_CW_FLAGS - # DEFINES *= $$STLLIB_USAGE_DEFINES - STLLIB_USAGE_CW_FLAGS = "-wchar_t on" - STLLIB_USAGE_DEFINES = _WCHAR_T_DECLARED - } else { # Old pre-SF structure # --------------------------------------- @@ -450,34 +423,49 @@ OS_LAYER_LIBUTILITY_SYSTEMINCLUDE = $$OS_LAYER_PLATFORM_EXPORT_PATH(stdapis/utility) \ /epoc32/include/stdapis/utility - # --------------------------------------- - # Definitions to export IBY files to different folders where they will be taken - # to ROM image - # --------------------------------------- - - defineReplace(CORE_APP_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/core/app/$$1) - } - defineReplace(CORE_MW_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/core/mw/$$1) - } - defineReplace(CORE_OSEXT_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/core/osext/$$1) - } - defineReplace(CORE_OS_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/core/osext/$$1) - } - defineReplace(CORE_ADAPT_LAYER_IBY_EXPORT_PATH) { - return(/epoc32/rom/include/$$1) - } - - # You need to define the following in pro-file, if you are using the stllib: - # QMAKE_CXXFLAGS.CW *= $$STLLIB_USAGE_CW_FLAGS - # DEFINES *= $$STLLIB_USAGE_DEFINES - STLLIB_USAGE_CW_FLAGS = "-wchar_t on" - STLLIB_USAGE_DEFINES = _WCHAR_T_DECLARED - } + + # Definitions common to both structures + + # --------------------------------------- + # Definitions to export IBY files to different folders where they will be taken + # to ROM image + # --------------------------------------- + + defineReplace(CORE_APP_LAYER_IBY_EXPORT_PATH) { + return(/epoc32/rom/include/core/app/$$1) + } + defineReplace(CORE_MW_LAYER_IBY_EXPORT_PATH) { + return(/epoc32/rom/include/core/mw/$$1) + } + + defineReplace(LANGUAGE_APP_LAYER_IBY_EXPORT_PATH) { + return(/epoc32/rom/include/language/app/$$1) + } + defineReplace(LANGUAGE_MW_LAYER_IBY_EXPORT_PATH) { + return(/epoc32/rom/include/language/mw/$$1) + } + + defineReplace(CUSTOMER_APP_LAYER_IBY_EXPORT_PATH) { + return(/epoc32/rom/include/customer/app/$$1) + } + defineReplace(CUSTOMER_MW_LAYER_IBY_EXPORT_PATH) { + return(/epoc32/rom/include/customer/mw/$$1) + } + + defineReplace(CUSTOMER_VARIANT_APP_LAYER_IBY_EXPORT_PATH) { + return(/epoc32/rom/include/customervariant/app/$$1) + } + defineReplace(CUSTOMER_VARIANT_MW_LAYER_IBY_EXPORT_PATH) { + return(/epoc32/rom/include/customervariant/mw/$$1) + } + + # You need to define the following in pro-file, if you are using the stllib: + # QMAKE_CXXFLAGS.CW *= $$STLLIB_USAGE_CW_FLAGS + # DEFINES *= $$STLLIB_USAGE_DEFINES + STLLIB_USAGE_CW_FLAGS = "-wchar_t on" + STLLIB_USAGE_DEFINES = _WCHAR_T_DECLARED + } diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/symbian/qt.prf --- a/mkspecs/features/symbian/qt.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/symbian/qt.prf Mon May 03 13:17:34 2010 +0300 @@ -22,19 +22,23 @@ INCLUDEPATH = $$PREPEND_INCLUDEPATH $$INCLUDEPATH # Add dependency to Qt package to all other projects besides Qt libs. -# Note: Qt libs with full capabilities has UID3 of 0x2001E61C, +# Note: Qt libs package with full capabilities has UID3 of 0x2001E61C, # while self-signed version typically has temporary UID3 of 0xE001E61C. -contains(CONFIG, qt):!contains(TARGET.UID3, 0x2001E61C):!contains(TARGET.UID3, 0xE001E61C) { - default_deployment.pkg_prerules += \ +contains(CONFIG, qt):!contains(TARGET.UID3, 0x2001E61C):!contains(TARGET.UID3, 0xE001E61C):isEmpty(QT_LIBINFIX) { + pkg_depends_qt += \ "; Default dependency to Qt libraries" \ "(0x2001E61C), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION}, {\"Qt\"}" # Projects linking to webkit need dependency to webkit contains(QT, webkit): { - default_deployment.pkg_prerules += \ + pkg_depends_webkit += \ "; Dependency to Qt Webkit" \ "(0x200267C2), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION}, {\"QtWebKit\"}" + } else { + default_deployment.pkg_prerules -= pkg_depends_webkit } +} else { + default_deployment.pkg_prerules -= pkg_depends_webkit pkg_depends_qt } isEmpty(TARGET.EPOCSTACKSIZE):TARGET.EPOCSTACKSIZE = 0x14000 @@ -44,8 +48,3 @@ #QTP: add userinclude MMP_RULES+="USERINCLUDE ." - -my_custom_rule = "$${LITERAL_HASH}if defined(ARMCC) && !defined(ARMCC_2_2) && !defined(ARMCC_3_1)"\ -"OPTION ARMCC --import_all_vtbl" \ -"$${LITERAL_HASH}endif" -MMP_RULES += my_custom_rule \ No newline at end of file diff -r 2f34d5167611 -r fcece45ef507 mkspecs/features/symbian/stl.prf --- a/mkspecs/features/symbian/stl.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/features/symbian/stl.prf Mon May 03 13:17:34 2010 +0300 @@ -30,4 +30,3 @@ LIBS *= $$STL_LIB MMP_RULES *= $$STL_MMP_RULE - diff -r 2f34d5167611 -r fcece45ef507 mkspecs/linux-g++-maemo/qplatformdefs.h --- a/mkspecs/linux-g++-maemo/qplatformdefs.h Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/linux-g++-maemo/qplatformdefs.h Mon May 03 13:17:34 2010 +0300 @@ -40,3 +40,5 @@ ****************************************************************************/ #include "../linux-g++/qplatformdefs.h" + +#define QT_GUI_DOUBLE_CLICK_RADIUS 20 diff -r 2f34d5167611 -r fcece45ef507 mkspecs/symbian-abld/qplatformdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mkspecs/symbian-abld/qplatformdefs.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the qmake spec 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../common/symbian/qplatformdefs.h" + diff -r 2f34d5167611 -r fcece45ef507 mkspecs/symbian-sbsv2/flm/qt/qmake_extra_pre_targetdep.flm --- a/mkspecs/symbian-sbsv2/flm/qt/qmake_extra_pre_targetdep.flm Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/symbian-sbsv2/flm/qt/qmake_extra_pre_targetdep.flm Mon May 03 13:17:34 2010 +0300 @@ -35,6 +35,7 @@ endef ifeq ($($(SINGLETON)),) +$(call makepathfor,$(PREDEP_TARGET)) $(eval $(qmake_extra_pre_targetdep)) $(eval $(call GenerateStandardCleanTarget,$(PREDEP_TARGET),'')) endif diff -r 2f34d5167611 -r fcece45ef507 mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm --- a/mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/symbian-sbsv2/flm/qt/qmake_store_build.flm Mon May 03 13:17:34 2010 +0300 @@ -26,7 +26,7 @@ endif define qmake_store_build -ALL:: $(STORE_BUILD_TARGET) +$(ALLTARGET):: $(STORE_BUILD_TARGET) $(STORE_BUILD_TARGET): $(call startrule,qmake_store_build) \ diff -r 2f34d5167611 -r fcece45ef507 mkspecs/symbian-sbsv2/flm/qt/qt.xml --- a/mkspecs/symbian-sbsv2/flm/qt/qt.xml Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/symbian-sbsv2/flm/qt/qt.xml Mon May 03 13:17:34 2010 +0300 @@ -16,7 +16,7 @@ - diff -r 2f34d5167611 -r fcece45ef507 mkspecs/symbian-sbsv2/qplatformdefs.h --- a/mkspecs/symbian-sbsv2/qplatformdefs.h Fri Apr 16 15:50:13 2010 +0300 +++ b/mkspecs/symbian-sbsv2/qplatformdefs.h Mon May 03 13:17:34 2010 +0300 @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -39,131 +39,5 @@ ** ****************************************************************************/ -#ifndef QPLATFORMDEFS_H -#define QPLATFORMDEFS_H - -// Get Qt defines/settings - -#include "qglobal.h" - -// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs - -// 1) need to reset default environment if _BSD_SOURCE is defined -// 2) need to specify POSIX thread interfaces explicitly in glibc 2.0 -// 3) it seems older glibc need this to include the X/Open stuff -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif - -#include - - -// We are hot - unistd.h should have turned on the specific APIs we requested - -//#include -#include -#include -#include -#include -#include -//#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef QT_NO_IPV6IFNAME -#include -#endif -#include +#include "../common/symbian/qplatformdefs.h" -#ifdef QT_LARGEFILE_SUPPORT -#define QT_STATBUF struct stat64 -#define QT_STATBUF4TSTAT struct stat64 -#define QT_STAT ::stat64 -#define QT_FSTAT ::fstat64 -#define QT_LSTAT ::lstat64 -#define QT_OPEN ::open64 -#define QT_TRUNCATE ::truncate64 -#define QT_FTRUNCATE ::ftruncate64 -#define QT_LSEEK ::lseek64 -#else -#define QT_STATBUF struct stat -#define QT_STATBUF4TSTAT struct stat -#define QT_STAT ::stat -#define QT_FSTAT ::fstat -#define QT_LSTAT ::lstat -#define QT_OPEN ::open -#define QT_TRUNCATE ::truncate -#define QT_FTRUNCATE ::ftruncate -#define QT_LSEEK ::lseek -#endif - -#ifdef QT_LARGEFILE_SUPPORT -#define QT_FOPEN ::fopen64 -#define QT_FSEEK ::fseeko64 -#define QT_FTELL ::ftello64 -#define QT_FGETPOS ::fgetpos64 -#define QT_FSETPOS ::fsetpos64 -#define QT_MMAP ::mmap64 -#define QT_FPOS_T fpos64_t -#define QT_OFF_T off64_t -#else -#define QT_FOPEN ::fopen -#define QT_FSEEK ::fseek -#define QT_FTELL ::ftell -#define QT_FGETPOS ::fgetpos -#define QT_FSETPOS ::fsetpos -#define QT_MMAP ::mmap -#define QT_FPOS_T fpos_t -#define QT_OFF_T long -#endif - -#define QT_STAT_REG S_IFREG -#define QT_STAT_DIR S_IFDIR -#define QT_STAT_MASK S_IFMT -#define QT_STAT_LNK S_IFLNK -#define QT_SOCKET_CONNECT ::connect -#define QT_SOCKET_BIND ::bind -#define QT_FILENO fileno -#define QT_CLOSE ::close -#define QT_READ ::read -#define QT_WRITE ::write -#define QT_ACCESS ::access -#define QT_GETCWD ::getcwd -#define QT_CHDIR ::chdir -#define QT_MKDIR ::mkdir -#define QT_RMDIR ::rmdir -#define QT_OPEN_LARGEFILE 0 -#define QT_OPEN_RDONLY O_RDONLY -#define QT_OPEN_WRONLY O_WRONLY -#define QT_OPEN_RDWR O_RDWR -#define QT_OPEN_CREAT O_CREAT -#define QT_OPEN_TRUNC O_TRUNC -#define QT_OPEN_APPEND O_APPEND - -#define QT_SIGNAL_RETTYPE void -#define QT_SIGNAL_ARGS int -#define QT_SIGNAL_IGNORE SIG_IGN - -#if (defined(__GLIBC__) && (__GLIBC__ >= 2)) || defined(Q_OS_SYMBIAN) -#define QT_SOCKLEN_T socklen_t -#else -#define QT_SOCKLEN_T int -#endif - - -#if defined(__ISO_C_VISIBLE) && (__ISO_C_VISIBLE >= 1999) -#define QT_SNPRINTF ::snprintf -#define QT_VSNPRINTF ::vsnprintf -#endif - - -#endif // QPLATFORMDEFS_H diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/symbian/initprojectdeploy_symbian.cpp --- a/qmake/generators/symbian/initprojectdeploy_symbian.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/symbian/initprojectdeploy_symbian.cpp Mon May 03 13:17:34 2010 +0300 @@ -46,15 +46,21 @@ #include #include -#define PLUGIN_STUB_DIR "qmakepluginstubs" -#define SYSBIN_DIR "/sys/bin" // Included from tools/shared #include +#define SYSBIN_DIR "/sys/bin" + #define SUFFIX_DLL "dll" #define SUFFIX_EXE "exe" #define SUFFIX_QTPLUGIN "qtplugin" +static QString fixPathToEpocOS(const QString &src) +{ + QString ret = Option::fixPathToTargetOS(src); + return ret.replace('/', '\\'); +} + static bool isPlugin(const QFileInfo& info, const QString& devicePath) { // Libraries are plugins if deployment path is something else than @@ -85,7 +91,7 @@ QStringList& generatedDirs, QStringList& generatedFiles) { - QDir().mkpath(QLatin1String(PLUGIN_STUB_DIR "/")); + QDir().mkpath(QLatin1String(PLUGIN_STUB_DIR)); if (!generatedDirs.contains(PLUGIN_STUB_DIR)) generatedDirs << PLUGIN_STUB_DIR; // Plugin stubs must have different name from the actual plugins, because @@ -104,7 +110,7 @@ } QFileInfo stubInfo(stubFile); deploymentList.append(CopyItem(Option::fixPathToLocalOS(stubInfo.absoluteFilePath()), - Option::fixPathToLocalOS(devicePath + "/" + stubInfo.fileName()))); + fixPathToEpocOS(devicePath + "/" + stubInfo.fileName()))); } QString generate_uid(const QString& target) @@ -168,30 +174,29 @@ foreach(QString item, project->values("DEPLOYMENT")) { QString devicePath = project->first(item + ".path"); - QString devicePathwDrive = devicePath; + QString devicePathWithoutDrive = devicePath; bool devicePathHasDriveLetter = false; if (devicePath.size() > 1) { devicePathHasDriveLetter = devicePath.at(1) == QLatin1Char(':'); } - //QTP: Sometime devicePath can contain disk but APP_RESOURCE_DIR not - //convert devicepath to correct format and delete drive letter + // Sometimes devicePath can contain disk but APP_RESOURCE_DIR does not, + // so remove the drive letter for comparison purposes. if (devicePathHasDriveLetter) { - devicePathwDrive.remove(0,2); + devicePathWithoutDrive.remove(0,2); } if (!deployBinaries - && !devicePathwDrive.isEmpty() - && (0 == devicePathwDrive.compare(project->values("APP_RESOURCE_DIR").join(""), Qt::CaseInsensitive) - || 0 == devicePathwDrive.compare(project->values("REG_RESOURCE_IMPORT_DIR").join(""), Qt::CaseInsensitive))) { + && !devicePathWithoutDrive.isEmpty() + && (0 == devicePathWithoutDrive.compare(project->values("APP_RESOURCE_DIR").join(""), Qt::CaseInsensitive) + || 0 == devicePathWithoutDrive.compare(project->values("REG_RESOURCE_IMPORT_DIR").join(""), Qt::CaseInsensitive))) { // Do not deploy resources in emulator builds, as that seems to cause conflicts // If there is ever a real need to deploy pre-built resources for emulator, // BLD_INF_RULES.prj_exports can be used as a workaround. continue; } - if (devicePath.isEmpty() || devicePath == QLatin1String(".")) { devicePath = targetPath; } @@ -199,38 +204,27 @@ else if (!(devicePath.at(0) == QLatin1Char('/') || devicePath.at(0) == QLatin1Char('\\') || devicePathHasDriveLetter)) { - // create output path + // Create output path devicePath = Option::fixPathToLocalOS(QDir::cleanPath(targetPath + QLatin1Char('/') + devicePath)); } else { - if (0 == platform.compare(QLatin1String("winscw"), Qt::CaseInsensitive)) { + if (!platform.compare(QLatin1String(EMULATOR_DEPLOYMENT_PLATFORM))) { if (devicePathHasDriveLetter) { devicePath = epocRoot() + "epoc32/winscw/" + devicePath.remove(1, 1); } else { devicePath = epocRoot() + "epoc32/winscw/c" + devicePath; } } else { - //The logic of the calling the initProjectDeploySymbian function depends only - //from devicePathHasDriveLetter in pro files. - //:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build if (!devicePathHasDriveLetter) { - if (targetPathHasDriveLetter) { + if (!platform.compare(QLatin1String(ROM_DEPLOYMENT_PLATFORM))) { + //For plugin deployment under ARM no needed drive letter + devicePath = epocRoot() + "epoc32/data/z" + devicePath; + } else if (targetPathHasDriveLetter) { // Drive letter needed if targetpath contains one and it is not already in - if ( 0 == platform.compare(QLatin1String("armv5"), Qt::CaseInsensitive) ) { - //For plugin deployment under ARM no needed drive letter - devicePath = epocRoot() + "epoc32/data/z" + devicePath; - } else { - devicePath = deploymentDrive + devicePath; - } - } else { - // Only deployment for ARM need full path for the deployment - if (0 == platform.compare(QLatin1String("armv5"), Qt::CaseInsensitive) ) { - devicePath = epocRoot() + "epoc32/data/z" + devicePath; - } + devicePath = deploymentDrive + devicePath; } - } else { //it is necessary to delete drive letter for ARM deployment - if (!platform.compare("armv5")) { + if (!platform.compare(QLatin1String(ROM_DEPLOYMENT_PLATFORM))) { devicePath.remove(0,2); devicePath = epocRoot() + "epoc32/data/z" + devicePath; } @@ -262,13 +256,7 @@ dirSearch = true; } else { if (info.exists() || source.indexOf('*') != -1) { -//QTP-Prod: Temporary solution due Option::fixPathToLocalOS. This function always replaces / to \ for Windows -//in the source. Changes fixPathToLocalOS requires more investigation and testing. -#if defined(Q_OS_WIN32) - nameFilter = source.split('\\').last(); -#else - nameFilter = source.split('/').last(); -#endif + nameFilter = source.split(QDir::separator()).last(); searchPath = info.absolutePath(); } else { // Entry was not found. That is ok if it is a binary, since those do not necessarily yet exist. @@ -276,13 +264,19 @@ if (isBinary(info)) { if (deployBinaries) { // Executables and libraries are deployed to \sys\bin - QFileInfo releasePath(epocRoot() + "epoc32/release/" + platform + "/" + build + "/"); + QFileInfo targetPath(epocRoot() + "epoc32/release/" + platform + "/" + build + "/"); if(devicePathHasDriveLetter) { - deploymentList.append(CopyItem(Option::fixPathToLocalOS(releasePath.absolutePath() + "/" + info.fileName(), false, true), - Option::fixPathToLocalOS(devicePath.left(2) + QLatin1String(SYSBIN_DIR "/") + info.fileName()))); + deploymentList.append(CopyItem( + Option::fixPathToLocalOS(targetPath.absolutePath() + "/" + info.fileName(), + false, true), + fixPathToEpocOS(devicePath.left(2) + QLatin1String(SYSBIN_DIR "/") + + info.fileName()))); } else { - deploymentList.append(CopyItem(Option::fixPathToLocalOS(releasePath.absolutePath() + "/" + info.fileName(), false, true), - Option::fixPathToLocalOS(deploymentDrive + QLatin1String(SYSBIN_DIR "/") + info.fileName()))); + deploymentList.append(CopyItem( + Option::fixPathToLocalOS(targetPath.absolutePath() + "/" + info.fileName(), + false, true), + fixPathToEpocOS(deploymentDrive + QLatin1String(SYSBIN_DIR "/") + + info.fileName()))); } } if (isPlugin(info, devicePath)) { @@ -293,7 +287,7 @@ // Generate deployment even if file doesn't exist, as this may be the case // when generating .pkg files. deploymentList.append(CopyItem(Option::fixPathToLocalOS(info.absoluteFilePath()), - Option::fixPathToLocalOS(devicePath + "/" + info.fileName()))); + fixPathToEpocOS(devicePath + "/" + info.fileName()))); continue; } } @@ -315,32 +309,29 @@ // This deploys pre-built plugins. Other pre-built binaries will deploy normally, // as they have SYSBIN_DIR target path. if (deployBinaries) { - deploymentList.append(CopyItem(Option::fixPathToLocalOS(absoluteItemPath + "/" + iterator.fileName()), - Option::fixPathToLocalOS(deploymentDrive + QLatin1String(SYSBIN_DIR "/") + iterator.fileName()))); + if (devicePathHasDriveLetter) { + deploymentList.append(CopyItem( + Option::fixPathToLocalOS(absoluteItemPath + "/" + iterator.fileName()), + fixPathToEpocOS(devicePath.left(2) + QLatin1String(SYSBIN_DIR "/") + + iterator.fileName()))); + } else { + deploymentList.append(CopyItem( + Option::fixPathToLocalOS(absoluteItemPath + "/" + iterator.fileName()), + fixPathToEpocOS(deploymentDrive + QLatin1String(SYSBIN_DIR "/") + + iterator.fileName()))); + } } - createPluginStub(info, devicePath + "/" + absoluteItemPath.right(diffSize), deploymentList, generatedDirs, generatedFiles); + createPluginStub(info, devicePath + "/" + absoluteItemPath.right(diffSize), + deploymentList, generatedDirs, generatedFiles); continue; } else { - deploymentList.append(CopyItem(Option::fixPathToLocalOS(absoluteItemPath + "/" + iterator.fileName()), - Option::fixPathToLocalOS(devicePath + "/" + absoluteItemPath.right(diffSize) + "/" + iterator.fileName()))); + deploymentList.append(CopyItem( + Option::fixPathToLocalOS(absoluteItemPath + "/" + iterator.fileName()), + fixPathToEpocOS(devicePath + "/" + absoluteItemPath.right(diffSize) + + "/" + iterator.fileName()))); } } } } } } - -//:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build -void writeSbsDeploymentList(const DeploymentList& depList, QTextStream& t) -{ - for (int i = 0; i < depList.size(); ++i) { - t << "START EXTENSION qt/qmake_emulator_deployment" << endl; - QString fromItem = depList.at(i).from; - QString toItem = depList.at(i).to; - fromItem.replace("\\", "/"); - toItem.replace("\\", "/"); - t << "OPTION DEPLOY_SOURCE " << fromItem << endl; - t << "OPTION DEPLOY_TARGET " << toItem << endl; - t << "END" << endl; - } -} diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/symbian/initprojectdeploy_symbian.h --- a/qmake/generators/symbian/initprojectdeploy_symbian.h Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/symbian/initprojectdeploy_symbian.h Mon May 03 13:17:34 2010 +0300 @@ -51,6 +51,8 @@ #include #define PLUGIN_STUB_DIR "qmakepluginstubs" +#define ROM_DEPLOYMENT_PLATFORM "rom" +#define EMULATOR_DEPLOYMENT_PLATFORM "emulator" struct CopyItem { @@ -71,6 +73,5 @@ const QString &build, QStringList& generatedDirs, QStringList& generatedFiles); -//:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build -extern void writeSbsDeploymentList(const DeploymentList& depList, QTextStream& t); + #endif // INITPROJECTDEPLOYSYMBIAN_H diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/symbian/symmake.cpp --- a/qmake/generators/symbian/symmake.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/symbian/symmake.cpp Mon May 03 13:17:34 2010 +0300 @@ -65,12 +65,18 @@ #define BLD_INF_TAG_MMPFILES "prj_mmpfiles" #define BLD_INF_TAG_TESTMMPFILES "prj_testmmpfiles" #define BLD_INF_TAG_EXTENSIONS "prj_extensions" -#define BLD_INF_TAG_EXPORTS "prj_exports" +#define BLD_INF_TAG_TESTEXTENSIONS "prj_testextensions" #define RSS_RULES "RSS_RULES" #define RSS_RULES_BASE "RSS_RULES." #define RSS_TAG_NBROFICONS "number_of_icons" #define RSS_TAG_ICONFILE "icon_file" +#define RSS_TAG_HEADER "header" +#define RSS_TAG_SERVICE_LIST "service_list" +#define RSS_TAG_FILE_OWNERSHIP_LIST "file_ownership_list" +#define RSS_TAG_DATATYPE_LIST "datatype_list" +#define RSS_TAG_FOOTER "footer" +#define RSS_TAG_DEFAULT "default_rules" // Same as just giving rules without tag #define MMP_TARGET "TARGET" #define MMP_TARGETTYPE "TARGETTYPE" @@ -149,14 +155,14 @@ resultPath = QDir::fromNativeSeparators(epocRoot()) + resultPath.mid(1); QFileInfo fi(fileInfo(resultPath)); - + // Since origPath can be something given in HEADERS, we need to check if we are dealing // with a file or a directory. In case the origPath doesn't yet exist, isFile() returns // false and we default to assuming it is a dir. if (fi.isFile()) { resultPath = fi.absolutePath(); } else { - resultPath = fi.absoluteFilePath(); + resultPath = fi.absoluteFilePath(); } resultPath = QDir::cleanPath(resultPath); @@ -202,7 +208,7 @@ QString numberOfIcons; QString iconFile; - QStringList userRssRules; + QMap userRssRules; readRssRules(numberOfIcons, iconFile, userRssRules); // Get the application translations and convert to symbian OS lang code, i.e. decical number @@ -326,17 +332,36 @@ tw << headerComment.arg(wrapperPkgFilename).arg(dateStr); // Construct QStringList from pkg_prerules since we need search it before printed to file + // Note: Though there can't be more than one language or header line, use stringlists + // in case user wants comments to go with the rules. QStringList rawPkgPreRules; + QStringList languageRules; + QStringList headerRules; foreach(QString deploymentItem, project->values("DEPLOYMENT")) { foreach(QString pkgrulesItem, project->values(deploymentItem + ".pkg_prerules")) { QStringList pkgrulesValue = project->values(pkgrulesItem); // If there is no stringlist defined for a rule, use rule name directly // This is convenience for defining single line mmp statements if (pkgrulesValue.isEmpty()) { - rawPkgPreRules << pkgrulesItem; + if (pkgrulesItem.startsWith("&")) + languageRules << pkgrulesItem; + else if (pkgrulesItem.startsWith("#")) + headerRules << pkgrulesItem; + else + rawPkgPreRules << pkgrulesItem; } else { - foreach(QString pkgrule, pkgrulesValue) { - rawPkgPreRules << pkgrule; + if (containsStartWithItem('&', pkgrulesValue)) { + foreach(QString pkgrule, pkgrulesValue) { + languageRules << pkgrule; + } + } else if (containsStartWithItem('#', pkgrulesValue)) { + foreach(QString pkgrule, pkgrulesValue) { + headerRules << pkgrule; + } + } else { + foreach(QString pkgrule, pkgrulesValue) { + rawPkgPreRules << pkgrule; + } } } } @@ -344,17 +369,17 @@ // Apply some defaults if specific data does not exist in PKG pre-rules - if (!containsStartWithItem('&', rawPkgPreRules)) { + if (languageRules.isEmpty()) { // language, (*** hardcoded to english atm, should be parsed from TRANSLATIONS) - QString languageCode = "; Language\n&EN\n\n"; - t << languageCode; - tw << languageCode; - } else { + languageRules << "; Language\n&EN\n\n"; + } else if (headerRules.isEmpty()) { // In case user defines langs, he must take care also about SIS header - if (!containsStartWithItem('#', rawPkgPreRules)) - fprintf(stderr, "Warning: If language is defined with DEPLOYMENT pkg_prerules, also the SIS header must be defined\n"); + fprintf(stderr, "Warning: If language is defined with DEPLOYMENT pkg_prerules, also the SIS header must be defined\n"); } + t << languageRules.join("\n") << endl; + tw << languageRules.join("\n") << endl; + // name of application, UID and version QString applicationVersion = project->first("VERSION").isEmpty() ? "1,0,0" : project->first("VERSION").replace('.', ','); QString sisHeader = "; SIS header: name, uid, version\n#{\"%1\"},(%2),%3\n\n"; @@ -368,9 +393,10 @@ tw << installerSisHeader << endl; } - if (!containsStartWithItem('#', rawPkgPreRules)) { + if (headerRules.isEmpty()) t << sisHeader.arg(visualTarget).arg(uid3).arg(applicationVersion); - } + else + t << headerRules.join("\n") << endl; // Localized vendor name QString vendorName; @@ -460,14 +486,29 @@ // deploy any additional DEPLOYMENT files QString remoteTestPath; remoteTestPath = QString("!:\\private\\%1").arg(privateDirUid); + QString zDir = epocRoot() + QLatin1String("epoc32/data/z"); initProjectDeploySymbian(project, depList, remoteTestPath, true, "$(PLATFORM)", "$(TARGET)", generatedDirs, generatedFiles); if (depList.size()) t << "; DEPLOYMENT" << endl; for (int i = 0; i < depList.size(); ++i) { - t << QString("\"%1\" - \"%2\"") - .arg(QString(depList.at(i).from).replace('\\','/')) - .arg(depList.at(i).to) << endl; + QString from = depList.at(i).from; + QString to = depList.at(i).to; + + // Deploy anything not already deployed from under epoc32 instead from under + // \epoc32\data\z\ to enable using pkg file without rebuilding + // the project, which can be useful for some binary only distributions. + if (!from.contains(QLatin1String("epoc32"), Qt::CaseInsensitive)) { + from = to; + if (from.size() > 1 && from.at(1) == QLatin1Char(':')) + from = from.mid(2); + from.prepend(zDir); + } else { + if (from.size() > 1 && from.at(1) == QLatin1Char(':')) + from = from.mid(2); + } + + t << QString("\"%1\" - \"%2\"").arg(from.replace('\\','/')).arg(to) << endl; } t << endl; @@ -779,15 +820,13 @@ QStringList restrictedMmpKeywords; bool inResourceBlock = false; - overridableMmpKeywords << QLatin1String(MMP_TARGETTYPE); + overridableMmpKeywords << QLatin1String(MMP_TARGETTYPE) << QLatin1String(MMP_EPOCHEAPSIZE); restrictableMmpKeywords << QLatin1String(MMP_TARGET) << QLatin1String(MMP_SECUREID) - << QLatin1String(MMP_OPTION_CW) << QLatin1String(MMP_OPTION_ARMCC) - << QLatin1String(MMP_OPTION_GCCE) << QLatin1String(MMP_LINKEROPTION_CW) - << QLatin1String(MMP_LINKEROPTION_ARMCC) << QLatin1String(MMP_LINKEROPTION_GCCE) + << QLatin1String(MMP_LINKEROPTION_CW) << QLatin1String(MMP_LINKEROPTION_ARMCC) + << QLatin1String(MMP_LINKEROPTION_GCCE) << QLatin1String(MMP_CAPABILITY) << QLatin1String(MMP_EPOCALLOWDLLDATA) - << QLatin1String(MMP_EPOCHEAPSIZE) << QLatin1String(MMP_EPOCSTACKSIZE) - << QLatin1String(MMP_UID) << QLatin1String(MMP_VENDORID) - << QLatin1String(MMP_VERSION); + << QLatin1String(MMP_EPOCSTACKSIZE) << QLatin1String(MMP_UID) + << QLatin1String(MMP_VENDORID) << QLatin1String(MMP_VERSION); foreach (QString item, project->values("MMP_RULES")) { if (project->values(item).isEmpty()) { @@ -961,6 +1000,7 @@ void SymbianMakefileGenerator::writeMmpFileTargetPart(QTextStream& t) { bool skipTargetType = overriddenMmpKeywords.contains(MMP_TARGETTYPE); + bool skipEpocHeapSize = overriddenMmpKeywords.contains(MMP_EPOCHEAPSIZE); if (targetType == TypeExe) { t << MMP_TARGET "\t\t" << fixedTarget << ".exe" << endl; @@ -1012,7 +1052,7 @@ if (0 != project->first("TARGET.EPOCSTACKSIZE").size()) t << MMP_EPOCSTACKSIZE "\t\t" << project->first("TARGET.EPOCSTACKSIZE") << endl; - if (0 != project->values("TARGET.EPOCHEAPSIZE").size()) + if (!skipEpocHeapSize && 0 != project->values("TARGET.EPOCHEAPSIZE").size()) t << MMP_EPOCHEAPSIZE "\t\t" << project->values("TARGET.EPOCHEAPSIZE").join(" ") << endl; if (0 != project->values("TARGET.EPOCALLOWDLLDATA").size()) t << MMP_EPOCALLOWDLLDATA << endl; @@ -1240,6 +1280,16 @@ t << MMP_OPTION_CW " " << cw << endl; if (!armcc.isEmpty()) t << MMP_OPTION_ARMCC " " << armcc << endl; + + foreach(QString armccVersion, project->values("VERSION_FLAGS.ARMCC")) { + QStringList currentValues = project->values("QMAKE_CXXFLAGS." + armccVersion); + if (currentValues.size()) { + t << "#if defined(" << armccVersion << ")" << endl; + t << MMP_OPTION_ARMCC " " << currentValues.join(" ") << endl; + t << "#endif" << endl; + } + } + if (!gcce.isEmpty()) t << MMP_OPTION_GCCE " " << gcce << endl; @@ -1352,6 +1402,10 @@ fixedItem = item; } + QString condition; + if (!project->isEmpty(item + ".condition")) + condition = project->first(item + ".condition"); + QFileInfo subdir(fileInfo(fixedItem)); QString relativePath = directory.relativeFilePath(fixedItem); QString subdirFileName = subdir.completeBaseName(); @@ -1380,9 +1434,16 @@ bldinfDefine = bldinfDefine.toUpper(); removeSpecialCharacters(bldinfDefine); + if (!condition.isEmpty()) + t << "#if defined(" << condition << ")" << endl; + t << "#ifndef " << bldinfDefine << endl; t << "\t#include \"" << bldinfFilename << "\"" << endl; - t << "#endif // " << bldinfDefine << endl; + t << "#endif" << endl; + + if (!condition.isEmpty()) + t << "#endif" << endl; + } // Add supported project platforms @@ -1400,7 +1461,7 @@ // Add project mmps and old style extension makefiles QString mmpTag; - if (project->isActiveConfig("symbian_test")) + if (project->isActiveConfig(SYMBIAN_TEST_CONFIG)) mmpTag = QLatin1String(BLD_INF_TAG_TESTMMPFILES); else mmpTag = QLatin1String(BLD_INF_TAG_MMPFILES); @@ -1423,16 +1484,22 @@ t << item << endl; userBldInfRules.remove(mmpTag); - t << endl << BLD_INF_TAG_EXTENSIONS << endl << endl; + QString extensionTag; + if (project->isActiveConfig(SYMBIAN_TEST_CONFIG)) + extensionTag = QLatin1String(BLD_INF_TAG_TESTEXTENSIONS); + else + extensionTag = QLatin1String(BLD_INF_TAG_EXTENSIONS); + + t << endl << extensionTag << endl << endl; // Generate extension rules writeBldInfExtensionRulesPart(t, iconFile); - userItems = userBldInfRules.value(BLD_INF_TAG_EXTENSIONS); + userItems = userBldInfRules.value(extensionTag); foreach(QString item, userItems) t << item << endl; - userBldInfRules.remove(BLD_INF_TAG_EXTENSIONS); + userBldInfRules.remove(extensionTag); // Add rest of the user defined content @@ -1442,80 +1509,9 @@ foreach(QString item, userItems) t << item << endl; } - if (project->values("CONFIG").contains("headerexport", Qt::CaseInsensitive)) { - writeExportPart(t); - } } -void SymbianMakefileGenerator::writeExportPart(QTextStream &t) -{ - QDir currentDir = QDir::current(); - t << "prj_exports" << endl; - - foreach(QString install, project->values("INSTALLS")) { - QString installDir = project->first(install + ".path"); - - // Export macros are the recommended way, but might not be used - // in all cases (such as Qt headers). We handle it either way, - // macros or not. - bool useLayerMacro = false; - if (installDir.startsWith("MW_LAYER_") || - installDir.startsWith("APP_LAYER_") || - installDir.startsWith("APP_LAYER_")) { - useLayerMacro = true; - } else { -#ifdef Q_OS_WIN - // If we are running on Windows, and the export target starts - // with a drive letter, we need to remove it, the build tools - // cannot handle drives in export paths - - if (installDir.length() > 2 && installDir[1] == ':') { - installDir.remove(0, 2); - } -#endif - installDir.replace("\\", "/"); - if (!installDir.endsWith("/")) { - installDir.append("/"); - } - } - - foreach(QString target, project->values(install + ".files")) { - // Handle glob targets (only in the current directory) - if (target.contains("*") || target.contains("?")) { - QDir globber = QDir::current(); - globber.setNameFilters(QStringList(target)); - foreach(QString globbedTarget, globber.entryList()) { - if (useLayerMacro) { - QFileInfo globbedInfo(globbedTarget); - t << globbedTarget << " " << installDir << - "(" << globbedInfo.fileName() << ")" << endl; - } else { - t << globbedTarget << " " << installDir << - globbedTarget << endl; - } - } - } else { - target = currentDir.relativeFilePath(target); - QFileInfo targetInfo(target); - - // Not possible to export whole directories, extension makefile needed for this - // Note that this check requires the file to be exported to exist in the qmake phase! - if (targetInfo.isFile()) { - if (useLayerMacro) { - t << target << " " << installDir << - "(" << targetInfo.fileName() << ")" << endl; - } else { - t << target << " " << installDir << - targetInfo.fileName() << endl; - } - } - } - } - } - t << endl; -} - -void SymbianMakefileGenerator::writeRegRssFile(QStringList &userItems) +void SymbianMakefileGenerator::writeRegRssFile(QMap &userItems) { QString filename(fixedTarget); filename.append("_reg.rss"); @@ -1535,6 +1531,8 @@ t << endl; t << "#include <" << fixedTarget << ".rsg>" << endl; t << "#include " << endl; + foreach(QString item, userItems[RSS_TAG_HEADER]) + t << item << endl; t << endl; t << "UID2 KUidAppRegistrationResourceFile" << endl; t << "UID3 " << uid3 << endl << endl; @@ -1542,16 +1540,51 @@ t << "\t{" << endl; t << "\tapp_file=\"" << fixedTarget << "\";" << endl; t << "\tlocalisable_resource_file=\"" RESOURCE_DIRECTORY_RESOURCE << fixedTarget << "\";" << endl; + + writeRegRssList(t, userItems[RSS_TAG_SERVICE_LIST], + QLatin1String(RSS_TAG_SERVICE_LIST), + QLatin1String("SERVICE_INFO")); + writeRegRssList(t, userItems[RSS_TAG_FILE_OWNERSHIP_LIST], + QLatin1String(RSS_TAG_FILE_OWNERSHIP_LIST), + QLatin1String("FILE_OWNERSHIP_INFO")); + writeRegRssList(t, userItems[RSS_TAG_DATATYPE_LIST], + QLatin1String(RSS_TAG_DATATYPE_LIST), + QLatin1String("DATATYPE")); t << endl; - foreach(QString item, userItems) - t << "\t" << item << endl; + foreach(QString item, userItems[RSS_TAG_DEFAULT]) + t << "\t" << item.replace("\n","\n\t") << endl; t << "\t}" << endl; + + foreach(QString item, userItems[RSS_TAG_FOOTER]) + t << item << endl; } else { PRINT_FILE_CREATE_ERROR(filename) } } +void SymbianMakefileGenerator::writeRegRssList(QTextStream &t, + QStringList &userList, + const QString &listTag, + const QString &listItem) +{ + int itemCount = userList.count(); + if (itemCount) { + t << "\t" << listTag << " ="<< endl; + t << "\t\t{" << endl; + foreach(QString item, userList) { + t << "\t\t" << listItem << endl; + t << "\t\t\t{" << endl; + t << "\t\t\t" << item.replace("\n","\n\t\t\t") << endl; + t << "\t\t\t}"; + if (--itemCount) + t << ","; + t << endl; + } + t << "\t\t}; "<< endl; + } +} + void SymbianMakefileGenerator::writeRssFile(QString &numberOfIcons, QString &iconFile) { QString filename(fixedTarget); @@ -1686,9 +1719,7 @@ if (tsFile.exists()) { if (tsFile.open(QIODevice::ReadOnly)) { QString shortCaptionId = QLatin1String("txt_short_caption_"); - shortCaptionId.append(filename); QString longCaptionId = QLatin1String("txt_long_caption_"); - longCaptionId.append(filename); QXmlStreamReader xml(&tsFile); while (!xml.atEnd()) { xml.readNext(); @@ -1697,7 +1728,7 @@ xml.readNext(); if (xml.isStartElement() && xml.name() == "message" && xml.attributes().value("numerus") == "no" && - xml.attributes().value("id") == shortCaptionId) { + xml.attributes().value("id").toString().left(shortCaptionId.length()) == shortCaptionId) { while (!(xml.isEndElement() && xml.name() == "message") && !xml.atEnd()) { xml.readNext(); if (xml.isStartElement() && xml.name() == "translation") { @@ -1707,7 +1738,7 @@ } if (xml.isStartElement() && xml.name() == "message" && xml.attributes().value("numerus") == "no" && - xml.attributes().value("id") == longCaptionId) { + xml.attributes().value("id").toString().left(longCaptionId.length()) == longCaptionId) { while (!(xml.isEndElement() && xml.name() == "message") && !xml.atEnd()) { xml.readNext(); if (xml.isStartElement() && xml.name() == "translation") { @@ -1719,8 +1750,7 @@ } } if (shortCaption.isEmpty()){ - fprintf(stderr, "Warning: STRING_r_short_caption not generated from file '%s'.\n", qPrintable(tsFilename)); - fprintf(stderr, " : short caption generated from target name '#%s'.\n", qPrintable(fixedTarget)); + fprintf(stderr, "Short caption generated from target name '#%s'.\n", qPrintable(fixedTarget)); } if (longCaption.isEmpty()){ fprintf(stderr, "Warning: STRING_r_caption not generated from file '%s'.\n", qPrintable(tsFilename)); @@ -1765,7 +1795,9 @@ } } -void SymbianMakefileGenerator::readRssRules(QString &numberOfIcons, QString &iconFile, QStringList &userRssRules) +void SymbianMakefileGenerator::readRssRules(QString &numberOfIcons, + QString &iconFile, QMap &userRssRules) { for (QMap::iterator it = project->variables().begin(); it != project->variables().end(); ++it) { if (it.key().startsWith(RSS_RULES_BASE)) { @@ -1777,14 +1809,16 @@ QStringList newValues; QStringList values = it.value(); foreach(QString item, values) { - // If there is no stringlist defined for a rule, use rule name directly + // If there is no stringlist defined for a rule, use rule value directly // This is convenience for defining single line statements if (project->values(item).isEmpty()) { newValues << item; } else { + QStringList itemList; foreach(QString itemRow, project->values(item)) { - newValues << itemRow; + itemList << itemRow; } + newValues << itemList.join("\n"); } } // Verify thet there is exactly one value in RSS_TAG_NBROFICONS @@ -1805,6 +1839,14 @@ RSS_RULES_BASE, RSS_TAG_ICONFILE); continue; } + } else if (newKey == RSS_TAG_HEADER + || newKey == RSS_TAG_SERVICE_LIST + || newKey == RSS_TAG_FILE_OWNERSHIP_LIST + || newKey == RSS_TAG_DATATYPE_LIST + || newKey == RSS_TAG_FOOTER + || newKey == RSS_TAG_DEFAULT) { + userRssRules[newKey] = newValues; + continue; } else { fprintf(stderr, "Warning: Unsupported key:'%s%s'\n", RSS_RULES_BASE, newKey.toLatin1().constData()); @@ -1813,15 +1855,17 @@ } } + QStringList newValues; foreach(QString item, project->values(RSS_RULES)) { - // If there is no stringlist defined for a rule, use rule name directly - // This is convenience for defining single line mmp statements + // If there is no stringlist defined for a rule, use rule value directly + // This is convenience for defining single line statements if (project->values(item).isEmpty()) { - userRssRules << item; + newValues << item; } else { - userRssRules << project->values(item); + newValues << project->values(item); } } + userRssRules[RSS_TAG_DEFAULT] << newValues; // Validate that either both RSS_TAG_NBROFICONS and RSS_TAG_ICONFILE keys exist // or neither of them exist @@ -2281,7 +2325,7 @@ t << "\t-call " << epocRoot() << "epoc32/release/winscw/udeb/" << fixedTarget << ".exe " << "$(QT_RUN_OPTIONS)" << endl; } t << "runonphone: sis" << endl; - t << "\trunonphone $(QT_RUN_ON_PHONE_OPTIONS) --sis " << fixedTarget << "_$(QT_SIS_TARGET).sis " << fixedTarget << ".exe " << "$(QT_RUN_OPTIONS)" << endl; + t << "\trunonphone $(QT_RUN_ON_PHONE_OPTIONS) --sis " << fixedTarget << ".sis " << fixedTarget << ".exe " << "$(QT_RUN_OPTIONS)" << endl; t << endl; } } diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/symbian/symmake.h --- a/qmake/generators/symbian/symmake.h Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/symbian/symmake.h Mon May 03 13:17:34 2010 +0300 @@ -49,9 +49,9 @@ #define BLD_INF_FILENAME "bld.inf" #define MAKEFILE_DEPENDENCY_SEPARATOR " \\\n\t" - #define QT_EXTRA_INCLUDE_DIR "tmp" #define MAKE_CACHE_NAME ".make.cache" +#define SYMBIAN_TEST_CONFIG "symbian_test" class SymbianMakefileGenerator : public MakefileGenerator { @@ -108,8 +108,10 @@ QString &checkString); void writeHeader(QTextStream &t); - void writeExportPart(QTextStream &t); - void writeBldInfContent(QTextStream& t, bool addDeploymentExtension, const QString &iconFile, DeploymentList &depList); + void writeBldInfContent(QTextStream& t, + bool addDeploymentExtension, + const QString &iconFile, + DeploymentList &depList); static bool removeDuplicatedStrings(QStringList& stringList); @@ -129,11 +131,16 @@ void writeCustomDefFile(); - void writeRegRssFile(QStringList &useritems); + void writeRegRssFile(QMap &useritems); + void writeRegRssList(QTextStream &t, QStringList &userList, + const QString &listTag, + const QString &listItem); void writeRssFile(QString &numberOfIcons, QString &iconfile); void writeLocFile(QStringList &symbianLangCodes); void writeSymbianLocFile(QStringList &symbianLangCodes); - void readRssRules(QString &numberOfIcons, QString &iconFile, QStringList &userRssRules); + void readRssRules(QString &numberOfIcons, + QString &iconFile, + QMap &userRssRules); QStringList symbianLangCodesFromTsFiles(); void fillQt2S60LangMapTable(); diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/symbian/symmake_abld.cpp --- a/qmake/generators/symbian/symmake_abld.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/symbian/symmake_abld.cpp Mon May 03 13:17:34 2010 +0300 @@ -59,15 +59,11 @@ #define FINALIZE_TARGET "finalize" #define GENERATED_SOURCES_TARGET "generated_sources" #define ALL_SOURCE_DEPS_TARGET "all_source_deps" -//:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build #define DEPLOYMENT_TARGET "deployment" #define DEPLOYMENT_CLEAN_TARGET "deployment_clean" #define WINSCW_DEPLOYMENT_TARGET "winscw_deployment" #define WINSCW_DEPLOYMENT_CLEAN_TARGET "winscw_deployment_clean" -/* :QTP:QTPROD-155: Don't write .make.cache during the compilation, it causes dependency problems in - * the parallel build clusters - */ -#define STORE_BUILD_TARGET "" +#define STORE_BUILD_TARGET "store_build" SymbianAbldMakefileGenerator::SymbianAbldMakefileGenerator() : SymbianMakefileGenerator() { } SymbianAbldMakefileGenerator::~SymbianAbldMakefileGenerator() { } @@ -119,24 +115,23 @@ QString cleanDepsWinscw; QString finalDepsWinscw; QStringList wrapperTargets; - //:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build if (deploymentOnly) { buildDeps.append(STORE_BUILD_TARGET); cleanDeps.append(DEPLOYMENT_CLEAN_TARGET); - cleanDepsWinscw.append(WINSCW_DEPLOYMENT_CLEAN_TARGET); + cleanDepsWinscw.append(WINSCW_DEPLOYMENT_CLEAN_TARGET " " DEPLOYMENT_CLEAN_TARGET); finalDeps.append(DEPLOYMENT_TARGET); - finalDepsWinscw.append(WINSCW_DEPLOYMENT_TARGET); + finalDepsWinscw.append(WINSCW_DEPLOYMENT_TARGET " " DEPLOYMENT_TARGET); wrapperTargets << WINSCW_DEPLOYMENT_TARGET - << WINSCW_DEPLOYMENT_CLEAN_TARGET - << DEPLOYMENT_TARGET - << DEPLOYMENT_CLEAN_TARGET + << WINSCW_DEPLOYMENT_CLEAN_TARGET + << DEPLOYMENT_TARGET + << DEPLOYMENT_CLEAN_TARGET << STORE_BUILD_TARGET; } else { buildDeps.append(CREATE_TEMPS_TARGET " " PRE_TARGETDEPS_TARGET " " STORE_BUILD_TARGET); cleanDeps.append(EXTENSION_CLEAN " " DEPLOYMENT_CLEAN_TARGET); - cleanDepsWinscw.append(EXTENSION_CLEAN " " WINSCW_DEPLOYMENT_CLEAN_TARGET); + cleanDepsWinscw.append(EXTENSION_CLEAN " " WINSCW_DEPLOYMENT_CLEAN_TARGET " " DEPLOYMENT_CLEAN_TARGET); finalDeps.append(FINALIZE_TARGET " " DEPLOYMENT_TARGET); - finalDepsWinscw.append(FINALIZE_TARGET " " WINSCW_DEPLOYMENT_TARGET); + finalDepsWinscw.append(FINALIZE_TARGET " " WINSCW_DEPLOYMENT_TARGET " " DEPLOYMENT_TARGET); wrapperTargets << PRE_TARGETDEPS_TARGET << CREATE_TEMPS_TARGET << EXTENSION_CLEAN @@ -263,7 +258,7 @@ releasePlatforms.removeAll("winscw"); // No release for emulator QString testClause; - if (project->isActiveConfig("symbian_test")) + if (project->isActiveConfig(SYMBIAN_TEST_CONFIG)) testClause = QLatin1String(" test"); else testClause = QLatin1String(""); @@ -286,6 +281,8 @@ t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl; t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl; t << "MOVE = " << var("QMAKE_MOVE") << endl; + t << "CHK_DIR_EXISTS = " << var("QMAKE_CHK_DIR_EXISTS") << endl; + t << "MKDIR = " << var("QMAKE_MKDIR") << endl; t << "XCOPY = xcopy /d /f /h /r /y /i" << endl; t << "ABLD = ABLD.BAT" << endl; t << "DEBUG_PLATFORMS = " << debugPlatforms.join(" ") << endl; @@ -450,16 +447,13 @@ qDeleteAll(subtargets); } - writeDeploymentTargets(t); - //:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build - writeDeploymentTargets(t, true); + // Deploymend targets for both emulator and rom deployment + writeDeploymentTargets(t, false); + writeDeploymentTargets(t, true); writeSisTargets(t); - /* :QTP:QTPROD-155: Don't write .make.cache during the compilation, it causes dependency problems in - * the parallel build clusters writeStoreBuildTarget(t); - */ generateDistcleanTargets(t); @@ -500,33 +494,36 @@ Q_UNUSED(iconTargetFile); } -//:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build -bool SymbianAbldMakefileGenerator::writeDeploymentTargets(QTextStream &t, bool isRelease /*= false*/) +bool SymbianAbldMakefileGenerator::writeDeploymentTargets(QTextStream &t, bool isRom) { - if (isRelease) + if (isRom) t << DEPLOYMENT_TARGET ":" << endl; else t << WINSCW_DEPLOYMENT_TARGET ":" << endl; - QString remoteTestPath = epocRoot() + QLatin1String( isRelease?"epoc32\\data\\z\\private\\":"epoc32\\winscw\\c\\private\\") - + privateDirUid; // default 4 OpenC; 4 all Symbian too + QString remoteTestPath = epocRoot() + + QLatin1String(isRom ? "epoc32\\data\\z\\private\\" : "epoc32\\winscw\\c\\private\\") + + privateDirUid; DeploymentList depList; - initProjectDeploySymbian(project, depList, remoteTestPath, false, QLatin1String(isRelease?"armv5":"winscw"), QLatin1String(isRelease?"urel":"udeb"), - generatedDirs, generatedFiles); + initProjectDeploySymbian(project, depList, remoteTestPath, false, + QLatin1String(isRom ? ROM_DEPLOYMENT_PLATFORM : EMULATOR_DEPLOYMENT_PLATFORM), + QString(), generatedDirs, generatedFiles); if (depList.size()) t << "\t-echo Deploying changed files..." << endl; + for (int i = 0; i < depList.size(); ++i) { // Xcopy prompts for selecting file or directory if target doesn't exist, // and doesn't provide switch to force file selection. It does provide dir forcing, though, // so strip the last part of the destination. - t << "\t-$(XCOPY) \"" << depList.at(i).from << "\" \"" << depList.at(i).to.left(depList.at(i).to.lastIndexOf("\\") + 1) << "\"" << endl; + t << "\t-$(XCOPY) \"" << depList.at(i).from << "\" \"" + << depList.at(i).to.left(depList.at(i).to.lastIndexOf("\\") + 1) << "\"" << endl; } t << endl; - if (isRelease) + if (isRom) t << DEPLOYMENT_CLEAN_TARGET ":" << endl; else t << WINSCW_DEPLOYMENT_CLEAN_TARGET ":" << endl; diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/symbian/symmake_abld.h --- a/qmake/generators/symbian/symmake_abld.h Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/symbian/symmake_abld.h Mon May 03 13:17:34 2010 +0300 @@ -58,9 +58,7 @@ virtual void appendAbldTempDirs(QStringList& sysincspaths, QString includepath); void writeStoreBuildTarget(QTextStream &t); - - //:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build - bool writeDeploymentTargets(QTextStream &t, bool isRelease = false); + bool writeDeploymentTargets(QTextStream &t, bool isRom); public: diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/symbian/symmake_sbsv2.cpp --- a/qmake/generators/symbian/symmake_sbsv2.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/symbian/symmake_sbsv2.cpp Mon May 03 13:17:34 2010 +0300 @@ -94,6 +94,23 @@ } } +void SymbianSbsv2MakefileGenerator::writeSbsDeploymentList(const DeploymentList& depList, QTextStream& t) +{ + for (int i = 0; i < depList.size(); ++i) { + t << "START EXTENSION qt/qmake_emulator_deployment" << endl; + QString fromItem = depList.at(i).from; + QString toItem = depList.at(i).to; + fromItem.replace("\\", "/"); + toItem.replace("\\", "/"); +#if defined(Q_OS_WIN) + toItem.prepend(QDir::current().absolutePath().left(2)); // add drive +#endif + t << "OPTION DEPLOY_SOURCE " << fromItem << endl; + t << "OPTION DEPLOY_TARGET " << toItem << endl; + t << "END" << endl; + } +} + void SymbianSbsv2MakefileGenerator::writeMkFile(const QString& wrapperFileName, bool deploymentOnly) { // Can't use extension makefile with sbsv2 @@ -113,7 +130,7 @@ releasePlatforms.removeAll("winscw"); // No release for emulator QString testClause; - if (project->isActiveConfig("symbian_test")) + if (project->isActiveConfig(SYMBIAN_TEST_CONFIG)) testClause = QLatin1String(".test"); else testClause = QLatin1String(""); @@ -134,6 +151,8 @@ t << "QMAKE = " << Option::fixPathToTargetOS(var("QMAKE_QMAKE")) << endl; t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl; t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl; + t << "CHK_DIR_EXISTS = " << var("QMAKE_CHK_DIR_EXISTS") << endl; + t << "MKDIR = " << var("QMAKE_MKDIR") << endl; t << "MOVE = " << var("QMAKE_MOVE") << endl; t << "DEBUG_PLATFORMS = " << debugPlatforms.join(" ") << endl; t << "RELEASE_PLATFORMS = " << releasePlatforms.join(" ") << endl; @@ -349,7 +368,7 @@ } } - t << "START EXTENSION qt/qmake_extra_pre_targetdep" << endl; + t << "START EXTENSION qt/qmake_extra_pre_targetdep.export" << endl; t << "OPTION PREDEP_TARGET " << absoluteTarget << endl; t << "OPTION DEPS " << absoluteDeps << endl; @@ -433,24 +452,23 @@ } } - // Write winscw deployment rules + // Write deployment rules QString remoteTestPath = epocRoot() + QLatin1String("epoc32/winscw/c/private/") + privateDirUid; DeploymentList depList; - initProjectDeploySymbian(project, depList, remoteTestPath, false, QLatin1String("winscw"), QLatin1String("udeb"), generatedDirs, generatedFiles); - //:QTP:QTPROD-92 Deployment of plugins requires WINSCW build before ARM build + //write emulator deployment t << "#if defined(WINSCW)" << endl; - //write WINSCW deployment - writeSbsDeploymentList(depList, t); - t << "#else" << endl; - //write ARMV5 deployment - remoteTestPath = epocRoot() + QLatin1String("epoc32/data/z/private/") + privateDirUid; - depList.clear(); - generatedDirs.clear(); - generatedFiles.clear(); - initProjectDeploySymbian(project, depList, remoteTestPath, false, QLatin1String("armv5"), QLatin1String("urel"), generatedDirs, generatedFiles); + initProjectDeploySymbian(project, depList, remoteTestPath, false, + QLatin1String(EMULATOR_DEPLOYMENT_PLATFORM), QString(), generatedDirs, generatedFiles); writeSbsDeploymentList(depList, t); t << "#endif" << endl; + + //write ROM deployment + remoteTestPath = epocRoot() + QLatin1String("epoc32/data/z/private/") + privateDirUid; + depList.clear(); + initProjectDeploySymbian(project, depList, remoteTestPath, false, + QLatin1String(ROM_DEPLOYMENT_PLATFORM), QString(), generatedDirs, generatedFiles); + writeSbsDeploymentList(depList, t); t << endl; // Write post link rules diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/symbian/symmake_sbsv2.h --- a/qmake/generators/symbian/symmake_sbsv2.h Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/symbian/symmake_sbsv2.h Mon May 03 13:17:34 2010 +0300 @@ -64,6 +64,7 @@ private: void exportFlm(); + void writeSbsDeploymentList(const DeploymentList& depList, QTextStream& t); QString extraTargetsCache; QString extraCompilersCache; diff -r 2f34d5167611 -r fcece45ef507 qmake/generators/win32/winmakefile.cpp --- a/qmake/generators/win32/winmakefile.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/qmake/generators/win32/winmakefile.cpp Mon May 03 13:17:34 2010 +0300 @@ -150,6 +150,10 @@ if(QMakeMetaInfo::libExists((*it).local() + Option::dir_sep + lib) || exists((*it).local() + Option::dir_sep + lib + extension)) { out = (*it).real() + Option::dir_sep + lib + extension; + if (out.contains(QLatin1Char(' '))) { + out.prepend(QLatin1Char('\"')); + out.append(QLatin1Char('\"')); + } break; } } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/abstractaudioeffect.cpp --- a/src/3rdparty/phonon/mmf/abstractaudioeffect.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/abstractaudioeffect.cpp Mon May 03 13:17:34 2010 +0300 @@ -20,7 +20,6 @@ #include "abstractaudioeffect.h" #include "audioplayer.h" -#include "mmf_videoplayer.h" QT_BEGIN_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/abstractaudioeffect.h --- a/src/3rdparty/phonon/mmf/abstractaudioeffect.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/abstractaudioeffect.h Mon May 03 13:17:34 2010 +0300 @@ -28,7 +28,6 @@ #include "audioplayer.h" #include "effectparameter.h" #include "mmf_medianode.h" -#include "mmf_videoplayer.h" class CMdaAudioOutputStream; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/abstractplayer.cpp --- a/src/3rdparty/phonon/mmf/abstractplayer.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/abstractplayer.cpp Mon May 03 13:17:34 2010 +0300 @@ -96,7 +96,7 @@ // Video output //----------------------------------------------------------------------------- -void MMF::AbstractPlayer::setVideoOutput(VideoOutput* videoOutput) +void MMF::AbstractPlayer::setVideoOutput(AbstractVideoOutput* videoOutput) { m_videoOutput = videoOutput; videoOutputChanged(); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/abstractplayer.h --- a/src/3rdparty/phonon/mmf/abstractplayer.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/abstractplayer.h Mon May 03 13:17:34 2010 +0300 @@ -24,7 +24,7 @@ #include -#include "videooutput.h" +#include "abstractvideooutput.h" class RFile; @@ -34,7 +34,6 @@ { namespace MMF { -class VideoOutput; /** * @short Interface which abstracts from MediaObject the current @@ -79,7 +78,7 @@ virtual void volumeChanged(qreal volume); - void setVideoOutput(VideoOutput* videoOutput); + void setVideoOutput(AbstractVideoOutput *videoOutput); /** * Records error message and changes state to ErrorState @@ -156,7 +155,7 @@ protected: // Not owned - VideoOutput* m_videoOutput; + AbstractVideoOutput* m_videoOutput; qreal m_volume; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/abstractvideooutput.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/abstractvideooutput.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,177 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#include "abstractvideooutput.h" +#include "utils.h" + +#ifndef QT_NO_DEBUG +#include "objectdump.h" +#endif + +#include // for qt_TSize2QSize + +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +using namespace Phonon; +using namespace Phonon::MMF; + +/*! \class MMF::AbstractVideoOutput + \internal +*/ + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +static const Phonon::VideoWidget::AspectRatio DefaultAspectRatio = + Phonon::VideoWidget::AspectRatioAuto; +static const Phonon::VideoWidget::ScaleMode DefaultScaleMode = + Phonon::VideoWidget::FitInView; + + +//----------------------------------------------------------------------------- +// Constructor / destructor +//----------------------------------------------------------------------------- + +MMF::AbstractVideoOutput::AbstractVideoOutput(QWidget *parent) + : QWidget(parent) + , m_aspectRatio(DefaultAspectRatio) + , m_scaleMode(DefaultScaleMode) +{ + +} + +MMF::AbstractVideoOutput::~AbstractVideoOutput() +{ + +} + +void MMF::AbstractVideoOutput::setVideoSize(const QSize &frameSize) +{ + TRACE_CONTEXT(AbstractVideoOutput::setVideoSize, EVideoInternal); + TRACE("oldSize %d %d newSize %d %d", + m_videoFrameSize.width(), m_videoFrameSize.height(), + frameSize.width(), frameSize.height()); + + if (frameSize != m_videoFrameSize) { + m_videoFrameSize = frameSize; + updateGeometry(); + } +} + + +//----------------------------------------------------------------------------- +// QWidget +//----------------------------------------------------------------------------- + +QSize MMF::AbstractVideoOutput::sizeHint() const +{ + // TODO: replace this with a more sensible default + QSize result(320, 240); + + if (!m_videoFrameSize.isNull()) + result = m_videoFrameSize; + + return result; +} + + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +RWindowBase* MMF::AbstractVideoOutput::videoWindow() const +{ + CCoeControl *control = internalWinId(); + if (!control) + control = effectiveWinId(); + + RWindowBase *window = 0; + if (control) + window = control->DrawableWindow(); + + return window; +} + +QSize MMF::AbstractVideoOutput::videoWindowSize() const +{ + QSize result; + if (RWindowBase *const window = videoWindow()) + result = qt_TSize2QSize(window->Size()); + return result; +} + +Phonon::VideoWidget::AspectRatio MMF::AbstractVideoOutput::aspectRatio() const +{ + return m_aspectRatio; +} + +void MMF::AbstractVideoOutput::setAspectRatio + (Phonon::VideoWidget::AspectRatio aspectRatio) +{ + if (m_aspectRatio != aspectRatio) { + m_aspectRatio = aspectRatio; + emit aspectRatioChanged(); + } +} + +Phonon::VideoWidget::ScaleMode MMF::AbstractVideoOutput::scaleMode() const +{ + return m_scaleMode; +} + +void MMF::AbstractVideoOutput::setScaleMode + (Phonon::VideoWidget::ScaleMode scaleMode) +{ + if (m_scaleMode != scaleMode) { + m_scaleMode = scaleMode; + emit scaleModeChanged(); + } +} + + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void MMF::AbstractVideoOutput::dump() const +{ +#ifndef QT_NO_DEBUG + TRACE_CONTEXT(AbstractVideoOutput::dump, EVideoInternal); + + QScopedPointer visitor(new ObjectDump::QVisitor); + visitor->setPrefix("Phonon::MMF"); // to aid searchability of logs + ObjectDump::addDefaultAnnotators(*visitor); + TRACE("Dumping tree from leaf 0x%08x:", this); + ObjectDump::dumpTreeFromLeaf(*this, *visitor); + + QScopedPointer dumper(new ObjectDump::QDumper); + dumper->setPrefix("Phonon::MMF"); // to aid searchability of logs + ObjectDump::addDefaultAnnotators(*dumper); + TRACE_0("Dumping AbstractVideoOutput:"); + dumper->dumpObject(*this); +#endif +} + +QT_END_NAMESPACE + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/abstractvideooutput.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/abstractvideooutput.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,93 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#ifndef PHONON_MMF_ABSTRACTVIDEOOUTPUT_H +#define PHONON_MMF_ABSTRACTVIDEOOUTPUT_H + +#include +#include +#include +#include "defs.h" + +#include +#include + +#include +class RWindowBase; + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace MMF +{ + +/** + * @short ABC for widget on which video is displayed + * + * @see DsaVideoOutput, SurfaceVideoOutput + */ +class AbstractVideoOutput + : public QWidget +{ + Q_OBJECT + +public: + ~AbstractVideoOutput(); + + // Set size of video frame. Called by VideoPlayer. + void setVideoSize(const QSize &size); + + RWindowBase* videoWindow() const; + QSize videoWindowSize() const; + + Phonon::VideoWidget::AspectRatio aspectRatio() const; + void setAspectRatio(Phonon::VideoWidget::AspectRatio aspectRatio); + + Phonon::VideoWidget::ScaleMode scaleMode() const; + void setScaleMode(Phonon::VideoWidget::ScaleMode scaleMode); + + // Debugging output + void dump() const; + +Q_SIGNALS: + void videoWindowChanged(); + void aspectRatioChanged(); + void scaleModeChanged(); + +protected: + AbstractVideoOutput(QWidget *parent); + +private: + // QWidget + QSize sizeHint() const; + +private: + // Dimensions of the video clip + QSize m_videoFrameSize; + + Phonon::VideoWidget::AspectRatio m_aspectRatio; + Phonon::VideoWidget::ScaleMode m_scaleMode; + +}; +} +} + +QT_END_NAMESPACE + +#endif diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/abstractvideoplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/abstractvideoplayer.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,490 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#include +#include +#include + +#include // for CCoeEnv + +#include "abstractvideoplayer.h" +#include "utils.h" + +#ifndef QT_NO_DEBUG +#include "objectdump.h" +#endif + +QT_BEGIN_NAMESPACE + +using namespace Phonon; +using namespace Phonon::MMF; + +/*! \class MMF::AbstractVideoPlayer + \internal +*/ + +//----------------------------------------------------------------------------- +// Constructor / destructor +//----------------------------------------------------------------------------- + +MMF::AbstractVideoPlayer::AbstractVideoPlayer(MediaObject *parent, const AbstractPlayer *player) + : AbstractMediaPlayer(parent, player) + , m_wsSession(CCoeEnv::Static()->WsSession()) + , m_screenDevice(*CCoeEnv::Static()->ScreenDevice()) + , m_window(0) + , m_scaleWidth(1.0) + , m_scaleHeight(1.0) + , m_totalTime(0) +{ + +} + +void MMF::AbstractVideoPlayer::construct() +{ + TRACE_CONTEXT(AbstractVideoPlayer::AbstractVideoPlayer, EVideoApi); + TRACE_ENTRY_0(); + + if (m_videoOutput) { + initVideoOutput(); + m_window = m_videoOutput->videoWindow(); + } + + createPlayer(); + + TRACE_EXIT_0(); +} + +MMF::AbstractVideoPlayer::~AbstractVideoPlayer() +{ + TRACE_CONTEXT(AbstractVideoPlayer::~AbstractVideoPlayer, EVideoApi); + TRACE_ENTRY_0(); + + // QObject destructor removes all signal-slot connections involving this + // object, so we do not need to disconnect from m_videoOutput here. + + TRACE_EXIT_0(); +} + +CVideoPlayerUtility* MMF::AbstractVideoPlayer::nativePlayer() const +{ + return m_player.data(); +} + +//----------------------------------------------------------------------------- +// Public API +//----------------------------------------------------------------------------- + +void MMF::AbstractVideoPlayer::doPlay() +{ + TRACE_CONTEXT(AbstractVideoPlayer::doPlay, EVideoApi); + + handlePendingParametersChanged(); + + m_player->Play(); +} + +void MMF::AbstractVideoPlayer::doPause() +{ + TRACE_CONTEXT(AbstractVideoPlayer::doPause, EVideoApi); + + TRAPD(err, m_player->PauseL()); + if (KErrNone != err && state() != ErrorState) { + TRACE("PauseL error %d", err); + setError(tr("Pause failed"), err); + } +} + +void MMF::AbstractVideoPlayer::doStop() +{ + m_player->Stop(); +} + +void MMF::AbstractVideoPlayer::doSeek(qint64 ms) +{ + TRACE_CONTEXT(AbstractVideoPlayer::doSeek, EVideoApi); + + TRAPD(err, m_player->SetPositionL(TTimeIntervalMicroSeconds(ms * 1000))); + + if (KErrNone != err) + setError(tr("Seek failed"), err); +} + +int MMF::AbstractVideoPlayer::setDeviceVolume(int mmfVolume) +{ + TRAPD(err, m_player->SetVolumeL(mmfVolume)); + return err; +} + +int MMF::AbstractVideoPlayer::openFile(RFile &file) +{ + TRAPD(err, m_player->OpenFileL(file)); + return err; +} + +int MMF::AbstractVideoPlayer::openUrl(const QString &url) +{ + TRAPD(err, m_player->OpenUrlL(qt_QString2TPtrC(url))); + return err; +} + +int MMF::AbstractVideoPlayer::bufferStatus() const +{ + int result = 0; + TRAP_IGNORE(m_player->GetVideoLoadingProgressL(result)); + return result; +} + +void MMF::AbstractVideoPlayer::close() +{ + m_player->Close(); +} + +bool MMF::AbstractVideoPlayer::hasVideo() const +{ + return true; +} + +qint64 MMF::AbstractVideoPlayer::currentTime() const +{ + TRACE_CONTEXT(AbstractVideoPlayer::currentTime, EVideoApi); + + TTimeIntervalMicroSeconds us; + TRAPD(err, us = m_player->PositionL()) + + qint64 result = 0; + + if (KErrNone == err) { + result = toMilliSeconds(us); + } else { + TRACE("PositionL error %d", err); + + // If we don't cast away constness here, we simply have to ignore + // the error. + const_cast(this)->setError(tr("Getting position failed"), err); + } + + return result; +} + +qint64 MMF::AbstractVideoPlayer::totalTime() const +{ + return m_totalTime; +} + + +//----------------------------------------------------------------------------- +// Public slots +//----------------------------------------------------------------------------- + +void MMF::AbstractVideoPlayer::videoWindowChanged() +{ + TRACE_CONTEXT(AbstractVideoPlayer::videoOutputRegionChanged, EVideoInternal); + TRACE_ENTRY("state %d", state()); + + m_window = m_videoOutput ? m_videoOutput->videoWindow() : 0; + + handleVideoWindowChanged(); + + TRACE_EXIT_0(); +} + +void MMF::AbstractVideoPlayer::aspectRatioChanged() +{ + TRACE_CONTEXT(AbstractVideoPlayer::aspectRatioChanged, EVideoInternal); + TRACE_ENTRY("state %d aspectRatio %d", state()); + + updateScaleFactors(m_videoOutput->videoWindowSize()); + + TRACE_EXIT_0(); +} + +void MMF::AbstractVideoPlayer::scaleModeChanged() +{ + TRACE_CONTEXT(AbstractVideoPlayer::scaleModeChanged, EVideoInternal); + TRACE_ENTRY("state %d", state()); + + updateScaleFactors(m_videoOutput->videoWindowSize()); + + TRACE_EXIT_0(); +} + + +//----------------------------------------------------------------------------- +// MVideoPlayerUtilityObserver callbacks +//----------------------------------------------------------------------------- + +void MMF::AbstractVideoPlayer::MvpuoOpenComplete(TInt aError) +{ + TRACE_CONTEXT(AbstractVideoPlayer::MvpuoOpenComplete, EVideoApi); + TRACE_ENTRY("state %d error %d", state(), aError); + + __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic)); + + if (KErrNone == aError) + m_player->Prepare(); + else + setError(tr("Opening clip failed"), aError); + + TRACE_EXIT_0(); +} + +void MMF::AbstractVideoPlayer::MvpuoPrepareComplete(TInt aError) +{ + TRACE_CONTEXT(AbstractVideoPlayer::MvpuoPrepareComplete, EVideoApi); + TRACE_ENTRY("state %d error %d", state(), aError); + + __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic)); + + TRAPD(err, getVideoClipParametersL(aError)); + + if (KErrNone == err) { + maxVolumeChanged(m_player->MaxVolume()); + + if (m_videoOutput) + m_videoOutput->setVideoSize(m_videoFrameSize); + + prepareCompleted(); + handlePendingParametersChanged(); + + emit totalTimeChanged(totalTime()); + changeState(StoppedState); + } else { + setError(tr("Buffering clip failed"), err); + } + + TRACE_EXIT_0(); +} + +void MMF::AbstractVideoPlayer::getVideoClipParametersL(TInt aError) +{ + User::LeaveIfError(aError); + + // Get frame size + TSize size; + m_player->VideoFrameSizeL(size); + m_videoFrameSize = QSize(size.iWidth, size.iHeight); + + // Get duration + m_totalTime = toMilliSeconds(m_player->DurationL()); +} + + +void MMF::AbstractVideoPlayer::MvpuoFrameReady(CFbsBitmap &aFrame, TInt aError) +{ + TRACE_CONTEXT(AbstractVideoPlayer::MvpuoFrameReady, EVideoApi); + TRACE_ENTRY("state %d error %d", state(), aError); + + Q_UNUSED(aFrame); + Q_UNUSED(aError); // suppress warnings in release builds + + TRACE_EXIT_0(); +} + +void MMF::AbstractVideoPlayer::MvpuoPlayComplete(TInt aError) +{ + TRACE_CONTEXT(AbstractVideoPlayer::MvpuoPlayComplete, EVideoApi) + TRACE_ENTRY("state %d error %d", state(), aError); + + // Call base class function which handles end of playback for both + // audio and video clips. + playbackComplete(aError); + + TRACE_EXIT_0(); +} + +void MMF::AbstractVideoPlayer::MvpuoEvent(const TMMFEvent &aEvent) +{ + TRACE_CONTEXT(AbstractVideoPlayer::MvpuoEvent, EVideoApi); + TRACE_ENTRY("state %d", state()); + + Q_UNUSED(aEvent); + + TRACE_EXIT_0(); +} + + +//----------------------------------------------------------------------------- +// MVideoLoadingObserver callbacks +//----------------------------------------------------------------------------- + +void MMF::AbstractVideoPlayer::MvloLoadingStarted() +{ + bufferingStarted(); +} + +void MMF::AbstractVideoPlayer::MvloLoadingComplete() +{ + bufferingComplete(); +} + + +//----------------------------------------------------------------------------- +// Video window updates +//----------------------------------------------------------------------------- + +void MMF::AbstractVideoPlayer::videoOutputChanged() +{ + TRACE_CONTEXT(AbstractVideoPlayer::videoOutputChanged, EVideoInternal); + TRACE_ENTRY_0(); + + if (m_videoOutput) + initVideoOutput(); + + videoWindowChanged(); + + TRACE_EXIT_0(); +} + +void MMF::AbstractVideoPlayer::initVideoOutput() +{ + bool connected = connect( + m_videoOutput, SIGNAL(videoWindowChanged()), + this, SLOT(videoWindowChanged()) + ); + Q_ASSERT(connected); + + connected = connect( + m_videoOutput, SIGNAL(aspectRatioChanged()), + this, SLOT(aspectRatioChanged()) + ); + Q_ASSERT(connected); + + connected = connect( + m_videoOutput, SIGNAL(scaleModeChanged()), + this, SLOT(scaleModeChanged()) + ); + Q_ASSERT(connected); + + // Suppress warnings in release builds + Q_UNUSED(connected); + + // Do these after all connections are complete, to ensure + // that any signals generated get to their destinations. + m_videoOutput->winId(); + m_videoOutput->setVideoSize(m_videoFrameSize); +} + +// Helper function for aspect ratio / scale mode handling +QSize scaleToAspect(const QSize &srcRect, int aspectWidth, int aspectHeight) +{ + const qreal aspectRatio = qreal(aspectWidth) / aspectHeight; + + int width = srcRect.width(); + int height = srcRect.width() / aspectRatio; + if (height > srcRect.height()){ + height = srcRect.height(); + width = srcRect.height() * aspectRatio; + } + return QSize(width, height); +} + +void MMF::AbstractVideoPlayer::updateScaleFactors(const QSize &windowSize, bool apply) +{ + if (m_videoFrameSize.isValid()) { + QRect videoRect; + + // Calculate size of smallest rect which contains video frame size + // and conforms to aspect ratio + switch (m_videoOutput->aspectRatio()) { + case Phonon::VideoWidget::AspectRatioAuto: + videoRect.setSize(m_videoFrameSize); + break; + + case Phonon::VideoWidget::AspectRatioWidget: + videoRect.setSize(windowSize); + break; + + case Phonon::VideoWidget::AspectRatio4_3: + videoRect.setSize(scaleToAspect(m_videoFrameSize, 4, 3)); + break; + + case Phonon::VideoWidget::AspectRatio16_9: + videoRect.setSize(scaleToAspect(m_videoFrameSize, 16, 9)); + break; + } + + // Scale to fill the window width + const int windowWidth = windowSize.width(); + const int windowHeight = windowSize.height(); + const qreal windowScaleFactor = qreal(windowWidth) / videoRect.width(); + int videoWidth = windowWidth; + int videoHeight = videoRect.height() * windowScaleFactor; + + const qreal windowToVideoHeightRatio = qreal(windowHeight) / videoHeight; + + switch (m_videoOutput->scaleMode()) { + case Phonon::VideoWidget::ScaleAndCrop: + if (videoHeight < windowHeight) { + videoWidth *= windowToVideoHeightRatio; + videoHeight = windowHeight; + } + break; + case Phonon::VideoWidget::FitInView: + default: + if (videoHeight > windowHeight) { + videoWidth *= windowToVideoHeightRatio; + videoHeight = windowHeight; + } + break; + } + + // Calculate scale factors + m_scaleWidth = 100.0f * videoWidth / m_videoFrameSize.width(); + m_scaleHeight = 100.0f * videoHeight / m_videoFrameSize.height(); + + if (apply) + parametersChanged(ScaleFactors); + } +} + +void MMF::AbstractVideoPlayer::parametersChanged(VideoParameters parameters) +{ + if (state() == LoadingState) + m_pendingChanges |= parameters; + else + handleParametersChanged(parameters); +} + +void MMF::AbstractVideoPlayer::handlePendingParametersChanged() +{ + if (m_pendingChanges) + handleParametersChanged(m_pendingChanges); + m_pendingChanges = 0; +} + + +//----------------------------------------------------------------------------- +// Metadata +//----------------------------------------------------------------------------- + +int MMF::AbstractVideoPlayer::numberOfMetaDataEntries() const +{ + int numberOfEntries = 0; + TRAP_IGNORE(numberOfEntries = m_player->NumberOfMetaDataEntriesL()); + return numberOfEntries; +} + +QPair MMF::AbstractVideoPlayer::metaDataEntry(int index) const +{ + CMMFMetaDataEntry *entry = 0; + QT_TRAP_THROWING(entry = m_player->MetaDataEntryL(index)); + return QPair(qt_TDesC2QString(entry->Name()), qt_TDesC2QString(entry->Value())); +} + +QT_END_NAMESPACE + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/abstractvideoplayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/abstractvideoplayer.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,171 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#ifndef PHONON_MMF_ABSTRACTVIDEOPLAYER_H +#define PHONON_MMF_ABSTRACTVIDEOPLAYER_H + +#include // from epoc32/include + +#include + +#include "abstractmediaplayer.h" +#include "abstractvideooutput.h" +#include "defs.h" + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace MMF +{ +/** + * @short ABC for classes which wrap the MMF video player utility + * + * On devices which use the legacy graphics subsystem which does not + * support surfaces, video rendering is done via Direct Screen Access using + * the CVideoPlayerUtility API. On devices with a graphics subsystem which + * does support surfaces, video rendering is done using the + * CVideoPlayerUtility2 API. Because CVideoPlayerUtility2 inherits from + * CVideoPlayerUtility, AbstractVideoPlayer holds a pointer to the latter. + * + * @see DsaVideoPlayer, SurfaceVideoPlayer + */ +class AbstractVideoPlayer + : public AbstractMediaPlayer + , public MVideoPlayerUtilityObserver + , public MVideoLoadingObserver +{ + Q_OBJECT + +public: + ~AbstractVideoPlayer(); + + typedef CVideoPlayerUtility NativePlayer; + NativePlayer *nativePlayer() const; + + // AbstractPlayer + virtual void doPlay(); + virtual void doPause(); + virtual void doStop(); + virtual void doSeek(qint64 milliseconds); + virtual int setDeviceVolume(int mmfVolume); + virtual int openFile(RFile &file); + virtual int openUrl(const QString &url); + virtual int bufferStatus() const; + virtual void close(); + + // MediaObjectInterface + virtual bool hasVideo() const; + virtual qint64 currentTime() const; + virtual qint64 totalTime() const; + + // AbstractPlayer + virtual void videoOutputChanged(); + + // AbstractMediaPlayer + virtual int numberOfMetaDataEntries() const; + virtual QPair metaDataEntry(int index) const; + +public Q_SLOTS: + void videoWindowChanged(); + void aspectRatioChanged(); + void scaleModeChanged(); + +protected: + AbstractVideoPlayer(MediaObject *parent, const AbstractPlayer *player); + void construct(); + virtual void initVideoOutput(); + void updateScaleFactors(const QSize &windowSize, bool apply = true); + + // Called when a video parameter changes. If the underlying native API is + // ready to handle the change, it is propagated immediately, otherwise the + // change is recorded in m_pendingChanged and handled later by + // handlePendingParametersChanged(). + void parametersChanged(VideoParameters parameter); + + // Implementation must initialize the m_player pointer. + virtual void createPlayer() = 0; + + // Called from the MvpuoPrepareComplete callback. Allows derived class to + // calculate clipping rectangles and scale factors prior to starting + // playback. + virtual void prepareCompleted() = 0; + + // Called when native video window handle changes. Derived class may defer + // propagation of this change to the MMF video player utility by calling + // parametersChanged(). + virtual void handleVideoWindowChanged() = 0; + + // Called when the derived class must handle changes which have been made + // to video parameters such as window handle, screen rectangle and scale + // factors. Guaranteed to be called only when the underlying MMF video + // player object is ready to handle changes to these parameters. + virtual void handleParametersChanged(VideoParameters parameters) = 0; + +private: + void getVideoClipParametersL(TInt aError); + + // Called when native player API enters a state in which it is able to + // handle pending changes such as new video window handle, updated scale + // factors etc. + void handlePendingParametersChanged(); + +private: + // MVideoPlayerUtilityObserver + virtual void MvpuoOpenComplete(TInt aError); + virtual void MvpuoPrepareComplete(TInt aError); + virtual void MvpuoFrameReady(CFbsBitmap &aFrame, TInt aError); + virtual void MvpuoPlayComplete(TInt aError); + virtual void MvpuoEvent(const TMMFEvent &aEvent); + + // MVideoLoadingObserver + virtual void MvloLoadingStarted(); + virtual void MvloLoadingComplete(); + +protected: + QScopedPointer m_player; + + // Not owned + RWsSession& m_wsSession; + CWsScreenDevice& m_screenDevice; + RWindowBase* m_window; + + // Scaling factors for video display, expressed as percentages + TReal32 m_scaleWidth; + TReal32 m_scaleHeight; + + // Dimensions of the video clip + QSize m_videoFrameSize; + +private: + // Bitmask of parameters which have changed while the MMF video player + // object is not yet ready to receive these changes. + // See handlePendingParametersChanged(). + VideoParameters m_pendingChanges; + + // Duration of the video clip + qint64 m_totalTime; + +}; + +} +} + +QT_END_NAMESPACE + +#endif diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/ancestormovemonitor.cpp --- a/src/3rdparty/phonon/mmf/ancestormovemonitor.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/ancestormovemonitor.cpp Mon May 03 13:17:34 2010 +0300 @@ -18,7 +18,8 @@ #include "ancestormovemonitor.h" #include "utils.h" -#include "videooutput.h" + +#include "videooutput_dsa.h" #include @@ -59,7 +60,7 @@ // Public functions //----------------------------------------------------------------------------- -void AncestorMoveMonitor::registerTarget(VideoOutput *target) +void AncestorMoveMonitor::registerTarget(DsaVideoOutput *target) { TRACE_CONTEXT(AncestorMoveMonitor::registerTarget, EVideoInternal); TRACE_ENTRY("target 0x%08x", target); @@ -93,7 +94,7 @@ TRACE_EXIT_0(); } -void AncestorMoveMonitor::unRegisterTarget(VideoOutput *target) +void AncestorMoveMonitor::unRegisterTarget(DsaVideoOutput *target) { TRACE_CONTEXT(AncestorMoveMonitor::unRegisterTarget, EVideoInternal); TRACE_ENTRY("target 0x%08x", target); @@ -126,7 +127,7 @@ const Hash::const_iterator it = m_hash.find(watched); if(it != m_hash.end()) { const TargetList& targetList = it.value(); - VideoOutput* target = 0; + DsaVideoOutput* target = 0; foreach(target, targetList) { switch (event->type()) { @@ -166,7 +167,7 @@ const QObject *ancestor = it.key(); TRACE("ancestor 0x%08x", ancestor); const TargetList& targetList = it.value(); - VideoOutput* target = 0; + DsaVideoOutput* target = 0; foreach(target, targetList) { TRACE(" target 0x%08x", target); } @@ -174,7 +175,5 @@ #endif } - - QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/ancestormovemonitor.h --- a/src/3rdparty/phonon/mmf/ancestormovemonitor.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/ancestormovemonitor.h Mon May 03 13:17:34 2010 +0300 @@ -29,7 +29,7 @@ { namespace MMF { -class VideoOutput; +class DsaVideoOutput; class AncestorMoveMonitor : public QObject { @@ -49,7 +49,7 @@ * ancestor list to be updated - therefore it should be called when * the target receives a ParentChange event. */ - void registerTarget(VideoOutput *target); + void registerTarget(DsaVideoOutput *target); /** * Remove target from the monitor. @@ -57,7 +57,7 @@ * The target will no longer receive notification when move events are * delivered to its ancestors. */ - void unRegisterTarget(VideoOutput *target); + void unRegisterTarget(DsaVideoOutput *target); protected: /** @@ -77,7 +77,7 @@ * therefore a set, however we use QList rather than QSet for * efficiency of iteration. */ - typedef QList TargetList; + typedef QList TargetList; /** * Map from widget on which the move event occurs, to widgets which @@ -92,4 +92,4 @@ QT_END_NAMESPACE -#endif +#endif // !PHONON_MMF_ANCESTORMOVEMONITOR_H diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/backend.cpp --- a/src/3rdparty/phonon/mmf/backend.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/backend.cpp Mon May 03 13:17:34 2010 +0300 @@ -24,7 +24,6 @@ #include // for TDataType #include "abstractaudioeffect.h" -#include "ancestormovemonitor.h" #include "audiooutput.h" #include "audioplayer.h" #include "backend.h" @@ -44,7 +43,9 @@ Backend::Backend(QObject *parent) : QObject(parent) +#ifndef PHONON_MMF_VIDEO_SURFACES , m_ancestorMoveMonitor(new AncestorMoveMonitor(this)) +#endif , m_effectFactory(new EffectFactory(this)) { TRACE_CONTEXT(Backend::Backend, EBackend); @@ -86,8 +87,15 @@ static_cast(args.first().toInt()); return m_effectFactory->createAudioEffect(type, parent); } + case VideoWidgetClass: - result = new VideoWidget(m_ancestorMoveMonitor.data(), qobject_cast(parent)); + { + VideoWidget *widget = new VideoWidget(qobject_cast(parent)); +#ifndef PHONON_MMF_VIDEO_SURFACES + widget->setAncestorMoveMonitor(m_ancestorMoveMonitor.data()); +#endif + result = widget; + } break; default: diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/backend.h --- a/src/3rdparty/phonon/mmf/backend.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/backend.h Mon May 03 13:17:34 2010 +0300 @@ -19,7 +19,10 @@ #ifndef PHONON_MMF_BACKEND_H #define PHONON_MMF_BACKEND_H +#ifndef PHONON_MMF_VIDEO_SURFACES #include "ancestormovemonitor.h" +#endif + #include "effectfactory.h" #include @@ -53,7 +56,9 @@ void objectDescriptionChanged(ObjectDescriptionType); private: +#ifndef PHONON_MMF_VIDEO_SURFACES QScopedPointer m_ancestorMoveMonitor; +#endif QScopedPointer m_effectFactory; }; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/defs.h --- a/src/3rdparty/phonon/mmf/defs.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/defs.h Mon May 03 13:17:34 2010 +0300 @@ -35,6 +35,15 @@ MediaTypeAudio, MediaTypeVideo }; + +enum VideoParameter { + WindowHandle = 0x1, + WindowScreenRect = 0x2, + ScaleFactors = 0x4 +}; +Q_DECLARE_FLAGS(VideoParameters, VideoParameter) +Q_DECLARE_OPERATORS_FOR_FLAGS(VideoParameters) + } } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/mediaobject.cpp --- a/src/3rdparty/phonon/mmf/mediaobject.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/mediaobject.cpp Mon May 03 13:17:34 2010 +0300 @@ -22,7 +22,13 @@ #include "dummyplayer.h" #include "utils.h" #include "utils.h" -#include "mmf_videoplayer.h" + +#ifdef PHONON_MMF_VIDEO_SURFACES +#include "videoplayer_surface.h" +#else +#include "videoplayer_dsa.h" +#endif + #include "videowidget.h" #include "mediaobject.h" @@ -293,7 +299,11 @@ break; case MediaTypeVideo: - newPlayer = new VideoPlayer(this, oldPlayer); +#ifdef PHONON_MMF_VIDEO_SURFACES + newPlayer = SurfaceVideoPlayer::create(this, oldPlayer); +#else + newPlayer = DsaVideoPlayer::create(this, oldPlayer); +#endif break; } @@ -383,7 +393,7 @@ // Video output //----------------------------------------------------------------------------- -void MMF::MediaObject::setVideoOutput(VideoOutput* videoOutput) +void MMF::MediaObject::setVideoOutput(AbstractVideoOutput* videoOutput) { m_player->setVideoOutput(videoOutput); } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/mediaobject.h --- a/src/3rdparty/phonon/mmf/mediaobject.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/mediaobject.h Mon May 03 13:17:34 2010 +0300 @@ -38,7 +38,7 @@ namespace MMF { class AbstractPlayer; -class VideoOutput; +class AbstractVideoOutput; /** * @short Facade class which wraps MMF client utility instance @@ -85,7 +85,7 @@ */ AbstractPlayer *abstractPlayer() const; - void setVideoOutput(VideoOutput* videoOutput); + void setVideoOutput(AbstractVideoOutput* videoOutput); public Q_SLOTS: void volumeChanged(qreal volume); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/mmf_videoplayer.cpp --- a/src/3rdparty/phonon/mmf/mmf_videoplayer.cpp Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,658 +0,0 @@ -/* This file is part of the KDE project. - -Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). - -This library is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 2.1 or 3 of the License. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this library. If not, see . - -*/ - -#include // for QApplication::activeWindow -#include -#include -#include - -#include // for CCoeEnv -#include - -#include "mmf_videoplayer.h" -#include "utils.h" - -#ifndef QT_NO_DEBUG -#include "objectdump.h" -#endif - -QT_BEGIN_NAMESPACE - -using namespace Phonon; -using namespace Phonon::MMF; - -/*! \class MMF::VideoPlayer - \internal -*/ - -//----------------------------------------------------------------------------- -// Constructor / destructor -//----------------------------------------------------------------------------- - -MMF::VideoPlayer::VideoPlayer(MediaObject *parent, const AbstractPlayer *player) - : AbstractMediaPlayer(parent, player) - , m_wsSession(CCoeEnv::Static()->WsSession()) - , m_screenDevice(*CCoeEnv::Static()->ScreenDevice()) - , m_window(0) - , m_totalTime(0) - , m_pendingChanges(false) - , m_dsaActive(false) -{ - construct(); -} - -void MMF::VideoPlayer::construct() -{ - TRACE_CONTEXT(VideoPlayer::VideoPlayer, EVideoApi); - TRACE_ENTRY_0(); - - getVideoWindow(); - - const TInt priority = 0; - const TMdaPriorityPreference preference = EMdaPriorityPreferenceNone; - - CVideoPlayerUtility *player = 0; - QT_TRAP_THROWING(player = CVideoPlayerUtility::NewL - ( - *this, - priority, preference, - m_wsSession, m_screenDevice, - *m_window, - m_videoRect, m_videoRect - ) - ); - m_player.reset(player); - - // CVideoPlayerUtility::NewL starts DSA - m_dsaActive = true; - - m_player->RegisterForVideoLoadingNotification(*this); - - TRACE_EXIT_0(); -} - -MMF::VideoPlayer::~VideoPlayer() -{ - TRACE_CONTEXT(VideoPlayer::~VideoPlayer, EVideoApi); - TRACE_ENTRY_0(); - - // QObject destructor removes all signal-slot connections involving this - // object, so we do not need to disconnect from m_videoOutput here. - - TRACE_EXIT_0(); -} - -CVideoPlayerUtility* MMF::VideoPlayer::nativePlayer() const -{ - return m_player.data(); -} - -//----------------------------------------------------------------------------- -// Public API -//----------------------------------------------------------------------------- - -void MMF::VideoPlayer::doPlay() -{ - TRACE_CONTEXT(VideoPlayer::doPlay, EVideoApi); - - applyPendingChanges(); - - m_player->Play(); -} - -void MMF::VideoPlayer::doPause() -{ - TRACE_CONTEXT(VideoPlayer::doPause, EVideoApi); - - TRAPD(err, m_player->PauseL()); - if (KErrNone != err && state() != ErrorState) { - TRACE("PauseL error %d", err); - setError(tr("Pause failed"), err); - } -} - -void MMF::VideoPlayer::doStop() -{ - m_player->Stop(); -} - -void MMF::VideoPlayer::doSeek(qint64 ms) -{ - TRACE_CONTEXT(VideoPlayer::doSeek, EVideoApi); - - TRAPD(err, m_player->SetPositionL(TTimeIntervalMicroSeconds(ms * 1000))); - - if(KErrNone != err) - setError(tr("Seek failed"), err); -} - -int MMF::VideoPlayer::setDeviceVolume(int mmfVolume) -{ - TRAPD(err, m_player->SetVolumeL(mmfVolume)); - return err; -} - -int MMF::VideoPlayer::openFile(RFile& file) -{ - TRAPD(err, m_player->OpenFileL(file)); - return err; -} - -int MMF::VideoPlayer::openUrl(const QString& url) -{ - TRAPD(err, m_player->OpenUrlL(qt_QString2TPtrC(url))); - return err; -} - -int MMF::VideoPlayer::bufferStatus() const -{ - int result = 0; - TRAP_IGNORE(m_player->GetVideoLoadingProgressL(result)); - return result; -} - -void MMF::VideoPlayer::close() -{ - m_player->Close(); -} - -bool MMF::VideoPlayer::hasVideo() const -{ - return true; -} - -qint64 MMF::VideoPlayer::currentTime() const -{ - TRACE_CONTEXT(VideoPlayer::currentTime, EVideoApi); - - TTimeIntervalMicroSeconds us; - TRAPD(err, us = m_player->PositionL()) - - qint64 result = 0; - - if (KErrNone == err) { - result = toMilliSeconds(us); - } else { - TRACE("PositionL error %d", err); - - // If we don't cast away constness here, we simply have to ignore - // the error. - const_cast(this)->setError(tr("Getting position failed"), err); - } - - return result; -} - -qint64 MMF::VideoPlayer::totalTime() const -{ - return m_totalTime; -} - - -//----------------------------------------------------------------------------- -// MVideoPlayerUtilityObserver callbacks -//----------------------------------------------------------------------------- - -void MMF::VideoPlayer::MvpuoOpenComplete(TInt aError) -{ - TRACE_CONTEXT(VideoPlayer::MvpuoOpenComplete, EVideoApi); - TRACE_ENTRY("state %d error %d", state(), aError); - - __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic)); - - if (KErrNone == aError) - m_player->Prepare(); - else - setError(tr("Opening clip failed"), aError); - - TRACE_EXIT_0(); -} - -void MMF::VideoPlayer::MvpuoPrepareComplete(TInt aError) -{ - TRACE_CONTEXT(VideoPlayer::MvpuoPrepareComplete, EVideoApi); - TRACE_ENTRY("state %d error %d", state(), aError); - - __ASSERT_ALWAYS(LoadingState == state(), Utils::panic(InvalidStatePanic)); - - TRAPD(err, doPrepareCompleteL(aError)); - - if (KErrNone == err) { - maxVolumeChanged(m_player->MaxVolume()); - - if (m_videoOutput) - m_videoOutput->setVideoSize(m_videoFrameSize); - - updateVideoRect(); - applyPendingChanges(); - - emit totalTimeChanged(totalTime()); - changeState(StoppedState); - } else { - setError(tr("Buffering clip failed"), err); - } - - TRACE_EXIT_0(); -} - -void MMF::VideoPlayer::doPrepareCompleteL(TInt aError) -{ - User::LeaveIfError(aError); - - // Get frame size - TSize size; - m_player->VideoFrameSizeL(size); - m_videoFrameSize = QSize(size.iWidth, size.iHeight); - - // Get duration - m_totalTime = toMilliSeconds(m_player->DurationL()); -} - - -void MMF::VideoPlayer::MvpuoFrameReady(CFbsBitmap &aFrame, TInt aError) -{ - TRACE_CONTEXT(VideoPlayer::MvpuoFrameReady, EVideoApi); - TRACE_ENTRY("state %d error %d", state(), aError); - - Q_UNUSED(aFrame); - Q_UNUSED(aError); // suppress warnings in release builds - - TRACE_EXIT_0(); -} - -void MMF::VideoPlayer::MvpuoPlayComplete(TInt aError) -{ - TRACE_CONTEXT(VideoPlayer::MvpuoPlayComplete, EVideoApi) - TRACE_ENTRY("state %d error %d", state(), aError); - - // Call base class function which handles end of playback for both - // audio and video clips. - playbackComplete(aError); - - TRACE_EXIT_0(); -} - -void MMF::VideoPlayer::MvpuoEvent(const TMMFEvent &aEvent) -{ - TRACE_CONTEXT(VideoPlayer::MvpuoEvent, EVideoApi); - TRACE_ENTRY("state %d", state()); - - Q_UNUSED(aEvent); - - TRACE_EXIT_0(); -} - - -//----------------------------------------------------------------------------- -// MVideoLoadingObserver callbacks -//----------------------------------------------------------------------------- - -void MMF::VideoPlayer::MvloLoadingStarted() -{ - bufferingStarted(); -} - -void MMF::VideoPlayer::MvloLoadingComplete() -{ - bufferingComplete(); -} - - -//----------------------------------------------------------------------------- -// Video window updates -//----------------------------------------------------------------------------- - -void MMF::VideoPlayer::getVideoWindow() -{ - TRACE_CONTEXT(VideoPlayer::getVideoWindow, EVideoInternal); - TRACE_ENTRY_0(); - - if(m_videoOutput) { - // Dump information to log, only in debug builds - m_videoOutput->dump(); - - initVideoOutput(); - videoWindowChanged(); - } else - // Top-level window - m_window = QApplication::activeWindow()->effectiveWinId()->DrawableWindow(); - - TRACE_EXIT_0(); -} - -void MMF::VideoPlayer::videoOutputChanged() -{ - TRACE_CONTEXT(VideoPlayer::videoOutputChanged, EVideoInternal); - TRACE_ENTRY_0(); - - if (m_videoOutput) { - initVideoOutput(); - videoWindowChanged(); - } - - TRACE_EXIT_0(); -} - -void MMF::VideoPlayer::initVideoOutput() -{ - m_videoOutput->winId(); - m_videoOutput->setVideoSize(m_videoFrameSize); - - bool connected = connect( - m_videoOutput, SIGNAL(videoWindowChanged()), - this, SLOT(videoWindowChanged()) - ); - Q_ASSERT(connected); - - connected = connect( - m_videoOutput, SIGNAL(beginVideoWindowNativePaint()), - this, SLOT(suspendDirectScreenAccess()) - ); - Q_ASSERT(connected); - - connected = connect( - m_videoOutput, SIGNAL(endVideoWindowNativePaint()), - this, SLOT(resumeDirectScreenAccess()) - ); - Q_ASSERT(connected); - - connected = connect( - m_videoOutput, SIGNAL(aspectRatioChanged()), - this, SLOT(aspectRatioChanged()) - ); - Q_ASSERT(connected); - - connected = connect( - m_videoOutput, SIGNAL(scaleModeChanged()), - this, SLOT(scaleModeChanged()) - ); - Q_ASSERT(connected); - - // Suppress warnings in release builds - Q_UNUSED(connected); -} - -void MMF::VideoPlayer::videoWindowChanged() -{ - TRACE_CONTEXT(VideoPlayer::videoOutputRegionChanged, EVideoInternal); - TRACE_ENTRY("state %d", state()); - - m_window = m_videoOutput->videoWindow(); - updateVideoRect(); - - TRACE_EXIT_0(); -} - -void MMF::VideoPlayer::suspendDirectScreenAccess() -{ - m_dsaWasActive = stopDirectScreenAccess(); -} - -void MMF::VideoPlayer::resumeDirectScreenAccess() -{ - if(m_dsaWasActive) { - startDirectScreenAccess(); - m_dsaWasActive = false; - } -} - -void MMF::VideoPlayer::startDirectScreenAccess() -{ - if(!m_dsaActive) { - TRAPD(err, m_player->StartDirectScreenAccessL()); - if(KErrNone == err) - m_dsaActive = true; - else - setError(tr("Video display error"), err); - } -} - -bool MMF::VideoPlayer::stopDirectScreenAccess() -{ - const bool dsaWasActive = m_dsaActive; - if(m_dsaActive) { - TRAPD(err, m_player->StopDirectScreenAccessL()); - if(KErrNone == err) - m_dsaActive = false; - else - setError(tr("Video display error"), err); - } - return dsaWasActive; -} - -// Helper function for aspect ratio / scale mode handling -QSize scaleToAspect(const QSize& srcRect, int aspectWidth, int aspectHeight) -{ - const qreal aspectRatio = qreal(aspectWidth) / aspectHeight; - - int width = srcRect.width(); - int height = srcRect.width() / aspectRatio; - if (height > srcRect.height()){ - height = srcRect.height(); - width = srcRect.height() * aspectRatio; - } - return QSize(width, height); -} - -void MMF::VideoPlayer::updateVideoRect() -{ - QRect videoRect; - QRect windowRect = m_videoOutput->videoWindowRect(); - - // Clip to physical window size - // This is due to a defect in the layout when running on S60 3.2, which - // results in the rectangle of the video widget extending outside the - // screen in certain circumstances. These include the initial startup - // of the mediaplayer demo in portrait mode. When this rectangle is - // passed to the CVideoPlayerUtility, no video is rendered. - const TSize screenSize = m_screenDevice.SizeInPixels(); - const QRect screenRect(0, 0, screenSize.iWidth, screenSize.iHeight); - windowRect = windowRect.intersected(screenRect); - - const QSize windowSize = windowRect.size(); - - // Calculate size of smallest rect which contains video frame size - // and conforms to aspect ratio - switch (m_videoOutput->aspectRatio()) { - case Phonon::VideoWidget::AspectRatioAuto: - videoRect.setSize(m_videoFrameSize); - break; - - case Phonon::VideoWidget::AspectRatioWidget: - videoRect.setSize(windowSize); - break; - - case Phonon::VideoWidget::AspectRatio4_3: - videoRect.setSize(scaleToAspect(m_videoFrameSize, 4, 3)); - break; - - case Phonon::VideoWidget::AspectRatio16_9: - videoRect.setSize(scaleToAspect(m_videoFrameSize, 16, 9)); - break; - } - - // Scale to fill the window width - const int windowWidth = windowSize.width(); - const int windowHeight = windowSize.height(); - const qreal windowScaleFactor = qreal(windowWidth) / videoRect.width(); - int videoWidth = windowWidth; - int videoHeight = videoRect.height() * windowScaleFactor; - - const qreal windowToVideoHeightRatio = qreal(windowHeight) / videoHeight; - - switch(m_videoOutput->scaleMode()) { - case Phonon::VideoWidget::ScaleAndCrop: - if(videoHeight < windowHeight) { - videoWidth *= windowToVideoHeightRatio; - videoHeight = windowHeight; - } - break; - case Phonon::VideoWidget::FitInView: - default: - if(videoHeight > windowHeight) { - videoWidth *= windowToVideoHeightRatio; - videoHeight = windowHeight; - } - break; - } - - // Calculate scale factors - m_scaleWidth = 100.0f * videoWidth / m_videoFrameSize.width(); - m_scaleHeight = 100.0f * videoHeight / m_videoFrameSize.height(); - - m_videoRect = qt_QRect2TRect(windowRect); - - if (state() == LoadingState) - m_pendingChanges = true; - else { - applyVideoWindowChange(); - m_pendingChanges = false; - } -} - -void MMF::VideoPlayer::aspectRatioChanged() -{ - TRACE_CONTEXT(VideoPlayer::aspectRatioChanged, EVideoInternal); - TRACE_ENTRY("state %d aspectRatio %d", state()); - - updateVideoRect(); - - TRACE_EXIT_0(); -} - -void MMF::VideoPlayer::scaleModeChanged() -{ - TRACE_CONTEXT(VideoPlayer::scaleModeChanged, EVideoInternal); - TRACE_ENTRY("state %d", state()); - - updateVideoRect(); - - TRACE_EXIT_0(); -} - -#ifndef QT_NO_DEBUG - -// The following code is for debugging problems related to video visibility. It allows -// the VideoPlayer instance to query the window server in order to determine the -// DSA drawing region for the video window. - -class CDummyAO : public CActive -{ -public: - CDummyAO() : CActive(CActive::EPriorityStandard) { CActiveScheduler::Add(this); } - void RunL() { } - void DoCancel() { } - TRequestStatus& Status() { return iStatus; } - void SetActive() { CActive::SetActive(); } -}; - -void getDsaRegion(RWsSession &session, const RWindowBase &window) -{ - RDirectScreenAccess dsa(session); - TInt err = dsa.Construct(); - CDummyAO ao; - RRegion* region; - err = dsa.Request(region, ao.Status(), window); - ao.SetActive(); - dsa.Close(); - ao.Cancel(); - if (region) { - qDebug() << "Phonon::MMF::getDsaRegion count" << region->Count(); - for (int i=0; iCount(); ++i) { - const TRect& rect = region->RectangleList()[i]; - qDebug() << "Phonon::MMF::getDsaRegion rect" - << rect.iTl.iX << rect.iTl.iY << rect.iBr.iX << rect.iBr.iY; - } - region->Close(); - } -} - -#endif // _DEBUG - -void MMF::VideoPlayer::applyPendingChanges() -{ - if(m_pendingChanges) - applyVideoWindowChange(); - - m_pendingChanges = false; -} - -void MMF::VideoPlayer::applyVideoWindowChange() -{ - TRACE_CONTEXT(VideoPlayer::applyVideoWindowChange, EVideoInternal); - TRACE_ENTRY_0(); - -#ifndef QT_NO_DEBUG - getDsaRegion(m_wsSession, *m_window); -#endif - - static const TBool antialias = ETrue; - - TRAPD(err, m_player->SetScaleFactorL(m_scaleWidth, m_scaleHeight, antialias)); - if(KErrNone != err) { - TRACE("SetScaleFactorL (1) err %d", err); - setError(tr("Video display error"), err); - } - - if(KErrNone == err) { - TRAP(err, - m_player->SetDisplayWindowL - ( - m_wsSession, m_screenDevice, - *m_window, - m_videoRect, m_videoRect - ) - ); - - if (KErrNone != err) { - TRACE("SetDisplayWindowL err %d", err); - setError(tr("Video display error"), err); - } else { - m_dsaActive = true; - TRAP(err, m_player->SetScaleFactorL(m_scaleWidth, m_scaleHeight, antialias)); - if(KErrNone != err) { - TRACE("SetScaleFactorL (2) err %d", err); - setError(tr("Video display error"), err); - } - } - } - - TRACE_EXIT_0(); -} - - -//----------------------------------------------------------------------------- -// Metadata -//----------------------------------------------------------------------------- - -int MMF::VideoPlayer::numberOfMetaDataEntries() const -{ - int numberOfEntries = 0; - TRAP_IGNORE(numberOfEntries = m_player->NumberOfMetaDataEntriesL()); - return numberOfEntries; -} - -QPair MMF::VideoPlayer::metaDataEntry(int index) const -{ - CMMFMetaDataEntry *entry = 0; - QT_TRAP_THROWING(entry = m_player->MetaDataEntryL(index)); - return QPair(qt_TDesC2QString(entry->Name()), qt_TDesC2QString(entry->Value())); -} - -QT_END_NAMESPACE - diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/mmf_videoplayer.h --- a/src/3rdparty/phonon/mmf/mmf_videoplayer.h Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,138 +0,0 @@ -/* This file is part of the KDE project. - -Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). - -This library is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 2.1 or 3 of the License. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this library. If not, see . - -*/ - -#ifndef PHONON_MMF_VIDEOPLAYER_H -#define PHONON_MMF_VIDEOPLAYER_H - -#include // from epoc32/include - -#include "abstractmediaplayer.h" -#include "videooutput.h" - -QT_BEGIN_NAMESPACE - -namespace Phonon -{ -namespace MMF -{ -/** - * @short Wrapper over MMF video client utility - * - * See - * How to - * play a video file using CVideoPlayerUtility - */ -class VideoPlayer : public AbstractMediaPlayer - , public MVideoPlayerUtilityObserver - , public MVideoLoadingObserver -{ - Q_OBJECT - -public: - VideoPlayer(MediaObject *parent = 0, const AbstractPlayer *player = 0); - virtual ~VideoPlayer(); - - typedef CVideoPlayerUtility NativePlayer; - NativePlayer *nativePlayer() const; - - // AbstractPlayer - virtual void doPlay(); - virtual void doPause(); - virtual void doStop(); - virtual void doSeek(qint64 milliseconds); - virtual int setDeviceVolume(int mmfVolume); - virtual int openFile(RFile& file); - virtual int openUrl(const QString& url); - virtual int bufferStatus() const; - virtual void close(); - - // MediaObjectInterface - virtual bool hasVideo() const; - virtual qint64 currentTime() const; - virtual qint64 totalTime() const; - - // AbstractPlayer - virtual void videoOutputChanged(); - - // AbstractMediaPlayer - virtual int numberOfMetaDataEntries() const; - virtual QPair metaDataEntry(int index) const; - -public Q_SLOTS: - void videoWindowChanged(); - void aspectRatioChanged(); - void scaleModeChanged(); - void suspendDirectScreenAccess(); - void resumeDirectScreenAccess(); - -private: - void construct(); - - void doPrepareCompleteL(TInt aError); - - void getVideoWindow(); - void initVideoOutput(); - void updateVideoRect(); - - void applyPendingChanges(); - void applyVideoWindowChange(); - - void startDirectScreenAccess(); - bool stopDirectScreenAccess(); - -private: - // MVideoPlayerUtilityObserver - virtual void MvpuoOpenComplete(TInt aError); - virtual void MvpuoPrepareComplete(TInt aError); - virtual void MvpuoFrameReady(CFbsBitmap &aFrame, TInt aError); - virtual void MvpuoPlayComplete(TInt aError); - virtual void MvpuoEvent(const TMMFEvent &aEvent); - - // MVideoLoadingObserver - virtual void MvloLoadingStarted(); - virtual void MvloLoadingComplete(); - -private: - QScopedPointer m_player; - - // Not owned - RWsSession& m_wsSession; - CWsScreenDevice& m_screenDevice; - RWindowBase* m_window; - - /* Extent of the video display - will be clipped to m_windowRect */ - TRect m_videoRect; - - TReal32 m_scaleWidth; - TReal32 m_scaleHeight; - - QSize m_videoFrameSize; - qint64 m_totalTime; - - bool m_pendingChanges; - bool m_dsaActive; - bool m_dsaWasActive; - -}; - -} -} - -QT_END_NAMESPACE - -#endif diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/utils.cpp --- a/src/3rdparty/phonon/mmf/utils.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/utils.cpp Mon May 03 13:17:34 2010 +0300 @@ -52,22 +52,24 @@ User::Panic(PanicCategory, code); } - -static const TInt KMimePrefixLength = 6; // either "audio/" or "video/" _LIT(KMimePrefixAudio, "audio/"); _LIT(KMimePrefixVideo, "video/"); +_LIT(KMimeSDP, "application/sdp"); + +enum ConstantStringLengths { + KMimePrefixLength = 6, // either "audio/" or "video/", + KMimeSDPLength = 15 // "application/sdp" +}; MMF::MediaType MMF::Utils::mimeTypeToMediaType(const TDesC& mimeType) { - MediaType result = MediaTypeUnknown; - if (mimeType.Left(KMimePrefixLength).Compare(KMimePrefixAudio) == 0) { - result = MediaTypeAudio; - } else if (mimeType.Left(KMimePrefixLength).Compare(KMimePrefixVideo) == 0) { - result = MediaTypeVideo; - } - - return result; + return MediaTypeAudio; + } else if (mimeType.Left(KMimePrefixLength).Compare(KMimePrefixVideo) == 0 || + mimeType.Left(KMimeSDPLength).Compare(KMimeSDP) == 0) { + return MediaTypeVideo; + } else + return MediaTypeUnknown; } QString MMF::Utils::symbianErrorToString(int errorCode) diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videooutput.cpp --- a/src/3rdparty/phonon/mmf/videooutput.cpp Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,303 +0,0 @@ -/* This file is part of the KDE project. - -Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). - -This library is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 2.1 or 3 of the License. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this library. If not, see . - -*/ - -#include "ancestormovemonitor.h" -#include "utils.h" -#include "videooutput.h" - -#ifndef QT_NO_DEBUG -#include "objectdump.h" -#endif - -#include -#include -#include -#include - -#include // for qt_TRect2QRect -#include // to access QWExtra - -#include - -#include // for CCoeEnv - -QT_BEGIN_NAMESPACE - -using namespace Phonon; -using namespace Phonon::MMF; - -/*! \class MMF::VideoOutput - \internal -*/ - -//----------------------------------------------------------------------------- -// Constants -//----------------------------------------------------------------------------- - -static const Phonon::VideoWidget::AspectRatio DefaultAspectRatio = - Phonon::VideoWidget::AspectRatioAuto; -static const Phonon::VideoWidget::ScaleMode DefaultScaleMode = - Phonon::VideoWidget::FitInView; - - -//----------------------------------------------------------------------------- -// Constructor / destructor -//----------------------------------------------------------------------------- - -MMF::VideoOutput::VideoOutput - (AncestorMoveMonitor* ancestorMoveMonitor, QWidget* parent) - : QWidget(parent) - , m_ancestorMoveMonitor(ancestorMoveMonitor) - , m_aspectRatio(DefaultAspectRatio) - , m_scaleMode(DefaultScaleMode) -{ - TRACE_CONTEXT(VideoOutput::VideoOutput, EVideoInternal); - TRACE_ENTRY("parent 0x%08x", parent); - - setPalette(QPalette(Qt::black)); - setAttribute(Qt::WA_OpaquePaintEvent, true); - setAttribute(Qt::WA_NoSystemBackground, true); - setAutoFillBackground(false); - - qt_widget_private(this)->extraData()->nativePaintMode = QWExtra::ZeroFill; - qt_widget_private(this)->extraData()->receiveNativePaintEvents = true; - - getVideoWindowRect(); - registerForAncestorMoved(); - - dump(); - - TRACE_EXIT_0(); -} - -MMF::VideoOutput::~VideoOutput() -{ - TRACE_CONTEXT(VideoOutput::~VideoOutput, EVideoInternal); - TRACE_ENTRY_0(); - - m_ancestorMoveMonitor->unRegisterTarget(this); - - TRACE_EXIT_0(); -} - -void MMF::VideoOutput::setVideoSize(const QSize& frameSize) -{ - TRACE_CONTEXT(VideoOutput::setVideoSize, EVideoInternal); - TRACE("oldSize %d %d newSize %d %d", - m_videoFrameSize.width(), m_videoFrameSize.height(), - frameSize.width(), frameSize.height()); - - if (frameSize != m_videoFrameSize) { - m_videoFrameSize = frameSize; - updateGeometry(); - } -} - -void MMF::VideoOutput::ancestorMoved() -{ - TRACE_CONTEXT(VideoOutput::ancestorMoved, EVideoInternal); - TRACE_ENTRY_0(); - - RWindowBase *const window = videoWindow(); - - if(window) { - const TPoint newWindowPosSymbian = window->AbsPosition(); - const QPoint newWindowPos(newWindowPosSymbian.iX, newWindowPosSymbian.iY); - - if(newWindowPos != m_videoWindowRect.topLeft()) { - m_videoWindowRect.moveTo(newWindowPos); - emit videoWindowChanged(); - } - } - - TRACE_EXIT_0(); -} - -//----------------------------------------------------------------------------- -// QWidget -//----------------------------------------------------------------------------- - -QSize MMF::VideoOutput::sizeHint() const -{ - // TODO: replace this with a more sensible default - QSize result(320, 240); - - if (!m_videoFrameSize.isNull()) - result = m_videoFrameSize; - - return result; -} - -void MMF::VideoOutput::paintEvent(QPaintEvent* event) -{ - TRACE_CONTEXT(VideoOutput::paintEvent, EVideoInternal); - TRACE("rect %d %d - %d %d", - event->rect().left(), event->rect().top(), - event->rect().right(), event->rect().bottom()); - TRACE("regions %d", event->region().rectCount()); - TRACE("type %d", event->type()); - - // Do nothing -} - -void MMF::VideoOutput::resizeEvent(QResizeEvent* event) -{ - TRACE_CONTEXT(VideoOutput::resizeEvent, EVideoInternal); - TRACE("%d %d -> %d %d", - event->oldSize().width(), event->oldSize().height(), - event->size().width(), event->size().height()); - - if(event->size() != event->oldSize()) { - m_videoWindowRect.setSize(event->size()); - emit videoWindowChanged(); - } -} - -void MMF::VideoOutput::moveEvent(QMoveEvent* event) -{ - TRACE_CONTEXT(VideoOutput::moveEvent, EVideoInternal); - TRACE("%d %d -> %d %d", - event->oldPos().x(), event->oldPos().y(), - event->pos().x(), event->pos().y()); - - if(event->pos() != event->oldPos()) { - m_videoWindowRect.moveTo(event->pos()); - emit videoWindowChanged(); - } -} - -bool MMF::VideoOutput::event(QEvent* event) -{ - TRACE_CONTEXT(VideoOutput::event, EVideoInternal); - - if (event->type() == QEvent::WinIdChange) { - TRACE_0("WinIdChange"); - getVideoWindowRect(); - emit videoWindowChanged(); - return true; - } else if (event->type() == QEvent::ParentChange) { - // Tell ancestor move monitor to update ancestor list for this widget - registerForAncestorMoved(); - return true; - } else - return QWidget::event(event); -} - - -//----------------------------------------------------------------------------- -// Public functions -//----------------------------------------------------------------------------- - -RWindowBase* MMF::VideoOutput::videoWindow() -{ - CCoeControl *control = internalWinId(); - if(!control) - control = effectiveWinId(); - - RWindowBase *window = 0; - if(control) - window = control->DrawableWindow(); - - return window; -} - -const QRect& MMF::VideoOutput::videoWindowRect() const -{ - return m_videoWindowRect; -} - -Phonon::VideoWidget::AspectRatio MMF::VideoOutput::aspectRatio() const -{ - return m_aspectRatio; -} - -void MMF::VideoOutput::setAspectRatio - (Phonon::VideoWidget::AspectRatio aspectRatio) -{ - if(m_aspectRatio != aspectRatio) { - m_aspectRatio = aspectRatio; - emit aspectRatioChanged(); - } -} - -Phonon::VideoWidget::ScaleMode MMF::VideoOutput::scaleMode() const -{ - return m_scaleMode; -} - -void MMF::VideoOutput::setScaleMode - (Phonon::VideoWidget::ScaleMode scaleMode) -{ - if(m_scaleMode != scaleMode) { - m_scaleMode = scaleMode; - emit scaleModeChanged(); - } -} - - -//----------------------------------------------------------------------------- -// Private functions -//----------------------------------------------------------------------------- - -void MMF::VideoOutput::getVideoWindowRect() -{ - RWindowBase *const window = videoWindow(); - if(window) - m_videoWindowRect = - qt_TRect2QRect(TRect(window->AbsPosition(), window->Size())); -} - -void MMF::VideoOutput::registerForAncestorMoved() -{ - m_ancestorMoveMonitor->registerTarget(this); -} - -void MMF::VideoOutput::dump() const -{ -#ifndef QT_NO_DEBUG - TRACE_CONTEXT(VideoOutput::dump, EVideoInternal); - - QScopedPointer visitor(new ObjectDump::QVisitor); - visitor->setPrefix("Phonon::MMF"); // to aid searchability of logs - ObjectDump::addDefaultAnnotators(*visitor); - TRACE("Dumping tree from leaf 0x%08x:", this); - ObjectDump::dumpTreeFromLeaf(*this, *visitor); - - QScopedPointer dumper(new ObjectDump::QDumper); - dumper->setPrefix("Phonon::MMF"); // to aid searchability of logs - ObjectDump::addDefaultAnnotators(*dumper); - TRACE_0("Dumping VideoOutput:"); - dumper->dumpObject(*this); -#endif -} - -void MMF::VideoOutput::beginNativePaintEvent(const QRect& /*controlRect*/) -{ - emit beginVideoWindowNativePaint(); -} - -void MMF::VideoOutput::endNativePaintEvent(const QRect& /*controlRect*/) -{ - // Ensure that draw ops are executed into the WSERV output framebuffer - CCoeEnv::Static()->WsSession().Flush(); - - emit endVideoWindowNativePaint(); -} - -QT_END_NAMESPACE - diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videooutput.h --- a/src/3rdparty/phonon/mmf/videooutput.h Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/* This file is part of the KDE project. - -Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). - -This library is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 2.1 or 3 of the License. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with this library. If not, see . - -*/ - -#ifndef PHONON_MMF_VIDEOOUTPUT_H -#define PHONON_MMF_VIDEOOUTPUT_H - -#include -#include -#include -#include "defs.h" - -#include - -#include -class RWindowBase; - -QT_BEGIN_NAMESPACE - -namespace Phonon -{ -namespace MMF -{ -class AncestorMoveMonitor; - -class VideoOutput : public QWidget -{ - Q_OBJECT - -public: - VideoOutput(AncestorMoveMonitor* ancestorMoveMonitor, QWidget* parent); - ~VideoOutput(); - - // Set size of video frame. Called by VideoPlayer. - void setVideoSize(const QSize& size); - - RWindowBase* videoWindow(); - const QRect& videoWindowRect() const; - - Phonon::VideoWidget::AspectRatio aspectRatio() const; - void setAspectRatio(Phonon::VideoWidget::AspectRatio aspectRatio); - - Phonon::VideoWidget::ScaleMode scaleMode() const; - void setScaleMode(Phonon::VideoWidget::ScaleMode scaleMode); - - // Called by AncestorMoveMonitor - void ancestorMoved(); - - // Debugging output - void dump() const; - -public Q_SLOTS: - void beginNativePaintEvent(const QRect& /*controlRect*/); - void endNativePaintEvent(const QRect& /*controlRect*/); - -Q_SIGNALS: - void videoWindowChanged(); - void aspectRatioChanged(); - void scaleModeChanged(); - void beginVideoWindowNativePaint(); - void endVideoWindowNativePaint(); - -protected: - // Override QWidget functions - QSize sizeHint() const; - void paintEvent(QPaintEvent* event); - void resizeEvent(QResizeEvent* event); - void moveEvent(QMoveEvent* event); - bool event(QEvent* event); - -private: - void getVideoWindowRect(); - void registerForAncestorMoved(); - -private: - // Not owned - AncestorMoveMonitor* m_ancestorMoveMonitor; - - QSize m_videoFrameSize; - QRect m_videoWindowRect; - - Phonon::VideoWidget::AspectRatio m_aspectRatio; - Phonon::VideoWidget::ScaleMode m_scaleMode; - -}; -} -} - -QT_END_NAMESPACE - -#endif diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videooutput_dsa.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/videooutput_dsa.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,177 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#include // for qt_TRect2QRect +#include // to access QWExtra +#include +#include + +#include // for CCoeEnv + +#include "ancestormovemonitor.h" +#include "utils.h" +#include "videooutput_dsa.h" + +QT_BEGIN_NAMESPACE + +using namespace Phonon; +using namespace Phonon::MMF; + +DsaVideoOutput::DsaVideoOutput(QWidget *parent) + : AbstractVideoOutput(parent) + , m_ancestorMoveMonitor(0) +{ + TRACE_CONTEXT(DsaVideoOutput::DsaVideoOutput, EVideoInternal); + TRACE_ENTRY("parent 0x%08x", parent); + + setPalette(QPalette(Qt::black)); + setAttribute(Qt::WA_OpaquePaintEvent, true); + setAttribute(Qt::WA_NoSystemBackground, true); + setAutoFillBackground(false); + + qt_widget_private(this)->extraData()->nativePaintMode = QWExtra::ZeroFill; + qt_widget_private(this)->extraData()->receiveNativePaintEvents = true; + + getVideoWindowScreenRect(); + + dump(); + + TRACE_EXIT_0(); +} + +DsaVideoOutput::~DsaVideoOutput() +{ + TRACE_CONTEXT(DsaVideoOutput::~DsaVideoOutput, EVideoInternal); + TRACE_ENTRY_0(); + + m_ancestorMoveMonitor->unRegisterTarget(this); + + TRACE_EXIT_0(); +} + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +void MMF::DsaVideoOutput::setAncestorMoveMonitor(AncestorMoveMonitor *monitor) +{ + m_ancestorMoveMonitor = monitor; + registerForAncestorMoved(); +} + +const QRect& MMF::DsaVideoOutput::videoWindowScreenRect() const +{ + return m_videoWindowScreenRect; +} + +void MMF::DsaVideoOutput::ancestorMoved() +{ + TRACE_CONTEXT(DsaVideoOutput::ancestorMoved, EVideoInternal); + TRACE_ENTRY_0(); + + RWindowBase *const window = videoWindow(); + + if (window) { + const TPoint newWindowPosSymbian = window->AbsPosition(); + const QPoint newWindowPos(newWindowPosSymbian.iX, newWindowPosSymbian.iY); + + if (newWindowPos != m_videoWindowScreenRect.topLeft()) { + m_videoWindowScreenRect.moveTo(newWindowPos); + emit videoWindowScreenRectChanged(); + } + } + + TRACE_EXIT_0(); +} + +void MMF::DsaVideoOutput::beginNativePaintEvent(const QRect & /*controlRect*/) +{ + emit beginVideoWindowNativePaint(); +} + +void MMF::DsaVideoOutput::endNativePaintEvent(const QRect & /*controlRect*/) +{ + // Ensure that draw ops are executed into the WSERV output framebuffer + CCoeEnv::Static()->WsSession().Flush(); + + emit endVideoWindowNativePaint(); +} + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void MMF::DsaVideoOutput::getVideoWindowScreenRect() +{ + RWindowBase *const window = videoWindow(); + if (window) + m_videoWindowScreenRect = + qt_TRect2QRect(TRect(window->AbsPosition(), window->Size())); +} + +void MMF::DsaVideoOutput::registerForAncestorMoved() +{ + m_ancestorMoveMonitor->registerTarget(this); +} + +void MMF::DsaVideoOutput::resizeEvent(QResizeEvent *event) +{ + TRACE_CONTEXT(DsaVideoOutput::resizeEvent, EVideoInternal); + TRACE("%d %d -> %d %d", + event->oldSize().width(), event->oldSize().height(), + event->size().width(), event->size().height()); + + if (event->size() != event->oldSize()) { + m_videoWindowScreenRect.setSize(event->size()); + emit videoWindowScreenRectChanged(); + } +} + +void MMF::DsaVideoOutput::moveEvent(QMoveEvent *event) +{ + TRACE_CONTEXT(DsaVideoOutput::moveEvent, EVideoInternal); + TRACE("%d %d -> %d %d", + event->oldPos().x(), event->oldPos().y(), + event->pos().x(), event->pos().y()); + + if (event->pos() != event->oldPos()) { + m_videoWindowScreenRect.moveTo(event->pos()); + emit videoWindowScreenRectChanged(); + } +} + +bool MMF::DsaVideoOutput::event(QEvent *event) +{ + TRACE_CONTEXT(DsaVideoOutput::event, EVideoInternal); + + if (event->type() == QEvent::WinIdChange) { + TRACE_0("WinIdChange"); + getVideoWindowScreenRect(); + emit videoWindowChanged(); + return true; + } else if (event->type() == QEvent::ParentChange) { + // Tell ancestor move monitor to update ancestor list for this widget + registerForAncestorMoved(); + return true; + } else { + return QWidget::event(event); + } +} + +QT_END_NAMESPACE + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videooutput_dsa.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/videooutput_dsa.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,109 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#ifndef PHONON_MMF_VIDEOOUTPUT_DSA_H +#define PHONON_MMF_VIDEOOUTPUT_DSA_H + +#include + +#include "phonon/mmf/abstractvideooutput.h" + +QT_BEGIN_NAMESPACE + +class QResizeEvent; +class QMoveEvent; + +namespace Phonon +{ +namespace MMF +{ +class AncestorMoveMonitor; + +/** + * @short Widget on which video is displayed by DSA rendering + * + * This implementation is used on devices with the legacy graphics + * subsystem, which does not support surfaces. On such devices, + * video rendering is done via Direct Screen Access (DSA), whereby + * the video decoder writes directly to the framebuffer. To ensure + * that the window server and video decoder do not try to draw to + * the same screen region at the same time, the video subsystem + * first requests permission to perform DSA. If the window server + * needs to draw to this screen region (for example to display a + * message dialog), it first notifies the video subsystem that it + * must stop rendering to this region. + * + * @see SurfaceVideoOutput + */ +class DsaVideoOutput + : public AbstractVideoOutput +{ + Q_OBJECT + +public: + DsaVideoOutput(QWidget *parent); + ~DsaVideoOutput(); + + void setAncestorMoveMonitor(AncestorMoveMonitor *monitor); + + // Get absolute screen rectangle for video window + const QRect& videoWindowScreenRect() const; + + // Called by AncestorMoveMonitor + void ancestorMoved(); + +public Q_SLOTS: + // Callbacks received from Symbian QtGui implementation, when it + // begins / ends blitting the video widget's backing store to the + // window server. + void beginNativePaintEvent(const QRect & /*controlRect*/); + void endNativePaintEvent(const QRect & /*controlRect*/); + +Q_SIGNALS: + void videoWindowScreenRectChanged(); + + // Emitted when the Symbian QtGui implementation begins / ends + // blitting the video widget's backing store to the window server. + void beginVideoWindowNativePaint(); + void endVideoWindowNativePaint(); + +private: + void getVideoWindowScreenRect(); + void registerForAncestorMoved(); + + // QWidget + void resizeEvent(QResizeEvent *event); + void moveEvent(QMoveEvent *event); + bool event(QEvent *event); + +private: + // Not owned + AncestorMoveMonitor* m_ancestorMoveMonitor; + + // Absolute screen rectangle on which video is displayed + QRect m_videoWindowScreenRect; + +}; + +} +} + +QT_END_NAMESPACE + +#endif // !PHONON_MMF_VIDEOOUTPUT_DSA_H + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videooutput_surface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/videooutput_surface.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,87 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#include + +#include // for qt_TRect2QRect +#include // to access QWExtra + +#include "utils.h" +#include "videooutput_surface.h" + +QT_BEGIN_NAMESPACE + +using namespace Phonon; +using namespace Phonon::MMF; + +SurfaceVideoOutput::SurfaceVideoOutput(QWidget *parent) + : AbstractVideoOutput(parent) +{ + TRACE_CONTEXT(SurfaceVideoOutput::SurfaceVideoOutput, EVideoInternal); + TRACE_ENTRY("parent 0x%08x", parent); + + qt_widget_private(this)->createExtra(); + qt_widget_private(this)->extraData()->nativePaintMode = QWExtra::Disable; + + TRACE_EXIT_0(); +} + +SurfaceVideoOutput::~SurfaceVideoOutput() +{ + TRACE_CONTEXT(SurfaceVideoOutput::~SurfaceVideoOutput, EVideoInternal); + TRACE_ENTRY_0(); + + TRACE_EXIT_0(); +} + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void MMF::SurfaceVideoOutput::resizeEvent(QResizeEvent *event) +{ + TRACE_CONTEXT(SurfaceVideoOutput::resizeEvent, EVideoInternal); + TRACE("%d %d -> %d %d", + event->oldSize().width(), event->oldSize().height(), + event->size().width(), event->size().height()); + + if (event->size() != event->oldSize()) + emit videoWindowSizeChanged(); +} + +bool MMF::SurfaceVideoOutput::event(QEvent *event) +{ + TRACE_CONTEXT(SurfaceVideoOutput::event, EVideoInternal); + + if (event->type() == QEvent::WinIdChange) { + TRACE_0("WinIdChange"); + emit videoWindowChanged(); + return true; + } else { + return QWidget::event(event); + } +} + + +QT_END_NAMESPACE + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videooutput_surface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/videooutput_surface.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,66 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#ifndef PHONON_MMF_VIDEOOUTPUT_SURFACE_H +#define PHONON_MMF_VIDEOOUTPUT_SURFACE_H + +#include "phonon/mmf/abstractvideooutput.h" + +QT_BEGIN_NAMESPACE + +class QResizeEvent; + +namespace Phonon +{ +namespace MMF +{ + +/** + * @short Widget on which video is displayed by rendering to a surface + * + * This implementation is used on devices with a graphics subsystem which + * supports surfaces. + * + * @see DsaVideoOutput + */ +class SurfaceVideoOutput + : public AbstractVideoOutput +{ + Q_OBJECT + +public: + SurfaceVideoOutput(QWidget *parent); + ~SurfaceVideoOutput(); + +Q_SIGNALS: + void videoWindowSizeChanged(); + +private: + // QWidget + void resizeEvent(QResizeEvent *event); + bool event(QEvent *event); + +}; + +} +} + +QT_END_NAMESPACE + +#endif // !PHONON_MMF_VIDEOOUTPUT_SURFACE_H + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videoplayer_dsa.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/videoplayer_dsa.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,291 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#include // for CCoeControl + +#include // for QApplication::activeWindow +#include // for qt_TRect2QRect + +#include "utils.h" +#include "videooutput_dsa.h" +#include "videoplayer_dsa.h" + +QT_BEGIN_NAMESPACE + +using namespace Phonon; +using namespace Phonon::MMF; + +// Two-phase constructor idiom is used because construct() calls virtual +// functions and therefore cannot be called from the AbstractVideoPlayer +// C++ constructor. +DsaVideoPlayer* DsaVideoPlayer::create(MediaObject *parent, + const AbstractPlayer *player) +{ + QScopedPointer self(new DsaVideoPlayer(parent, player)); + self->construct(); + return self.take(); +} + +DsaVideoPlayer::DsaVideoPlayer(MediaObject *parent, const AbstractPlayer *player) + : AbstractVideoPlayer(parent, player) + , m_dsaActive(false) + , m_dsaWasActive(false) +{ + +} + +DsaVideoPlayer::~DsaVideoPlayer() +{ + +} + + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +void MMF::DsaVideoPlayer::videoWindowScreenRectChanged() +{ + QRect windowRect = static_cast(m_videoOutput)->videoWindowScreenRect(); + + // Clip to physical window size + // This is due to a defect in the layout when running on S60 3.2, which + // results in the rectangle of the video widget extending outside the + // screen in certain circumstances. These include the initial startup + // of the mediaplayer demo in portrait mode. When this rectangle is + // passed to the CVideoPlayerUtility, no video is rendered. + const TSize screenSize = m_screenDevice.SizeInPixels(); + const QRect screenRect(0, 0, screenSize.iWidth, screenSize.iHeight); + windowRect = windowRect.intersected(screenRect); + + // Recalculate scale factors. Pass 'false' as second parameter in order to + // suppress application of the change to the player - this is done at the end + // of the function. + updateScaleFactors(windowRect.size(), false); + + m_videoScreenRect = qt_QRect2TRect(windowRect); + + parametersChanged(WindowScreenRect | ScaleFactors); +} + +void MMF::DsaVideoPlayer::suspendDirectScreenAccess() +{ + m_dsaWasActive = stopDirectScreenAccess(); +} + +void MMF::DsaVideoPlayer::resumeDirectScreenAccess() +{ + if (m_dsaWasActive) { + startDirectScreenAccess(); + m_dsaWasActive = false; + } +} + + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void MMF::DsaVideoPlayer::createPlayer() +{ + // A window handle must be provided in order to construct + // CVideoPlayerUtility. If no VideoOutput has yet been connected to this + // player, we temporarily use the top-level application window handle. + // No video ever gets rendered into this window; SetDisplayWindowL is + // always called before rendering actually begins. + if (!m_window) + m_window = QApplication::activeWindow()->effectiveWinId()->DrawableWindow(); + + const TInt priority = 0; + const TMdaPriorityPreference preference = EMdaPriorityPreferenceNone; + + CVideoPlayerUtility *player = 0; + QT_TRAP_THROWING(player = CVideoPlayerUtility::NewL(*this, + priority, preference, + m_wsSession, m_screenDevice, + *m_window, + m_videoScreenRect, m_videoScreenRect)); + m_player.reset(player); + + // CVideoPlayerUtility::NewL starts DSA + m_dsaActive = true; + + m_player->RegisterForVideoLoadingNotification(*this); +} + +void MMF::DsaVideoPlayer::initVideoOutput() +{ + bool connected = connect( + m_videoOutput, SIGNAL(videoWindowScreenRectChanged()), + this, SLOT(videoWindowScreenRectChanged()) + ); + Q_ASSERT(connected); + + connected = connect( + m_videoOutput, SIGNAL(beginVideoWindowNativePaint()), + this, SLOT(suspendDirectScreenAccess()) + ); + Q_ASSERT(connected); + + connected = connect( + m_videoOutput, SIGNAL(endVideoWindowNativePaint()), + this, SLOT(resumeDirectScreenAccess()) + ); + Q_ASSERT(connected); + + // Suppress warnings in release builds + Q_UNUSED(connected); + + AbstractVideoPlayer::initVideoOutput(); +} + +void MMF::DsaVideoPlayer::prepareCompleted() +{ + videoWindowScreenRectChanged(); +} + +void MMF::DsaVideoPlayer::handleVideoWindowChanged() +{ + if (!m_window) { + if (QWidget *window = QApplication::activeWindow()) + m_window = window->effectiveWinId()->DrawableWindow(); + else + m_window = 0; + m_videoScreenRect = TRect(); + } + + parametersChanged(WindowHandle | WindowScreenRect); +} + +#ifndef QT_NO_DEBUG + +// The following code is for debugging problems related to video visibility. It allows +// the VideoPlayer instance to query the window server in order to determine the +// DSA drawing region for the video window. + +class CDummyAO : public CActive +{ +public: + CDummyAO() : CActive(CActive::EPriorityStandard) { CActiveScheduler::Add(this); } + void RunL() { } + void DoCancel() { } + TRequestStatus& Status() { return iStatus; } + void SetActive() { CActive::SetActive(); } +}; + +void getDsaRegion(RWsSession &session, const RWindowBase &window) +{ + RDirectScreenAccess dsa(session); + TInt err = dsa.Construct(); + CDummyAO ao; + RRegion* region; + err = dsa.Request(region, ao.Status(), window); + ao.SetActive(); + dsa.Close(); + ao.Cancel(); + if (region) { + qDebug() << "Phonon::MMF::getDsaRegion count" << region->Count(); + for (int i=0; iCount(); ++i) { + const TRect& rect = region->RectangleList()[i]; + qDebug() << "Phonon::MMF::getDsaRegion rect" + << rect.iTl.iX << rect.iTl.iY << rect.iBr.iX << rect.iBr.iY; + } + region->Close(); + } +} + +#endif // QT_NO_DEBUG + +void MMF::DsaVideoPlayer::handleParametersChanged(VideoParameters parameters) +{ + TRACE_CONTEXT(DsaVideoPlayer::handleParametersChanged, EVideoInternal); + TRACE_ENTRY_0(); + + if (!m_window) + return; + +#ifndef QT_NO_DEBUG + getDsaRegion(m_wsSession, *m_window); +#endif + + static const TBool antialias = ETrue; + int err = KErrNone; + + if (parameters & ScaleFactors) { + TRAP(err, m_player->SetScaleFactorL(m_scaleWidth, m_scaleHeight, + antialias)); + if(KErrNone != err) { + TRACE("SetScaleFactorL (1) err %d", err); + setError(tr("Video display error"), err); + } + } + + if (KErrNone == err) { + if (parameters & WindowHandle || parameters & WindowScreenRect) { + TRAP(err, + m_player->SetDisplayWindowL(m_wsSession, m_screenDevice, + *m_window, + m_videoScreenRect, + m_videoScreenRect)); + } + + if (KErrNone != err) { + TRACE("SetDisplayWindowL err %d", err); + setError(tr("Video display error"), err); + } else { + m_dsaActive = true; + if (parameters & ScaleFactors) { + TRAP(err, m_player->SetScaleFactorL(m_scaleWidth, m_scaleHeight, + antialias)); + if (KErrNone != err) { + TRACE("SetScaleFactorL (2) err %d", err); + setError(tr("Video display error"), err); + } + } + } + } + + TRACE_EXIT_0(); +} + +void MMF::DsaVideoPlayer::startDirectScreenAccess() +{ + if (!m_dsaActive) { + TRAPD(err, m_player->StartDirectScreenAccessL()); + if (KErrNone == err) + m_dsaActive = true; + else + setError(tr("Video display error"), err); + } +} + +bool MMF::DsaVideoPlayer::stopDirectScreenAccess() +{ + const bool dsaWasActive = m_dsaActive; + if (m_dsaActive) { + TRAPD(err, m_player->StopDirectScreenAccessL()); + if (KErrNone == err) + m_dsaActive = false; + else + setError(tr("Video display error"), err); + } + return dsaWasActive; +} + +QT_END_NAMESPACE + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videoplayer_dsa.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/videoplayer_dsa.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,92 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#ifndef PHONON_MMF_VIDEOPLAYER_DSA_H +#define PHONON_MMF_VIDEOPLAYER_DSA_H + +#include "abstractvideoplayer.h" + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace MMF +{ + +/** + * @short Wrapper over the MMF video player utility (DSA version) + * + * This implementation is used on devices with the legacy graphics + * subsystem, which does not support surfaces. On such devices, + * video rendering is done via Direct Screen Access (DSA), whereby + * the video decoder writes directly to the framebuffer. To ensure + * that the window server and video decoder do not try to draw to + * the same screen region at the same time, the video subsystem + * first requests permission to perform DSA. If the window server + * needs to draw to this screen region (for example to display a + * message dialog), it first notifies the video subsystem that it + * must stop rendering to this region. + * + * @see SurfaceVideoPlayer + */ +class DsaVideoPlayer + : public AbstractVideoPlayer +{ + Q_OBJECT + +public: + // Factory function + static DsaVideoPlayer* create(MediaObject *parent = 0, + const AbstractPlayer *player = 0); + ~DsaVideoPlayer(); + +public Q_SLOTS: + void videoWindowScreenRectChanged(); + void suspendDirectScreenAccess(); + void resumeDirectScreenAccess(); + +private: + DsaVideoPlayer(MediaObject *parent, const AbstractPlayer *player); + + // AbstractVideoPlayer + void createPlayer(); + void initVideoOutput(); + void prepareCompleted(); + void handleVideoWindowChanged(); + void handleParametersChanged(VideoParameters parameters); + + void startDirectScreenAccess(); + bool stopDirectScreenAccess(); + +private: + bool m_dsaActive; + bool m_dsaWasActive; + + // Absolute screen rectangle on which video is displayed + TRect m_videoScreenRect; + +}; + +} +} + +QT_END_NAMESPACE + +#endif // !PHONON_MMF_VIDEOPLAYER_DSA_H + + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videoplayer_surface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/videoplayer_surface.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,150 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#include + +#include // for qt_QRect2TRect + +#include "utils.h" +#include "videooutput_surface.h" +#include "videoplayer_surface.h" + +QT_BEGIN_NAMESPACE + +using namespace Phonon; +using namespace Phonon::MMF; + +// Two-phase constructor idiom is used because construct() calls virtual +// functions and therefore cannot be called from the AbstractVideoPlayer +// C++ constructor. +SurfaceVideoPlayer* SurfaceVideoPlayer::create(MediaObject *parent, + const AbstractPlayer *player) +{ + QScopedPointer self(new SurfaceVideoPlayer(parent, player)); + self->construct(); + return self.take(); +} + +SurfaceVideoPlayer::SurfaceVideoPlayer(MediaObject *parent, const AbstractPlayer *player) + : AbstractVideoPlayer(parent, player) + , m_displayWindow(0) +{ + +} + +SurfaceVideoPlayer::~SurfaceVideoPlayer() +{ + +} + + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +void MMF::SurfaceVideoPlayer::videoWindowSizeChanged() +{ + updateScaleFactors(m_videoOutput->videoWindowSize()); +} + + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void MMF::SurfaceVideoPlayer::createPlayer() +{ + const TInt priority = 0; + const TMdaPriorityPreference preference = EMdaPriorityPreferenceNone; + + CVideoPlayerUtility2 *player = 0; + QT_TRAP_THROWING(player = CVideoPlayerUtility2::NewL(*this, + priority, preference)); + m_player.reset(player); +} + +void MMF::SurfaceVideoPlayer::initVideoOutput() +{ + bool connected = connect( + m_videoOutput, SIGNAL(videoWindowSizeChanged()), + this, SLOT(videoWindowSizeChanged()) + ); + Q_ASSERT(connected); + + // Suppress warnings in release builds + Q_UNUSED(connected); + + AbstractVideoPlayer::initVideoOutput(); +} + +void MMF::SurfaceVideoPlayer::prepareCompleted() +{ + videoWindowSizeChanged(); +} + +void MMF::SurfaceVideoPlayer::handleVideoWindowChanged() +{ + parametersChanged(WindowHandle); +} + +void MMF::SurfaceVideoPlayer::handleParametersChanged(VideoParameters parameters) +{ + CVideoPlayerUtility2 *player = static_cast(m_player.data()); + + int err = KErrNone; + + TRect rect; + + if (m_videoOutput) { + m_videoOutput->dump(); + const QSize size = m_videoOutput->videoWindowSize(); + rect.SetSize(TSize(size.width(), size.height())); + } + + if (parameters & WindowHandle) { + if (m_displayWindow) + player->RemoveDisplayWindow(*m_displayWindow); + + RWindow *window = static_cast(m_window); + if (window) { + window->SetBackgroundColor(TRgb(0, 0, 0, 255)); + TRAP(err, player->AddDisplayWindowL(m_wsSession, m_screenDevice, *window, rect, rect)); + if (KErrNone != err) { + setError(tr("Video display error"), err); + window = 0; + } + } + m_displayWindow = window; + } + + if (KErrNone == err) { + if (parameters & ScaleFactors) { + Q_ASSERT(m_displayWindow); + TRAP(err, player->SetVideoExtentL(*m_displayWindow, rect)); + if (KErrNone == err) + TRAP(err, player->SetWindowClipRectL(*m_displayWindow, rect)); + if (KErrNone == err) + TRAP(err, player->SetScaleFactorL(*m_displayWindow, m_scaleWidth, m_scaleHeight)); + if (KErrNone != err) + setError(tr("Video display error"), err); + } + } +} + +QT_END_NAMESPACE + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videoplayer_surface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/phonon/mmf/videoplayer_surface.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,78 @@ +/* This file is part of the KDE project. + +Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + +This library is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 2.1 or 3 of the License. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library. If not, see . + +*/ + +#ifndef PHONON_MMF_VIDEOPLAYER_SURFACE_H +#define PHONON_MMF_VIDEOPLAYER_SURFACE_H + +#include "abstractvideoplayer.h" + +class RWindow; + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace MMF +{ + +/** + * @short Wrapper over the MMF video player utility (surface version) + * + * This implementation is used on devices with a graphics subsystem which + * supports surfaces. + * + * @see DsaVideoPlayer + */ +class SurfaceVideoPlayer + : public AbstractVideoPlayer +{ + Q_OBJECT + +public: + // Factory function + static SurfaceVideoPlayer* create(MediaObject *parent = 0, + const AbstractPlayer *player = 0); + ~SurfaceVideoPlayer(); + +public Q_SLOTS: + void videoWindowSizeChanged(); + +private: + SurfaceVideoPlayer(MediaObject *parent, const AbstractPlayer *player); + + // AbstractVideoPlayer + void createPlayer(); + void initVideoOutput(); + void prepareCompleted(); + void handleVideoWindowChanged(); + void handleParametersChanged(VideoParameters parameters); + +private: + // Window handle which has been passed to the MMF via + // CVideoPlayerUtility2::SetDisplayWindowL + RWindow* m_displayWindow; + +}; + +} +} + +QT_END_NAMESPACE + +#endif // !PHONON_MMF_VIDEOPLAYER_SURFACE_H + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videowidget.cpp --- a/src/3rdparty/phonon/mmf/videowidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/videowidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -18,10 +18,15 @@ #include "mediaobject.h" #include "utils.h" -#include "videooutput.h" #include "videowidget.h" +#ifdef PHONON_MMF_VIDEO_SURFACES +#include "videooutput_surface.h" +#else +#include "videooutput_dsa.h" +#endif + QT_BEGIN_NAMESPACE using namespace Phonon; @@ -45,10 +50,13 @@ // Constructor / destructor //----------------------------------------------------------------------------- -MMF::VideoWidget::VideoWidget - (AncestorMoveMonitor* ancestorMoveMonitor, QWidget* parent) +MMF::VideoWidget::VideoWidget(QWidget *parent) : MediaNode(parent) - , m_videoOutput(new VideoOutput(ancestorMoveMonitor, parent)) +#ifdef PHONON_MMF_VIDEO_SURFACES + , m_videoOutput(new SurfaceVideoOutput(parent)) +#else + , m_videoOutput(new DsaVideoOutput(parent)) +#endif , m_brightness(DefaultBrightness) , m_contrast(DefaultContrast) , m_hue(DefaultHue) @@ -68,6 +76,13 @@ TRACE_EXIT_0(); } +#ifndef PHONON_MMF_VIDEO_SURFACES +void MMF::VideoWidget::setAncestorMoveMonitor(AncestorMoveMonitor *monitor) +{ + static_cast(m_videoOutput.data())->setAncestorMoveMonitor(monitor); +} +#endif + //----------------------------------------------------------------------------- // VideoWidgetInterface diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/phonon/mmf/videowidget.h --- a/src/3rdparty/phonon/mmf/videowidget.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/phonon/mmf/videowidget.h Mon May 03 13:17:34 2010 +0300 @@ -19,8 +19,8 @@ #ifndef PHONON_MMF_VIDEOWIDGET_H #define PHONON_MMF_VIDEOWIDGET_H +#include "abstractvideooutput.h" #include "mmf_medianode.h" -#include "videooutput.h" #include #include @@ -32,8 +32,9 @@ { namespace MMF { +#ifndef PHONON_MMF_VIDEO_SURFACES class AncestorMoveMonitor; -class VideoOutput; +#endif class VideoWidget : public MediaNode , public Phonon::VideoWidgetInterface @@ -42,9 +43,13 @@ Q_INTERFACES(Phonon::VideoWidgetInterface) public: - VideoWidget(AncestorMoveMonitor* ancestorMoveMonitor, QWidget* parent); + VideoWidget(QWidget* parent); ~VideoWidget(); +#ifndef PHONON_MMF_VIDEO_SURFACES + void setAncestorMoveMonitor(AncestorMoveMonitor *ancestorMoveMonitor); +#endif + // VideoWidgetInterface virtual Phonon::VideoWidget::AspectRatio aspectRatio() const; virtual void setAspectRatio(Phonon::VideoWidget::AspectRatio aspectRatio); @@ -66,7 +71,7 @@ void disconnectMediaObject(MediaObject *mediaObject); private: - QScopedPointer m_videoOutput; + QScopedPointer m_videoOutput; qreal m_brightness; qreal m_contrast; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/.gitattributes --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/3rdparty/webkit/.gitattributes Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,4 @@ +# To enable automatic merging of ChangeLog files, use the following command: +# git config merge.changelog.driver "resolve-ChangeLogs --merge-driver %O %A %B" +ChangeLog* merge=changelog + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/ChangeLog --- a/src/3rdparty/webkit/ChangeLog Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/ChangeLog Mon May 03 13:17:34 2010 +0300 @@ -1,3 +1,11 @@ +2010-02-18 Tor Arne Vestbø + + Reviewed by Eric Seidel. + + Add .gitattributes file for custom ChangeLog merge-driver + + * .gitattributes: Added. + 2009-11-30 Jan-Arve Sæther Reviewed by Simon Hausmann. diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/VERSION --- a/src/3rdparty/webkit/VERSION Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/VERSION Mon May 03 13:17:34 2010 +0300 @@ -8,4 +8,4 @@ and has the sha1 checksum - ffae5e11181a3961193fa21ea405851cad714d4b + e9151b11e974f0aa47fd40c225f88f35ced91496 diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/ChangeLog --- a/src/3rdparty/webkit/WebCore/ChangeLog Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/ChangeLog Mon May 03 13:17:34 2010 +0300 @@ -1,3 +1,287 @@ +2010-03-25 yael aharon + + Reviewed by Laszlo Gombos. + + [Qt] Windowed netscape plugins don't work with QGraphicsWebView on Symbian + https://bugs.webkit.org/show_bug.cgi?id=35112 + + Add a proxy widget when loading a QWidget based plugin in a QGraphicsWebView. + + * plugins/symbian/PluginContainerSymbian.cpp: + (PluginContainerSymbian::PluginContainerSymbian): + (PluginContainerSymbian::focusInEvent): + * plugins/symbian/PluginContainerSymbian.h: + (WebCore::PluginContainerSymbian::proxy): + * plugins/symbian/PluginViewSymbian.cpp: + (WebCore::PluginView::updatePluginWidget): + (WebCore::PluginView::platformStart): + (WebCore::PluginView::platformDestroy): + +2010-03-29 Laszlo Gombos + + Reviewed for the Qt 4.6 branch by Simon Hausmann. + + Accept XHTML-MP content type as XHTML content + https://bugs.webkit.org/show_bug.cgi?id=34262 + + Enable processing XHTML-MP mime type as an XHTML document + even if XHTML-MP support is not enabled. + + * platform/MIMETypeRegistry.cpp: + (WebCore::initializeSupportedNonImageMimeTypes): + +2010-03-22 Jakub Wieczorek + + Reviewed by Simon Hausmann. + + [Qt] Don't construct a QLineEdit every time when painting a text field + https://bugs.webkit.org/show_bug.cgi?id=36373 + + Instead, keep one instance per RenderTheme around. + + * platform/qt/RenderThemeQt.cpp: + (WebCore::findFrameLineWidth): + +2010-03-26 Janne Koskinen + + Reviewed by Laszlo Gombos. + + Don't undefine SKIP_STATIC_CONSTRUCTORS_ON_GCC for Symbian HW targets. + https://bugs.webkit.org/show_bug.cgi?id=34081 + + Defining StringImpl instances as globals will cause a crash on process exit as + StringImpl::Remove expects TLS which was already deleted at time of exiting main and ends up + constructing one exiting thread. + + * config.h: + +2010-02-02 Alexey Proskuryakov + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=34076 + Crash in mangleme in WebCore::Element::getAttribute + + Test: fast/forms/misplaced-img-form-registration.html + + * html/HTMLFormElement.cpp: + (WebCore::HTMLFormElement::registerImgElement): Assert that the same image isn't added + to vector again. + (WebCore::HTMLFormElement::removeImgElement): Similarly, assert that we're removing something + that's actually registered. + + * html/HTMLImageElement.cpp: (WebCore::HTMLImageElement::~HTMLImageElement): If parser fails + to insert the image element, then there will be no removed from tree notification either, + need to unregister right away. + +2010-01-25 Alexey Proskuryakov + + Rubber-stamped by Geoffrey Garen. + + https://bugs.webkit.org/show_bug.cgi?id=34076 + An image remains accessible via form.property syntax after being removed from document. + + Fix crashing regression tests (tables/mozilla/bugs/bug4527.html et al.) + + * html/HTMLImageElement.cpp: (WebCore::HTMLImageElement::insertedIntoTree): Remove incorrect + assertions added in the previous patch - it's mot true that m_for is always a parent; table + parsing can reparent the image element, but m_form still needs to be set. + +2010-01-25 Alexey Proskuryakov + + Reviewed by Geoffrey Garen. + + https://bugs.webkit.org/show_bug.cgi?id=34076 + An image remains accessible via form.property syntax after being removed from document. + + Tests: fast/forms/removed-image-as-property.html + fast/forms/reparented-image-as-property.html + + * html/HTMLImageElement.cpp: + (WebCore::HTMLImageElement::~HTMLImageElement): This is called during GC - not a good time + to make observable changes to DOM. + (WebCore::HTMLImageElement::insertedIntoTree): This is the right place to do any work that + depends on connectedness to some ancestor. We still allow for m_form to be set via constructor, + which happens during parsing. + (WebCore::HTMLImageElement::removedFromTree): Ditto. + + * html/HTMLImageElement.h: Added removedFromTree/insertedIntoTree, moved removedFromDocument + and insertedIntoDocument to private section, as they shouldn't be called directly. + +2009-12-08 Brady Eidson + + Reviewed by Darin Adler. + + Navigating to a cached page can result in accessing a destroyed HTMLInputElement. + and https://webkit.org/b/32293 + + Test: fast/loader/input-element-page-cache-crash.html + + * html/HTMLInputElement.cpp: + (WebCore::HTMLInputElement::parseMappedAttribute): Make sure to unregister for the activation + callback after the new m_autocomplete setting has been stored so the unregistration actually + takes place. + +2009-12-13 Dan Bernstein + + Reviewed by Simon Fraser. + + Crash at HTMLParser::popOneBlockCommon() after + handling misnested residual style tags + + Test: fast/parser/residual-style-close-ref-clone.html + + * html/HTMLParser.cpp: + (WebCore::HTMLParser::handleResidualStyleCloseTagAcrossBlocks): Gave the + block stack a strong reference to the cloned residual style element. + +2009-12-23 Dan Bernstein + + Reviewed by Darin Adler. + + First line of text cannot be selected + https://bugs.webkit.org/show_bug.cgi?id=32749 + + Test: fast/text/remove-zero-length-run.html + + * rendering/RenderText.cpp: + (WebCore::RenderText::positionLineBox): Changed code that assumed that if a box was being + removed, it was the only box in the RenderText. Instead, correctly preserve the list of + text boxes. + (WebCore::RenderText::checkConsistency): Updated for earlier rename. + +2009-12-10 Oliver Hunt + + Reviewed by Alexey Proskuryakov. + + Crash in XMLTokenizer::popCurrentNode if window.close() is called during parsing + https://bugs.webkit.org/show_bug.cgi?id=31576 + + Add a RefCounted wrapper object around xmlParserCtxtPtr so we can + maintain it's lifetime more effectively. + + Test: fast/parser/xhtml-close-while-parsing.xhtml + + * dom/XMLTokenizer.cpp: + (WebCore::XMLTokenizer::popCurrentNode): + * dom/XMLTokenizer.h: + (WebCore::XMLParserContext::context): + (WebCore::XMLParserContext::XMLParserContext): + (WebCore::XMLTokenizer::context): + * dom/XMLTokenizerLibxml2.cpp: + (WebCore::XMLParserContext::createStringParser): + (WebCore::XMLParserContext::createMemoryParser): + (WebCore::XMLParserContext::~XMLParserContext): + (WebCore::XMLTokenizer::~XMLTokenizer): + (WebCore::XMLTokenizer::doWrite): + (WebCore::XMLTokenizer::initializeParserContext): + (WebCore::XMLTokenizer::doEnd): + (WebCore::XMLTokenizer::lineNumber): + (WebCore::XMLTokenizer::columnNumber): + (WebCore::XMLTokenizer::stopParsing): + (WebCore::parseXMLDocumentFragment): + (WebCore::parseAttributes): + +2009-11-09 Anders Carlsson + + Reviewed by Darin Adler and Dan Bernstein. + + + https://bugs.webkit.org/show_bug.cgi?id=31277 + + When an object tag's style changes (for example when child nodes are added/removed), + reuse its Frame (if it has one) instead of creating multiple Frames. + + Test: fast/dom/HTMLObjectElement/children-changed.html + + * loader/FrameLoader.cpp: + (WebCore::FrameLoader::requestObject): + +2009-12-05 Adam Langley + + Reviewed by Adam Barth. + + Check that a CSS format() argument is of a valid type. + + https://bugs.webkit.org/show_bug.cgi?id=31815 + http://code.google.com/p/chromium/issues/detail?id=28582 + + Test: fast/css/url-format-non-string.html + + * css/CSSParser.cpp: + (WebCore::CSSParser::parseFontFaceSrc): + +2010-03-19 Miikka Heikkinen + + Reviewed by Simon Hausmann. + + [Qt] Support for QT_LIBINFIX in Symbian builds + + Configuring Qt with -qtlibinfix parameter will enable installing + an alternate version of Qt on devices that already have it on ROM. + This patch provides support for infixed builds of Webkit. + + * WebCore.pro: + +2010-01-31 Benjamin Poulain + + Reviewed by Eric Seidel. + + [Qt] Enable FAST_MOBILE_SCROLLING on Qt embedded platforms + https://bugs.webkit.org/show_bug.cgi?id=34168 + + Enable FAST_MOBILE_SCROLLING for Qt on Maemo 5, Linux embedded + and Symbian + + * WebCore.pro: + +2010-01-19 Daniel Bates + + Reviewed by Adam Treat. + + https://bugs.webkit.org/show_bug.cgi?id=33408 + + Implements an optimization to ignore fixed background images + (i.e. background-attachment: fixed) when a page does not contain + any fixed position elements so as to allow fast repaints (via bit + blit) when scrolling a page. + + Currently, if a page has elements that specify either a fixed + background or a fixed position then we perform a slow repaint + (i.e disable blitting) so as to avoid rendering artifacts. + However, on low-powered/mobile devices slow repaints can cause + noticeable delays when scrolling a page with a fixed background + image. By sacrificing support for fixed background images when + there are no fixed elements on the page and with come care, we + don't need to force slow repaints and can avoid rendering artifacts. + Hence, on such devices we can improve the responsiveness of + scrolling a page with a fixed background image. + + Note, this optimization is only enabled if the WebKit is built + with FAST_MOBILE_SCROLLING enabled. + + Tests: fast/fast-mobile-scrolling/fixed-position-element.html + fast/fast-mobile-scrolling/no-fixed-position-elements.html + + * rendering/RenderBoxModelObject.cpp: + (WebCore::RenderBoxModelObject::calculateBackgroundImageGeometry): + Disable fixed background attachment if we can blit on scroll. + * rendering/RenderObject.cpp: + (WebCore::RenderObject::styleWillChange): + +2010-03-11 Simon Hausmann + + Reviewed by Tor Arne Vestbø. + + [Qt] Avoid double-buffering with Qt image decoders + + Pass QIODevice::Unbuffered when opening the QBuffer that + wraps the image data, to hint to Qt that no extra buffering + is needed. + + * platform/graphics/qt/ImageDecoderQt.cpp: + (WebCore::ImageDecoderQt::setData): + 2010-01-14 Diego Gonzalez Reviewed by Kenneth Christiansen. diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/WebCore.pro --- a/src/3rdparty/webkit/WebCore/WebCore.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/WebCore.pro Mon May 03 13:17:34 2010 +0300 @@ -6,9 +6,12 @@ TARGET.EPOCALLOWDLLDATA=1 TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 // Min 128kB, Max 32MB TARGET.CAPABILITY = All -Tcb - TARGET.UID3 = 0x200267C2 - - webkitlibs.sources = QtWebKit.dll + isEmpty(QT_LIBINFIX) { + TARGET.UID3 = 0x200267C2 + } else { + TARGET.UID3 = 0xE00267C2 + } + webkitlibs.sources = QtWebKit$${QT_LIBINFIX}.dll webkitlibs.path = /sys/bin vendorinfo = \ "; Localised Vendor name" \ @@ -164,6 +167,10 @@ DEFINES += ENABLE_SVG_FONTS=0 ENABLE_SVG_FOREIGN_OBJECT=0 ENABLE_SVG_ANIMATION=0 ENABLE_SVG_AS_IMAGE=0 ENABLE_SVG_USE=0 } +mameo5|symbian|embedded { + DEFINES += ENABLE_FAST_MOBILE_SCROLLING=1 +} + # HTML5 ruby support !contains(DEFINES, ENABLE_RUBY=.): DEFINES += ENABLE_RUBY=1 diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/config.h --- a/src/3rdparty/webkit/WebCore/config.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/config.h Mon May 03 13:17:34 2010 +0300 @@ -144,7 +144,9 @@ #if PLATFORM(SYMBIAN) #undef WIN32 #undef _WIN32 +#if COMPILER(WINSCW) #undef SKIP_STATIC_CONSTRUCTORS_ON_GCC +#endif #define USE_SYSTEM_MALLOC 1 #define U_HAVE_INT8_T 0 #define U_HAVE_INT16_T 0 diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/css/CSSParser.cpp --- a/src/3rdparty/webkit/WebCore/css/CSSParser.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/css/CSSParser.cpp Mon May 03 13:17:34 2010 +0300 @@ -3328,6 +3328,12 @@ return false; } +static bool isValidFormatFunction(CSSParserValue* val) +{ + CSSParserValueList* args = val->function->args; + return equalIgnoringCase(val->function->name, "format(") && (args->current()->unit == CSSPrimitiveValue::CSS_STRING || args->current()->unit == CSSPrimitiveValue::CSS_IDENT); +} + bool CSSParser::parseFontFaceSrc() { RefPtr values(CSSValueList::createCommaSeparated()); @@ -3355,7 +3361,7 @@ CSSParserValue* a = args->current(); uriValue.clear(); parsedValue = CSSFontFaceSrcValue::createLocal(a->string); - } else if (equalIgnoringCase(val->function->name, "format(") && allowFormat && uriValue) { + } else if (allowFormat && uriValue && isValidFormatFunction(val)) { expectComma = true; allowFormat = false; uriValue->setFormat(args->current()->string); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp --- a/src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/dom/XMLTokenizer.cpp Mon May 03 13:17:34 2010 +0300 @@ -91,7 +91,8 @@ void XMLTokenizer::popCurrentNode() { - ASSERT(m_currentNode); + if (!m_currentNode) + return; ASSERT(m_currentNodeStack.size()); if (m_currentNode != m_doc) diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/dom/XMLTokenizer.h --- a/src/3rdparty/webkit/WebCore/dom/XMLTokenizer.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/dom/XMLTokenizer.h Mon May 03 13:17:34 2010 +0300 @@ -52,6 +52,23 @@ class PendingCallbacks; class ScriptElement; +#if !USE(QXMLSTREAM) + class XMLParserContext : public RefCounted { + public: + static PassRefPtr createMemoryParser(xmlSAXHandlerPtr, void*, const char*); + static PassRefPtr createStringParser(xmlSAXHandlerPtr, void*); + ~XMLParserContext(); + xmlParserCtxtPtr context() const { return m_context; } + + private: + XMLParserContext(xmlParserCtxtPtr context) + : m_context(context) + { + } + xmlParserCtxtPtr m_context; + }; +#endif + class XMLTokenizer : public Tokenizer, public CachedResourceClient { public: XMLTokenizer(Document*, FrameView* = 0); @@ -146,7 +163,8 @@ QXmlStreamReader m_stream; bool m_wroteText; #else - xmlParserCtxtPtr m_context; + xmlParserCtxtPtr context() const { return m_context ? m_context->context() : 0; }; + RefPtr m_context; OwnPtr m_pendingCallbacks; Vector m_bufferedText; #endif diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp --- a/src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/dom/XMLTokenizerLibxml2.cpp Mon May 03 13:17:34 2010 +0300 @@ -465,7 +465,7 @@ static bool didInit = false; -static xmlParserCtxtPtr createStringParser(xmlSAXHandlerPtr handlers, void* userData) +PassRefPtr XMLParserContext::createStringParser(xmlSAXHandlerPtr handlers, void* userData) { if (!didInit) { xmlInitParser(); @@ -482,12 +482,12 @@ const unsigned char BOMHighByte = *reinterpret_cast(&BOM); xmlSwitchEncoding(parser, BOMHighByte == 0xFF ? XML_CHAR_ENCODING_UTF16LE : XML_CHAR_ENCODING_UTF16BE); - return parser; + return adoptRef(new XMLParserContext(parser)); } // Chunk should be encoded in UTF-8 -static xmlParserCtxtPtr createMemoryParser(xmlSAXHandlerPtr handlers, void* userData, const char* chunk) +PassRefPtr XMLParserContext::createMemoryParser(xmlSAXHandlerPtr handlers, void* userData, const char* chunk) { if (!didInit) { xmlInitParser(); @@ -518,8 +518,8 @@ parser->str_xmlns = xmlDictLookup(parser->dict, BAD_CAST "xmlns", 5); parser->str_xml_ns = xmlDictLookup(parser->dict, XML_XML_NAMESPACE, 36); parser->_private = userData; - - return parser; + + return adoptRef(new XMLParserContext(parser)); } // -------------------------------- @@ -609,6 +609,13 @@ m_defaultNamespaceURI = parentElement->namespaceURI(); } +XMLParserContext::~XMLParserContext() +{ + if (m_context->myDoc) + xmlFreeDoc(m_context->myDoc); + xmlFreeParserCtxt(m_context); +} + XMLTokenizer::~XMLTokenizer() { clearCurrentNodeStack(); @@ -616,15 +623,16 @@ m_doc->deref(); if (m_pendingScript) m_pendingScript->removeClient(this); - if (m_context) - xmlFreeParserCtxt(m_context); } void XMLTokenizer::doWrite(const String& parseString) { if (!m_context) initializeParserContext(); - + + // Protect the libxml context from deletion during a callback + RefPtr context = m_context; + // libXML throws an error if you try to switch the encoding for an empty string. if (parseString.length()) { // Hack around libxml2's lack of encoding overide support by manually @@ -633,15 +641,15 @@ // and switch encodings, causing the parse to fail. const UChar BOM = 0xFEFF; const unsigned char BOMHighByte = *reinterpret_cast(&BOM); - xmlSwitchEncoding(m_context, BOMHighByte == 0xFF ? XML_CHAR_ENCODING_UTF16LE : XML_CHAR_ENCODING_UTF16BE); + xmlSwitchEncoding(context->context(), BOMHighByte == 0xFF ? XML_CHAR_ENCODING_UTF16LE : XML_CHAR_ENCODING_UTF16BE); XMLTokenizerScope scope(m_doc->docLoader()); - xmlParseChunk(m_context, reinterpret_cast(parseString.characters()), sizeof(UChar) * parseString.length(), 0); + xmlParseChunk(context->context(), reinterpret_cast(parseString.characters()), sizeof(UChar) * parseString.length(), 0); } if (m_doc->decoder() && m_doc->decoder()->sawError()) { // If the decoder saw an error, report it as fatal (stops parsing) - handleError(fatal, "Encoding error", lineNumber(), columnNumber()); + handleError(fatal, "Encoding error", context->context()->input->line, context->context()->input->col); } return; @@ -1277,9 +1285,9 @@ XMLTokenizerScope scope(m_doc->docLoader()); if (m_parsingFragment) - m_context = createMemoryParser(&sax, this, chunk); + m_context = XMLParserContext::createMemoryParser(&sax, this, chunk); else - m_context = createStringParser(&sax, this); + m_context = XMLParserContext::createStringParser(&sax, this); } void XMLTokenizer::doEnd() @@ -1300,12 +1308,9 @@ // Tell libxml we're done. { XMLTokenizerScope scope(m_doc->docLoader()); - xmlParseChunk(m_context, 0, 0, 1); + xmlParseChunk(context(), 0, 0, 1); } - if (m_context->myDoc) - xmlFreeDoc(m_context->myDoc); - xmlFreeParserCtxt(m_context); m_context = 0; } } @@ -1334,18 +1339,19 @@ int XMLTokenizer::lineNumber() const { - return m_context ? m_context->input->line : 1; + return context() ? context()->input->line : 1; } int XMLTokenizer::columnNumber() const { - return m_context ? m_context->input->col : 1; + return context() ? context()->input->col : 1; } void XMLTokenizer::stopParsing() { Tokenizer::stopParsing(); - xmlStopParser(m_context); + if (context()) + xmlStopParser(context()); } void XMLTokenizer::resumeParsing() @@ -1384,17 +1390,17 @@ CString chunkAsUtf8 = chunk.utf8(); tokenizer.initializeParserContext(chunkAsUtf8.data()); - xmlParseContent(tokenizer.m_context); + xmlParseContent(tokenizer.context()); tokenizer.endDocument(); // Check if all the chunk has been processed. - long bytesProcessed = xmlByteConsumed(tokenizer.m_context); + long bytesProcessed = xmlByteConsumed(tokenizer.context()); if (bytesProcessed == -1 || ((unsigned long)bytesProcessed) != chunkAsUtf8.length()) return false; // No error if the chunk is well formed or it is not but we have no error. - return tokenizer.m_context->wellFormed || xmlCtxtGetLastError(tokenizer.m_context) == 0; + return tokenizer.context()->wellFormed || xmlCtxtGetLastError(tokenizer.context()) == 0; } // -------------------------------- @@ -1437,12 +1443,9 @@ memset(&sax, 0, sizeof(sax)); sax.startElementNs = attributesStartElementNsHandler; sax.initialized = XML_SAX2_MAGIC; - xmlParserCtxtPtr parser = createStringParser(&sax, &state); + RefPtr parser = XMLParserContext::createStringParser(&sax, &state); String parseString = ""; - xmlParseChunk(parser, reinterpret_cast(parseString.characters()), parseString.length() * sizeof(UChar), 1); - if (parser->myDoc) - xmlFreeDoc(parser->myDoc); - xmlFreeParserCtxt(parser); + xmlParseChunk(parser->context(), reinterpret_cast(parseString.characters()), parseString.length() * sizeof(UChar), 1); attrsOK = state.gotAttributes; return state.attributes; } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/html/HTMLFormElement.cpp --- a/src/3rdparty/webkit/WebCore/html/HTMLFormElement.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/html/HTMLFormElement.cpp Mon May 03 13:17:34 2010 +0300 @@ -515,11 +515,13 @@ void HTMLFormElement::registerImgElement(HTMLImageElement* e) { + ASSERT(imgElements.find(e) == notFound); imgElements.append(e); } void HTMLFormElement::removeImgElement(HTMLImageElement* e) { + ASSERT(imgElements.find(e) != notFound); removeFromVector(imgElements, e); } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp --- a/src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/html/HTMLImageElement.cpp Mon May 03 13:17:34 2010 +0300 @@ -209,6 +209,30 @@ HTMLElement::removedFromDocument(); } +void HTMLImageElement::insertedIntoTree(bool deep) +{ + if (!m_form) { + // m_form can be non-null if it was set in constructor. + for (Node* ancestor = parentNode(); ancestor; ancestor = ancestor->parentNode()) { + if (ancestor->hasTagName(formTag)) { + m_form = static_cast(ancestor); + m_form->registerImgElement(this); + break; + } + } + } + + HTMLElement::insertedIntoTree(deep); +} + +void HTMLImageElement::removedFromTree(bool deep) +{ + if (m_form) + m_form->removeImgElement(this); + m_form = 0; + HTMLElement::removedFromTree(deep); +} + int HTMLImageElement::width(bool ignorePendingStylesheets) const { if (!renderer()) { diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/html/HTMLImageElement.h --- a/src/3rdparty/webkit/WebCore/html/HTMLImageElement.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/html/HTMLImageElement.h Mon May 03 13:17:34 2010 +0300 @@ -45,8 +45,6 @@ virtual void attach(); virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); - virtual void insertedIntoDocument(); - virtual void removedFromDocument(); virtual bool canStartSelection() const { return false; } @@ -105,6 +103,11 @@ virtual void addSubresourceAttributeURLs(ListHashSet&) const; private: + virtual void insertedIntoDocument(); + virtual void removedFromDocument(); + virtual void insertedIntoTree(bool deep); + virtual void removedFromTree(bool deep); + HTMLImageLoader m_imageLoader; String usemap; bool ismap; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp --- a/src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/html/HTMLInputElement.cpp Mon May 03 13:17:34 2010 +0300 @@ -701,12 +701,15 @@ m_autocomplete = Off; registerForActivationCallbackIfNeeded(); } else { - if (m_autocomplete == Off) - unregisterForActivationCallbackIfNeeded(); + bool needsToUnregister = m_autocomplete == Off; + if (attr->isEmpty()) m_autocomplete = Uninitialized; else m_autocomplete = On; + + if (needsToUnregister) + unregisterForActivationCallbackIfNeeded(); } } else if (attr->name() == typeAttr) { setInputType(attr->value()); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/html/HTMLParser.cpp --- a/src/3rdparty/webkit/WebCore/html/HTMLParser.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/html/HTMLParser.cpp Mon May 03 13:17:34 2010 +0300 @@ -1275,7 +1275,8 @@ prevMaxElem->next = elem; ASSERT(newNodePtr); prevMaxElem->node = newNodePtr; - prevMaxElem->didRefNode = false; + newNodePtr->ref(); + prevMaxElem->didRefNode = true; } else delete elem; } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp --- a/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp Mon May 03 13:17:34 2010 +0300 @@ -1260,9 +1260,11 @@ ASSERT(renderer->node()->hasTagName(objectTag) || renderer->node()->hasTagName(embedTag)); HTMLPlugInElement* element = static_cast(renderer->node()); - - // FIXME: OK to always make a new frame? When does the old frame get removed? - return loadSubframe(element, completedURL, frameName, m_outgoingReferrer); + + // If the plug-in element already contains a subframe, requestFrame will re-use it. Otherwise, + // it will create a new frame and set it as the RenderPart's widget, causing what was previously + // in the widget to be torn down. + return requestFrame(element, completedURL, frameName); } bool FrameLoader::shouldUsePlugin(const KURL& url, const String& mimeType, bool hasFallback, bool& useFallback) diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/page/FrameView.cpp --- a/src/3rdparty/webkit/WebCore/page/FrameView.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/page/FrameView.cpp Mon May 03 13:17:34 2010 +0300 @@ -106,6 +106,7 @@ FrameView::FrameView(Frame* frame) : m_frame(frame) , m_slowRepaintObjectCount(0) + , m_fixedObjectCount(0) , m_layoutTimer(this, &FrameView::layoutTimerFired) , m_layoutRoot(0) , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) @@ -735,7 +736,7 @@ bool FrameView::useSlowRepaints() const { - return m_useSlowRepaints || m_slowRepaintObjectCount > 0 || m_isOverlapped || !m_contentIsOpaque; + return m_useSlowRepaints || m_slowRepaintObjectCount > 0 || (platformWidget() && m_fixedObjectCount > 0) || m_isOverlapped || !m_contentIsOpaque; } void FrameView::setUseSlowRepaints() @@ -759,6 +760,78 @@ setCanBlitOnScroll(!useSlowRepaints()); } +void FrameView::addFixedObject() +{ + if (!m_fixedObjectCount && platformWidget()) + setCanBlitOnScroll(false); + ++m_fixedObjectCount; +} + +void FrameView::removeFixedObject() +{ + ASSERT(m_fixedObjectCount > 0); + m_fixedObjectCount--; + if (!m_fixedObjectCount) + setCanBlitOnScroll(!useSlowRepaints()); +} + +void FrameView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) +{ + const size_t fixedObjectThreshold = 5; + + ListHashSet* positionedObjects = 0; + if (RenderView* root = m_frame->contentRenderer()) + positionedObjects = root->positionedObjects(); + + if (!positionedObjects || positionedObjects->isEmpty()) { + hostWindow()->scroll(scrollDelta, rectToScroll, clipRect); + return; + } + + // Get the rects of the fixed objects visible in the rectToScroll + Vector subRectToUpdate; + bool updateInvalidatedSubRect = true; + ListHashSet::const_iterator end = positionedObjects->end(); + for (ListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { + RenderBox* renderBox = *it; + if (renderBox->style()->position() != FixedPosition) + continue; + IntRect topLevelRect; + IntRect updateRect = renderBox->paintingRootRect(topLevelRect); + updateRect.move(-scrollX(), -scrollY()); + updateRect.intersect(rectToScroll); + if (!updateRect.isEmpty()) { + if (subRectToUpdate.size() >= fixedObjectThreshold) { + updateInvalidatedSubRect = false; + break; + } + subRectToUpdate.append(updateRect); + } + } + + // Scroll the view + if (updateInvalidatedSubRect) { + // 1) scroll + hostWindow()->scroll(scrollDelta, rectToScroll, clipRect); + + // 2) update the area of fixed objets that has been invalidated + size_t fixObjectsCount = subRectToUpdate.size(); + for (size_t i = 0; i < fixObjectsCount; ++i) { + IntRect updateRect = subRectToUpdate[i]; + IntRect scrolledRect = updateRect; + scrolledRect.move(scrollDelta); + updateRect.unite(scrolledRect); + updateRect.intersect(rectToScroll); + hostWindow()->repaint(updateRect, true, false, true); + } + } else { + // the number of fixed objects exceed the threshold, so we repaint everything. + IntRect updateRect = clipRect; + updateRect.intersect(rectToScroll); + hostWindow()->repaint(updateRect, true, false, true); + } +} + void FrameView::setIsOverlapped(bool isOverlapped) { if (isOverlapped == m_isOverlapped) diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/page/FrameView.h --- a/src/3rdparty/webkit/WebCore/page/FrameView.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/page/FrameView.h Mon May 03 13:17:34 2010 +0300 @@ -143,6 +143,9 @@ void addSlowRepaintObject(); void removeSlowRepaintObject(); + void addFixedObject(); + void removeFixedObject(); + void beginDeferredRepaints(); void endDeferredRepaints(); void checkStopDelayingDeferredRepaints(); @@ -196,6 +199,9 @@ bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; } void invalidateScrollCorner(); +protected: + virtual void scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect); + private: FrameView(Frame*); @@ -261,6 +267,7 @@ bool m_isOverlapped; bool m_contentIsOpaque; unsigned m_slowRepaintObjectCount; + unsigned m_fixedObjectCount; int m_borderX, m_borderY; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.cpp --- a/src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.cpp Mon May 03 13:17:34 2010 +0300 @@ -200,9 +200,7 @@ "text/", "application/xml", "application/xhtml+xml", -#if ENABLE(XHTMLMP) "application/vnd.wap.xhtml+xml", -#endif "application/rss+xml", "application/atom+xml", #if ENABLE(SVG) diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/platform/ScrollView.cpp --- a/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp Mon May 03 13:17:34 2010 +0300 @@ -509,7 +509,7 @@ if (canBlitOnScroll()) { // The main frame can just blit the WebView window // FIXME: Find a way to blit subframes without blitting overlapping content - hostWindow()->scroll(-scrollDelta, scrollViewRect, clipRect); + scrollContentsFastPath(-scrollDelta, scrollViewRect, clipRect); } else { // We need to go ahead and repaint the entire backing store. Do it now before moving the // windowed plugins. @@ -524,6 +524,11 @@ hostWindow()->paint(); } +void ScrollView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) +{ + hostWindow()->scroll(scrollDelta, rectToScroll, clipRect); +} + IntPoint ScrollView::windowToContents(const IntPoint& windowPoint) const { IntPoint viewPoint = convertFromContainingWindow(windowPoint); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/platform/ScrollView.h --- a/src/3rdparty/webkit/WebCore/platform/ScrollView.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/platform/ScrollView.h Mon May 03 13:17:34 2010 +0300 @@ -244,6 +244,9 @@ IntRect scrollCornerRect() const; virtual void updateScrollCorner(); virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect); + + // Scroll the content by blitting the pixels + virtual void scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect); private: RefPtr m_horizontalScrollbar; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp Mon May 03 13:17:34 2010 +0300 @@ -79,7 +79,7 @@ QByteArray imageData = QByteArray::fromRawData(m_data->data(), m_data->size()); m_buffer = new QBuffer; m_buffer->setData(imageData); - m_buffer->open(QBuffer::ReadOnly); + m_buffer->open(QBuffer::ReadOnly | QIODevice::Unbuffered); m_reader = new QImageReader(m_buffer, m_format); } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp --- a/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp Mon May 03 13:17:34 2010 +0300 @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include #include #include diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp --- a/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp Mon May 03 13:17:34 2010 +0300 @@ -126,6 +126,7 @@ RenderThemeQt::RenderThemeQt(Page* page) : RenderTheme() , m_page(page) + , m_lineEdit(0) { QPushButton button; button.setAttribute(Qt::WA_MacSmallSize); @@ -142,6 +143,7 @@ RenderThemeQt::~RenderThemeQt() { delete m_fallbackStyle; + delete m_lineEdit; } // for some widget painting, we need to fallback to Windows style @@ -207,11 +209,13 @@ return true; } -static int findFrameLineWidth(QStyle* style) +int RenderThemeQt::findFrameLineWidth(QStyle* style) const { - QLineEdit lineEdit; + if (!m_lineEdit) + m_lineEdit = new QLineEdit(); + QStyleOptionFrameV2 opt; - return style->pixelMetric(QStyle::PM_DefaultFrameWidth, &opt, &lineEdit); + return style->pixelMetric(QStyle::PM_DefaultFrameWidth, &opt, m_lineEdit); } static QRect inflateButtonRect(const QRect& originalRect, QStyle* style) diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.h --- a/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.h Mon May 03 13:17:34 2010 +0300 @@ -27,6 +27,7 @@ #include QT_BEGIN_NAMESPACE +class QLineEdit; class QPainter; class QWidget; QT_END_NAMESPACE @@ -140,6 +141,8 @@ void setButtonPadding(RenderStyle*) const; void setPopupPadding(RenderStyle*) const; + int findFrameLineWidth(QStyle* style) const; + QStyle* fallbackStyle() const; Page* m_page; @@ -150,6 +153,7 @@ QString m_buttonFontFamily; QStyle* m_fallbackStyle; + mutable QLineEdit* m_lineEdit; }; class StylePainter { diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.cpp --- a/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.cpp Mon May 03 13:17:34 2010 +0300 @@ -32,12 +32,12 @@ using namespace WebCore; -PluginContainerSymbian::PluginContainerSymbian(PluginView* view, QWidget* parent) - : m_parent(parent) +PluginContainerSymbian::PluginContainerSymbian(PluginView* view, QWidget* parent, QGraphicsProxyWidget* proxy) + : QWidget(parent) , m_pluginView(view) + , m_proxy(proxy) , m_hasPendingGeometryChange(false) { - setParent(m_parent); } PluginContainerSymbian::~PluginContainerSymbian() @@ -62,7 +62,7 @@ } } -void PluginContainerSymbian::focusInEvent(QFocusEvent* event) +void PluginContainerSymbian::focusInEvent(QFocusEvent*) { if (Page* page = m_pluginView->parentFrame()->page()) page->focusController()->setActive(true); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.h --- a/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginContainerSymbian.h Mon May 03 13:17:34 2010 +0300 @@ -22,6 +22,8 @@ #include +class QGraphicsProxyWidget; + namespace WebCore { class PluginView; @@ -29,18 +31,19 @@ class PluginContainerSymbian : public QWidget { Q_OBJECT public: - PluginContainerSymbian(PluginView*, QWidget* parent); + PluginContainerSymbian(PluginView*, QWidget* parent, QGraphicsProxyWidget* proxy = 0); ~PluginContainerSymbian(); void requestGeometry(const QRect&, const QRegion& clip = QRegion()); void adjustGeometry(); + QGraphicsProxyWidget* proxy() { return m_proxy; } protected: virtual void focusInEvent(QFocusEvent*); virtual void focusOutEvent(QFocusEvent*); private: PluginView* m_pluginView; - QWidget* m_parent; + QGraphicsProxyWidget* m_proxy; QRect m_windowRect; QRegion m_clipRegion; bool m_hasPendingGeometryChange; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/plugins/symbian/PluginViewSymbian.cpp --- a/src/3rdparty/webkit/WebCore/plugins/symbian/PluginViewSymbian.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/plugins/symbian/PluginViewSymbian.cpp Mon May 03 13:17:34 2010 +0300 @@ -52,6 +52,8 @@ #include "runtime.h" #include "runtime_root.h" #include "QWebPageClient.h" +#include "qgraphicswebview.h" +#include #include #include #include @@ -84,6 +86,7 @@ IntRect oldClipRect = m_clipRect; m_windowRect = IntRect(frameView->contentsToWindow(frameRect().location()), frameRect().size()); + m_clipRect = windowClipRect(); m_clipRect.move(-m_windowRect.x(), -m_windowRect.y()); if (m_windowRect == oldWindowRect && m_clipRect == oldClipRect) @@ -425,12 +428,15 @@ if (m_isWindowed) { QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient(); - // FIXME this will not work for QGraphicsView. - // But we cannot use winId because it will create a window and on S60, - // QWidgets should not create a window. - Q_ASSERT(qobject_cast(client->pluginParent())); - setPlatformWidget(new PluginContainerSymbian(this, - qobject_cast(client->pluginParent()))); + QGraphicsProxyWidget* proxy = 0; + if (QGraphicsWebView *webView = qobject_cast(client->pluginParent())) + proxy = new QGraphicsProxyWidget(webView); + + PluginContainerSymbian* container = new PluginContainerSymbian(this, proxy ? 0 : client->ownerWidget(), proxy); + setPlatformWidget(container); + if (proxy) + proxy->setWidget(container); + m_npWindow.type = NPWindowTypeWindow; m_npWindow.window = (void*)platformPluginWidget(); @@ -446,7 +452,11 @@ void PluginView::platformDestroy() { - delete platformPluginWidget(); + QWebPageClient* client = m_parentFrame->view()->hostWindow()->platformPageClient(); + if (QGraphicsWebView *webView = qobject_cast(client->pluginParent())) + delete static_cast(platformPluginWidget())->proxy(); + else + delete platformPluginWidget(); } void PluginView::halt() diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/rendering/RenderBlock.h --- a/src/3rdparty/webkit/WebCore/rendering/RenderBlock.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/rendering/RenderBlock.h Mon May 03 13:17:34 2010 +0300 @@ -75,6 +75,7 @@ void insertPositionedObject(RenderBox*); void removePositionedObject(RenderBox*); void removePositionedObjects(RenderBlock*); + ListHashSet* positionedObjects() const { return m_positionedObjects; } void addPercentHeightDescendant(RenderBox*); static void removePercentHeightDescendant(RenderBox*); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp --- a/src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/rendering/RenderBox.cpp Mon May 03 13:17:34 2010 +0300 @@ -145,6 +145,16 @@ removeFloatingOrPositionedChildFromBlockLists(); } } + if (FrameView *frameView = view()->frameView()) { + bool newStyleIsFixed = newStyle && newStyle->position() == FixedPosition; + bool oldStyleIsFixed = style() && style()->position() == FixedPosition; + if (newStyleIsFixed != oldStyleIsFixed) { + if (newStyleIsFixed) + frameView->addFixedObject(); + else + frameView->removeFixedObject(); + } + } RenderBoxModelObject::styleWillChange(diff, newStyle); } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/rendering/RenderBoxModelObject.cpp --- a/src/3rdparty/webkit/WebCore/rendering/RenderBoxModelObject.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/rendering/RenderBoxModelObject.cpp Mon May 03 13:17:34 2010 +0300 @@ -557,6 +557,17 @@ // Determine the background positioning area and set destRect to the background painting area. // destRect will be adjusted later if the background is non-repeating. bool fixedAttachment = fillLayer->attachment() == FixedBackgroundAttachment; + +#if ENABLE(FAST_MOBILE_SCROLLING) + if (view()->frameView() && view()->frameView()->canBlitOnScroll()) { + // As a side effect of an optimization to blit on scroll, we do not honor the CSS + // property "background-attachment: fixed" because it may result in rendering + // artifacts. Note, these artifacts only appear if we are blitting on scroll of + // a page that has fixed background images. + fixedAttachment = false; + } +#endif + if (!fixedAttachment) { destRect = IntRect(tx, ty, w, h); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp --- a/src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/rendering/RenderObject.cpp Mon May 03 13:17:34 2010 +0300 @@ -1591,10 +1591,17 @@ s_affectsParentBlock = false; if (view()->frameView()) { - // FIXME: A better solution would be to only invalidate the fixed regions when scrolling. It's overkill to - // prevent the entire view from blitting on a scroll. - bool newStyleSlowScroll = newStyle && (newStyle->position() == FixedPosition || newStyle->hasFixedBackgroundImage()); - bool oldStyleSlowScroll = m_style && (m_style->position() == FixedPosition || m_style->hasFixedBackgroundImage()); + bool shouldBlitOnFixedBackgroundImage = false; +#if ENABLE(FAST_MOBILE_SCROLLING) + // On low-powered/mobile devices, preventing blitting on a scroll can cause noticeable delays + // when scrolling a page with a fixed background image. As an optimization, assuming there are + // no fixed positoned elements on the page, we can acclerate scrolling (via blitting) if we + // ignore the CSS property "background-attachment: fixed". + shouldBlitOnFixedBackgroundImage = true; +#endif + + bool newStyleSlowScroll = newStyle && !shouldBlitOnFixedBackgroundImage && newStyle->hasFixedBackgroundImage(); + bool oldStyleSlowScroll = m_style && !shouldBlitOnFixedBackgroundImage && m_style->hasFixedBackgroundImage(); if (oldStyleSlowScroll != newStyleSlowScroll) { if (oldStyleSlowScroll) view()->frameView()->removeSlowRepaintObject(); diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebCore/rendering/RenderText.cpp --- a/src/3rdparty/webkit/WebCore/rendering/RenderText.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebCore/rendering/RenderText.cpp Mon May 03 13:17:34 2010 +0300 @@ -1047,8 +1047,15 @@ if (!s->len()) { // We want the box to be destroyed. s->remove(); + if (m_firstTextBox == s) + m_firstTextBox = s->nextTextBox(); + else + s->prevTextBox()->setNextLineBox(s->nextTextBox()); + if (m_lastTextBox == s) + m_lastTextBox = s->prevTextBox(); + else + s->nextTextBox()->setPreviousLineBox(s->prevTextBox()); s->destroy(renderArena()); - m_firstTextBox = m_lastTextBox = 0; return; } @@ -1349,7 +1356,7 @@ #ifdef CHECK_CONSISTENCY const InlineTextBox* prev = 0; for (const InlineTextBox* child = m_firstTextBox; child != 0; child = child->nextTextBox()) { - ASSERT(child->object() == this); + ASSERT(child->renderer() == this); ASSERT(child->prevTextBox() == prev); prev = child; } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.cpp --- a/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.cpp Mon May 03 13:17:34 2010 +0300 @@ -30,6 +30,7 @@ #include #include #include +#include #if defined(Q_WS_X11) #include #endif @@ -63,6 +64,9 @@ void _q_doLoadFinished(bool success); + void _q_updateMicroFocus(); + void _q_pageDestroyed(); + QGraphicsWebView* q; QWebPage* page; }; @@ -80,6 +84,26 @@ emit q->loadFinished(success); } +void QGraphicsWebViewPrivate::_q_updateMicroFocus() +{ +#if !defined(QT_NO_IM) && (defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)) + // Ideally, this should be handled by a common call to an updateMicroFocus function + // in QGraphicsItem. See http://bugreports.qt.nokia.com/browse/QTBUG-7578. + QList views = q->scene()->views(); + for (int c = 0; c < views.size(); ++c) { + QInputContext* ic = views.at(c)->inputContext(); + if (ic) + ic->update(); + } +#endif +} + +void QGraphicsWebViewPrivate::_q_pageDestroyed() +{ + page = 0; + q->setPage(0); +} + void QGraphicsWebViewPrivate::scroll(int dx, int dy, const QRect& rectToScroll) { q->scroll(qreal(dx), qreal(dy), QRectF(rectToScroll)); @@ -435,6 +459,10 @@ this, SIGNAL(statusBarMessage(QString))); connect(d->page, SIGNAL(linkClicked(QUrl)), this, SIGNAL(linkClicked(QUrl))); + connect(d->page, SIGNAL(microFocusChanged()), + this, SLOT(_q_updateMicroFocus())); + connect(d->page, SIGNAL(destroyed()), + this, SLOT(_q_pageDestroyed())); } /*! diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.h --- a/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/Api/qgraphicswebview.h Mon May 03 13:17:34 2010 +0300 @@ -134,6 +134,8 @@ private: Q_PRIVATE_SLOT(d, void _q_doLoadFinished(bool success)) + Q_PRIVATE_SLOT(d, void _q_updateMicroFocus()) + Q_PRIVATE_SLOT(d, void _q_pageDestroyed()) QGraphicsWebViewPrivate* const d; friend class QGraphicsWebViewPrivate; diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h --- a/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebelement.h Mon May 03 13:17:34 2010 +0300 @@ -20,11 +20,11 @@ #ifndef QWEBELEMENT_H #define QWEBELEMENT_H -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "qwebkitglobal.h" namespace WebCore { diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp --- a/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebframe.cpp Mon May 03 13:17:34 2010 +0300 @@ -324,15 +324,12 @@ } } -static bool webframe_scrollOverflow(WebCore::Frame* frame, int dx, int dy) +static bool webframe_scrollOverflow(WebCore::Frame* frame, int dx, int dy, const QPoint& pos) { if (!frame || !frame->document() || !frame->eventHandler()) return false; - Node* node = frame->document()->focusedNode(); - if (!node) - node = frame->document()->elementFromPoint(frame->eventHandler()->currentMousePosition().x(), - frame->eventHandler()->currentMousePosition().y()); + Node* node = frame->document()->elementFromPoint(pos.x(), pos.y()); if (!node) return false; @@ -363,6 +360,10 @@ return (scrolledHorizontal || scrolledVertical); } + + + + /*! \class QWebFrame \since 4.4 @@ -1047,27 +1048,24 @@ } /*! - \since 4.7 \internal Scrolls nested frames starting at this frame, \a dx pixels to the right and \a dy pixels downward. Both \a dx and \a dy may be negative. First attempts - to scroll elements with CSS overflow followed by this frame. If this + to scroll elements with CSS overflow at position pos, followed by this frame. If this frame doesn't scroll, attempts to scroll the parent - - \sa QWebFrame::scroll */ -bool QWEBKIT_EXPORT qtwebkit_webframe_scrollRecursively(QWebFrame* qFrame, int dx, int dy) +void QWEBKIT_EXPORT qtwebkit_webframe_scrollRecursively(QWebFrame* qFrame, int dx, int dy, const QPoint& pos) { Frame* frame = QWebFramePrivate::core(qFrame); - bool scrolledHorizontal = false; - bool scrolledVertical = false; - bool scrolledOverflow = webframe_scrollOverflow(frame, dx, dy); - if (!scrolledOverflow) { - if (!frame || !frame->view()) - return false; - + if (!frame || !frame->view()) + return; + + if (!webframe_scrollOverflow(frame, dx, dy, pos)) { do { + bool scrolledHorizontal = false; + bool scrolledVertical = false; + IntSize scrollOffset = frame->view()->scrollOffset(); IntPoint maxScrollOffset = frame->view()->maximumScrollPosition(); @@ -1083,12 +1081,12 @@ if (scrolledHorizontal || scrolledVertical) { frame->view()->scrollBy(IntSize(dx, dy)); - return true; + return; } + frame = frame->tree()->parent(); } while (frame && frame->view()); } - return (scrolledHorizontal || scrolledVertical || scrolledOverflow); } /*! diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp --- a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp Mon May 03 13:17:34 2010 +0300 @@ -1248,8 +1248,8 @@ #if QT_VERSION >= 0x040600 case QInputMethodEvent::Selection: { if (renderTextControl) { - renderTextControl->setSelectionStart(a.start); - renderTextControl->setSelectionEnd(a.start + a.length); + renderTextControl->setSelectionStart(qMin(a.start, (a.start + a.length))); + renderTextControl->setSelectionEnd(qMax(a.start, (a.start + a.length))); } break; } diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/ChangeLog --- a/src/3rdparty/webkit/WebKit/qt/ChangeLog Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/ChangeLog Mon May 03 13:17:34 2010 +0300 @@ -1,3 +1,112 @@ +2010-03-22 Jakub Wieczorek + + Reviewed by Simon Hausmann. + + [Qt] Don't construct a QLineEdit every time when painting a text field + https://bugs.webkit.org/show_bug.cgi?id=36373 + + Add a simple benchmark covering this area. + + * tests/benchmarks/painting/tst_painting.cpp: + (tst_Painting::textAreas): + +2010-03-22 Yi Shen + + Reviewed by Simon Hausmann. + + https://bugs.webkit.org/show_bug.cgi?id=35933 + [Qt] [Symbian] Can not backward select (highlight) text using virtual keyboard + Make sure the selection start index is smaller than the selection end index. + + * Api/qwebpage.cpp: + (QWebPagePrivate::inputMethodEvent): + * tests/qwebpage/tst_qwebpage.cpp: + (tst_QWebPage::inputMethods): + +2010-03-25 Yael Aharon + + Reviewed by Kenneth Rohde Christiansen. + + [Qt] QtLauncher crashes on Mac OS and Linux when exiting with QGraphicsView mode enabled + https://bugs.webkit.org/show_bug.cgi?id=35251 + + Followed the way QWebView registers for the signal QWebPage::destroyed(), to prevent + QGraphicsWebView from referencing QWebPage after it was deleted. + + * Api/qgraphicswebview.cpp: + (QGraphicsWebViewPrivate::_q_pageDestroyed): + (QGraphicsWebView::setPage): + * Api/qgraphicswebview.h: + +2010-03-23 David Leong + + Reviewed by Laszlo Gombos. + + Build fix for Symbian Def file. + + * symbian/eabi/QtWebKitu.def: + +2010-03-18 Joe Ligman + + Reviewed by Simon Hausmann. + + [Qt] New API scrollRecursively has several problems. + https://bugs.webkit.org/show_bug.cgi?id=35873 + + Remove scrollRecursively from the Qt 4.7 API + Update the internal API to accept a hit test position + for nested scrolling + + * Api/qwebframe.cpp: + (webframe_scrollOverflow): + (qtwebkit_webframe_scrollRecursively): + * Api/qwebframe.h: + * Api/qwebframe_p.h: + * tests/qwebframe/tst_qwebframe.cpp: + +2009-12-18 Joe Ligman + + Reviewed by Kenneth Rohde Christiansen. + + [Qt] Add new API to QWebFrame to scrollRecursively starting with any css overflow + then checking current frame and then ancestors + https://bugs.webkit.org/show_bug.cgi?id=32668 + + * Api/qwebframe.cpp: + (QWebFramePrivate::scrollOverflow): + (QWebFrame::scrollRecursively): + * Api/qwebframe.h: + * Api/qwebframe_p.h: + * tests/qwebframe/qwebframe.qrc: + * tests/qwebframe/testiframe.html: Added. + * tests/qwebframe/testiframe2.html: Added. + * tests/qwebframe/tst_qwebframe.cpp: + +2010-03-21 Kristian Amlie + + Reviewed by Simon Hausmann. + + Fixed updating the VKB display when inputting into QGraphicsWebView. + https://bugs.webkit.org/show_bug.cgi?id=36292 + + * Api/qgraphicswebview.cpp: + (QGraphicsWebViewPrivate::_q_updateMicroFocus): + (QGraphicsWebView::setPage): + * Api/qgraphicswebview.h: + +2010-03-04 Simon Hausmann + + Reviewed by Kenneth Rohde Christiansen. + + [Qt] qwebelement.h does not include QtCore headers correctly + https://bugs.webkit.org/show_bug.cgi?id=35748 + + The header files of QtCore must be included as QtCore/foo.h. + + See also http://bugreports.qt.nokia.com/browse/QTBUG-8661 + + * Api/qwebelement.h: + 2010-01-28 Kenneth Rohde Christiansen Reviewed by Simon Hausmann. diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/symbian/bwins/QtWebKitu.def --- a/src/3rdparty/webkit/WebKit/qt/symbian/bwins/QtWebKitu.def Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/symbian/bwins/QtWebKitu.def Mon May 03 13:17:34 2010 +0300 @@ -623,5 +623,5 @@ ?qt_networkAccessAllowed@@YAX_N@Z @ 622 NONAME ; void qt_networkAccessAllowed(bool) ?qt_resumeActiveDOMObjects@@YAXPAVQWebFrame@@@Z @ 623 NONAME ; void qt_resumeActiveDOMObjects(class QWebFrame *) ?qt_suspendActiveDOMObjects@@YAXPAVQWebFrame@@@Z @ 624 NONAME ; void qt_suspendActiveDOMObjects(class QWebFrame *) - ?qtwebkit_webframe_scrollRecursively@@YA_NPAVQWebFrame@@HH@Z @ 625 NONAME ; bool qtwebkit_webframe_scrollRecursively(class QWebFrame *, int, int) + diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/symbian/eabi/QtWebKitu.def --- a/src/3rdparty/webkit/WebKit/qt/symbian/eabi/QtWebKitu.def Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/symbian/eabi/QtWebKitu.def Mon May 03 13:17:34 2010 +0300 @@ -693,5 +693,5 @@ _Z23qt_networkAccessAllowedb @ 692 NONAME _Z25qt_resumeActiveDOMObjectsP9QWebFrame @ 693 NONAME _Z26qt_suspendActiveDOMObjectsP9QWebFrame @ 694 NONAME - _Z35qtwebkit_webframe_scrollRecursivelyP9QWebFrameii @ 695 NONAME - + _Z35qtwebkit_webframe_scrollRecursivelyP9QWebFrameii @ 695 NONAME ABSENT + _Z35qtwebkit_webframe_scrollRecursivelyP9QWebFrameiiRK6QPoint @ 696 NONAME diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/tests/benchmarks/painting/tst_painting.cpp --- a/src/3rdparty/webkit/WebKit/qt/tests/benchmarks/painting/tst_painting.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/tests/benchmarks/painting/tst_painting.cpp Mon May 03 13:17:34 2010 +0300 @@ -19,6 +19,7 @@ #include +#include #include #include #include @@ -59,6 +60,7 @@ private Q_SLOTS: void paint_data(); void paint(); + void textAreas(); private: QWebView* m_view; @@ -105,5 +107,30 @@ } } +void tst_Painting::textAreas() +{ + m_view->load(QUrl("data:text/html;")); + ::waitForSignal(m_view, SIGNAL(loadFinished(bool))); + + QWebElement bodyElement = m_page->mainFrame()->findFirstElement("body"); + + int count = 100; + while (count--) { + QString markup(""); + bodyElement.appendInside(markup); + } + + /* force a layout */ + QWebFrame* mainFrame = m_page->mainFrame(); + mainFrame->toPlainText(); + + QPixmap pixmap(mainFrame->contentsSize()); + QBENCHMARK { + QPainter painter(&pixmap); + mainFrame->render(&painter, QRect(QPoint(0, 0), mainFrame->contentsSize())); + painter.end(); + } +} + QTEST_MAIN(tst_Painting) #include "tst_painting.moc" diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp --- a/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp Mon May 03 13:17:34 2010 +0300 @@ -606,7 +606,6 @@ void scrollPosition(); void evaluateWillCauseRepaint(); void qObjectWrapperWithSameIdentity(); - void scrollRecursively(); private: QString evalJS(const QString&s) { @@ -2825,71 +2824,5 @@ QCOMPARE(mainFrame->toPlainText(), QString("test2")); } -bool QWEBKIT_EXPORT qtwebkit_webframe_scrollRecursively(QWebFrame* qFrame, int dx, int dy); - -void tst_QWebFrame::scrollRecursively() -{ - // The test content is - // a nested frame set - // The main frame scrolls - // and has two children - // an iframe and a div overflow - // both scroll - QWebView webView; - QWebPage* webPage = webView.page(); - QSignalSpy loadSpy(webPage, SIGNAL(loadFinished(bool))); - QUrl url = QUrl("qrc:///testiframe.html"); - webPage->mainFrame()->load(url); - QTRY_COMPARE(loadSpy.count(), 1); - - QList children = webPage->mainFrame()->childFrames(); - QVERIFY(children.count() == 1); - - // 1st test - // call scrollRecursively over mainframe - // verify scrolled - // verify scroll postion changed - QPoint scrollPosition(webPage->mainFrame()->scrollPosition()); - QVERIFY(qtwebkit_webframe_scrollRecursively(webPage->mainFrame(), 10, 10)); - QVERIFY(scrollPosition != webPage->mainFrame()->scrollPosition()); - - // 2nd test - // call scrollRecursively over child iframe - // verify scrolled - // verify child scroll position changed - // verify parent's scroll position did not change - scrollPosition = webPage->mainFrame()->scrollPosition(); - QPoint childScrollPosition = children.at(0)->scrollPosition(); - QVERIFY(qtwebkit_webframe_scrollRecursively(children.at(0), 10, 10)); - QVERIFY(scrollPosition == webPage->mainFrame()->scrollPosition()); - QVERIFY(childScrollPosition != children.at(0)->scrollPosition()); - - // 3rd test - // call scrollRecursively over div overflow - // verify scrolled == true - // verify parent and child frame's scroll postion did not change - QWebElement div = webPage->mainFrame()->documentElement().findFirst("#content1"); - QMouseEvent evpres(QEvent::MouseMove, div.geometry().center(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); - webPage->event(&evpres); - scrollPosition = webPage->mainFrame()->scrollPosition(); - childScrollPosition = children.at(0)->scrollPosition(); - QVERIFY(qtwebkit_webframe_scrollRecursively(webPage->mainFrame(), 5, 5)); - QVERIFY(childScrollPosition == children.at(0)->scrollPosition()); - QVERIFY(scrollPosition == webPage->mainFrame()->scrollPosition()); - - // 4th test - // call scrollRecursively twice over childs iframe - // verify scrolled == true first time - // verify parent's scroll == true second time - // verify parent and childs scroll position changed - childScrollPosition = children.at(0)->scrollPosition(); - QVERIFY(qtwebkit_webframe_scrollRecursively(children.at(0), -10, -10)); - QVERIFY(childScrollPosition != children.at(0)->scrollPosition()); - scrollPosition = webPage->mainFrame()->scrollPosition(); - QVERIFY(qtwebkit_webframe_scrollRecursively(children.at(0), -10, -10)); - QVERIFY(scrollPosition != webPage->mainFrame()->scrollPosition()); - -} - QTEST_MAIN(tst_QWebFrame) #include "tst_qwebframe.moc" diff -r 2f34d5167611 -r fcece45ef507 src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp --- a/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/3rdparty/webkit/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp Mon May 03 13:17:34 2010 +0300 @@ -1451,6 +1451,26 @@ variant = page->inputMethodQuery(Qt::ImCurrentSelection); QString selectionValue = variant.value(); QCOMPARE(selectionValue, QString("eb")); + + //Set selection with negative length + inputAttributes << QInputMethodEvent::Attribute(QInputMethodEvent::Selection, 6, -5, QVariant()); + QInputMethodEvent eventSelection2("",inputAttributes); + page->event(&eventSelection2); + + //ImAnchorPosition + variant = page->inputMethodQuery(Qt::ImAnchorPosition); + anchorPosition = variant.toInt(); + QCOMPARE(anchorPosition, 1); + + //ImCursorPosition + variant = page->inputMethodQuery(Qt::ImCursorPosition); + cursorPosition = variant.toInt(); + QCOMPARE(cursorPosition, 6); + + //ImCurrentSelection + variant = page->inputMethodQuery(Qt::ImCurrentSelection); + selectionValue = variant.value(); + QCOMPARE(selectionValue, QString("tWebK")); #endif //ImSurroundingText diff -r 2f34d5167611 -r fcece45ef507 src/activeqt/container/qaxwidget.cpp --- a/src/activeqt/container/qaxwidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/activeqt/container/qaxwidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -1438,9 +1438,6 @@ HRESULT WINAPI QAxClientSite::EnableModeless(BOOL fEnable) { -#if !defined(Q_OS_WINCE) - LockWindowUpdate(host->window()->winId()); -#endif EnableWindow(host->window()->winId(), fEnable); if (!fEnable) { @@ -1451,9 +1448,6 @@ QApplicationPrivate::leaveModal(host); } qt_win_ignoreNextMouseReleaseEvent = false; -#if !defined(Q_OS_WINCE) - LockWindowUpdate(0); -#endif return S_OK; } diff -r 2f34d5167611 -r fcece45ef507 src/corelib/animation/qanimationgroup.cpp --- a/src/corelib/animation/qanimationgroup.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/animation/qanimationgroup.cpp Mon May 03 13:17:34 2010 +0300 @@ -244,7 +244,7 @@ // in ChildRemoved event d->animations.removeAt(index); animation->setParent(0); - d->animationRemovedAt(index); + d->animationRemoved(index, animation); return animation; } @@ -285,7 +285,7 @@ } -void QAnimationGroupPrivate::animationRemovedAt(int index) +void QAnimationGroupPrivate::animationRemoved(int index, QAbstractAnimation *) { Q_Q(QAnimationGroup); Q_UNUSED(index); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/animation/qanimationgroup_p.h --- a/src/corelib/animation/qanimationgroup_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/animation/qanimationgroup_p.h Mon May 03 13:17:34 2010 +0300 @@ -72,8 +72,19 @@ isGroup = true; } - virtual void animationInsertedAt(int index) { Q_UNUSED(index) }; - virtual void animationRemovedAt(int index); + virtual void animationInsertedAt(int) { } + virtual void animationRemoved(int, QAbstractAnimation *); + + void disconnectUncontrolledAnimation(QAbstractAnimation *anim) + { + //0 for the signal here because we might be called from the animation destructor + QObject::disconnect(anim, 0, q_func(), SLOT(_q_uncontrolledAnimationFinished())); + } + + void connectUncontrolledAnimation(QAbstractAnimation *anim) + { + QObject::connect(anim, SIGNAL(finished()), q_func(), SLOT(_q_uncontrolledAnimationFinished())); + } QList animations; }; diff -r 2f34d5167611 -r fcece45ef507 src/corelib/animation/qparallelanimationgroup.cpp --- a/src/corelib/animation/qparallelanimationgroup.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/animation/qparallelanimationgroup.cpp Mon May 03 13:17:34 2010 +0300 @@ -246,11 +246,9 @@ void QParallelAnimationGroupPrivate::disconnectUncontrolledAnimations() { - Q_Q(QParallelAnimationGroup); - QHash::iterator it = uncontrolledFinishTime.begin(); while (it != uncontrolledFinishTime.end()) { - QObject::disconnect(it.key(), SIGNAL(finished()), q, SLOT(_q_uncontrolledAnimationFinished())); + disconnectUncontrolledAnimation(it.key()); ++it; } @@ -259,13 +257,11 @@ void QParallelAnimationGroupPrivate::connectUncontrolledAnimations() { - Q_Q(QParallelAnimationGroup); - for (int i = 0; i < animations.size(); ++i) { QAbstractAnimation *animation = animations.at(i); if (animation->duration() == -1 || animation->loopCount() < 0) { uncontrolledFinishTime[animation] = -1; - QObject::connect(animation, SIGNAL(finished()), q, SLOT(_q_uncontrolledAnimationFinished())); + connectUncontrolledAnimation(animation); } } } @@ -305,6 +301,13 @@ return uncontrolledFinishTime.value(anim, -1) >= 0; } +void QParallelAnimationGroupPrivate::animationRemoved(int index, QAbstractAnimation *anim) +{ + QAnimationGroupPrivate::animationRemoved(index, anim); + disconnectUncontrolledAnimation(anim); + uncontrolledFinishTime.remove(anim); +} + /*! \reimp */ diff -r 2f34d5167611 -r fcece45ef507 src/corelib/animation/qparallelanimationgroup_p.h --- a/src/corelib/animation/qparallelanimationgroup_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/animation/qparallelanimationgroup_p.h Mon May 03 13:17:34 2010 +0300 @@ -80,6 +80,8 @@ void connectUncontrolledAnimations(); void disconnectUncontrolledAnimations(); + void animationRemoved(int index, QAbstractAnimation *); + // private slot void _q_uncontrolledAnimationFinished(); }; diff -r 2f34d5167611 -r fcece45ef507 src/corelib/animation/qsequentialanimationgroup.cpp --- a/src/corelib/animation/qsequentialanimationgroup.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/animation/qsequentialanimationgroup.cpp Mon May 03 13:17:34 2010 +0300 @@ -479,7 +479,7 @@ // connects to the finish signal of uncontrolled animations if (currentAnimation->totalDuration() == -1) - QObject::connect(currentAnimation, SIGNAL(finished()), q, SLOT(_q_uncontrolledAnimationFinished())); + connectUncontrolledAnimation(currentAnimation); currentAnimation->start(); if (!intermediate && state == QSequentialAnimationGroup::Paused) @@ -496,7 +496,7 @@ actualDuration.append(-1); actualDuration[currentAnimationIndex] = currentAnimation->currentTime(); - QObject::disconnect(currentAnimation, SIGNAL(finished()), q, SLOT(_q_uncontrolledAnimationFinished())); + disconnectUncontrolledAnimation(currentAnimation); if ((direction == QAbstractAnimation::Forward && currentAnimation == animations.last()) || (direction == QAbstractAnimation::Backward && currentAnimationIndex == 0)) { @@ -543,10 +543,10 @@ the group at index \a index. The animation is no more listed when this method is called. */ -void QSequentialAnimationGroupPrivate::animationRemovedAt(int index) +void QSequentialAnimationGroupPrivate::animationRemoved(int index, QAbstractAnimation *anim) { Q_Q(QSequentialAnimationGroup); - QAnimationGroupPrivate::animationRemovedAt(index); + QAnimationGroupPrivate::animationRemoved(index, anim); Q_ASSERT(currentAnimation); // currentAnimation should always be set @@ -555,7 +555,10 @@ const int currentIndex = animations.indexOf(currentAnimation); if (currentIndex == -1) { - //we're removing the current animation, let's update it to another one + //we're removing the current animation + + disconnectUncontrolledAnimation(currentAnimation); + if (index < animations.count()) setCurrentAnimation(index); //let's try to take the next one else if (index > 0) diff -r 2f34d5167611 -r fcece45ef507 src/corelib/animation/qsequentialanimationgroup_p.h --- a/src/corelib/animation/qsequentialanimationgroup_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/animation/qsequentialanimationgroup_p.h Mon May 03 13:17:34 2010 +0300 @@ -85,7 +85,7 @@ void activateCurrentAnimation(bool intermediate = false); void animationInsertedAt(int index); - void animationRemovedAt(int index); + void animationRemoved(int index, QAbstractAnimation *anim); bool atEnd() const; diff -r 2f34d5167611 -r fcece45ef507 src/corelib/arch/armv6/qatomic_generic_armv6.cpp --- a/src/corelib/arch/armv6/qatomic_generic_armv6.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/arch/armv6/qatomic_generic_armv6.cpp Mon May 03 13:17:34 2010 +0300 @@ -46,6 +46,7 @@ #include #ifdef QT_HAVE_ARMV6 +#ifndef SYMBIAN_E32_ATOMIC_API QT_BEGIN_NAMESPACE @@ -55,6 +56,24 @@ #pragma push #pragma arm Q_CORE_EXPORT asm +bool QBasicAtomicInt_testAndSetRelaxed(volatile int *_q_value, int expectedValue, int newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +bool QBasicAtomicInt_testAndSetAcquire(volatile int *_q_value, int expectedValue, int newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +bool QBasicAtomicInt_testAndSetRelease(volatile int *_q_value, int expectedValue, int newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm bool QBasicAtomicInt_testAndSetOrdered(volatile int *_q_value, int expectedValue, int newValue) { CODE32 @@ -73,6 +92,24 @@ } Q_CORE_EXPORT asm +int QBasicAtomicInt_fetchAndStoreRelaxed(volatile int *_q_value, int newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +int QBasicAtomicInt_fetchAndStoreAcquire(volatile int *_q_value, int newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +int QBasicAtomicInt_fetchAndStoreRelease(volatile int *_q_value, int newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *_q_value, int newValue) { CODE32 @@ -88,6 +125,24 @@ } Q_CORE_EXPORT asm +int QBasicAtomicInt_fetchAndAddRelaxed(volatile int *_q_value, int valueToAdd) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +int QBasicAtomicInt_fetchAndAddAcquire(volatile int *_q_value, int valueToAdd) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +int QBasicAtomicInt_fetchAndAddRelease(volatile int *_q_value, int valueToAdd) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm int QBasicAtomicInt_fetchAndAddOrdered(volatile int *_q_value, int valueToAdd) { CODE32 @@ -105,6 +160,30 @@ } Q_CORE_EXPORT asm +bool QBasicAtomicPointer_testAndSetRelaxed(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +bool QBasicAtomicPointer_testAndSetRelease(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +bool QBasicAtomicPointer_testAndSetAcquire(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value, void *expectedValue, void *newValue) @@ -125,6 +204,24 @@ } Q_CORE_EXPORT asm +void *QBasicAtomicPointer_fetchAndStoreRelaxed(void * volatile *_q_value, void *newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +void *QBasicAtomicPointer_fetchAndStoreAcquire(void * volatile *_q_value, void *newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +void *QBasicAtomicPointer_fetchAndStoreRelease(void * volatile *_q_value, void *newValue) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, void *newValue) { CODE32 @@ -140,6 +237,24 @@ } Q_CORE_EXPORT asm +void *QBasicAtomicPointer_fetchAndAddRelaxed(void * volatile *_q_value, qptrdiff valueToAdd) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +void *QBasicAtomicPointer_fetchAndAddRelease(void * volatile *_q_value, qptrdiff valueToAdd) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm +void *QBasicAtomicPointer_fetchAndAddAcquire(void * volatile *_q_value, qptrdiff valueToAdd) +{ + CODE32 + //fall through +} +Q_CORE_EXPORT asm void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *_q_value, qptrdiff valueToAdd) { CODE32 @@ -159,6 +274,21 @@ #pragma pop #elif defined (Q_CC_GCCE) Q_CORE_EXPORT __declspec( naked ) +bool QBasicAtomicInt_testAndSetRelaxed(volatile int *_q_value, int expectedValue, int newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +bool QBasicAtomicInt_testAndSetAcquire(volatile int *_q_value, int expectedValue, int newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +bool QBasicAtomicInt_testAndSetRelease(volatile int *_q_value, int expectedValue, int newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) bool QBasicAtomicInt_testAndSetOrdered(volatile int *_q_value, int expectedValue, int newValue) { //R0 = _q_value @@ -176,6 +306,21 @@ } Q_CORE_EXPORT __declspec( naked ) +int QBasicAtomicInt_fetchAndStoreRelaxed(volatile int *_q_value, int newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +int QBasicAtomicInt_fetchAndStoreAcquire(volatile int *_q_value, int newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +int QBasicAtomicInt_fetchAndStoreRelease(volatile int *_q_value, int newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *_q_value, int newValue) { //R0 = _q_value @@ -190,6 +335,21 @@ } Q_CORE_EXPORT __declspec( naked ) +int QBasicAtomicInt_fetchAndAddRelaxed(volatile int *_q_value, int valueToAdd) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +int QBasicAtomicInt_fetchAndAddAcquire(volatile int *_q_value, int valueToAdd) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +int QBasicAtomicInt_fetchAndAddRelease(volatile int *_q_value, int valueToAdd) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) int QBasicAtomicInt_fetchAndAddOrdered(volatile int *_q_value, int valueToAdd) { //R0 = _q_value @@ -206,6 +366,27 @@ } Q_CORE_EXPORT __declspec( naked ) +bool QBasicAtomicPointer_testAndSetRelaxed(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +bool QBasicAtomicPointer_testAndSetRelease(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +bool QBasicAtomicPointer_testAndSetAcquire(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value, void *expectedValue, void *newValue) @@ -225,6 +406,21 @@ } Q_CORE_EXPORT __declspec( naked ) +void *QBasicAtomicPointer_fetchAndStoreRelaxed(void * volatile *_q_value, void *newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +void *QBasicAtomicPointer_fetchAndStoreAcquire(void * volatile *_q_value, void *newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +void *QBasicAtomicPointer_fetchAndStoreRelease(void * volatile *_q_value, void *newValue) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, void *newValue) { //R0 = _q_value @@ -239,6 +435,21 @@ } Q_CORE_EXPORT __declspec( naked ) +void *QBasicAtomicPointer_fetchAndAddRelaxed(void * volatile *_q_value, qptrdiff valueToAdd) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +void *QBasicAtomicPointer_fetchAndAddRelease(void * volatile *_q_value, qptrdiff valueToAdd) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) +void *QBasicAtomicPointer_fetchAndAddAcquire(void * volatile *_q_value, qptrdiff valueToAdd) +{ + //fall through +} +Q_CORE_EXPORT __declspec( naked ) void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *_q_value, qptrdiff valueToAdd) { //R0 = _q_value @@ -258,3 +469,4 @@ #endif QT_END_NAMESPACE #endif +#endif diff -r 2f34d5167611 -r fcece45ef507 src/corelib/arch/qatomic_symbian.h --- a/src/corelib/arch/qatomic_symbian.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/arch/qatomic_symbian.h Mon May 03 13:17:34 2010 +0300 @@ -104,10 +104,28 @@ Q_CORE_EXPORT bool QBasicAtomicInt_testAndSetOrdered(volatile int *, int, int); Q_CORE_EXPORT int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *, int); Q_CORE_EXPORT int QBasicAtomicInt_fetchAndAddOrdered(volatile int *, int); +Q_CORE_EXPORT bool QBasicAtomicInt_testAndSetRelaxed(volatile int *, int, int); +Q_CORE_EXPORT int QBasicAtomicInt_fetchAndStoreRelaxed(volatile int *, int); +Q_CORE_EXPORT int QBasicAtomicInt_fetchAndAddRelaxed(volatile int *, int); +Q_CORE_EXPORT bool QBasicAtomicInt_testAndSetAcquire(volatile int *, int, int); +Q_CORE_EXPORT int QBasicAtomicInt_fetchAndStoreAcquire(volatile int *, int); +Q_CORE_EXPORT int QBasicAtomicInt_fetchAndAddAcquire(volatile int *, int); +Q_CORE_EXPORT bool QBasicAtomicInt_testAndSetRelease(volatile int *, int, int); +Q_CORE_EXPORT int QBasicAtomicInt_fetchAndStoreRelease(volatile int *, int); +Q_CORE_EXPORT int QBasicAtomicInt_fetchAndAddRelease(volatile int *, int); Q_CORE_EXPORT bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *, void *, void *); Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *, void *); Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *, qptrdiff); +Q_CORE_EXPORT bool QBasicAtomicPointer_testAndSetRelaxed(void * volatile *, void *, void *); +Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndStoreRelaxed(void * volatile *, void *); +Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndAddRelaxed(void * volatile *, qptrdiff); +Q_CORE_EXPORT bool QBasicAtomicPointer_testAndSetAcquire(void * volatile *, void *, void *); +Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndStoreAcquire(void * volatile *, void *); +Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndAddAcquire(void * volatile *, qptrdiff); +Q_CORE_EXPORT bool QBasicAtomicPointer_testAndSetRelease(void * volatile *, void *, void *); +Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndStoreRelease(void * volatile *, void *); +Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndAddRelease(void * volatile *, qptrdiff); // Reference counting @@ -133,17 +151,17 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) { - return testAndSetOrdered(expectedValue, newValue); + return QBasicAtomicInt_testAndSetRelaxed(&_q_value, expectedValue, newValue); } inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) { - return testAndSetOrdered(expectedValue, newValue); + return QBasicAtomicInt_testAndSetAcquire(&_q_value, expectedValue, newValue); } inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) { - return testAndSetOrdered(expectedValue, newValue); + return QBasicAtomicInt_testAndSetRelease(&_q_value, expectedValue, newValue); } // Fetch and store for integers @@ -155,17 +173,17 @@ inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) { - return fetchAndStoreOrdered(newValue); + return QBasicAtomicInt_fetchAndStoreRelaxed(&_q_value, newValue); } inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) { - return fetchAndStoreOrdered(newValue); + return QBasicAtomicInt_fetchAndStoreAcquire(&_q_value, newValue); } inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue) { - return fetchAndStoreOrdered(newValue); + return QBasicAtomicInt_fetchAndStoreRelease(&_q_value, newValue); } // Fetch and add for integers @@ -177,17 +195,17 @@ inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) { - return fetchAndAddOrdered(valueToAdd); + return QBasicAtomicInt_fetchAndAddRelaxed(&_q_value, valueToAdd); } inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) { - return fetchAndAddOrdered(valueToAdd); + return QBasicAtomicInt_fetchAndAddAcquire(&_q_value, valueToAdd); } inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) { - return fetchAndAddOrdered(valueToAdd); + return QBasicAtomicInt_fetchAndAddRelease(&_q_value, valueToAdd); } // Test and set for pointers @@ -195,27 +213,29 @@ template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetOrdered(T *expectedValue, T *newValue) { - union { T * volatile * typed; void * volatile * voidp; } pointer; - pointer.typed = &_q_value; - return QBasicAtomicPointer_testAndSetOrdered(pointer.voidp, expectedValue, newValue); + return QBasicAtomicPointer_testAndSetOrdered(reinterpret_cast(&_q_value), + expectedValue, newValue); } template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue) { - return testAndSetOrdered(expectedValue, newValue); + return QBasicAtomicPointer_testAndSetRelaxed(reinterpret_cast(&_q_value), + expectedValue, newValue); } template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue) { - return testAndSetOrdered(expectedValue, newValue); + return QBasicAtomicPointer_testAndSetAcquire(reinterpret_cast(&_q_value), + expectedValue, newValue); } template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue) { - return testAndSetOrdered(expectedValue, newValue); + return QBasicAtomicPointer_testAndSetRelease(reinterpret_cast(&_q_value), + expectedValue, newValue); } // Fetch and store for pointers @@ -223,29 +243,33 @@ template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreOrdered(T *newValue) { - union { T * volatile * typed; void * volatile * voidp; } pointer; - union { T *typed; void *voidp; } returnValue; - pointer.typed = &_q_value; - returnValue.voidp = QBasicAtomicPointer_fetchAndStoreOrdered(pointer.voidp, newValue); - return returnValue.typed; + return static_cast(QBasicAtomicPointer_fetchAndStoreOrdered( + reinterpret_cast(&_q_value) + , newValue)); } template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) { - return fetchAndStoreOrdered(newValue); + return static_cast(QBasicAtomicPointer_fetchAndStoreRelaxed( + reinterpret_cast(&_q_value) + , newValue)); } template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) { - return fetchAndStoreOrdered(newValue); + return static_cast(QBasicAtomicPointer_fetchAndStoreAcquire( + reinterpret_cast(&_q_value) + , newValue)); } template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelease(T *newValue) { - return fetchAndStoreOrdered(newValue); + return static_cast(QBasicAtomicPointer_fetchAndStoreRelease( + reinterpret_cast(&_q_value) + , newValue)); } // Fetch and add for pointers @@ -253,29 +277,33 @@ template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddOrdered(qptrdiff valueToAdd) { - union { T * volatile *typed; void * volatile *voidp; } pointer; - union { T *typed; void *voidp; } returnValue; - pointer.typed = &_q_value; - returnValue.voidp = QBasicAtomicPointer_fetchAndAddOrdered(pointer.voidp, valueToAdd * sizeof(T)); - return returnValue.typed; + return static_cast(QBasicAtomicPointer_fetchAndAddOrdered( + reinterpret_cast(&_q_value), + valueToAdd * sizeof(T))); } template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueToAdd) { - return fetchAndAddOrdered(valueToAdd); + return static_cast(QBasicAtomicPointer_fetchAndAddRelaxed( + reinterpret_cast(&_q_value), + valueToAdd * sizeof(T))); } template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddAcquire(qptrdiff valueToAdd) { - return fetchAndAddOrdered(valueToAdd); + return static_cast(QBasicAtomicPointer_fetchAndAddAcquire( + reinterpret_cast(&_q_value), + valueToAdd * sizeof(T))); } template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelease(qptrdiff valueToAdd) { - return fetchAndAddOrdered(valueToAdd); + return static_cast(QBasicAtomicPointer_fetchAndAddRelease( + reinterpret_cast(&_q_value), + valueToAdd * sizeof(T))); } QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/corelib/arch/symbian/qatomic_symbian.cpp --- a/src/corelib/arch/symbian/qatomic_symbian.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/arch/symbian/qatomic_symbian.cpp Mon May 03 13:17:34 2010 +0300 @@ -42,6 +42,10 @@ #include #include +#ifdef SYMBIAN_E32_ATOMIC_API +#include +#endif + #include QT_BEGIN_NAMESPACE @@ -79,7 +83,7 @@ Q_CORE_EXPORT bool QBasicAtomicInt::isReferenceCountingNative() { -#ifdef QT_HAVE_ARMV6 +#if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6) return true; #else return false; @@ -88,7 +92,7 @@ Q_CORE_EXPORT bool QBasicAtomicInt::isTestAndSetNative() { -#ifdef QT_HAVE_ARMV6 +#if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6) return true; #else return false; @@ -97,7 +101,7 @@ Q_CORE_EXPORT bool QBasicAtomicInt::isFetchAndStoreNative() { -#ifdef QT_HAVE_ARMV6 +#if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6) return true; #else return false; @@ -106,7 +110,7 @@ Q_CORE_EXPORT bool QBasicAtomicInt::isFetchAndAddNative() { -#ifdef QT_HAVE_ARMV6 +#if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6) return true; #else return false; @@ -115,7 +119,7 @@ Q_CORE_EXPORT bool QBasicAtomicPointer_isTestAndSetNative() { -#ifdef QT_HAVE_ARMV6 +#if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6) return true; #else return false; @@ -124,7 +128,7 @@ Q_CORE_EXPORT bool QBasicAtomicPointer_isFetchAndStoreNative() { -#ifdef QT_HAVE_ARMV6 +#if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6) return true; #else return false; @@ -133,13 +137,187 @@ Q_CORE_EXPORT bool QBasicAtomicPointer_isFetchAndAddNative() { -#ifdef QT_HAVE_ARMV6 +#if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6) return true; #else return false; #endif } +#ifdef SYMBIAN_E32_ATOMIC_API +//Symbian's API is SMP-safe when using SMP kernel, and cheap when using uniprocessor kernel + +//generate compiler error if casting assumptions are wrong (symbian64?) +__ASSERT_COMPILE(sizeof(int) == sizeof(TUint32)); +__ASSERT_COMPILE(sizeof(void *) == sizeof(TUint32)); + +Q_CORE_EXPORT +bool QBasicAtomicInt_testAndSetOrdered(volatile int *_q_value, int expectedValue, int newValue) +{ + return static_cast(__e32_atomic_cas_ord32(_q_value, + reinterpret_cast(&expectedValue), newValue)); +} + +Q_CORE_EXPORT +bool QBasicAtomicInt_testAndSetRelaxed(volatile int *_q_value, int expectedValue, int newValue) +{ + return static_cast(__e32_atomic_cas_rlx32(_q_value, + reinterpret_cast(&expectedValue), newValue)); +} + +Q_CORE_EXPORT +bool QBasicAtomicInt_testAndSetAcquire(volatile int *_q_value, int expectedValue, int newValue) +{ + return static_cast(__e32_atomic_cas_acq32(_q_value, + reinterpret_cast(&expectedValue), newValue)); +} + +Q_CORE_EXPORT +bool QBasicAtomicInt_testAndSetRelease(volatile int *_q_value, int expectedValue, int newValue) +{ + return static_cast(__e32_atomic_cas_rel32(_q_value, + reinterpret_cast(&expectedValue), newValue)); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *_q_value, int newValue) +{ + return static_cast(__e32_atomic_swp_ord32(_q_value, newValue)); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndStoreRelaxed(volatile int *_q_value, int newValue) +{ + return static_cast(__e32_atomic_swp_rlx32(_q_value, newValue)); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndStoreAcquire(volatile int *_q_value, int newValue) +{ + return static_cast(__e32_atomic_swp_acq32(_q_value, newValue)); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndStoreRelease(volatile int *_q_value, int newValue) +{ + return static_cast(__e32_atomic_swp_rel32(_q_value, newValue)); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndAddOrdered(volatile int *_q_value, int valueToAdd) +{ + return static_cast(__e32_atomic_add_ord32(_q_value, valueToAdd)); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndAddRelaxed(volatile int *_q_value, int valueToAdd) +{ + return static_cast(__e32_atomic_add_rlx32(_q_value, valueToAdd)); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndAddAcquire(volatile int *_q_value, int valueToAdd) +{ + return static_cast(__e32_atomic_add_acq32(_q_value, valueToAdd)); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndAddRelease(volatile int *_q_value, int valueToAdd) +{ + return static_cast(__e32_atomic_add_rel32(_q_value, valueToAdd)); +} + +Q_CORE_EXPORT +bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + return static_cast(__e32_atomic_cas_ord_ptr(_q_value, + &expectedValue, + newValue)); +} + +Q_CORE_EXPORT +bool QBasicAtomicPointer_testAndSetRelaxed(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + return static_cast(__e32_atomic_cas_rlx_ptr(_q_value, + &expectedValue, + newValue)); +} + +Q_CORE_EXPORT +bool QBasicAtomicPointer_testAndSetAcquire(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + return static_cast(__e32_atomic_cas_acq_ptr(_q_value, + &expectedValue, + newValue)); +} + +Q_CORE_EXPORT +bool QBasicAtomicPointer_testAndSetRelease(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + return static_cast(__e32_atomic_cas_rel_ptr(_q_value, + &expectedValue, + newValue)); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, void *newValue) +{ + return __e32_atomic_swp_ord_ptr(_q_value, newValue); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndStoreRelaxed(void * volatile *_q_value, void *newValue) +{ + return __e32_atomic_swp_rlx_ptr(_q_value, newValue); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndStoreAcquire(void * volatile *_q_value, void *newValue) +{ + return __e32_atomic_swp_acq_ptr(_q_value, newValue); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndStoreRelease(void * volatile *_q_value, void *newValue) +{ + return __e32_atomic_swp_rel_ptr(_q_value, newValue); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *_q_value, qptrdiff valueToAdd) +{ + return __e32_atomic_add_ord_ptr(_q_value, valueToAdd); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndAddRelaxed(void * volatile *_q_value, qptrdiff valueToAdd) +{ + return __e32_atomic_add_rlx_ptr(_q_value, valueToAdd); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndAddAcquire(void * volatile *_q_value, qptrdiff valueToAdd) +{ + return __e32_atomic_add_acq_ptr(_q_value, valueToAdd); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndAddRelease(void * volatile *_q_value, qptrdiff valueToAdd) +{ + return __e32_atomic_add_rel_ptr(_q_value, valueToAdd); +} + +#else +//Symbian kernels 9.4 and earlier don't expose a suitable API + //For ARMv6, the generic atomics are machine coded #ifndef QT_HAVE_ARMV6 @@ -229,6 +407,121 @@ return returnValue; } +Q_CORE_EXPORT +bool QBasicAtomicInt_testAndSetRelaxed(volatile int *_q_value, int expectedValue, int newValue) +{ + return QBasicAtomicInt_testAndSetOrdered(_q_value, expectedValue, newValue); +} + +Q_CORE_EXPORT +bool QBasicAtomicInt_testAndSetAcquire(volatile int *_q_value, int expectedValue, int newValue) +{ + return QBasicAtomicInt_testAndSetOrdered(_q_value, expectedValue, newValue); +} + +Q_CORE_EXPORT +bool QBasicAtomicInt_testAndSetRelease(volatile int *_q_value, int expectedValue, int newValue) +{ + return QBasicAtomicInt_testAndSetOrdered(_q_value, expectedValue, newValue); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndStoreRelaxed(volatile int *_q_value, int newValue) +{ + return QBasicAtomicInt_fetchAndStoreOrdered(_q_value, newValue); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndStoreAcquire(volatile int *_q_value, int newValue) +{ + return QBasicAtomicInt_fetchAndStoreOrdered(_q_value, newValue); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndStoreRelease(volatile int *_q_value, int newValue) +{ + return QBasicAtomicInt_fetchAndStoreOrdered(_q_value, newValue); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndAddRelaxed(volatile int *_q_value, int valueToAdd) +{ + return QBasicAtomicInt_fetchAndAddOrdered(_q_value, valueToAdd); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndAddAcquire(volatile int *_q_value, int valueToAdd) +{ + return QBasicAtomicInt_fetchAndAddOrdered(_q_value, valueToAdd); +} + +Q_CORE_EXPORT +int QBasicAtomicInt_fetchAndAddRelease(volatile int *_q_value, int valueToAdd) +{ + return QBasicAtomicInt_fetchAndAddOrdered(_q_value, valueToAdd); +} + +Q_CORE_EXPORT +bool QBasicAtomicPointer_testAndSetRelaxed(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + return QBasicAtomicPointer_testAndSetOrdered(_q_value, expectedValue, newValue); +} + +Q_CORE_EXPORT +bool QBasicAtomicPointer_testAndSetAcquire(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + return QBasicAtomicPointer_testAndSetOrdered(_q_value, expectedValue, newValue); +} + +Q_CORE_EXPORT +bool QBasicAtomicPointer_testAndSetRelease(void * volatile *_q_value, + void *expectedValue, + void *newValue) +{ + return QBasicAtomicPointer_testAndSetOrdered(_q_value, expectedValue, newValue); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndStoreRelaxed(void * volatile *_q_value, void *newValue) +{ + return QBasicAtomicPointer_fetchAndStoreOrdered(_q_value, newValue); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndStoreAcquire(void * volatile *_q_value, void *newValue) +{ + return QBasicAtomicPointer_fetchAndStoreOrdered(_q_value, newValue); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndStoreRelease(void * volatile *_q_value, void *newValue) +{ + return QBasicAtomicPointer_fetchAndStoreOrdered(_q_value, newValue); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndAddRelaxed(void * volatile *_q_value, qptrdiff valueToAdd) +{ + return QBasicAtomicPointer_fetchAndAddOrdered(_q_value, valueToAdd); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndAddAcquire(void * volatile *_q_value, qptrdiff valueToAdd) +{ + return QBasicAtomicPointer_fetchAndAddOrdered(_q_value, valueToAdd); +} + +Q_CORE_EXPORT +void *QBasicAtomicPointer_fetchAndAddRelease(void * volatile *_q_value, qptrdiff valueToAdd) +{ + return QBasicAtomicPointer_fetchAndAddOrdered(_q_value, valueToAdd); +} + #endif // QT_HAVE_ARMV6 +#endif // SYMBIAN_E32_ATOMIC_API QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/corelib/codecs/qiconvcodec.cpp --- a/src/corelib/codecs/qiconvcodec.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/codecs/qiconvcodec.cpp Mon May 03 13:17:34 2010 +0300 @@ -299,6 +299,32 @@ Q_GLOBAL_STATIC(QThreadStorage, fromUnicodeState) +static bool setByteOrder(iconv_t cd) +{ +#if !defined(NO_BOM) + // give iconv() a BOM + char buf[4]; + ushort bom[] = { QChar::ByteOrderMark }; + + char *outBytes = buf; + char *inBytes = reinterpret_cast(bom); + size_t outBytesLeft = sizeof buf; + size_t inBytesLeft = sizeof bom; + +#if defined(GNU_LIBICONV) + const char **inBytesPtr = const_cast(&inBytes); +#else + char **inBytesPtr = &inBytes; +#endif + + if (iconv(cd, inBytesPtr, &inBytesLeft, &outBytes, &outBytesLeft) == (size_t) -1) { + return false; + } +#endif // NO_BOM + + return true; +} + QByteArray QIconvCodec::convertFromUnicode(const QChar *uc, int len, ConverterState *convState) const { char *inBytes; @@ -325,17 +351,8 @@ IconvState *&state = ts->localData(); if (!state) { state = new IconvState(QIconvCodec::createIconv_t(0, UTF16)); - if (state->cd != reinterpret_cast(-1)) { - size_t outBytesLeft = len + 3; // +3 for the BOM - QByteArray ba(outBytesLeft, Qt::Uninitialized); - outBytes = ba.data(); - -#if !defined(NO_BOM) - // give iconv() a BOM - QChar bom[] = { QChar(QChar::ByteOrderMark) }; - inBytes = reinterpret_cast(bom); - inBytesLeft = sizeof(bom); - if (iconv(state->cd, inBytesPtr, &inBytesLeft, &outBytes, &outBytesLeft) == (size_t) -1) { + if (state->cd == reinterpret_cast(-1)) { + if (!setByteOrder(state->cd)) { perror("QIconvCodec::convertFromUnicode: using ASCII for conversion, iconv failed for BOM"); iconv_close(state->cd); @@ -343,7 +360,6 @@ return QString(uc, len).toAscii(); } -#endif // NO_BOM } } if (state->cd == reinterpret_cast(-1)) { @@ -422,6 +438,7 @@ // reset to initial state iconv(state->cd, 0, &inBytesLeft, 0, &outBytesLeft); + setByteOrder(state->cd); ba.resize(ba.size() - outBytesLeft); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/concurrent/qfuturewatcher.cpp --- a/src/corelib/concurrent/qfuturewatcher.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/concurrent/qfuturewatcher.cpp Mon May 03 13:17:34 2010 +0300 @@ -499,6 +499,13 @@ /*! \fn void QFutureWatcher::setFuture(const QFuture &future) Starts watching the given \a future. + + One of the signals might be emitted for the current state of the + \a future. For example, if the future is already stopped, the + finished signal will be emitted. + + To avoid a race condition, it is important to call this function + \i after doing the connections. */ /*! \fn QFuture QFutureWatcher::future() const diff -r 2f34d5167611 -r fcece45ef507 src/corelib/corelib.pro --- a/src/corelib/corelib.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/corelib.pro Mon May 03 13:17:34 2010 +0300 @@ -39,7 +39,6 @@ # Partial upgrade SIS file vendorinfo = \ - "&EN" \ "; Localised Vendor name" \ "%{\"Nokia, Qt\"}" \ " " \ diff -r 2f34d5167611 -r fcece45ef507 src/corelib/global/qnamespace.h --- a/src/corelib/global/qnamespace.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/global/qnamespace.h Mon May 03 13:17:34 2010 +0300 @@ -299,7 +299,9 @@ MacWindowToolBarButtonHint = 0x10000000, BypassGraphicsProxyWidget = 0x20000000, WindowOkButtonHint = 0x00080000, - WindowCancelButtonHint = 0x00100000 + WindowCancelButtonHint = 0x00100000, + WindowSoftkeysVisibleHint = 0x40000000, + WindowSoftkeysRespondHint = 0x80000000 #ifdef QT3_SUPPORT , diff -r 2f34d5167611 -r fcece45ef507 src/corelib/global/qnamespace.qdoc --- a/src/corelib/global/qnamespace.qdoc Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/global/qnamespace.qdoc Mon May 03 13:17:34 2010 +0300 @@ -1622,22 +1622,22 @@ \value Key_OpenUrl \value Key_LaunchMail \value Key_LaunchMedia - \value Key_Launch0 - \value Key_Launch1 - \value Key_Launch2 - \value Key_Launch3 - \value Key_Launch4 - \value Key_Launch5 - \value Key_Launch6 - \value Key_Launch7 - \value Key_Launch8 - \value Key_Launch9 - \value Key_LaunchA - \value Key_LaunchB - \value Key_LaunchC - \value Key_LaunchD - \value Key_LaunchE - \value Key_LaunchF + \value Key_Launch0 On X11 this key is mapped to "My Computer" (XF86XK_MyComputer) key for legacy reasons. + \value Key_Launch1 On X11 this key is mapped to "Calculator" (XF86XK_Calculator) key for legacy reasons. + \value Key_Launch2 On X11 this key is mapped to XF86XK_Launch0 key for legacy reasons. + \value Key_Launch3 On X11 this key is mapped to XF86XK_Launch1 key for legacy reasons. + \value Key_Launch4 On X11 this key is mapped to XF86XK_Launch2 key for legacy reasons. + \value Key_Launch5 On X11 this key is mapped to XF86XK_Launch3 key for legacy reasons. + \value Key_Launch6 On X11 this key is mapped to XF86XK_Launch4 key for legacy reasons. + \value Key_Launch7 On X11 this key is mapped to XF86XK_Launch5 key for legacy reasons. + \value Key_Launch8 On X11 this key is mapped to XF86XK_Launch6 key for legacy reasons. + \value Key_Launch9 On X11 this key is mapped to XF86XK_Launch7 key for legacy reasons. + \value Key_LaunchA On X11 this key is mapped to XF86XK_Launch8 key for legacy reasons. + \value Key_LaunchB On X11 this key is mapped to XF86XK_Launch9 key for legacy reasons. + \value Key_LaunchC On X11 this key is mapped to XF86XK_LaunchA key for legacy reasons. + \value Key_LaunchD On X11 this key is mapped to XF86XK_LaunchB key for legacy reasons. + \value Key_LaunchE On X11 this key is mapped to XF86XK_LaunchC key for legacy reasons. + \value Key_LaunchF On X11 this key is mapped to XF86XK_LaunchD key for legacy reasons. \value Key_MonBrightnessUp \value Key_MonBrightnessDown \value Key_KeyboardLightOnOff @@ -1663,7 +1663,7 @@ \value Key_ApplicationRight \value Key_Book \value Key_CD - \value Key_Calculator + \value Key_Calculator On X11 this key is not mapped for legacy reasons. Use Qt::Key_Launch1 instead. \value Key_ToDoList \value Key_ClearGrab \value Key_Close @@ -2146,6 +2146,14 @@ \value WindowCancelButtonHint Adds a Cancel button to the window decoration of a dialog. Only supported for Windows CE. + \value WindowSoftkeysVisibleHint Makes softkeys visible when widget is fullscreen. + Only supported for Symbian. + + \value WindowSoftkeysRespondHint Makes softkeys to receive key events even + when invisible. With this hint the softkey actions are triggered + even the softkeys are invisible i.e. the window is displayed with + \c showFullscreen(). Only supported for Symbian. + \value WindowType_Mask A mask for extracting the window type part of the window flags. diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qdir.cpp --- a/src/corelib/io/qdir.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qdir.cpp Mon May 03 13:17:34 2010 +0300 @@ -993,15 +993,15 @@ /*! \obsolete + + Use QDir::addSearchPath() with a prefix instead. + Adds \a path to the search paths searched in to find resources that are not specified with an absolute path. The default search path is to search only in the root (\c{:/}). - Use QDir::addSearchPath() with a prefix instead. - - \sa {The Qt Resource System}, QResource::addSearchPath() + \sa {The Qt Resource System} */ - void QDir::addResourceSearchPath(const QString &path) { #ifdef QT_BUILD_CORE_LIB diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qfile.cpp --- a/src/corelib/io/qfile.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qfile.cpp Mon May 03 13:17:34 2010 +0300 @@ -62,21 +62,25 @@ static QByteArray locale_encode(const QString &f) { -#ifndef Q_OS_DARWIN - return f.toLocal8Bit(); -#else +#if defined(Q_OS_DARWIN) // Mac always expects UTF-8... and decomposed... return f.normalized(QString::NormalizationForm_D).toUtf8(); +#elif defined(Q_OS_SYMBIAN) + return f.toUtf8(); +#else + return f.toLocal8Bit(); #endif } static QString locale_decode(const QByteArray &f) { -#ifndef Q_OS_DARWIN - return QString::fromLocal8Bit(f); -#else +#if defined(Q_OS_DARWIN) // Mac always gives us UTF-8 and decomposed, we want that composed... return QString::fromUtf8(f).normalized(QString::NormalizationForm_C); +#elif defined(Q_OS_SYMBIAN) + return QString::fromUtf8(f); +#else + return QString::fromLocal8Bit(f); #endif } @@ -86,7 +90,8 @@ QFilePrivate::QFilePrivate() : fileEngine(0), lastWasWrite(false), - writeBuffer(QFILE_WRITEBUFFER_SIZE), error(QFile::NoError) + writeBuffer(QFILE_WRITEBUFFER_SIZE), error(QFile::NoError), + cachedSize(0) { } @@ -1253,8 +1258,10 @@ seek(sz); if(d->fileEngine->setSize(sz)) { unsetError(); + d->cachedSize = sz; return true; } + d->cachedSize = 0; d->setError(QFile::ResizeError, d->fileEngine->errorString()); return false; } @@ -1416,7 +1423,8 @@ Q_D(const QFile); if (!d->ensureFlushed()) return 0; - return fileEngine()->size(); + d->cachedSize = fileEngine()->size(); + return d->cachedSize; } /*! @@ -1442,16 +1450,16 @@ { Q_D(const QFile); + // If there's buffered data left, we're not at the end. + if (!d->buffer.isEmpty()) + return false; + if (!isOpen()) return true; if (!d->ensureFlushed()) return false; - // If there's buffered data left, we're not at the end. - if (!d->buffer.isEmpty()) - return false; - // If the file engine knows best, say what it says. if (d->fileEngine->supportsExtension(QAbstractFileEngine::AtEndExtension)) { // Check if the file engine supports AtEndExtension, and if it does, @@ -1459,6 +1467,11 @@ return d->fileEngine->atEnd(); } + // if it looks like we are at the end, or if size is not cached, + // fall through to bytesAvailable() to make sure. + if (pos() < d->cachedSize) + return false; + // Fall back to checking how much is available (will stat files). return bytesAvailable() == 0; } @@ -1498,12 +1511,21 @@ if (!d->ensureFlushed()) return -1; - if (d->fileEngine->supportsExtension(QAbstractFileEngine::FastReadLineExtension)) - return d->fileEngine->readLine(data, maxlen); + qint64 read; + if (d->fileEngine->supportsExtension(QAbstractFileEngine::FastReadLineExtension)) { + read = d->fileEngine->readLine(data, maxlen); + } else { + // Fall back to QIODevice's readLine implementation if the engine + // cannot do it faster. + read = QIODevice::readLineData(data, maxlen); + } - // Fall back to QIODevice's readLine implementation if the engine - // cannot do it faster. - return QIODevice::readLineData(data, maxlen); + if (read < maxlen) { + // failed to read all requested, may be at the end of file, stop caching size so that it's rechecked + d->cachedSize = 0; + } + + return read; } /*! @@ -1524,6 +1546,12 @@ err = QFile::ReadError; d->setError(err, d->fileEngine->errorString()); } + + if (read < len) { + // failed to read all requested, may be at the end of file, stop caching size so that it's rechecked + d->cachedSize = 0; + } + return read; } diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qfile_p.h --- a/src/corelib/io/qfile_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qfile_p.h Mon May 03 13:17:34 2010 +0300 @@ -84,6 +84,8 @@ void setError(QFile::FileError err, const QString &errorString); void setError(QFile::FileError err, int errNum); + mutable qint64 cachedSize; + private: static QFile::EncoderFn encoder; static QFile::DecoderFn decoder; diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qfsfileengine.cpp --- a/src/corelib/io/qfsfileengine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qfsfileengine.cpp Mon May 03 13:17:34 2010 +0300 @@ -145,6 +145,8 @@ #endif // Mac OS X 10.5.x doesn't support the realpath(X,0) extenstion we use here. #if defined(Q_OS_LINUX) || defined(Q_OS_SYMBIAN) + // ... but Linux with uClibc does not have it +#if !defined(__UCLIBC__) char *ret = realpath(path.toLocal8Bit().constData(), (char*)0); if (ret) { QString canonicalPath = QDir::cleanPath(QString::fromLocal8Bit(ret)); @@ -152,6 +154,7 @@ return canonicalPath; } #endif +#endif QFileInfo fi; const QChar slash(QLatin1Char('/')); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qfsfileengine_p.h --- a/src/corelib/io/qfsfileengine_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qfsfileengine_p.h Mon May 03 13:17:34 2010 +0300 @@ -151,6 +151,10 @@ static bool uncListSharesOnServer(const QString &server, QStringList *list); #endif +#ifdef Q_OS_SYMBIAN + void setSymbianError(int symbianError, QFile::FileError defaultError, QString defaultString); +#endif + protected: QFSFileEnginePrivate(); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qfsfileengine_unix.cpp --- a/src/corelib/io/qfsfileengine_unix.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qfsfileengine_unix.cpp Mon May 03 13:17:34 2010 +0300 @@ -81,6 +81,40 @@ && ((fileName.at(0).isLetter() && fileName.at(1) == QLatin1Char(':')) || (fileName.at(0) == QLatin1Char('/') && fileName.at(1) == QLatin1Char('/'))))); } + +/*! + \internal + convert symbian error code to the one suitable for setError. + example usage: setSymbianError(err, QFile::CopyError, QLatin1String("copy error")) +*/ +void QFSFileEnginePrivate::setSymbianError(int symbianError, QFile::FileError defaultError, QString defaultString) +{ + Q_Q(QFSFileEngine); + switch (symbianError) { + case KErrNone: + q->setError(QFile::NoError, QLatin1String("")); + break; + case KErrAccessDenied: + q->setError(QFile::PermissionsError, QLatin1String("access denied")); + break; + case KErrPermissionDenied: + q->setError(QFile::PermissionsError, QLatin1String("permission denied")); + break; + case KErrAbort: + q->setError(QFile::AbortError, QLatin1String("aborted")); + break; + case KErrCancel: + q->setError(QFile::AbortError, QLatin1String("cancelled")); + break; + case KErrTimedOut: + q->setError(QFile::TimeOutError, QLatin1String("timed out")); + break; + default: + q->setError(defaultError, defaultString); + break; + } +} + #endif /*! @@ -427,8 +461,10 @@ } ) // End TRAP delete fm; - // ### Add error reporting on failure - return (err == KErrNone); + if (err == KErrNone) + return true; + d->setSymbianError(err, QFile::CopyError, QLatin1String("copy error")); + return false; #else Q_UNUSED(newName); // ### Add copy code for Unix here @@ -482,7 +518,9 @@ if ((st.st_mode & S_IFMT) != S_IFDIR) return false; } else if (QT_MKDIR(chunk, 0777) != 0) { - return false; + //QTP: workaround for QT-3141 + if (errno != EEXIST) + return false; } } } @@ -668,6 +706,16 @@ could_stat = (QT_FSTAT(QT_FILENO(fh), &st) == 0); } else if (fd == -1) { // ### actually covers two cases: d->fh and when the file is not open +#if defined(Q_OS_SYMBIAN) + // Optimisation for Symbian where fileFlags() calls both doStat() and isSymlink(), but rarely on real links. + // When the filename is not a link, lstat will return the same info as stat, but this also removes + // any need for a further call to lstat to check if the file is a link. + need_lstat = false; + could_stat = (QT_LSTAT(nativeFilePath.constData(), &st) == 0); + is_link = could_stat ? S_ISLNK(st.st_mode) : false; + // if it turns out this was a link, we can call stat too. + if (is_link) +#endif could_stat = (QT_STAT(nativeFilePath.constData(), &st) == 0); } else { could_stat = (QT_FSTAT(fd, &st) == 0); @@ -1270,7 +1318,7 @@ int pageSize = getpagesize(); int extra = offset % pageSize; - if (size + extra > (size_t)-1) { + if (quint64(size + extra) > quint64((size_t)-1)) { q->setError(QFile::UnspecifiedError, qt_error_string(int(EINVAL))); return 0; } diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qiodevice.cpp --- a/src/corelib/io/qiodevice.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qiodevice.cpp Mon May 03 13:17:34 2010 +0300 @@ -84,10 +84,6 @@ } #endif -#ifndef QIODEVICE_BUFFERSIZE -#define QIODEVICE_BUFFERSIZE Q_INT64_C(16384) -#endif - #define Q_VOID #define CHECK_MAXLEN(function, returnType) \ @@ -123,7 +119,9 @@ QIODevicePrivate::QIODevicePrivate() : openMode(QIODevice::NotOpen), buffer(QIODEVICE_BUFFERSIZE), pos(0), devicePos(0) + , pPos(&pos), pDevicePos(&devicePos) , baseReadLineDataCalled(false) + , firstRead(true) , accessMode(Unset) #ifdef QT_NO_QOBJECT , q_ptr(0) @@ -282,8 +280,7 @@ Certain flags, such as \c Unbuffered and \c Truncate, are meaningless when used with some subclasses. Some of these restrictions are implied by the type of device that is represented - by a subclass; for example, access to a QBuffer is always - unbuffered. In other cases, the restriction may be due to the + by a subclass. In other cases, the restriction may be due to the implementation, or may be imposed by the underlying platform; for example, QTcpSocket does not support \c Unbuffered mode, and limitations in the native API prevent QFile from supporting \c @@ -450,11 +447,15 @@ */ void QIODevice::setOpenMode(OpenMode openMode) { + Q_D(QIODevice); #if defined QIODEVICE_DEBUG printf("%p QIODevice::setOpenMode(0x%x)\n", this, int(openMode)); #endif - d_func()->openMode = openMode; - d_func()->accessMode = QIODevicePrivate::Unset; + d->openMode = openMode; + d->accessMode = QIODevicePrivate::Unset; + d->firstRead = true; + if (!isReadable()) + d->buffer.clear(); } /*! @@ -538,6 +539,7 @@ d->pos = (mode & Append) ? size() : qint64(0); d->buffer.clear(); d->accessMode = QIODevicePrivate::Unset; + d->firstRead = true; #if defined QIODEVICE_DEBUG printf("%p QIODevice::open(0x%x)\n", this, quint32(mode)); #endif @@ -567,6 +569,7 @@ d->errorString.clear(); d->pos = 0; d->buffer.clear(); + d->firstRead = true; } /*! @@ -730,6 +733,12 @@ return qint64(0); } +#ifdef Q_CC_RVCT +// arm mode makes the 64-bit integer operations much faster in RVCT 2.2 +#pragma push +#pragma arm +#endif + /*! Reads at most \a maxSize bytes from the device into \a data, and returns the number of bytes read. If an error occurs, such as when @@ -746,21 +755,17 @@ qint64 QIODevice::read(char *data, qint64 maxSize) { Q_D(QIODevice); - CHECK_READABLE(read, qint64(-1)); - CHECK_MAXLEN(read, qint64(-1)); #if defined QIODEVICE_DEBUG printf("%p QIODevice::read(%p, %d), d->pos = %d, d->buffer.size() = %d\n", this, data, int(maxSize), int(d->pos), int(d->buffer.size())); #endif - const bool sequential = d->isSequential(); // Short circuit for getChar() if (maxSize == 1) { int chint; while ((chint = d->buffer.getChar()) != -1) { - if (!sequential) - ++d->pos; + ++(*d->pPos); char c = char(uchar(chint)); if (c == '\r' && (d->openMode & Text)) @@ -774,61 +779,77 @@ } } + CHECK_MAXLEN(read, qint64(-1)); qint64 readSoFar = 0; bool moreToRead = true; do { - int lastReadChunkSize = 0; + // Try reading from the buffer. + int lastReadChunkSize = d->buffer.read(data, maxSize); + *d->pPos += lastReadChunkSize; + readSoFar += lastReadChunkSize; + // fast exit when satisfied by buffer + if (lastReadChunkSize == maxSize && !(d->openMode & Text)) + return readSoFar; - // Try reading from the buffer. - if (!d->buffer.isEmpty()) { - lastReadChunkSize = d->buffer.read(data + readSoFar, maxSize - readSoFar); - readSoFar += lastReadChunkSize; - if (!sequential) - d->pos += lastReadChunkSize; + if (lastReadChunkSize > 0) { + data += lastReadChunkSize; + maxSize -= lastReadChunkSize; #if defined QIODEVICE_DEBUG printf("%p \treading %d bytes from buffer into position %d\n", this, lastReadChunkSize, int(readSoFar) - lastReadChunkSize); #endif - } else if ((d->openMode & Unbuffered) == 0 && maxSize < QIODEVICE_BUFFERSIZE) { - // In buffered mode, we try to fill up the QIODevice buffer before - // we do anything else. - int bytesToBuffer = qMax(maxSize - readSoFar, QIODEVICE_BUFFERSIZE); - char *writePointer = d->buffer.reserve(bytesToBuffer); + } else { + if (d->firstRead) { + // this is the first time the file has been read, check it's valid and set up pos pointers + // for fast pos updates. + CHECK_READABLE(read, qint64(-1)); + d->firstRead = false; + if (d->isSequential()) { + d->pPos = &d->seqDumpPos; + d->pDevicePos = &d->seqDumpPos; + } + } - // Make sure the device is positioned correctly. - if (d->pos != d->devicePos && !sequential && !seek(d->pos)) - return qint64(-1); - qint64 readFromDevice = readData(writePointer, bytesToBuffer); - d->buffer.chop(bytesToBuffer - (readFromDevice < 0 ? 0 : int(readFromDevice))); + if ((d->openMode & Unbuffered) == 0 && maxSize < QIODEVICE_BUFFERSIZE) { + // In buffered mode, we try to fill up the QIODevice buffer before + // we do anything else. + // buffer is empty at this point, try to fill it + int bytesToBuffer = QIODEVICE_BUFFERSIZE; + char *writePointer = d->buffer.reserve(bytesToBuffer); - if (readFromDevice > 0) { - if (!sequential) - d->devicePos += readFromDevice; + // Make sure the device is positioned correctly. + if (d->pos != d->devicePos && !d->isSequential() && !seek(d->pos)) + return readSoFar ? readSoFar : qint64(-1); + qint64 readFromDevice = readData(writePointer, bytesToBuffer); + d->buffer.chop(bytesToBuffer - (readFromDevice < 0 ? 0 : int(readFromDevice))); + + if (readFromDevice > 0) { + *d->pDevicePos += readFromDevice; #if defined QIODEVICE_DEBUG - printf("%p \treading %d from device into buffer\n", this, int(readFromDevice)); + printf("%p \treading %d from device into buffer\n", this, int(readFromDevice)); #endif - if (readFromDevice < bytesToBuffer) - d->buffer.truncate(int(readFromDevice)); - if (!d->buffer.isEmpty()) { - lastReadChunkSize = d->buffer.read(data + readSoFar, maxSize - readSoFar); - readSoFar += lastReadChunkSize; - if (!sequential) - d->pos += lastReadChunkSize; + if (!d->buffer.isEmpty()) { + lastReadChunkSize = d->buffer.read(data, maxSize); + readSoFar += lastReadChunkSize; + data += lastReadChunkSize; + maxSize -= lastReadChunkSize; + *d->pPos += lastReadChunkSize; #if defined QIODEVICE_DEBUG - printf("%p \treading %d bytes from buffer at position %d\n", this, - lastReadChunkSize, int(readSoFar)); + printf("%p \treading %d bytes from buffer at position %d\n", this, + lastReadChunkSize, int(readSoFar)); #endif + } } } } // If we need more, try reading from the device. - if (readSoFar < maxSize) { + if (maxSize > 0) { // Make sure the device is positioned correctly. - if (d->pos != d->devicePos && !sequential && !seek(d->pos)) - return qint64(-1); - qint64 readFromDevice = readData(data + readSoFar, maxSize - readSoFar); + if (d->pos != d->devicePos && !d->isSequential() && !seek(d->pos)) + return readSoFar ? readSoFar : qint64(-1); + qint64 readFromDevice = readData(data, maxSize); #if defined QIODEVICE_DEBUG printf("%p \treading %d bytes from device (total %d)\n", this, int(readFromDevice), int(readSoFar)); #endif @@ -836,27 +857,21 @@ // error and we haven't read anything: return immediately return -1; } - if (readFromDevice <= 0) { - moreToRead = false; - } else { - // see if we read as much data as we asked for - if (readFromDevice < maxSize - readSoFar) - moreToRead = false; - + if (readFromDevice > 0) { lastReadChunkSize += int(readFromDevice); readSoFar += readFromDevice; - if (!sequential) { - d->pos += readFromDevice; - d->devicePos += readFromDevice; - } + data += readFromDevice; + maxSize -= readFromDevice; + *d->pPos += readFromDevice; + *d->pDevicePos += readFromDevice; } - } else { - moreToRead = false; } + // Best attempt has been made to read data, don't try again except for text mode adjustment below + moreToRead = false; if (readSoFar && d->openMode & Text) { - char *readPtr = data + readSoFar - lastReadChunkSize; - const char *endPtr = data + readSoFar; + char *readPtr = data - lastReadChunkSize; + const char *endPtr = data; if (readPtr < endPtr) { // optimization to avoid initial self-assignment @@ -871,8 +886,11 @@ char ch = *readPtr++; if (ch != '\r') *writePtr++ = ch; - else + else { --readSoFar; + --data; + ++maxSize; + } } // Make sure we get more data if there is room for more. This @@ -886,11 +904,15 @@ #if defined QIODEVICE_DEBUG printf("%p \treturning %d, d->pos == %d, d->buffer.size() == %d\n", this, int(readSoFar), int(d->pos), d->buffer.size()); - debugBinaryString(data, readSoFar); + debugBinaryString(data - readSoFar, readSoFar); #endif return readSoFar; } +#ifdef Q_CC_RVCT +#pragma pop +#endif + /*! \overload @@ -998,13 +1020,19 @@ return result; } +#ifdef Q_CC_RVCT +// arm mode makes the 64-bit integer operations much faster in RVCT 2.2 +#pragma push +#pragma arm +#endif + /*! This function reads a line of ASCII characters from the device, up to a maximum of \a maxSize - 1 bytes, stores the characters in \a data, and returns the number of bytes read. If a line could not be read but no error ocurred, this function returns 0. If an error - occurs, this function returns what it could the length of what - could be read, or -1 if nothing was read. + occurs, this function returns the length of what could be read, or + -1 if nothing was read. A terminating '\0' byte is always appended to \a data, so \a maxSize must be larger than 1. @@ -1230,6 +1258,10 @@ return readSoFar; } +#ifdef Q_CC_RVCT +#pragma pop +#endif + /*! Returns true if a complete line of data can be read from the device; otherwise returns false. @@ -1417,9 +1449,7 @@ */ bool QIODevice::getChar(char *c) { - Q_D(QIODevice); - CHECK_READABLE(getChar, false); - + // readability checked in read() char ch; return (1 == read(c ? c : &ch, 1)); } diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qiodevice_p.h --- a/src/corelib/io/qiodevice_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qiodevice_p.h Mon May 03 13:17:34 2010 +0300 @@ -64,6 +64,126 @@ QT_BEGIN_NAMESPACE +#ifndef QIODEVICE_BUFFERSIZE +#define QIODEVICE_BUFFERSIZE Q_INT64_C(16384) +#endif + +// This is QIODevice's read buffer, optimised for read(), isEmpty() and getChar() +class QIODevicePrivateLinearBuffer +{ +public: + QIODevicePrivateLinearBuffer(int) : len(0), first(0), buf(0), capacity(0) { + } + ~QIODevicePrivateLinearBuffer() { + delete [] buf; + } + void clear() { + first = buf; + len = 0; + } + int size() const { + return len; + } + bool isEmpty() const { + return len == 0; + } + void skip(int n) { + if (n >= len) { + clear(); + } else { + len -= n; + first += n; + } + } + int getChar() { + if (len == 0) + return -1; + int ch = uchar(*first); + len--; + first++; + return ch; + } + int read(char* target, int size) { + int r = qMin(size, len); + memcpy(target, first, r); + len -= r; + first += r; + return r; + } + char* reserve(int size) { + makeSpace(size + len, freeSpaceAtEnd); + char* writePtr = first + len; + len += size; + return writePtr; + } + void chop(int size) { + if (size >= len) { + clear(); + } else { + len -= size; + } + } + QByteArray readAll() { + char* f = first; + int l = len; + clear(); + return QByteArray(f, l); + } + int readLine(char* target, int size) { + int r = qMin(size, len); + char* eol = static_cast(memchr(first, '\n', r)); + if (eol) + r = 1+(eol-first); + memcpy(target, first, r); + len -= r; + first += r; + return int(r); + } + bool canReadLine() const { + return memchr(first, '\n', len); + } + void ungetChar(char c) { + if (first == buf) { + // underflow, the existing valid data needs to move to the end of the (potentially bigger) buffer + makeSpace(len+1, freeSpaceAtStart); + } + first--; + len++; + *first = c; + } + +private: + enum FreeSpacePos {freeSpaceAtStart, freeSpaceAtEnd}; + void makeSpace(size_t required, FreeSpacePos where) { + size_t newCapacity = qMax(capacity, size_t(QIODEVICE_BUFFERSIZE)); + while (newCapacity < required) + newCapacity *= 2; + int moveOffset = (where == freeSpaceAtEnd) ? 0 : newCapacity - len; + if (newCapacity > capacity) { + // allocate more space + char* newBuf = new char[newCapacity]; + memmove(newBuf + moveOffset, first, len); + delete [] buf; + buf = newBuf; + capacity = newCapacity; + } else { + // shift any existing data to make space + memmove(buf + moveOffset, first, len); + } + first = buf + moveOffset; + } + +private: + // length of the unread data + int len; + // start of the unread data + char* first; + // the allocated buffer + char* buf; + // allocated buffer size + size_t capacity; +}; + class Q_CORE_EXPORT QIODevicePrivate #ifndef QT_NO_QOBJECT : public QObjectPrivate @@ -78,10 +198,15 @@ QIODevice::OpenMode openMode; QString errorString; - QRingBuffer buffer; + QIODevicePrivateLinearBuffer buffer; qint64 pos; qint64 devicePos; + // these three are for fast position updates during read, avoiding isSequential test + qint64 seqDumpPos; + qint64 *pPos; + qint64 *pDevicePos; bool baseReadLineDataCalled; + bool firstRead; virtual bool putCharHelper(char c); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qprocess_symbian.cpp --- a/src/corelib/io/qprocess_symbian.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qprocess_symbian.cpp Mon May 03 13:17:34 2010 +0300 @@ -237,11 +237,15 @@ --i; endQuote += QLatin1String("\\"); } - commandLine += QLatin1String(" \"") + tmp.left(i) + endQuote; + commandLine += QLatin1String("\"") + tmp.left(i) + endQuote + QLatin1Char(' '); } else { - commandLine += QLatin1Char(' ') + tmp; + commandLine += tmp + QLatin1Char(' '); } } + + // Chop the extra trailing space if any arguments were appended + if (arguments.size()) + commandLine.chop(1); } static TInt qt_create_symbian_process(RProcess **proc, const QString &programName, const QStringList &arguments) @@ -371,6 +375,7 @@ // Called from ProcessManagerThread QProcessActive::~QProcessActive() { + Cancel(); process = NULL; pproc = NULL; } @@ -477,6 +482,7 @@ // Called from ProcessManagerThread QProcessManagerMediator::~QProcessManagerMediator() { + Cancel(); processManagerThread.Close(); currentCommand = ENoCommand; currentObserver = NULL; diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qresource.cpp --- a/src/corelib/io/qresource.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qresource.cpp Mon May 03 13:17:34 2010 +0300 @@ -555,16 +555,15 @@ /*! \obsolete + Use QDir::addSearchPath() with a prefix instead. + Adds \a path to the search paths searched in to find resources that are not specified with an absolute path. The \a path must be an absolute path (start with \c{/}). The default search path is to search only in the root (\c{:/}). The last path added will be consulted first upon next QResource creation. - - Use QDir::addSearchPath() with a prefix instead. */ - void QResource::addSearchPath(const QString &path) { @@ -578,6 +577,10 @@ } /*! + \obsolete + + Use QDir::searchPaths() instead. + Returns the current search path list. This list is consulted when creating a relative resource. diff -r 2f34d5167611 -r fcece45ef507 src/corelib/io/qurl.cpp --- a/src/corelib/io/qurl.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/io/qurl.cpp Mon May 03 13:17:34 2010 +0300 @@ -437,17 +437,19 @@ } // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) -static void QT_FASTCALL _scheme(const char **ptr, QUrlParseData *parseData) +static bool QT_FASTCALL _scheme(const char **ptr, QUrlParseData *parseData) { bool first = true; + bool isSchemeValid = true; parseData->scheme = *ptr; for (;;) { char ch = **ptr; if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { ; - } else if (!first && ((ch >= '0' && ch <= '9') || ch == '+' || ch == '-' || ch == '.')) { - ; + } else if ((ch >= '0' && ch <= '9') || ch == '+' || ch == '-' || ch == '.') { + if (first) + isSchemeValid = false; } else { break; } @@ -457,11 +459,14 @@ } if (**ptr != ':') { + isSchemeValid = true; *ptr = parseData->scheme; } else { parseData->schemeLength = *ptr - parseData->scheme; ++(*ptr); // skip ':' } + + return isSchemeValid; } // IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) @@ -3743,7 +3748,19 @@ #endif // optional scheme - _scheme(ptr, &parseData); + bool isSchemeValid = _scheme(ptr, &parseData); + + if (isSchemeValid == false) { + that->isValid = false; + char ch = *((*ptr)++); + that->errorInfo.setParams(*ptr, QT_TRANSLATE_NOOP(QUrl, "unexpected URL scheme"), + 0, ch); + QURL_SETFLAG(that->stateFlags, Validated | Parsed); +#if defined (QURL_DEBUG) + qDebug("QUrlPrivate::parse(), unrecognized: %c%s", ch, *ptr); +#endif + return; + } // hierpart _hierPart(ptr, &parseData); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/kernel/qcore_symbian_p.cpp --- a/src/corelib/kernel/qcore_symbian_p.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/kernel/qcore_symbian_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -132,9 +132,10 @@ void init() { #ifdef Q_WS_S60 - _LIT(KLibName_3_1, "qts60plugin_3_1.dll"); - _LIT(KLibName_3_2, "qts60plugin_3_2.dll"); - _LIT(KLibName_5_0, "qts60plugin_5_0.dll"); + _LIT(KLibName_3_1, "qts60plugin_3_1" QT_LIBINFIX_UNICODE L".dll"); + _LIT(KLibName_3_2, "qts60plugin_3_2" QT_LIBINFIX_UNICODE L".dll"); + _LIT(KLibName_5_0, "qts60plugin_5_0" QT_LIBINFIX_UNICODE L".dll"); + TPtrC libName; TInt uidValue; switch (QSysInfo::s60Version()) { diff -r 2f34d5167611 -r fcece45ef507 src/corelib/kernel/qcore_symbian_p.h --- a/src/corelib/kernel/qcore_symbian_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/kernel/qcore_symbian_p.h Mon May 03 13:17:34 2010 +0300 @@ -60,6 +60,15 @@ #include #include +#define QT_LSTRING2(x) L##x +#define QT_LSTRING(x) QT_LSTRING2(x) + +#if defined(QT_LIBINFIX) +# define QT_LIBINFIX_UNICODE QT_LSTRING(QT_LIBINFIX) +#else +# define QT_LIBINFIX_UNICODE L"" +#endif + QT_BEGIN_HEADER QT_BEGIN_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/corelib/kernel/qcoreapplication.cpp --- a/src/corelib/kernel/qcoreapplication.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/kernel/qcoreapplication.cpp Mon May 03 13:17:34 2010 +0300 @@ -2221,9 +2221,7 @@ while (err == KErrNone) { QString foundDir(reinterpret_cast(finder.File().Ptr()), finder.File().Length()); - /* :QTP: Disabled because of severe braindead OpenC regression of returning -1 for certain directories foundDir = QDir(foundDir).canonicalPath(); - */ if (!app_libpaths->contains(foundDir)) app_libpaths->append(foundDir); err = finder.Find(); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/kernel/qeventdispatcher_symbian.cpp --- a/src/corelib/kernel/qeventdispatcher_symbian.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/kernel/qeventdispatcher_symbian.cpp Mon May 03 13:17:34 2010 +0300 @@ -50,6 +50,13 @@ QT_BEGIN_NAMESPACE +#ifdef SYMBIAN_GRAPHICS_WSERV_QT_EFFECTS +// when the system UI is Qt based, priority drop is not needed as CPU starved processes will not be killed. +#undef QT_SYMBIAN_PRIORITY_DROP +#else +#define QT_SYMBIAN_PRIORITY_DROP +#endif + #define WAKE_UP_PRIORITY CActive::EPriorityStandard #define TIMER_PRIORITY CActive::EPriorityHigh #define NULLTIMER_PRIORITY CActive::EPriorityLow @@ -697,6 +704,7 @@ bool handledSymbianEvent = false; m_interrupt = false; +#ifdef QT_SYMBIAN_PRIORITY_DROP /* * This QTime variable is used to measure the time it takes to finish * the event loop. If we take too long in the loop, other processes @@ -714,6 +722,7 @@ } timeState = FirstRun; TProcessPriority priority; +#endif while (1) { if (block) { @@ -727,13 +736,15 @@ CActiveScheduler::Current()->WaitForAnyRequest(); } +#ifdef QT_SYMBIAN_PRIORITY_DROP if (timeState == SubsequentRun) { time.start(); timeState = TimeStarted; } +#endif TInt error; - handledSymbianEvent = CActiveScheduler::RunIfReady(error, CActive::EPriorityIdle); + handledSymbianEvent = CActiveScheduler::RunIfReady(error, KMinTInt); if (error) { qWarning("CActiveScheduler::RunIfReady() returned error: %i\n", error); CActiveScheduler::Current()->Error(error); @@ -747,6 +758,7 @@ break; } block = false; +#ifdef QT_SYMBIAN_PRIORITY_DROP if (timeState == TimeStarted && time.elapsed() > 100) { priority = m_processHandle.Priority(); m_processHandle.SetPriority(EPriorityBackground); @@ -759,6 +771,7 @@ } if (timeState == FirstRun) timeState = SubsequentRun; +#endif }; emit awake(); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/kernel/qmetaobject.cpp --- a/src/corelib/kernel/qmetaobject.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/kernel/qmetaobject.cpp Mon May 03 13:17:34 2010 +0300 @@ -943,7 +943,7 @@ if (!type || !*type) return result; - QVarLengthArray stackbuf(int(strlen(type)) + 1); + QVarLengthArray stackbuf(qstrlen(type) + 1); qRemoveWhitespace(type, stackbuf.data()); int templdepth = 0; qNormalizeType(stackbuf.data(), templdepth, result); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/kernel/qobject.cpp --- a/src/corelib/kernel/qobject.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/kernel/qobject.cpp Mon May 03 13:17:34 2010 +0300 @@ -3264,12 +3264,14 @@ const int method = c->method; QObjectPrivate::Sender currentSender; - currentSender.sender = sender; - currentSender.signal = signal_absolute_index; - currentSender.ref = 1; + const bool receiverInSameThread = currentThreadData == receiver->d_func()->threadData; QObjectPrivate::Sender *previousSender = 0; - if (currentThreadData == receiver->d_func()->threadData) + if (receiverInSameThread) { + currentSender.sender = sender; + currentSender.signal = signal_absolute_index; + currentSender.ref = 1; previousSender = QObjectPrivate::setCurrentSender(receiver, ¤tSender); + } locker.unlock(); if (qt_signal_spy_callback_set.slot_begin_callback != 0) { @@ -3285,8 +3287,8 @@ metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv); } QT_CATCH(...) { locker.relock(); - - QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender); + if (receiverInSameThread) + QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender); --connectionLists->inUse; Q_ASSERT(connectionLists->inUse >= 0); @@ -3301,7 +3303,8 @@ locker.relock(); - QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender); + if (receiverInSameThread) + QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender); if (connectionLists->orphaned) break; diff -r 2f34d5167611 -r fcece45ef507 src/corelib/kernel/qobjectdefs.h --- a/src/corelib/kernel/qobjectdefs.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/kernel/qobjectdefs.h Mon May 03 13:17:34 2010 +0300 @@ -78,6 +78,7 @@ #define Q_CLASSINFO(name, value) #define Q_INTERFACES(x) #define Q_PROPERTY(text) +#define Q_PRIVATE_PROPERTY(d, text) #define Q_OVERRIDE(text) #define Q_ENUMS(x) #define Q_FLAGS(x) @@ -178,6 +179,7 @@ #define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value) #define Q_INTERFACES(x) Q_INTERFACES(x) #define Q_PROPERTY(text) Q_PROPERTY(text) +#define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text) #define Q_OVERRIDE(text) Q_OVERRIDE(text) #define Q_ENUMS(x) Q_ENUMS(x) #define Q_FLAGS(x) Q_FLAGS(x) diff -r 2f34d5167611 -r fcece45ef507 src/corelib/kernel/qvariant.cpp --- a/src/corelib/kernel/qvariant.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/kernel/qvariant.cpp Mon May 03 13:17:34 2010 +0300 @@ -466,9 +466,13 @@ * QMetaType::VoidStar, QMetaType::QObjectStar and so forth, is that it wouldn't include * user defined pointer types. */ const char *const typeName = QMetaType::typeName(a->type); - if (typeName[qstrlen(typeName) - 1] == '*') + uint typeNameLen = qstrlen(typeName); + if (typeNameLen > 0 && typeName[typeNameLen - 1] == '*') return *static_cast(a_ptr) == *static_cast(b_ptr); + if (a->is_null && b->is_null) + return true; + return a_ptr == b_ptr; } diff -r 2f34d5167611 -r fcece45ef507 src/corelib/statemachine/qstatemachine.cpp --- a/src/corelib/statemachine/qstatemachine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/statemachine/qstatemachine.cpp Mon May 03 13:17:34 2010 +0300 @@ -1175,6 +1175,16 @@ _startState = 0; } +void QStateMachinePrivate::clearHistory() +{ + Q_Q(QStateMachine); + QList historyStates = qFindChildren(q); + for (int i = 0; i < historyStates.size(); ++i) { + QHistoryState *h = historyStates.at(i); + QHistoryStatePrivate::get(h)->configuration.clear(); + } +} + void QStateMachinePrivate::_q_start() { Q_Q(QStateMachine); @@ -1186,6 +1196,7 @@ internalEventQueue.clear(); qDeleteAll(externalEventQueue); externalEventQueue.clear(); + clearHistory(); #ifdef QSTATEMACHINE_DEBUG qDebug() << q << ": starting"; diff -r 2f34d5167611 -r fcece45ef507 src/corelib/statemachine/qstatemachine_p.h --- a/src/corelib/statemachine/qstatemachine_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/statemachine/qstatemachine_p.h Mon May 03 13:17:34 2010 +0300 @@ -126,6 +126,8 @@ QState *startState(); void removeStartState(); + void clearHistory(); + void microstep(QEvent *event, const QList &transitionList); bool isPreempted(const QAbstractState *s, const QSet &transitions) const; QSet selectTransitions(QEvent *event) const; diff -r 2f34d5167611 -r fcece45ef507 src/corelib/thread/qmutex.h --- a/src/corelib/thread/qmutex.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/thread/qmutex.h Mon May 03 13:17:34 2010 +0300 @@ -95,7 +95,7 @@ { public: inline explicit QMutexLocker(QMutex *m) - : mtx(m) + : val(reinterpret_cast(m)) { Q_ASSERT_X((val & quintptr(1u)) == quintptr(0), "QMutexLocker", "QMutex pointer is misaligned"); @@ -105,19 +105,19 @@ inline void unlock() { - if (mtx) { + if (val) { if ((val & quintptr(1u)) == quintptr(1u)) { val &= ~quintptr(1u); - mtx->unlock(); + mutex()->unlock(); } } } inline void relock() { - if (mtx) { + if (val) { if ((val & quintptr(1u)) == quintptr(0u)) { - mtx->lock(); + mutex()->lock(); val |= quintptr(1u); } } @@ -140,10 +140,7 @@ private: Q_DISABLE_COPY(QMutexLocker) - union { - QMutex *mtx; - quintptr val; - }; + quintptr val; }; #else // QT_NO_THREAD diff -r 2f34d5167611 -r fcece45ef507 src/corelib/thread/qreadwritelock.h --- a/src/corelib/thread/qreadwritelock.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/thread/qreadwritelock.h Mon May 03 13:17:34 2010 +0300 @@ -96,19 +96,19 @@ inline void unlock() { - if (q_lock) { + if (q_val) { if ((q_val & quintptr(1u)) == quintptr(1u)) { q_val &= ~quintptr(1u); - q_lock->unlock(); + readWriteLock()->unlock(); } } } inline void relock() { - if (q_lock) { + if (q_val) { if ((q_val & quintptr(1u)) == quintptr(0u)) { - q_lock->lockForRead(); + readWriteLock()->lockForRead(); q_val |= quintptr(1u); } } @@ -119,14 +119,11 @@ private: Q_DISABLE_COPY(QReadLocker) - union { - QReadWriteLock *q_lock; - quintptr q_val; - }; + quintptr q_val; }; inline QReadLocker::QReadLocker(QReadWriteLock *areadWriteLock) - : q_lock(areadWriteLock) + : q_val(reinterpret_cast(areadWriteLock)) { Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0), "QReadLocker", "QReadWriteLock pointer is misaligned"); @@ -143,19 +140,19 @@ inline void unlock() { - if (q_lock) { + if (q_val) { if ((q_val & quintptr(1u)) == quintptr(1u)) { q_val &= ~quintptr(1u); - q_lock->unlock(); + readWriteLock()->unlock(); } } } inline void relock() { - if (q_lock) { + if (q_val) { if ((q_val & quintptr(1u)) == quintptr(0u)) { - q_lock->lockForWrite(); + readWriteLock()->lockForWrite(); q_val |= quintptr(1u); } } @@ -167,14 +164,11 @@ private: Q_DISABLE_COPY(QWriteLocker) - union{ - QReadWriteLock *q_lock; - quintptr q_val; - }; + quintptr q_val; }; inline QWriteLocker::QWriteLocker(QReadWriteLock *areadWriteLock) - : q_lock(areadWriteLock) + : q_val(reinterpret_cast(areadWriteLock)) { Q_ASSERT_X((q_val & quintptr(1u)) == quintptr(0), "QWriteLocker", "QReadWriteLock pointer is misaligned"); diff -r 2f34d5167611 -r fcece45ef507 src/corelib/tools/qchar.cpp --- a/src/corelib/tools/qchar.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/tools/qchar.cpp Mon May 03 13:17:34 2010 +0300 @@ -381,8 +381,12 @@ \value Null A QChar with this value isNull(). \value Nbsp Non-breaking space. - \value ReplacementCharacter - \value ObjectReplacementCharacter The character shown when a font has no glyph for a certain codepoint. The square character is normally used. + \value ReplacementCharacter The character shown when a font has no glyph + for a certain codepoint. A special question mark character is often + used. Codecs use this codepoint when input data cannot be + represented in Unicode. + \value ObjectReplacementCharacter Used to represent an object such as an + image when such objects cannot be presented. \value ByteOrderMark \value ByteOrderSwapped \value ParagraphSeparator diff -r 2f34d5167611 -r fcece45ef507 src/corelib/tools/qregexp.cpp --- a/src/corelib/tools/qregexp.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/tools/qregexp.cpp Mon May 03 13:17:34 2010 +0300 @@ -523,7 +523,7 @@ \endtable In the mode Wildcard, the wildcard characters cannot be - escaped. In the mode WildcardUnix, the character '\' escapes the + escaped. In the mode WildcardUnix, the character '\\' escapes the wildcard. For example if we are in wildcard mode and have strings which @@ -3774,7 +3774,7 @@ \value WildcardUnix This is similar to Wildcard but with the behavior of a Unix shell. The wildcard characters can be escaped - with the character "\". + with the character "\\". \value FixedString The pattern is a fixed string. This is equivalent to using the RegExp pattern on a string in diff -r 2f34d5167611 -r fcece45ef507 src/corelib/tools/qscopedpointer.cpp --- a/src/corelib/tools/qscopedpointer.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/tools/qscopedpointer.cpp Mon May 03 13:17:34 2010 +0300 @@ -225,4 +225,59 @@ Swap this pointer with \a other. */ +/*! + \class QScopedArrayPointer + + \brief The QScopedArrayPointer class stores a pointer to a + dynamically allocated array of objects, and deletes it upon + destruction. + + \since 4.6 + \reentrant + \ingroup misc + + A QScopedArrayPointer is a QScopedPointer that defaults to + deleting the object it is pointing to with the delete[] operator. It + also features operator[] for convenience, so we can write: + + \code + void foo() + { + QScopedArrayPointer i(new int[10]); + i[2] = 42; + ... + return; // our integer array is now deleted using delete[] + } + \endcode +*/ + +/*! + \fn QScopedArrayPointer::QScopedArrayPointer(T *p = 0) + + Constructs this QScopedArrayPointer instance and sets its pointer + to \a p. +*/ + +/*! + \fn T *QScopedArrayPointer::operator[](int i) + + Provides access to entry \a i of the scoped pointer's array of + objects. + + If the contained pointer is \c null, behavior is undefined. + + \sa isNull() +*/ + +/*! + \fn T *QScopedArrayPointer::operator[](int i) const + + Provides access to entry \a i of the scoped pointer's array of + objects. + + If the contained pointer is \c null, behavior is undefined. + + \sa isNull() +*/ + QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/corelib/tools/qstring.cpp --- a/src/corelib/tools/qstring.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/tools/qstring.cpp Mon May 03 13:17:34 2010 +0300 @@ -3185,7 +3185,7 @@ if (!empty || !(flags & SectionSkipEmpty)) x++; } - if((flags & SectionIncludeLeadingSep)) { + if((flags & SectionIncludeLeadingSep) && first_i < sections.size()) { const qt_section_chunk §ion = sections.at(first_i); ret.prepend(section.string.left(section.length)); } diff -r 2f34d5167611 -r fcece45ef507 src/corelib/tools/qvarlengtharray.h --- a/src/corelib/tools/qvarlengtharray.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/corelib/tools/qvarlengtharray.h Mon May 03 13:17:34 2010 +0300 @@ -222,7 +222,6 @@ } } else { qMemCopy(ptr, oldPtr, qMin(asize, osize) * sizeof(T)); - s = asize; } } else { ptr = oldPtr; @@ -233,7 +232,7 @@ if (QTypeInfo::isComplex) { while (osize > asize) (oldPtr+(--osize))->~T(); - if( oldPtr == ptr ) + if (!QTypeInfo::isStatic) s = osize; } diff -r 2f34d5167611 -r fcece45ef507 src/dbus/qdbusconnection.cpp --- a/src/dbus/qdbusconnection.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/dbus/qdbusconnection.cpp Mon May 03 13:17:34 2010 +0300 @@ -491,6 +491,12 @@ its return value, which will be either of type QDBusMessage::ReplyMessage or QDBusMessage::ErrorMessage. + If no reply is received within \a timeout milliseconds, an automatic + error will be delivered indicating the expiration of the call. + The default \a timeout is -1, which will be replaced with an + implementation-defined value that is suitable for inter-process + communications (generally, 25 seconds). + See the QDBusInterface::call() function for a more friendly way of placing calls. @@ -526,9 +532,14 @@ Sends the \a message over this connection and returns immediately. This function is suitable for method calls only. It returns an object of type QDBusPendingCall which can be used to - track the status of the reply. The \a timeout parameter is used to - determine when an auto-generated error reply may be emitted and is - also the upper limit for waiting in QDBusPendingCall::waitForFinished(). + track the status of the reply. + + If no reply is received within \a timeout milliseconds, an automatic + error will be delivered indicating the expiration of the call. The + default \a timeout is -1, which will be replaced with an + implementation-defined value that is suitable for inter-process + communications (generally, 25 seconds). This timeout is also the + upper limit for waiting in QDBusPendingCall::waitForFinished(). See the QDBusInterface::asyncCall() function for a more friendly way of placing calls. diff -r 2f34d5167611 -r fcece45ef507 src/gui/dialogs/qcolordialog.cpp --- a/src/gui/dialogs/qcolordialog.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/dialogs/qcolordialog.cpp Mon May 03 13:17:34 2010 +0300 @@ -644,6 +644,7 @@ void paintEvent(QPaintEvent*); void mouseMoveEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); + void resizeEvent(QResizeEvent *); private: int hue; @@ -654,7 +655,7 @@ int satPt(const QPoint &pt); void setCol(const QPoint &pt); - QPixmap *pix; + QPixmap pix; }; static int pWidth = 220; @@ -790,13 +791,27 @@ } QPoint QColorPicker::colPt() -{ return QPoint((360-hue)*(pWidth-1)/360, (255-sat)*(pHeight-1)/255); } +{ + QRect r = contentsRect(); + return QPoint((360 - hue) * (r.width() - 1) / 360, (255 - sat) * (r.height() - 1) / 255); +} + int QColorPicker::huePt(const QPoint &pt) -{ return 360 - pt.x()*360/(pWidth-1); } +{ + QRect r = contentsRect(); + return 360 - pt.x() * 360 / (r.width() - 1); +} + int QColorPicker::satPt(const QPoint &pt) -{ return 255 - pt.y()*255/(pHeight-1) ; } +{ + QRect r = contentsRect(); + return 255 - pt.y() * 255 / (r.height() - 1); +} + void QColorPicker::setCol(const QPoint &pt) -{ setCol(huePt(pt), satPt(pt)); } +{ + setCol(huePt(pt), satPt(pt)); +} QColorPicker::QColorPicker(QWidget* parent) : QFrame(parent) @@ -804,29 +819,12 @@ hue = 0; sat = 0; setCol(150, 255); - QImage img(pWidth, pHeight, QImage::Format_RGB32); - int x, y; - uint *pixel = (uint *) img.scanLine(0); - for (y = 0; y < pHeight; y++) { - const uint *end = pixel + pWidth; - x = 0; - while (pixel < end) { - QPoint p(x, y); - QColor c; - c.setHsv(huePt(p), satPt(p), 200); - *pixel = c.rgb(); - ++pixel; - ++x; - } - } - pix = new QPixmap(QPixmap::fromImage(img)); setAttribute(Qt::WA_NoSystemBackground); setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed) ); } QColorPicker::~QColorPicker() { - delete pix; } QSize QColorPicker::sizeHint() const @@ -869,7 +867,7 @@ drawFrame(&p); QRect r = contentsRect(); - p.drawPixmap(r.topLeft(), *pix); + p.drawPixmap(r.topLeft(), pix); QPoint pt = colPt() + r.topLeft(); p.setPen(Qt::black); @@ -878,6 +876,31 @@ } +void QColorPicker::resizeEvent(QResizeEvent *ev) +{ + QFrame::resizeEvent(ev); + + int w = width() - frameWidth() * 2; + int h = height() - frameWidth() * 2; + QImage img(w, h, QImage::Format_RGB32); + int x, y; + uint *pixel = (uint *) img.scanLine(0); + for (y = 0; y < h; y++) { + const uint *end = pixel + w; + x = 0; + while (pixel < end) { + QPoint p(x, y); + QColor c; + c.setHsv(huePt(p), satPt(p), 200); + *pixel = c.rgb(); + ++pixel; + ++x; + } + } + pix = QPixmap::fromImage(img); +} + + class QColSpinBox : public QSpinBox { public: diff -r 2f34d5167611 -r fcece45ef507 src/gui/dialogs/qcolordialog_mac.mm --- a/src/gui/dialogs/qcolordialog_mac.mm Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/dialogs/qcolordialog_mac.mm Mon May 03 13:17:34 2010 +0300 @@ -96,6 +96,7 @@ - (void)finishOffWithCode:(NSInteger)result; - (void)showColorPanel; - (void)exec; +- (void)setResultSet:(BOOL)result; @end @implementation QCocoaColorPanelDelegate @@ -158,6 +159,11 @@ [super dealloc]; } +- (void)setResultSet:(BOOL)result +{ + mResultSet = result; +} + - (BOOL)windowShouldClose:(id)window { Q_UNUSED(window); @@ -320,7 +326,7 @@ } else { mPriv->colorDialog()->accept(); } - } + } } } @@ -433,7 +439,7 @@ priv:this]; [colorPanel setDelegate:static_cast(delegate)]; } - + [delegate setResultSet:false]; setCocoaPanelColor(initial); [static_cast(delegate) showColorPanel]; } diff -r 2f34d5167611 -r fcece45ef507 src/gui/dialogs/qdialog.cpp --- a/src/gui/dialogs/qdialog.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/dialogs/qdialog.cpp Mon May 03 13:17:34 2010 +0300 @@ -69,7 +69,6 @@ # include "qfontdialog.h" # include "qcolordialog.h" # include "qwizard.h" -# include "qmenubar.h" #endif #if defined(Q_WS_S60) @@ -415,8 +414,15 @@ result = true; } #else - if ((e->type() == QEvent::StyleChange) || (e->type() == QEvent::Resize )) - adjustPosition(parentWidget()); + if ((e->type() == QEvent::StyleChange) || (e->type() == QEvent::Resize )) { + if (!testAttribute(Qt::WA_Moved)) { + Qt::WindowStates state = windowState(); + adjustPosition(parentWidget()); + setAttribute(Qt::WA_Moved, false); // not really an explicit position + if (state != windowState()) + setWindowState(state); + } + } #endif return result; } @@ -522,12 +528,6 @@ #endif //Q_WS_WINCE_WM #ifdef Q_OS_SYMBIAN -#ifndef QT_NO_MENUBAR - QMenuBar *menuBar = 0; - if (!findChild()) - menuBar = new QMenuBar(this); -#endif - if (qobject_cast(this) || qobject_cast(this) || qobject_cast(this) || qobject_cast(this)) showMaximized(); @@ -559,13 +559,6 @@ delete menuBar; #endif //QT_NO_MENUBAR #endif //Q_WS_WINCE_WM -#ifdef Q_OS_SYMBIAN -#ifndef QT_NO_MENUBAR - else if (menuBar) - delete menuBar; -#endif //QT_NO_MENUBAR -#endif //Q_OS_SYMBIAN - return res; } @@ -807,11 +800,11 @@ void QDialog::showEvent(QShowEvent *event) { if (!event->spontaneous() && !testAttribute(Qt::WA_Moved)) { - Qt::WindowStates state = windowState(); + Qt::WindowStates state = windowState(); adjustPosition(parentWidget()); setAttribute(Qt::WA_Moved, false); // not really an explicit position - if (state != windowState()) - setWindowState(state); + if (state != windowState()) + setWindowState(state); } } diff -r 2f34d5167611 -r fcece45ef507 src/gui/dialogs/qmessagebox.cpp --- a/src/gui/dialogs/qmessagebox.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/dialogs/qmessagebox.cpp Mon May 03 13:17:34 2010 +0300 @@ -65,6 +65,10 @@ #include #include +#ifndef QT_NO_STYLE_S60 +#include +#endif + #ifdef Q_WS_WINCE extern bool qt_wince_is_mobile(); //defined in qguifunctions_wince.cpp extern bool qt_wince_is_smartphone();//defined in qguifunctions_wince.cpp @@ -314,6 +318,7 @@ } width = hardLimit; } + } #ifdef Q_WS_S60 // in S60 portait messageBoxes should always occupy maximum width if (QApplication::desktop()->size().height() > QApplication::desktop()->size().width()){ @@ -323,7 +328,6 @@ width = qMin(QApplication::desktop()->size().height(), hardLimit); } #endif - } if (informativeLabel) { label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); @@ -353,6 +357,16 @@ int height = (layout->hasHeightForWidth()) ? layout->totalHeightForWidth(width) : layout->totalMinimumSize().height(); + +#ifndef QT_NO_STYLE_S60 + QS60Style *s60Style = 0; + s60Style = qobject_cast(QApplication::style()); + + //use custom pixel metric to deduce the minimum height of the messagebox + if (s60Style) + height = qMax(height, s60Style->pixelMetric((QStyle::PixelMetric)PM_MessageBoxHeight)); +#endif + q->setFixedSize(width, height); QCoreApplication::removePostedEvents(q, QEvent::LayoutRequest); } diff -r 2f34d5167611 -r fcece45ef507 src/gui/dialogs/qprintdialog_unix.cpp --- a/src/gui/dialogs/qprintdialog_unix.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/dialogs/qprintdialog_unix.cpp Mon May 03 13:17:34 2010 +0300 @@ -154,6 +154,9 @@ bool checkFields(); void setupPrinter(); void setOptionsPane(QPrintDialogPrivate *pane); +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + void setCupsProperties(); +#endif // slots void _q_printerChanged(int index); @@ -942,7 +945,7 @@ void QUnixPrintWidgetPrivate::_q_btnPropertiesClicked() { - if (propertiesDialog == 0) { + if (!propertiesDialog) { propertiesDialog = new QPrintPropertiesDialog(q); propertiesDialog->setResult(QDialog::Rejected); } @@ -962,6 +965,35 @@ propertiesDialog->exec(); } +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) +void QUnixPrintWidgetPrivate::setCupsProperties() +{ + if (cups && QCUPSSupport::isAvailable()) { + QPrintEngine *engine = printer->printEngine(); + const ppd_option_t* pageSizes = cups->pageSizes(); + QByteArray cupsPageSize; + for (int i = 0; i < pageSizes->num_choices; ++i) { + if (static_cast(pageSizes->choices[i].marked) == 1) + cupsPageSize = pageSizes->choices[i].choice; + } + engine->setProperty(PPK_CupsStringPageSize, QString::fromLatin1(cupsPageSize)); + engine->setProperty(PPK_CupsOptions, cups->options()); + + QRect pageRect = cups->pageRect(cupsPageSize); + engine->setProperty(PPK_CupsPageRect, pageRect); + + QRect paperRect = cups->paperRect(cupsPageSize); + engine->setProperty(PPK_CupsPaperRect, paperRect); + + for (int ps = 0; ps < QPrinter::NPaperSize; ++ps) { + QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(ps)); + if (size.width == paperRect.width() && size.height == paperRect.height()) + printer->setPaperSize(static_cast(ps)); + } + } +} +#endif + void QUnixPrintWidgetPrivate::setupPrinter() { const int printerCount = widget.printers->count(); @@ -986,6 +1018,10 @@ if (propertiesDialog && propertiesDialog->result() == QDialog::Accepted) propertiesDialog->setupPrinter(); +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (!propertiesDialog) + setCupsProperties(); +#endif } diff -r 2f34d5167611 -r fcece45ef507 src/gui/dialogs/qprintpreviewdialog.cpp --- a/src/gui/dialogs/qprintpreviewdialog.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/dialogs/qprintpreviewdialog.cpp Mon May 03 13:17:34 2010 +0300 @@ -273,7 +273,20 @@ QWidget *pageEdit = new QWidget(toolbar); QVBoxLayout *vboxLayout = new QVBoxLayout; vboxLayout->setContentsMargins(0, 0, 0, 0); +#ifdef Q_WS_MAC + // We query the widgets about their size and then we fix the size. + // This should do the trick for the laying out part... + QSize pageNumEditSize, pageNumLabelSize; + pageNumEditSize = pageNumEdit->minimumSizeHint(); + pageNumLabelSize = pageNumLabel->minimumSizeHint(); + pageNumEdit->resize(pageNumEditSize); + pageNumLabel->resize(pageNumLabelSize); +#endif QFormLayout *formLayout = new QFormLayout; +#ifdef Q_WS_MAC + // We have to change the growth policy in Mac. + formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); +#endif formLayout->setWidget(0, QFormLayout::LabelRole, pageNumEdit); formLayout->setWidget(0, QFormLayout::FieldRole, pageNumLabel); vboxLayout->addLayout(formLayout); diff -r 2f34d5167611 -r fcece45ef507 src/gui/egl/qegl_symbian.cpp --- a/src/gui/egl/qegl_symbian.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/egl/qegl_symbian.cpp Mon May 03 13:17:34 2010 +0300 @@ -96,7 +96,7 @@ if (devType == QInternal::Image) setPixelFormat(static_cast(dev)->format()); else - setPixelFormat(QImage::Format_RGB32); + setPixelFormat(QImage::Format_ARGB32); } diff -r 2f34d5167611 -r fcece45ef507 src/gui/egl/qegl_wince.cpp --- a/src/gui/egl/qegl_wince.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/egl/qegl_wince.cpp Mon May 03 13:17:34 2010 +0300 @@ -89,8 +89,8 @@ EGLNativeDisplayType QEglContext::nativeDisplay() { - HWND win = (static_cast(device))->winId(); - HDC myDc = GetDC(win); + HDC myDc = GetDC(0); + if (!myDc) { qWarning("QEglContext::nativeDisplay(): WinCE display is not open"); return EGL_DEFAULT_DISPLAY; diff -r 2f34d5167611 -r fcece45ef507 src/gui/egl/qeglproperties.cpp --- a/src/gui/egl/qeglproperties.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/egl/qeglproperties.cpp Mon May 03 13:17:34 2010 +0300 @@ -39,13 +39,13 @@ ** ****************************************************************************/ +#include +#include + #include "qeglproperties_p.h" QT_BEGIN_NAMESPACE -#include -#include - #include "qegl_p.h" diff -r 2f34d5167611 -r fcece45ef507 src/gui/egl/qeglproperties_p.h --- a/src/gui/egl/qeglproperties_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/egl/qeglproperties_p.h Mon May 03 13:17:34 2010 +0300 @@ -58,12 +58,17 @@ QT_BEGIN_INCLUDE_NAMESPACE +#if defined(QT_OPENGL_ES_2) +# include +#endif + #if defined(QT_GLES_EGL) -#include +# include #else -#include +# include #endif + #if defined(Q_WS_X11) // If included , then the global namespace // may have been polluted with X #define's. The following makes sure diff -r 2f34d5167611 -r fcece45ef507 src/gui/embedded/directfb.pri --- a/src/gui/embedded/directfb.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/embedded/directfb.pri Mon May 03 13:17:34 2010 +0300 @@ -15,7 +15,7 @@ #DEFINES += QT_DIRECTFB_TIMING #DEFINES += QT_NO_DIRECTFB_OPAQUE_DETECTION #DEFINES += QT_NO_DIRECTFB_STRETCHBLIT -#DIRECTFB_DRAWINGOPERATIONS=DRAW_RECTS|DRAW_LINES|DRAW_IMAGE|DRAW_PIXMAP|DRAW_TILED_PIXMAP|STROKE_PATH|DRAW_PATH|DRAW_POINTS|DRAW_ELLIPSE|DRAW_POLYGON|DRAW_TEXT|FILL_PATH|FILL_RECT|DRAW_COLORSPANS|DRAW_ROUNDED_RECT +DIRECTFB_DRAWINGOPERATIONS=DRAW_RECTS|DRAW_LINES|DRAW_IMAGE|DRAW_PIXMAP|DRAW_TILED_PIXMAP|STROKE_PATH|DRAW_PATH|DRAW_POINTS|DRAW_ELLIPSE|DRAW_POLYGON|DRAW_TEXT|FILL_PATH|FILL_RECT|DRAW_COLORSPANS|DRAW_ROUNDED_RECT #DEFINES += \"QT_DIRECTFB_WARN_ON_RASTERFALLBACKS=$$DIRECTFB_DRAWINGOPERATIONS\" #DEFINES += \"QT_DIRECTFB_DISABLE_RASTERFALLBACKS=$$DIRECTFB_DRAWINGOPERATIONS\" diff -r 2f34d5167611 -r fcece45ef507 src/gui/embedded/qscreen_qws.cpp --- a/src/gui/embedded/qscreen_qws.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/embedded/qscreen_qws.cpp Mon May 03 13:17:34 2010 +0300 @@ -2739,7 +2739,7 @@ default: break; } - spanData.setup(qwsServer->backgroundBrush(), 256, QPainter::CompositionMode_SourceOver); + spanData.setup(qwsServer->backgroundBrush(), 256, QPainter::CompositionMode_Source); spanData.dx = off.x(); spanData.dy = off.y(); } else if (!surface->isBuffered()) { diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicsitem.cpp --- a/src/gui/graphicsview/qgraphicsitem.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicsitem.cpp Mon May 03 13:17:34 2010 +0300 @@ -414,12 +414,6 @@ /*! \enum QGraphicsItem::GraphicsItemChange - ItemVisibleHasChanged, - ItemEnabledHasChanged, - ItemSelectedHasChanged, - ItemParentHasChanged, - ItemSceneHasChanged - This enum describes the state changes that are notified by QGraphicsItem::itemChange(). The notifications are sent as the state changes, and in some cases, adjustments can be made (see the documentation @@ -647,9 +641,16 @@ are children of a modal panel are not blocked. The values are: - \value NonModal The panel is not modal and does not block input to other panels. - \value PanelModal The panel is modal to a single item hierarchy and blocks input to its parent pane, all grandparent panels, and all siblings of its parent and grandparent panels. - \value SceneModal The window is modal to the entire scene and blocks input to all panels. + + \value NonModal The panel is not modal and does not block input to + other panels. This is the default value for panels. + + \value PanelModal The panel is modal to a single item hierarchy + and blocks input to its parent pane, all grandparent panels, and + all siblings of its parent and grandparent panels. + + \value SceneModal The window is modal to the entire scene and + blocks input to all panels. \sa QGraphicsItem::setPanelModality(), QGraphicsItem::panelModality(), QGraphicsItem::ItemIsPanel */ @@ -1129,6 +1130,9 @@ } } + // Resolve depth. + invalidateDepthRecursively(); + if ((parent = newParent)) { if (parent->d_func()->scene && parent->d_func()->scene != scene) { // Move this item to its new parent's scene @@ -1179,8 +1183,6 @@ } } - // Resolve depth. - invalidateDepthRecursively(); dirtySceneTransform = 1; // Restore the sub focus chain. @@ -1881,7 +1883,8 @@ d_ptr->cacheMode = mode; bool noVisualChange = (mode == NoCache && lastMode == NoCache) || (mode == NoCache && lastMode == DeviceCoordinateCache) - || (mode == DeviceCoordinateCache && lastMode == NoCache); + || (mode == DeviceCoordinateCache && lastMode == NoCache) + || (mode == DeviceCoordinateCache && lastMode == DeviceCoordinateCache); if (mode == NoCache) { d_ptr->removeExtraItemCache(); } else { @@ -2175,11 +2178,16 @@ QGraphicsItemCache *c = (QGraphicsItemCache *)qVariantValue(extra(ExtraCacheData)); if (c) c->purge(); - if (scene) + if (scene) { +#ifndef QT_NO_GRAPHICSEFFECT + invalidateParentGraphicsEffectsRecursively(); +#endif //QT_NO_GRAPHICSEFFECT scene->d_func()->markDirty(q_ptr, QRectF(), /*invalidateChildren=*/false, /*force=*/true); + } } // Certain properties are dropped as an item becomes invisible. + bool hasFocus = q_ptr->hasFocus(); if (!newVisible) { if (scene) { if (scene->d_func()->mouseGrabberItems.contains(q)) @@ -2189,7 +2197,7 @@ if (q->isPanel() && panelModality != QGraphicsItem::NonModal) scene->d_func()->leaveModal(q_ptr); } - if (q_ptr->hasFocus() && scene) { + if (hasFocus && scene) { // Hiding the closest non-panel ancestor of the focus item QGraphicsItem *focusItem = scene->focusItem(); bool clear = true; @@ -2202,7 +2210,7 @@ } while ((focusItem = focusItem->parentWidget()) && !focusItem->isPanel()); } if (clear) - q_ptr->clearFocus(); + clearFocusHelper(/* giveFocusToParent = */ false); } if (q_ptr->isSelected()) q_ptr->setSelected(false); @@ -2240,26 +2248,45 @@ } // Enable subfocus - if (scene && newVisible) { - QGraphicsItem *p = parent; - bool done = false; - while (p) { - if (p->flags() & QGraphicsItem::ItemIsFocusScope) { - QGraphicsItem *fsi = p->d_ptr->focusScopeItem; - if (q_ptr == fsi || q_ptr->isAncestorOf(fsi)) { - done = true; - while (fsi->d_ptr->focusScopeItem && fsi->d_ptr->focusScopeItem->isVisible()) - fsi = fsi->d_ptr->focusScopeItem; - scene->setFocusItem(fsi); + if (scene) { + if (newVisible) { + // Item is shown + QGraphicsItem *p = parent; + bool done = false; + while (p) { + if (p->flags() & QGraphicsItem::ItemIsFocusScope) { + QGraphicsItem *fsi = p->d_ptr->focusScopeItem; + if (q_ptr == fsi || q_ptr->isAncestorOf(fsi)) { + done = true; + while (fsi->d_ptr->focusScopeItem && fsi->d_ptr->focusScopeItem->isVisible()) + fsi = fsi->d_ptr->focusScopeItem; + fsi->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ true, + /* focusFromShow = */ true); + } + break; } - break; + p = p->d_ptr->parent; + } + if (!done) { + QGraphicsItem *fi = subFocusItem; + if (fi && fi != scene->focusItem()) { + scene->setFocusItem(fi); + } } - p = p->d_ptr->parent; - } - if (!done) { - QGraphicsItem *fi = subFocusItem; - if (fi && fi != scene->focusItem()) { - scene->setFocusItem(fi); + } else { + // Item is hidden + if (hasFocus) { + QGraphicsItem *p = parent; + while (p) { + if (p->flags() & QGraphicsItem::ItemIsFocusScope) { + if (p->d_ptr->visible) { + p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ true, + /* focusFromShow = */ true); + } + break; + } + p = p->d_ptr->parent; + } } } } @@ -3110,13 +3137,13 @@ */ void QGraphicsItem::setFocus(Qt::FocusReason focusReason) { - d_ptr->setFocusHelper(focusReason, /* climb = */ true); + d_ptr->setFocusHelper(focusReason, /* climb = */ true, /* focusFromShow = */ false); } /*! \internal */ -void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool climb) +void QGraphicsItemPrivate::setFocusHelper(Qt::FocusReason focusReason, bool climb, bool focusFromShow) { // Disabled / unfocusable items cannot accept focus. if (!q_ptr->isEnabled() || !(flags & QGraphicsItem::ItemIsFocusable)) @@ -3136,7 +3163,7 @@ while (p) { if (p->flags() & QGraphicsItem::ItemIsFocusScope) { p->d_ptr->focusScopeItem = q_ptr; - if (!p->focusItem()) { + if (!p->focusItem() && !focusFromShow) { // If you call setFocus on a child of a focus scope that // doesn't currently have a focus item, then stop. return; @@ -3177,24 +3204,35 @@ */ void QGraphicsItem::clearFocus() { - // Pass focus to the closest parent focus scope. - if (!d_ptr->inDestructor) { - QGraphicsItem *p = d_ptr->parent; - while (p) { - if (p->flags() & ItemIsFocusScope) { - p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ false); - return; + d_ptr->clearFocusHelper(/* giveFocusToParent = */ true); +} + +/*! + \internal +*/ +void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent) +{ + if (giveFocusToParent) { + // Pass focus to the closest parent focus scope + if (!inDestructor) { + QGraphicsItem *p = parent; + while (p) { + if (p->flags() & QGraphicsItem::ItemIsFocusScope) { + p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ false, + /* focusFromShow = */ false); + return; + } + p = p->d_ptr->parent; } - p = p->d_ptr->parent; } } // Invisible items with focus must explicitly clear subfocus. - d_ptr->clearSubFocus(this); - - if (hasFocus()) { + clearSubFocus(q_ptr); + + if (q_ptr->hasFocus()) { // If this item has the scene's input focus, clear it. - d_ptr->scene->setFocusItem(0); + scene->setFocusItem(0); } } @@ -5187,6 +5225,8 @@ needSortChildren = 1; // ### maybe 0 child->d_ptr->siblingIndex = children.size(); children.append(child); + if (isObject) + emit static_cast(q_ptr)->childrenChanged(); } /*! @@ -5209,6 +5249,8 @@ // the child is not guaranteed to be at the index after the list is sorted. // (see ensureSortedChildren()). child->d_ptr->siblingIndex = -1; + if (isObject) + emit static_cast(q_ptr)->childrenChanged(); } /*! @@ -7416,6 +7458,88 @@ } } +void QGraphicsItemPrivate::append(QDeclarativeListProperty *list, QGraphicsObject *item) +{ + QGraphicsItemPrivate::get(item)->setParentItemHelper(static_cast(list->object), /*newParentVariant=*/0, /*thisPointerVariant=*/0); +} + +/*! + Returns a list of this item's children. + + The items are sorted by stacking order. This takes into account both the + items' insertion order and their Z-values. + +*/ +QDeclarativeListProperty QGraphicsItemPrivate::childrenList() +{ + Q_Q(QGraphicsItem); + if (isObject) { + QGraphicsObject *that = static_cast(q); + return QDeclarativeListProperty(that, &children, QGraphicsItemPrivate::append); + } else { + //QGraphicsItem is not supported for this property + return QDeclarativeListProperty(); + } +} + +/*! + \internal + Returns the width of the item + Reimplemented by QGraphicsWidget +*/ +qreal QGraphicsItemPrivate::width() const +{ + return 0; +} + +/*! + \internal + Set the width of the item + Reimplemented by QGraphicsWidget +*/ +void QGraphicsItemPrivate::setWidth(qreal w) +{ + Q_UNUSED(w); +} + +/*! + \internal + Reset the width of the item + Reimplemented by QGraphicsWidget +*/ +void QGraphicsItemPrivate::resetWidth() +{ +} + +/*! + \internal + Returns the height of the item + Reimplemented by QGraphicsWidget +*/ +qreal QGraphicsItemPrivate::height() const +{ + return 0; +} + +/*! + \internal + Set the height of the item + Reimplemented by QGraphicsWidget +*/ +void QGraphicsItemPrivate::setHeight(qreal h) +{ + Q_UNUSED(h); +} + +/*! + \internal + Reset the height of the item + Reimplemented by QGraphicsWidget +*/ +void QGraphicsItemPrivate::resetHeight() +{ +} + /*! \property QGraphicsObject::parent \brief the parent of the item @@ -7602,6 +7726,23 @@ \sa scale, rotation, QGraphicsItem::transformOriginPoint() */ +/*! + \fn void QGraphicsObject::widthChanged() + \internal +*/ + +/*! + \fn void QGraphicsObject::heightChanged() + \internal +*/ + +/*! + + \fn QGraphicsObject::childrenChanged() + + This signal gets emitted whenever the children list changes + \internal +*/ /*! \class QAbstractGraphicsShapeItem @@ -10809,6 +10950,7 @@ } } +// sourceRect must be in the given coordinate system QRect QGraphicsItemEffectSourcePrivate::paddedEffectRect(Qt::CoordinateSystem system, QGraphicsEffect::PixmapPadMode mode, const QRectF &sourceRect, bool *unpadded) const { QRectF effectRectF; @@ -10818,7 +10960,8 @@ if (mode == QGraphicsEffect::PadToEffectiveBoundingRect) { if (info) { - effectRectF = item->graphicsEffect()->boundingRectFor(boundingRect(Qt::DeviceCoordinates)); + QRectF deviceRect = system == Qt::DeviceCoordinates ? sourceRect : info->painter->worldTransform().mapRect(sourceRect); + effectRectF = item->graphicsEffect()->boundingRectFor(deviceRect); if (unpadded) *unpadded = (effectRectF.size() == sourceRect.size()); if (info && system == Qt::LogicalCoordinates) @@ -10867,30 +11010,6 @@ return static_cast(item)->pixmap(); } - if (deviceCoordinates) { - // Clip to viewport rect. - int left, top, right, bottom; - effectRect.getCoords(&left, &top, &right, &bottom); - if (left < 0) { - if (offset) - offset->rx() += -left; - effectRect.setX(0); - } - if (top < 0) { - if (offset) - offset->ry() += -top; - effectRect.setY(0); - } - // NB! We use +-1 for historical reasons (see QRect documentation). - QPaintDevice *device = info->painter->device(); - const int deviceWidth = device->width(); - const int deviceHeight = device->height(); - if (right + 1 > deviceWidth) - effectRect.setRight(deviceWidth - 1); - if (bottom + 1 > deviceHeight) - effectRect.setBottom(deviceHeight -1); - - } if (effectRect.isEmpty()) return QPixmap(); diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicsitem.h --- a/src/gui/graphicsview/qgraphicsitem.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicsitem.h Mon May 03 13:17:34 2010 +0300 @@ -547,6 +547,10 @@ Q_PROPERTY(qreal rotation READ rotation WRITE setRotation NOTIFY rotationChanged) Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged) Q_PROPERTY(QPointF transformOriginPoint READ transformOriginPoint WRITE setTransformOriginPoint) + Q_PRIVATE_PROPERTY(QGraphicsItem::d_func(), QDeclarativeListProperty children READ childrenList DESIGNABLE false NOTIFY childrenChanged) + Q_PRIVATE_PROPERTY(QGraphicsItem::d_func(), qreal width READ width WRITE setWidth NOTIFY widthChanged RESET resetWidth FINAL) + Q_PRIVATE_PROPERTY(QGraphicsItem::d_func(), qreal height READ height WRITE setHeight NOTIFY heightChanged RESET resetHeight FINAL) + Q_CLASSINFO("DefaultProperty", "children") Q_INTERFACES(QGraphicsItem) public: QGraphicsObject(QGraphicsItem *parent = 0); @@ -571,6 +575,9 @@ void zChanged(); void rotationChanged(); void scaleChanged(); + void childrenChanged(); + void widthChanged(); + void heightChanged(); protected: QGraphicsObject(QGraphicsItemPrivate &dd, QGraphicsItem *parent, QGraphicsScene *scene); diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicsitem_p.h --- a/src/gui/graphicsview/qgraphicsitem_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicsitem_p.h Mon May 03 13:17:34 2010 +0300 @@ -71,6 +71,62 @@ class QGraphicsItemPrivate; +#ifndef QDECLARATIVELISTPROPERTY +#define QDECLARATIVELISTPROPERTY +template +struct QDeclarativeListProperty { + typedef void (*AppendFunction)(QDeclarativeListProperty *, T*); + typedef int (*CountFunction)(QDeclarativeListProperty *); + typedef T *(*AtFunction)(QDeclarativeListProperty *, int); + typedef void (*ClearFunction)(QDeclarativeListProperty *); + + QDeclarativeListProperty() + : object(0), data(0), append(0), count(0), at(0), clear(0), dummy1(0), dummy2(0) {} + QDeclarativeListProperty(QObject *o, QList &list) + : object(o), data(&list), append(qlist_append), count(qlist_count), at(qlist_at), + clear(qlist_clear), dummy1(0), dummy2(0) {} + QDeclarativeListProperty(QObject *o, void *d, AppendFunction a, CountFunction c = 0, AtFunction t = 0, + ClearFunction r = 0) + : object(o), data(d), append(a), count(c), at(t), clear(r), dummy1(0), dummy2(0) {} + + bool operator==(const QDeclarativeListProperty &o) const { + return object == o.object && + data == o.data && + append == o.append && + count == o.count && + at == o.at && + clear == o.clear; + } + + QObject *object; + void *data; + + AppendFunction append; + + CountFunction count; + AtFunction at; + + ClearFunction clear; + + void *dummy1; + void *dummy2; + +private: + static void qlist_append(QDeclarativeListProperty *p, T *v) { + ((QList *)p->data)->append(v); + } + static int qlist_count(QDeclarativeListProperty *p) { + return ((QList *)p->data)->count(); + } + static T *qlist_at(QDeclarativeListProperty *p, int idx) { + return ((QList *)p->data)->at(idx); + } + static void qlist_clear(QDeclarativeListProperty *p) { + return ((QList *)p->data)->clear(); + } +}; +#endif + class QGraphicsItemCache { public: @@ -237,6 +293,7 @@ void resolveDepth(); void addChild(QGraphicsItem *child); void removeChild(QGraphicsItem *child); + QDeclarativeListProperty childrenList(); void setParentItemHelper(QGraphicsItem *parent, const QVariant *newParentVariant, const QVariant *thisPointerVariant); void childrenBoundingRectHelper(QTransform *x, QRectF *rect); @@ -414,7 +471,8 @@ inline void markParentDirty(bool updateBoundingRect = false); - void setFocusHelper(Qt::FocusReason focusReason, bool climb); + void setFocusHelper(Qt::FocusReason focusReason, bool climb, bool focusFromShow); + void clearFocusHelper(bool giveFocusToParent); void setSubFocus(QGraphicsItem *rootItem = 0); void clearSubFocus(QGraphicsItem *rootItem = 0); void resetFocusProxy(); @@ -422,11 +480,21 @@ inline QTransform transformToParent() const; inline void ensureSortedChildren(); + static void append(QDeclarativeListProperty *list, QGraphicsObject *item); static inline bool insertionOrder(QGraphicsItem *a, QGraphicsItem *b); void ensureSequentialSiblingIndex(); inline void sendScenePosChange(); virtual void siblingOrderChange(); + // Private Properties + virtual qreal width() const; + virtual void setWidth(qreal); + virtual void resetWidth(); + + virtual qreal height() const; + virtual void setHeight(qreal); + virtual void resetHeight(); + QRectF childrenBoundingRect; QRectF needsRepaint; QMap paintedViewBoundingRects; diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicsproxywidget.cpp --- a/src/gui/graphicsview/qgraphicsproxywidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicsproxywidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -1315,6 +1315,8 @@ return; } + d->proxyIsGivingFocus = true; + switch (event->reason()) { case Qt::TabFocusReason: { if (QWidget *focusChild = d->findFocusChild(0, true)) @@ -1328,10 +1330,11 @@ default: if (d->widget && d->widget->focusWidget()) { d->widget->focusWidget()->setFocus(event->reason()); - return; } break; } + + d->proxyIsGivingFocus = false; } /*! diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicsproxywidget_p.h --- a/src/gui/graphicsview/qgraphicsproxywidget_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicsproxywidget_p.h Mon May 03 13:17:34 2010 +0300 @@ -118,6 +118,7 @@ quint32 styleChangeMode : 2; quint32 paletteChangeMode : 2; quint32 focusFromWidgetToProxy : 1; + quint32 proxyIsGivingFocus : 1; }; QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicsscene.cpp --- a/src/gui/graphicsview/qgraphicsscene.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicsscene.cpp Mon May 03 13:17:34 2010 +0300 @@ -4285,6 +4285,7 @@ if (!subPix.isNull()) { // Blit the subpixmap into the main pixmap. pixmapPainter.begin(pix); + pixmapPainter.setCompositionMode(QPainter::CompositionMode_Source); pixmapPainter.setClipRegion(pixmapExposed); pixmapPainter.drawPixmap(br.topLeft(), subPix); pixmapPainter.end(); @@ -4450,6 +4451,8 @@ } // Create or reuse offscreen pixmap, possibly scroll/blit from the old one. + // If the world transform is rotated we always recreate the cache to avoid + // wrong blending. bool pixModified = false; QGraphicsItemCache::DeviceData *deviceData = &itemCache->deviceData[widget]; bool invertable = true; @@ -4457,7 +4460,9 @@ if (invertable) diff *= painter->worldTransform(); deviceData->lastTransform = painter->worldTransform(); - if (!invertable || diff.type() > QTransform::TxTranslate) { + if (!invertable + || diff.type() > QTransform::TxTranslate + || painter->worldTransform().type() > QTransform::TxScale) { pixModified = true; itemCache->allExposed = true; itemCache->exposed.clear(); @@ -4714,31 +4719,18 @@ if (sourced->currentCachedSystem() != Qt::LogicalCoordinates && sourced->lastEffectTransform != painter->worldTransform()) { - bool unclipped = false; if (sourced->lastEffectTransform.type() <= QTransform::TxTranslate && painter->worldTransform().type() <= QTransform::TxTranslate) { - QRectF itemRect = item->boundingRect(); - if (!item->d_ptr->children.isEmpty()) - itemRect |= item->childrenBoundingRect(); - - QRectF oldSourceRect = sourced->lastEffectTransform.mapRect(itemRect); - QRectF newSourceRect = painter->worldTransform().mapRect(itemRect); - - QRect oldEffectRect = sourced->paddedEffectRect(sourced->currentCachedSystem(), sourced->currentCachedMode(), oldSourceRect); - QRect newEffectRect = sourced->paddedEffectRect(sourced->currentCachedSystem(), sourced->currentCachedMode(), newSourceRect); - - QRect deviceRect(0, 0, painter->device()->width(), painter->device()->height()); - if (deviceRect.contains(oldEffectRect) && deviceRect.contains(newEffectRect)) { - sourced->setCachedOffset(newEffectRect.topLeft()); - unclipped = true; - } + QRectF sourceRect = sourced->boundingRect(Qt::DeviceCoordinates); + QRect effectRect = sourced->paddedEffectRect(Qt::DeviceCoordinates, sourced->currentCachedMode(), sourceRect); + + sourced->setCachedOffset(effectRect.topLeft()); + } else { + sourced->invalidateCache(QGraphicsEffectSourcePrivate::TransformChanged); } sourced->lastEffectTransform = painter->worldTransform(); - - if (!unclipped) - sourced->invalidateCache(QGraphicsEffectSourcePrivate::TransformChanged); } item->d_ptr->graphicsEffect->draw(painter); diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicssceneevent.h --- a/src/gui/graphicsview/qgraphicssceneevent.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicssceneevent.h Mon May 03 13:17:34 2010 +0300 @@ -77,6 +77,8 @@ QGraphicsSceneEvent(QGraphicsSceneEventPrivate &dd, Type type = None); QScopedPointer d_ptr; Q_DECLARE_PRIVATE(QGraphicsSceneEvent) +private: + Q_DISABLE_COPY(QGraphicsSceneEvent) }; class QGraphicsSceneMouseEventPrivate; @@ -124,6 +126,7 @@ private: Q_DECLARE_PRIVATE(QGraphicsSceneMouseEvent) + Q_DISABLE_COPY(QGraphicsSceneMouseEvent) }; class QGraphicsSceneWheelEventPrivate; @@ -156,6 +159,7 @@ private: Q_DECLARE_PRIVATE(QGraphicsSceneWheelEvent) + Q_DISABLE_COPY(QGraphicsSceneWheelEvent) }; class QGraphicsSceneContextMenuEventPrivate; @@ -184,6 +188,7 @@ private: Q_DECLARE_PRIVATE(QGraphicsSceneContextMenuEvent) + Q_DISABLE_COPY(QGraphicsSceneContextMenuEvent) }; class QGraphicsSceneHoverEventPrivate; @@ -216,6 +221,7 @@ private: Q_DECLARE_PRIVATE(QGraphicsSceneHoverEvent) + Q_DISABLE_COPY(QGraphicsSceneHoverEvent) }; class QGraphicsSceneHelpEventPrivate; @@ -233,6 +239,7 @@ private: Q_DECLARE_PRIVATE(QGraphicsSceneHelpEvent) + Q_DISABLE_COPY(QGraphicsSceneHelpEvent) }; class QGraphicsSceneDragDropEventPrivate; @@ -275,12 +282,14 @@ private: Q_DECLARE_PRIVATE(QGraphicsSceneDragDropEvent) + Q_DISABLE_COPY(QGraphicsSceneDragDropEvent) }; class QGraphicsSceneResizeEventPrivate; class Q_GUI_EXPORT QGraphicsSceneResizeEvent : public QGraphicsSceneEvent { Q_DECLARE_PRIVATE(QGraphicsSceneResizeEvent) + Q_DISABLE_COPY(QGraphicsSceneResizeEvent) public: QGraphicsSceneResizeEvent(); ~QGraphicsSceneResizeEvent(); @@ -296,6 +305,7 @@ class Q_GUI_EXPORT QGraphicsSceneMoveEvent : public QGraphicsSceneEvent { Q_DECLARE_PRIVATE(QGraphicsSceneMoveEvent) + Q_DISABLE_COPY(QGraphicsSceneMoveEvent) public: QGraphicsSceneMoveEvent(); ~QGraphicsSceneMoveEvent(); diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicsview.cpp --- a/src/gui/graphicsview/qgraphicsview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicsview.cpp Mon May 03 13:17:34 2010 +0300 @@ -3360,12 +3360,6 @@ backgroundPainter.setClipRegion(d->backgroundPixmapExposed, Qt::ReplaceClip); if (viewTransformed) backgroundPainter.setTransform(viewTransform); -#ifdef Q_WS_X11 -#undef X11 - if (backgroundPainter.paintEngine()->type() != QPaintEngine::X11) -#define X11 qt_x11Data -#endif - backgroundPainter.setCompositionMode(QPainter::CompositionMode_Source); QRectF backgroundExposedSceneRect = mapToScene(d->backgroundPixmapExposed.boundingRect()).boundingRect(); drawBackground(&backgroundPainter, backgroundExposedSceneRect); d->backgroundPixmapExposed = QRegion(); @@ -3400,6 +3394,13 @@ if (!d->scene->d_func()->painterStateProtection) painter.setWorldTransform(viewTransform); } else { + // Make sure we don't have unpolished items before we draw + if (!d->scene->d_func()->unpolishedItems.isEmpty()) + d->scene->d_func()->_q_polishItems(); + // We reset updateAll here (after we've issued polish events) + // so that we can discard update requests coming from polishEvent(). + d->scene->d_func()->updateAll = false; + // Find all exposed items bool allItems = false; QList itemList = d->findItems(d->exposedRegion, &allItems, viewTransform); @@ -3408,9 +3409,25 @@ const int numItems = itemList.size(); QGraphicsItem **itemArray = &itemList[0]; // Relies on QList internals, but is perfectly valid. QStyleOptionGraphicsItem *styleOptionArray = d->allocStyleOptionsArray(numItems); + QTransform transform(Qt::Uninitialized); for (int i = 0; i < numItems; ++i) { - itemArray[i]->d_ptr->initStyleOption(&styleOptionArray[i], viewTransform, - d->exposedRegion, allItems); + QGraphicsItem *item = itemArray[i]; + QGraphicsItemPrivate *itemd = item->d_ptr.data(); + itemd->initStyleOption(&styleOptionArray[i], viewTransform, d->exposedRegion, allItems); + // Cache the item's area in view coordinates. + // Note that we have to do this here in case the base class implementation + // (QGraphicsScene::drawItems) is not called. If it is, we'll do this + // operation twice, but that's the price one has to pay for using indirect + // painting :-/. + const QRectF brect = adjustedItemEffectiveBoundingRect(item); + if (!itemd->itemIsUntransformable()) { + transform = item->sceneTransform(); + if (viewTransformed) + transform *= viewTransform; + } else { + transform = item->deviceTransform(viewTransform); + } + itemd->paintedViewBoundingRects.insert(d->viewport, transform.mapRect(brect).toRect()); } // Draw the items. drawItems(&painter, numItems, itemArray, styleOptionArray); diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicswidget.cpp --- a/src/gui/graphicsview/qgraphicswidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicswidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -324,6 +324,14 @@ */ /*! + + \fn QGraphicsWidget::geometryChanged() + + This signal gets emitted whenever the geometry of the item changes + \internal +*/ + +/*! \property QGraphicsWidget::geometry \brief the geometry of the widget @@ -334,7 +342,7 @@ A side effect of calling this function is that the widget will receive a move event and a resize event. Also, if the widget has a layout assigned, the layout will activate. - + \sa geometry(), resize() */ void QGraphicsWidget::setGeometry(const QRectF &rect) @@ -384,13 +392,17 @@ } QSizeF oldSize = size(); QGraphicsLayoutItem::setGeometry(newGeom); - + emit geometryChanged(); // Send resize event bool resized = newGeom.size() != oldSize; if (resized) { QGraphicsSceneResizeEvent re; re.setOldSize(oldSize); re.setNewSize(newGeom.size()); + if (oldSize.width() != newGeom.size().width()) + emit widthChanged(); + if (oldSize.height() != newGeom.size().height()) + emit heightChanged(); QApplication::sendEvent(this, &re); } } @@ -562,7 +574,7 @@ void QGraphicsWidget::unsetWindowFrameMargins() { Q_D(QGraphicsWidget); - if ((d->windowFlags & Qt::Window) && (d->windowFlags & Qt::WindowType_Mask) != Qt::Popup && + if ((d->windowFlags & Qt::Window) && (d->windowFlags & Qt::WindowType_Mask) != Qt::Popup && (d->windowFlags & Qt::WindowType_Mask) != Qt::ToolTip && !(d->windowFlags & Qt::FramelessWindowHint)) { QStyleOptionTitleBar bar; d->initStyleOptionTitleBar(&bar); @@ -1139,7 +1151,7 @@ Returns true if \a event has been recognized and processed; otherwise, returns false. - + \sa event() */ bool QGraphicsWidget::windowFrameEvent(QEvent *event) @@ -1196,7 +1208,7 @@ const QRectF r = windowFrameRect(); if (!r.contains(pos)) return Qt::NoSection; - + const qreal left = r.left(); const qreal top = r.top(); const qreal right = r.right(); @@ -2322,5 +2334,5 @@ #endif QT_END_NAMESPACE - + #endif //QT_NO_GRAPHICSVIEW diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicswidget.h --- a/src/gui/graphicsview/qgraphicswidget.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicswidget.h Mon May 03 13:17:34 2010 +0300 @@ -73,7 +73,7 @@ Q_PROPERTY(QPalette palette READ palette WRITE setPalette) Q_PROPERTY(QFont font READ font WRITE setFont) Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection RESET unsetLayoutDirection) - Q_PROPERTY(QSizeF size READ size WRITE resize) + Q_PROPERTY(QSizeF size READ size WRITE resize NOTIFY geometryChanged) Q_PROPERTY(QSizeF minimumSize READ minimumSize WRITE setMinimumSize) Q_PROPERTY(QSizeF preferredSize READ preferredSize WRITE setPreferredSize) Q_PROPERTY(QSizeF maximumSize READ maximumSize WRITE setMaximumSize) @@ -81,11 +81,10 @@ Q_PROPERTY(Qt::FocusPolicy focusPolicy READ focusPolicy WRITE setFocusPolicy) Q_PROPERTY(Qt::WindowFlags windowFlags READ windowFlags WRITE setWindowFlags) Q_PROPERTY(QString windowTitle READ windowTitle WRITE setWindowTitle) - Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry) + Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry NOTIFY geometryChanged) public: QGraphicsWidget(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0); ~QGraphicsWidget(); - QGraphicsLayout *layout() const; void setLayout(QGraphicsLayout *layout); void adjustSize(); @@ -175,6 +174,9 @@ using QObject::children; #endif +Q_SIGNALS: + void geometryChanged(); + public Q_SLOTS: bool close(); diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicswidget_p.cpp --- a/src/gui/graphicsview/qgraphicswidget_p.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicswidget_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -44,6 +44,7 @@ #ifndef QT_NO_GRAPHICSVIEW #include +#include #include "qgraphicswidget_p.h" #include "qgraphicslayout.h" #include "qgraphicsscene_p.h" @@ -825,6 +826,56 @@ } } +qreal QGraphicsWidgetPrivate::width() const +{ + Q_Q(const QGraphicsWidget); + return q->geometry().width(); +} + +void QGraphicsWidgetPrivate::setWidth(qreal w) +{ + if (qIsNaN(w)) + return; + Q_Q(QGraphicsWidget); + if (q->geometry().width() == w) + return; + + QRectF oldGeom = q->geometry(); + + q->setGeometry(QRectF(q->x(), q->y(), w, height())); +} + +void QGraphicsWidgetPrivate::resetWidth() +{ + Q_Q(QGraphicsWidget); + q->setGeometry(QRectF(q->x(), q->y(), 0, height())); +} + +qreal QGraphicsWidgetPrivate::height() const +{ + Q_Q(const QGraphicsWidget); + return q->geometry().height(); +} + +void QGraphicsWidgetPrivate::setHeight(qreal h) +{ + if (qIsNaN(h)) + return; + Q_Q(QGraphicsWidget); + if (q->geometry().height() == h) + return; + + QRectF oldGeom = q->geometry(); + + q->setGeometry(QRectF(q->x(), q->y(), width(), h)); +} + +void QGraphicsWidgetPrivate::resetHeight() +{ + Q_Q(QGraphicsWidget); + q->setGeometry(QRectF(q->x(), q->y(), width(), 0)); +} + QT_END_NAMESPACE #endif //QT_NO_GRAPHICSVIEW diff -r 2f34d5167611 -r fcece45ef507 src/gui/graphicsview/qgraphicswidget_p.h --- a/src/gui/graphicsview/qgraphicswidget_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/graphicsview/qgraphicswidget_p.h Mon May 03 13:17:34 2010 +0300 @@ -130,6 +130,15 @@ void windowFrameHoverLeaveEvent(QGraphicsSceneHoverEvent *event); bool hasDecoration() const; + // Private Properties + qreal width() const; + void setWidth(qreal); + void resetWidth(); + + qreal height() const; + void setHeight(qreal); + void resetHeight(); + // State inline int attributeToBitIndex(Qt::WidgetAttribute att) const { diff -r 2f34d5167611 -r fcece45ef507 src/gui/gui.pro --- a/src/gui/gui.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/gui.pro Mon May 03 13:17:34 2010 +0300 @@ -60,7 +60,6 @@ # Partial upgrade SIS file vendorinfo = \ - "&EN" \ "; Localised Vendor name" \ "%{\"Nokia, Qt\"}" \ " " \ diff -r 2f34d5167611 -r fcece45ef507 src/gui/image/qicon.cpp --- a/src/gui/image/qicon.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/image/qicon.cpp Mon May 03 13:17:34 2010 +0300 @@ -982,7 +982,9 @@ icon = *cachedIcon; } - if (icon.availableSizes().isEmpty()) + // Note the qapp check is to allow lazy loading of static icons + // Supporting fallbacks will not work for this case. + if (qApp && icon.availableSizes().isEmpty()) return fallback; return icon; diff -r 2f34d5167611 -r fcece45ef507 src/gui/image/qiconloader.cpp --- a/src/gui/image/qiconloader.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/image/qiconloader.cpp Mon May 03 13:17:34 2010 +0300 @@ -85,19 +85,30 @@ } QIconLoader::QIconLoader() : - m_themeKey(1), m_supportsSvg(false) + m_themeKey(1), m_supportsSvg(false), m_initialized(false) +{ +} + +// We lazily initialize the loader to make static icons +// work. Though we do not officially support this. +void QIconLoader::ensureInitialized() { - m_systemTheme = qt_guiPlatformPlugin()->systemIconThemeName(); - if (m_systemTheme.isEmpty()) - m_systemTheme = fallbackTheme(); + if (!m_initialized) { + m_initialized = true; + Q_ASSERT(qApp); + + m_systemTheme = qt_guiPlatformPlugin()->systemIconThemeName(); + if (m_systemTheme.isEmpty()) + m_systemTheme = fallbackTheme(); #ifndef QT_NO_LIBRARY - QFactoryLoader iconFactoryLoader(QIconEngineFactoryInterfaceV2_iid, - QLatin1String("/iconengines"), - Qt::CaseInsensitive); - if (iconFactoryLoader.keys().contains(QLatin1String("svg"))) - m_supportsSvg = true; + QFactoryLoader iconFactoryLoader(QIconEngineFactoryInterfaceV2_iid, + QLatin1String("/iconengines"), + Qt::CaseInsensitive); + if (iconFactoryLoader.keys().contains(QLatin1String("svg"))) + m_supportsSvg = true; #endif //QT_NO_LIBRARY + } } QIconLoader *QIconLoader::instance() @@ -339,6 +350,9 @@ // Lazily load the icon void QIconLoaderEngine::ensureLoaded() { + + iconLoaderInstance()->ensureInitialized(); + if (!(iconLoaderInstance()->themeKey() == m_key)) { while (!m_entries.isEmpty()) diff -r 2f34d5167611 -r fcece45ef507 src/gui/image/qiconloader_p.h --- a/src/gui/image/qiconloader_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/image/qiconloader_p.h Mon May 03 13:17:34 2010 +0300 @@ -169,6 +169,7 @@ static QIconLoader *instance(); void updateSystemTheme(); void invalidateKey() { m_themeKey++; } + void ensureInitialized(); private: QThemeIconEntries findIconHelper(const QString &themeName, @@ -176,6 +177,7 @@ QStringList &visited) const; uint m_themeKey; bool m_supportsSvg; + bool m_initialized; mutable QString m_userTheme; mutable QString m_systemTheme; diff -r 2f34d5167611 -r fcece45ef507 src/gui/image/qimagepixmapcleanuphooks.cpp --- a/src/gui/image/qimagepixmapcleanuphooks.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/image/qimagepixmapcleanuphooks.cpp Mon May 03 13:17:34 2010 +0300 @@ -96,6 +96,11 @@ void QImagePixmapCleanupHooks::executePixmapDataModificationHooks(QPixmapData* pmd) { QImagePixmapCleanupHooks *h = qt_image_and_pixmap_cleanup_hooks(); + // the global destructor for the pixmap and image hooks might have + // been called already if the app is "leaking" global + // pixmaps/images + if (!h) + return; for (int i = 0; i < h->pixmapModificationHooks.count(); ++i) h->pixmapModificationHooks[i](pmd); @@ -106,6 +111,11 @@ void QImagePixmapCleanupHooks::executePixmapDataDestructionHooks(QPixmapData* pmd) { QImagePixmapCleanupHooks *h = qt_image_and_pixmap_cleanup_hooks(); + // the global destructor for the pixmap and image hooks might have + // been called already if the app is "leaking" global + // pixmaps/images + if (!h) + return; for (int i = 0; i < h->pixmapDestructionHooks.count(); ++i) h->pixmapDestructionHooks[i](pmd); diff -r 2f34d5167611 -r fcece45ef507 src/gui/image/qnativeimage.cpp --- a/src/gui/image/qnativeimage.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/image/qnativeimage.cpp Mon May 03 13:17:34 2010 +0300 @@ -182,7 +182,7 @@ qWarning() << "Error while marking the shared memory segment to be destroyed"; ok = (xshminfo.shmaddr != (char*)-1); if (ok) - image = QImage((uchar *)xshmimg->data, width, height, systemFormat()); + image = QImage((uchar *)xshmimg->data, width, height, format); } xshminfo.readOnly = false; if (ok) diff -r 2f34d5167611 -r fcece45ef507 src/gui/image/qpixmap.cpp --- a/src/gui/image/qpixmap.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/image/qpixmap.cpp Mon May 03 13:17:34 2010 +0300 @@ -831,21 +831,14 @@ if (QPixmapCache::find(key, *this)) return true; - bool ok; - - if (data) { - ok = data->fromFile(fileName, format, flags); - } else { - QScopedPointer tmp(QPixmapData::create(0, 0, QPixmapData::PixmapType)); - ok = tmp->fromFile(fileName, format, flags); - if (ok) - data = tmp.take(); + QScopedPointer tmp(QPixmapData::create(0, 0, data ? data->type : QPixmapData::PixmapType)); + if (tmp->fromFile(fileName, format, flags)) { + data = tmp.take(); + QPixmapCache::insert(key, *this); + return true; } - if (ok) - QPixmapCache::insert(key, *this); - - return ok; + return false; } /*! @@ -2026,12 +2019,16 @@ over the one you grab, you get pixels from the overlying window, too. The mouse cursor is generally not grabbed. - Note on X11that if the given \a window doesn't have the same depth + Note on X11 that if the given \a window doesn't have the same depth as the root window, and another window partially or entirely obscures the one you grab, you will \e not get pixels from the overlying window. The contents of the obscured areas in the pixmap will be undefined and uninitialized. + On Windows Vista and above grabbing a layered window, which is + created by setting the Qt::WA_TranslucentBackground attribute, will + not work. Instead grabbing the desktop widget should work. + \warning In general, grabbing an area outside the screen is not safe. This depends on the underlying window system. diff -r 2f34d5167611 -r fcece45ef507 src/gui/image/qpixmap_s60.cpp --- a/src/gui/image/qpixmap_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/image/qpixmap_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -337,7 +337,7 @@ if (!bitmap) return QPixmap(); - QScopedPointer data(new QS60PixmapData(QPixmapData::PixmapType)); + QScopedPointer data(QPixmapData::create(0,0, QPixmapData::PixmapType)); data->fromNativeType(reinterpret_cast(bitmap), QPixmapData::FbsBitmap); QPixmap pixmap(data.take()); return pixmap; @@ -735,7 +735,7 @@ if (!sgImage) return QPixmap(); - QScopedPointer data(new QS60PixmapData(QPixmapData::PixmapType)); + QScopedPointer data(QPixmapData::create(0,0, QPixmapData::PixmapType)); data->fromNativeType(reinterpret_cast(sgImage), QPixmapData::SgImage); QPixmap pixmap(data.take()); return pixmap; diff -r 2f34d5167611 -r fcece45ef507 src/gui/image/qpixmapfilter.cpp --- a/src/gui/image/qpixmapfilter.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/image/qpixmapfilter.cpp Mon May 03 13:17:34 2010 +0300 @@ -777,6 +777,9 @@ Q_GUI_EXPORT QImage qt_halfScaled(const QImage &source) { + if (source.width() < 2 || source.height() < 2) + return QImage(); + QImage srcImage = source; if (source.format() == QImage::Format_Indexed8) { @@ -869,7 +872,7 @@ } qreal scale = 1; - if (radius >= 4) { + if (radius >= 4 && blurImage.width() >= 2 && blurImage.height() >= 2) { blurImage = qt_halfScaled(blurImage); scale = 2; radius *= qreal(0.5); diff -r 2f34d5167611 -r fcece45ef507 src/gui/inputmethod/inputmethod.pri --- a/src/gui/inputmethod/inputmethod.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/inputmethod/inputmethod.pri Mon May 03 13:17:34 2010 +0300 @@ -26,6 +26,6 @@ symbian:contains(QT_CONFIG, s60) { HEADERS += inputmethod/qcoefepinputcontext_p.h SOURCES += inputmethod/qcoefepinputcontext_s60.cpp - LIBS += -lfepbase + LIBS += -lfepbase -lakninputlanguage } diff -r 2f34d5167611 -r fcece45ef507 src/gui/inputmethod/qcoefepinputcontext_s60.cpp --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -551,6 +551,21 @@ m_formatRetriever = &aInlineTextFormatRetriever; m_pointerHandler = &aPointerEventHandlerDuringInlineEdit; + // With T9 aInitialInlineText is typically empty when StartFepInlineEditL is called, + // but FEP requires that selected text is always removed at StartFepInlineEditL. + // Let's remove the selected text if aInitialInlineText is empty and there is selected text + if (m_preeditString.isEmpty()) { + int anchor = w->inputMethodQuery(Qt::ImAnchorPosition).toInt(); + int replacementLength = qAbs(m_cursorPos-anchor); + if (replacementLength > 0) { + int replacementStart = m_cursorPos < anchor ? 0 : -replacementLength; + QList clearSelectionAttributes; + QInputMethodEvent clearSelectionEvent(QLatin1String(""), clearSelectionAttributes); + clearSelectionEvent.setCommitString(QLatin1String(""), replacementStart, replacementLength); + sendEvent(clearSelectionEvent); + } + } + applyFormat(&attributes); attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, diff -r 2f34d5167611 -r fcece45ef507 src/gui/inputmethod/qinputcontextfactory.cpp --- a/src/gui/inputmethod/qinputcontextfactory.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/inputmethod/qinputcontextfactory.cpp Mon May 03 13:17:34 2010 +0300 @@ -73,6 +73,7 @@ #endif #ifdef Q_WS_S60 #include "qcoefepinputcontext_p.h" +#include "akninputlanguageinfo.h" #endif #include "private/qfactoryloader_p.h" @@ -198,6 +199,42 @@ return result; } +#if defined(Q_WS_S60) +/*! + \internal + + This function contains pure Symbian exception handling code for + getting S60 language list. + Returned object ownership is transfered to caller. +*/ +static CAknInputLanguageList* s60LangListL() +{ + CAknInputLanguageInfo *langInfo = AknInputLanguageInfoFactory::CreateInputLanguageInfoL(); + CleanupStack::PushL(langInfo); + // In rare phone there is more than 7 languages installed -> use 7 as an array granularity + CAknInputLanguageList *langList = new (ELeave) CAknInputLanguageList(7); + CleanupStack::PushL(langList); + langInfo->AppendAvailableLanguagesL(langList); + CleanupStack::Pop(langList); + CleanupStack::PopAndDestroy(langInfo); + return langList; +} + +/*! + \internal + + This function utility function return S60 language list. + Returned object ownership is transfered to caller. +*/ +static CAknInputLanguageList* s60LangList() +{ + CAknInputLanguageList *langList = NULL; + TRAP_IGNORE(langList = s60LangListL()); + q_check_ptr(langList); + return langList; +} +#endif + /*! Returns the languages supported by the QInputContext object specified by \a key. @@ -229,7 +266,15 @@ #endif #if defined(Q_WS_S60) if (key == QLatin1String("coefep")) - return QStringList(QString()); + { + CAknInputLanguageList *langList = s60LangList(); + int count = langList->Count(); + for (int i = 0; i < count; ++i) + { + result.append(QString(qt_symbianLocaleName(langList->At(i)->LanguageCode()))); + } + delete langList; + } #endif #if defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS) Q_UNUSED(key); diff -r 2f34d5167611 -r fcece45ef507 src/gui/itemviews/qabstractitemview.cpp --- a/src/gui/itemviews/qabstractitemview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/itemviews/qabstractitemview.cpp Mon May 03 13:17:34 2010 +0300 @@ -2119,6 +2119,11 @@ Q_D(QAbstractItemView); QAbstractScrollArea::focusOutEvent(event); d->viewport->update(); + +#ifdef QT_SOFTKEYS_ENABLED + if(!hasEditFocus()) + removeAction(d->doneSoftKey); +#endif } /*! @@ -2144,7 +2149,12 @@ if (!hasEditFocus()) { setEditFocus(true); #ifdef QT_SOFTKEYS_ENABLED - addAction(d->doneSoftKey); + // If we can't keypad navigate to any direction, there is no sense to add + // "Done" softkey, since it basically does nothing when there is + // only one widget in screen + if(QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) + || QWidgetPrivate::canKeypadNavigate(Qt::Vertical)) + addAction(d->doneSoftKey); #endif return; } @@ -2160,6 +2170,26 @@ event->ignore(); } return; + case Qt::Key_Down: + case Qt::Key_Up: + // Let's ignore vertical navigation events, only if there is no other widget + // what can take the focus in vertical direction. This means widget can handle navigation events + // even the widget don't have edit focus, and there is no other widget in requested direction. + if(QApplication::keypadNavigationEnabled() && !hasEditFocus() + && QWidgetPrivate::canKeypadNavigate(Qt::Vertical)) { + event->ignore(); + return; + } + break; + case Qt::Key_Left: + case Qt::Key_Right: + // Similar logic as in up and down events + if(QApplication::keypadNavigationEnabled() && !hasEditFocus() + && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) || QWidgetPrivate::inTabWidget(this))) { + event->ignore(); + return; + } + break; default: if (QApplication::keypadNavigationEnabled() && !hasEditFocus()) { event->ignore(); @@ -2245,7 +2275,7 @@ case Qt::Key_Down: case Qt::Key_Up: #ifdef QT_KEYPAD_NAVIGATION - if (QApplication::keypadNavigationEnabled()) { + if (QApplication::keypadNavigationEnabled() && QWidgetPrivate::canKeypadNavigate(Qt::Vertical)) { event->accept(); // don't change focus break; } @@ -2253,8 +2283,10 @@ case Qt::Key_Left: case Qt::Key_Right: #ifdef QT_KEYPAD_NAVIGATION - if (QApplication::navigationMode() == Qt::NavigationModeKeypadDirectional) { - event->accept(); // don't change horizontal focus in directional mode + if (QApplication::navigationMode() == Qt::NavigationModeKeypadDirectional + && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) + || (QWidgetPrivate::inTabWidget(this) && d->model->columnCount(d->root) > 1))) { + event->accept(); // don't change focus break; } #endif // QT_KEYPAD_NAVIGATION @@ -2536,6 +2568,7 @@ QStyleOptionViewItemV4 option = d->viewOptionsV4(); QList::iterator it = d->editors.begin(); QWidgetList editorsToRelease; + QWidgetList editorsToHide; while (it != d->editors.end()) { QModelIndex index = it->index; QWidget *editor = it->editor; @@ -2547,7 +2580,7 @@ if (delegate) delegate->updateEditorGeometry(editor, option, index); } else { - editor->hide(); + editorsToHide << editor; } ++it; } else { @@ -2556,8 +2589,11 @@ } } - //we release the editor outside of the loop because it might change the focus and try + //we hide and release the editor outside of the loop because it might change the focus and try //to change the d->editors list. + for (int i = 0; i < editorsToHide.count(); ++i) { + editorsToHide.at(i)->hide(); + } for (int i = 0; i < editorsToRelease.count(); ++i) { d->releaseEditor(editorsToRelease.at(i)); } @@ -3014,6 +3050,7 @@ if (!d->isIndexValid(index)) return; if (QWidget *oldWidget = indexWidget(index)) { + d->persistent.remove(oldWidget); d->removeEditor(oldWidget); oldWidget->deleteLater(); } diff -r 2f34d5167611 -r fcece45ef507 src/gui/itemviews/qabstractproxymodel.cpp --- a/src/gui/itemviews/qabstractproxymodel.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/itemviews/qabstractproxymodel.cpp Mon May 03 13:17:34 2010 +0300 @@ -127,6 +127,7 @@ } else { d->model = QAbstractItemModelPrivate::staticEmptyModel(); } + d->roleNames = d->model->roleNames(); } /*! diff -r 2f34d5167611 -r fcece45ef507 src/gui/itemviews/qitemdelegate.cpp --- a/src/gui/itemviews/qitemdelegate.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/itemviews/qitemdelegate.cpp Mon May 03 13:17:34 2010 +0300 @@ -1297,14 +1297,8 @@ return false; } - Qt::CheckState state; - if ( flags & Qt::ItemIsTristate ) { - state = static_cast( (value.toInt() + 1) % 3 ); - } else { - state = (static_cast(value.toInt()) == Qt::Checked + Qt::CheckState state = (static_cast(value.toInt()) == Qt::Checked ? Qt::Unchecked : Qt::Checked); - } - return model->setData(index, state, Qt::CheckStateRole); } diff -r 2f34d5167611 -r fcece45ef507 src/gui/itemviews/qstyleditemdelegate.cpp --- a/src/gui/itemviews/qstyleditemdelegate.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/itemviews/qstyleditemdelegate.cpp Mon May 03 13:17:34 2010 +0300 @@ -747,13 +747,8 @@ return false; } - Qt::CheckState state; - if ( flags & Qt::ItemIsTristate ) { - state = static_cast( (value.toInt() + 1) % 3 ); - } else { - state = (static_cast(value.toInt()) == Qt::Checked + Qt::CheckState state = (static_cast(value.toInt()) == Qt::Checked ? Qt::Unchecked : Qt::Checked); - } return model->setData(index, state, Qt::CheckStateRole); } diff -r 2f34d5167611 -r fcece45ef507 src/gui/itemviews/qtableview.cpp --- a/src/gui/itemviews/qtableview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/itemviews/qtableview.cpp Mon May 03 13:17:34 2010 +0300 @@ -1908,6 +1908,7 @@ width, rowHeight(r))); } } else { // nothing moved + const int gridAdjust = showGrid() ? 1 : 0; for (int i = 0; i < selection.count(); ++i) { QItemSelectionRange range = selection.at(i); if (range.parent() != d->root || !range.isValid()) @@ -1916,9 +1917,16 @@ const int rtop = rowViewportPosition(range.top()); const int rbottom = rowViewportPosition(range.bottom()) + rowHeight(range.bottom()); - const int rleft = columnViewportPosition(range.left()); - const int rright = columnViewportPosition(range.right()) + columnWidth(range.right()); - selectionRegion += QRect(QPoint(rleft, rtop), QPoint(rright, rbottom)); + int rleft; + int rright; + if (isLeftToRight()) { + rleft = columnViewportPosition(range.left()); + rright = columnViewportPosition(range.right()) + columnWidth(range.right()); + } else { + rleft = columnViewportPosition(range.right()); + rright = columnViewportPosition(range.left()) + columnWidth(range.left()); + } + selectionRegion += QRect(QPoint(rleft, rtop), QPoint(rright - 1 - gridAdjust, rbottom - 1 - gridAdjust)); if (d->hasSpans()) { foreach (QSpanCollection::Span *s, d->spans.spansInRect(range.left(), range.top(), range.width(), range.height())) { @@ -2546,7 +2554,7 @@ // check if we really need to do anything if (!d->isIndexValid(index) || (d->model->parent(index) != d->root) - || isIndexHidden(index)) + || isRowHidden(index.row()) || isColumnHidden(index.column())) return; QSpanCollection::Span span; diff -r 2f34d5167611 -r fcece45ef507 src/gui/itemviews/qtreeview.cpp --- a/src/gui/itemviews/qtreeview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/itemviews/qtreeview.cpp Mon May 03 13:17:34 2010 +0300 @@ -3770,10 +3770,15 @@ if (previousSibiling != -1 && after && model->rowCount(parent) == start) viewItems[previousSibiling].hasMoreSiblings = false; - - updateChildCount(parentItem, -removedCount); - if (parentItem != -1 && viewItems.at(parentItem).total == 0) - viewItems[parentItem].hasChildren = false; //every children have been removed; + if (parentItem != -1) { + if (viewItems.at(parentItem).expanded) { + updateChildCount(parentItem, -removedCount); + if (viewItems.at(parentItem).total == 0) + viewItems[parentItem].hasChildren = false; //every children have been removed; + } else if (viewItems[parentItem].hasChildren && !hasVisibleChildren(parent)) { + viewItems[parentItem].hasChildren = false; + } + } if (after) { q->updateGeometries(); viewport->update(); diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qapplication.cpp --- a/src/gui/kernel/qapplication.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qapplication.cpp Mon May 03 13:17:34 2010 +0300 @@ -892,6 +892,14 @@ { QWidgetPrivate::mapper = new QWidgetMapper; QWidgetPrivate::allWidgets = new QWidgetSet; + +#if !defined(Q_WS_X11) && !defined(Q_WS_QWS) && !defined(Q_CC_NOKIAX86) + // initialize the graphics system - on X11 this is initialized inside + // qt_init() in qapplication_x11.cpp because of several reasons. + // On QWS, the graphics system is set by the QScreen plugin. + graphics_system = QGraphicsSystemFactory::create(graphics_system_name); +#endif + if (qt_appType != QApplication::Tty) (void) QApplication::style(); // trigger creation of application style // trigger registering of QVariant's GUI types @@ -926,12 +934,13 @@ // Set up which span functions should be used in raster engine... qInitDrawhelperAsm(); -#if !defined(Q_WS_X11) && !defined(Q_WS_QWS) - // initialize the graphics system - on X11 this is initialized inside - // qt_init() in qapplication_x11.cpp because of several reasons. - // On QWS, the graphics system is set by the QScreen plugin. +#if defined(Q_CC_NOKIAX86) + // initialize the graphics system - For symbian emulator, we create graphics system here, since + // there is some unknown error launching the emulator with openVg when + // graphics system is created before style instance. graphics_system = QGraphicsSystemFactory::create(graphics_system_name); #endif + #ifndef QT_NO_WHEELEVENT QApplicationPrivate::wheel_scroll_lines = 3; #endif diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qapplication_p.h --- a/src/gui/kernel/qapplication_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qapplication_p.h Mon May 03 13:17:34 2010 +0300 @@ -530,6 +530,7 @@ const QList &touchPoints); #if defined(Q_WS_WIN) + static bool HasTouchSupport; static PtrRegisterTouchWindow RegisterTouchWindow; static PtrGetTouchInputInfo GetTouchInputInfo; static PtrCloseTouchInputHandle CloseTouchInputHandle; diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qapplication_s60.cpp --- a/src/gui/kernel/qapplication_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qapplication_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -52,6 +52,7 @@ #include "qstring.h" #include "qdebug.h" #include "qimage.h" +#include "qcombobox.h" #include "private/qkeymapper_p.h" #include "private/qfont_p.h" #ifndef QT_NO_STYLE_S60 @@ -597,7 +598,9 @@ TUint s60Keysym = QApplicationPrivate::resolveS60ScanCode(keyEvent.iScanCode, keyEvent.iCode); int keyCode; - if (s60Keysym >= 0x20 && s60Keysym < ENonCharacterKeyBase) { + if (s60Keysym == EKeyNull){ //some key events have 0 in iCode, for them iScanCode should be used + keyCode = qt_keymapper_private()->mapS60ScanCodesToQt(keyEvent.iScanCode); + } else if (s60Keysym >= 0x20 && s60Keysym < ENonCharacterKeyBase) { // Normal characters keys. keyCode = s60Keysym; } else { @@ -964,13 +967,26 @@ qwidget->d_func()->setWindowTitle_sys(qwidget->windowTitle()); #ifdef Q_WS_S60 // If widget is fullscreen/minimized, hide status pane and button container otherwise show them. - CEikStatusPane* statusPane = S60->statusPane(); - CEikButtonGroupContainer* buttonGroup = S60->buttonGroupContainer(); + CEikStatusPane *statusPane = S60->statusPane(); + CEikButtonGroupContainer *buttonGroup = S60->buttonGroupContainer(); TBool visible = !(qwidget->windowState() & (Qt::WindowFullScreen | Qt::WindowMinimized)); if (statusPane) statusPane->MakeVisible(visible); - if (buttonGroup) - buttonGroup->MakeVisible(visible); + if (buttonGroup) { + // Visibility + const TBool isFullscreen = qwidget->windowState() & Qt::WindowFullScreen; + const TBool cbaVisibilityHint = qwidget->windowFlags() & Qt::WindowSoftkeysVisibleHint; + buttonGroup->MakeVisible(visible || (isFullscreen && cbaVisibilityHint)); + + // Responsiviness + CEikCba *cba = static_cast( buttonGroup->ButtonGroup() ); // downcast from MEikButtonGroup + TUint cbaFlags = cba->ButtonGroupFlags(); + if(qwidget->windowFlags() & Qt::WindowSoftkeysRespondHint) + cbaFlags |= EAknCBAFlagRespondWhenInvisible; + else + cbaFlags &= ~EAknCBAFlagRespondWhenInvisible; + cba->SetButtonGroupFlags(cbaFlags); + } #endif } else if (QApplication::activeWindow() == qwidget->window()) { if (CCoeEnv::Static()->AppUi()->IsDisplayingMenuOrDialog()) { @@ -988,16 +1004,32 @@ // else { We don't touch the active window unless we were explicitly activated or deactivated } } +void QSymbianControl::handleClientAreaChange() +{ + const bool cbaVisibilityHint = qwidget->windowFlags() & Qt::WindowSoftkeysVisibleHint; + if (qwidget->isFullScreen() && !cbaVisibilityHint) { + SetExtentToWholeScreen(); + } else if (qwidget->isMaximized() || (qwidget->isFullScreen() && cbaVisibilityHint)) { + TRect r = static_cast(S60->appUi())->ClientRect(); + SetExtent(r.iTl, r.Size()); + } else if (!qwidget->isMinimized()) { // Normal geometry + if (!qwidget->testAttribute(Qt::WA_Resized)) { + qwidget->adjustSize(); + qwidget->setAttribute(Qt::WA_Resized, false); //not a user resize + } + if (!qwidget->testAttribute(Qt::WA_Moved) && qwidget->windowType() != Qt::Dialog) { + TRect r = static_cast(S60->appUi())->ClientRect(); + SetPosition(r.iTl); + qwidget->setAttribute(Qt::WA_Moved, false); // not really an explicit position + } + } +} + void QSymbianControl::HandleResourceChange(int resourceType) { switch (resourceType) { case KInternalStatusPaneChange: - if (qwidget->isFullScreen()) { - SetExtentToWholeScreen(); - } else if (qwidget->isMaximized()) { - TRect r = static_cast(S60->appUi())->ClientRect(); - SetExtent(r.iTl, r.Size()); - } + handleClientAreaChange(); if (IsFocused() && IsVisible()) { qwidget->d_func()->setWindowIcon_sys(true); qwidget->d_func()->setWindowTitle_sys(qwidget->windowTitle()); @@ -1009,12 +1041,7 @@ #ifdef Q_WS_S60 case KEikDynamicLayoutVariantSwitch: { - if (qwidget->isFullScreen()) { - SetExtentToWholeScreen(); - } else if (qwidget->isMaximized()) { - TRect r = static_cast(S60->appUi())->ClientRect(); - SetExtent(r.iTl, r.Size()); - } + handleClientAreaChange(); break; } #endif @@ -1227,7 +1254,7 @@ S60->avkonComponentsSupportTransparency = (value==1) ? true : false; } } -#endif +#endif if (touch) { QApplicationPrivate::navigationMode = Qt::NavigationModeNone; @@ -1382,11 +1409,13 @@ void QApplicationPrivate::openPopup(QWidget *popup) { + if (popup && qobject_cast(popup->parentWidget())) + static_cast(popup->effectiveWinId())->FadeBehindPopup(ETrue); + if (!QApplicationPrivate::popupWidgets) QApplicationPrivate::popupWidgets = new QWidgetList; QApplicationPrivate::popupWidgets->append(popup); - // Cancel focus widget pointer capture and long tap timer if (QApplication::focusWidget()) { static_cast(QApplication::focusWidget()->effectiveWinId())->CancelLongTapTimer(); @@ -1425,6 +1454,9 @@ void QApplicationPrivate::closePopup(QWidget *popup) { + if (popup && qobject_cast(popup->parentWidget())) + static_cast(popup->effectiveWinId())->FadeBehindPopup(EFalse); + if (!QApplicationPrivate::popupWidgets) return; QApplicationPrivate::popupWidgets->removeAll(popup); @@ -1448,6 +1480,9 @@ QWidget *fw = QApplicationPrivate::active_window ? QApplicationPrivate::active_window->focusWidget() : q_func()->focusWidget(); if (fw) { + if(fw->window()->isModal()) // restore pointer capture for modal window + fw->effectiveWinId()->SetPointerCapture(true); + if (fw != q_func()->focusWidget()) { fw->setFocus(Qt::PopupFocusReason); } else { diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qapplication_win.cpp --- a/src/gui/kernel/qapplication_win.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qapplication_win.cpp Mon May 03 13:17:34 2010 +0300 @@ -115,6 +115,8 @@ # include #endif +#include "private/qwinnativepangesturerecognizer_win_p.h" + #ifndef WM_TOUCH # define WM_TOUCH 0x0240 @@ -2524,6 +2526,7 @@ } result = false; break; +#if !defined(Q_WS_WINCE) || defined(QT_WINCE_GESTURES) case WM_GESTURE: { GESTUREINFO gi; memset(&gi, 0, sizeof(GESTUREINFO)); @@ -2556,6 +2559,7 @@ result = true; break; } +#endif // !defined(Q_WS_WINCE) || defined(QT_WINCE_GESTURES) default: result = false; // event was not processed break; @@ -3998,12 +4002,45 @@ #endif //QT_NO_SESSIONMANAGER +bool QApplicationPrivate::HasTouchSupport = false; PtrRegisterTouchWindow QApplicationPrivate::RegisterTouchWindow = 0; PtrGetTouchInputInfo QApplicationPrivate::GetTouchInputInfo = 0; PtrCloseTouchInputHandle QApplicationPrivate::CloseTouchInputHandle = 0; void QApplicationPrivate::initializeMultitouch_sys() { + static const IID QT_IID_IInkTablets = {0x112086D9, 0x7779, 0x4535, {0xA6, 0x99, 0x86, 0x2B, 0x43, 0xAC, 0x18, 0x63} }; + static const IID QT_IID_IInkTablet2 = {0x90c91ad2, 0xfa36, 0x49d6, {0x95, 0x16, 0xce, 0x8d, 0x57, 0x0f, 0x6f, 0x85} }; + static const CLSID QT_CLSID_InkTablets = {0x6E4FCB12, 0x510A, 0x4d40, {0x93, 0x04, 0x1D, 0xA1, 0x0A, 0xE9, 0x14, 0x7C} }; + + IInkTablets *iInkTablets = 0; + HRESULT hr = CoCreateInstance(QT_CLSID_InkTablets, NULL, CLSCTX_ALL, QT_IID_IInkTablets, (void**)&iInkTablets); + if (SUCCEEDED(hr)) { + long count = 0; + iInkTablets->get_Count(&count); + for (long i = 0; i < count; ++i) { + IInkTablet *iInkTablet = 0; + hr = iInkTablets->Item(i, &iInkTablet); + if (FAILED(hr)) + continue; + IInkTablet2 *iInkTablet2 = 0; + hr = iInkTablet->QueryInterface(QT_IID_IInkTablet2, (void**)&iInkTablet2); + iInkTablet->Release(); + if (FAILED(hr)) + continue; + TabletDeviceKind kind; + hr = iInkTablet2->get_DeviceKind(&kind); + iInkTablet2->Release(); + if (FAILED(hr)) + continue; + if (kind == TDK_Touch) { + QApplicationPrivate::HasTouchSupport = true; + break; + } + } + iInkTablets->Release(); + } + QLibrary library(QLatin1String("user32")); // MinGW (g++ 3.4.5) accepts only C casts. RegisterTouchWindow = (PtrRegisterTouchWindow)(library.resolve("RegisterTouchWindow")); diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qapplication_x11.cpp --- a/src/gui/kernel/qapplication_x11.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qapplication_x11.cpp Mon May 03 13:17:34 2010 +0300 @@ -96,6 +96,11 @@ } #endif +#ifndef QT_GUI_DOUBLE_CLICK_RADIUS +#define QT_GUI_DOUBLE_CLICK_RADIUS 5 +#endif + + //#define ALIEN_DEBUG #if !defined(QT_NO_GLIB) @@ -315,9 +320,14 @@ "_XEMBED\0" "_XEMBED_INFO\0" + // Wacom old. (before version 0.10) "Wacom Stylus\0" "Wacom Cursor\0" "Wacom Eraser\0" + + // Tablet + "STYLUS\0" + "ERASER\0" }; Q_GUI_EXPORT QX11Data *qt_x11Data = 0; @@ -2361,12 +2371,12 @@ gotStylus = true; } #else - if (devs->type == ATOM(XWacomStylus)) { + if (devs->type == ATOM(XWacomStylus) || devs->type == ATOM(XTabletStylus)) { deviceType = QTabletEvent::Stylus; if (wacomDeviceName()->isEmpty()) wacomDeviceName()->append(devs->name); gotStylus = true; - } else if (devs->type == ATOM(XWacomEraser)) { + } else if (devs->type == ATOM(XWacomEraser) || devs->type == ATOM(XTabletEraser)) { deviceType = QTabletEvent::XFreeEraser; gotEraser = true; } @@ -4215,8 +4225,8 @@ mouseButtonPressed == button && (long)event->xbutton.time -(long)mouseButtonPressTime < QApplication::doubleClickInterval() && - qAbs(event->xbutton.x - mouseXPos) < 5 && - qAbs(event->xbutton.y - mouseYPos) < 5) { + qAbs(event->xbutton.x - mouseXPos) < QT_GUI_DOUBLE_CLICK_RADIUS && + qAbs(event->xbutton.y - mouseYPos) < QT_GUI_DOUBLE_CLICK_RADIUS) { type = QEvent::MouseButtonDblClick; mouseButtonPressTime -= 2000; // no double-click next time } else { diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qcursor.cpp --- a/src/gui/kernel/qcursor.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qcursor.cpp Mon May 03 13:17:34 2010 +0300 @@ -342,7 +342,8 @@ \o B=1 and M=1 gives black. \o B=0 and M=1 gives white. \o B=0 and M=0 gives transparent. - \o B=1 and M=0 gives an XOR'd result. + \o B=1 and M=0 gives an XOR'd result under Windows, undefined + results on all other platforms. \endlist Use the global Qt color Qt::color0 to draw 0-pixels and Qt::color1 to diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qdesktopwidget_s60.cpp --- a/src/gui/kernel/qdesktopwidget_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qdesktopwidget_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -88,6 +88,7 @@ void QDesktopWidgetPrivate::init(QDesktopWidget *that) { + Q_UNUSED(that); // int screenCount=0; // ### TODO: Implement proper multi-display support diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qgesturemanager.cpp --- a/src/gui/kernel/qgesturemanager.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qgesturemanager.cpp Mon May 03 13:17:34 2010 +0300 @@ -45,6 +45,7 @@ #include "private/qgesture_p.h" #include "private/qgraphicsitem_p.h" #include "private/qevent_p.h" +#include "private/qapplication_p.h" #include "qgesture.h" #include "qevent.h" #include "qgraphicsitem.h" @@ -86,7 +87,8 @@ #endif #if defined(Q_OS_WIN) #if !defined(QT_NO_NATIVE_GESTURES) - registerGestureRecognizer(new QWinNativePanGestureRecognizer); + if (QApplicationPrivate::HasTouchSupport) + registerGestureRecognizer(new QWinNativePanGestureRecognizer); #endif #else registerGestureRecognizer(new QTapAndHoldGestureRecognizer); diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qguifunctions_wince.cpp --- a/src/gui/kernel/qguifunctions_wince.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qguifunctions_wince.cpp Mon May 03 13:17:34 2010 +0300 @@ -278,7 +278,14 @@ bool qt_wince_is_windows_mobile_65() { - return ((qt_wince_get_version() == 52) && (qt_wince_get_build() > 2000)); + const DWORD dwFirstWM65BuildNumber = 21139; + OSVERSIONINFO osvi; + osvi.dwOSVersionInfoSize = sizeof(osvi); + if (!GetVersionEx(&osvi)) + return false; + return osvi.dwMajorVersion > 5 + || (osvi.dwMajorVersion == 5 && (osvi.dwMinorVersion > 2 || + (osvi.dwMinorVersion == 2 && osvi.dwBuildNumber >= dwFirstWM65BuildNumber))); } bool qt_wince_is_pocket_pc() { diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qkeymapper_p.h --- a/src/gui/kernel/qkeymapper_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qkeymapper_p.h Mon May 03 13:17:34 2010 +0300 @@ -207,12 +207,12 @@ KeyboardLayoutItem *keyLayout[256]; #elif defined(Q_WS_QWS) #elif defined(Q_OS_SYMBIAN) -private: - QHash s60ToQtKeyMap; - void fillKeyMap(); public: QString translateKeyEvent(int keySym, Qt::KeyboardModifiers modifiers); int mapS60KeyToQt(TUint s60key); + int mapS60ScanCodesToQt(TUint s60key); + int mapQtToS60Key(int qtKey); + int mapQtToS60ScanCodes(int qtKey); #endif }; diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qkeymapper_s60.cpp --- a/src/gui/kernel/qkeymapper_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qkeymapper_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -46,7 +46,6 @@ QKeyMapperPrivate::QKeyMapperPrivate() { - fillKeyMap(); } QKeyMapperPrivate::~QKeyMapperPrivate() @@ -74,174 +73,145 @@ return QString(QChar(keySym)); } -void QKeyMapperPrivate::fillKeyMap() -{ - using namespace Qt; - static const struct { - TUint s60Key; - int qtKey; - } map[] = { - {EKeyBell, Key_unknown}, - {EKeyBackspace, Key_Backspace}, - {EKeyTab, Key_Tab}, - {EKeyLineFeed, Key_unknown}, - {EKeyVerticalTab, Key_unknown}, - {EKeyFormFeed, Key_unknown}, - {EKeyEnter, Key_Enter}, - {EKeyEscape, Key_Escape}, - {EKeySpace, Key_Space}, - {EKeyDelete, Key_Delete}, - {EKeyPrintScreen, Key_SysReq}, - {EKeyPause, Key_Pause}, - {EKeyHome, Key_Home}, - {EKeyEnd, Key_End}, - {EKeyPageUp, Key_PageUp}, - {EKeyPageDown, Key_PageDown}, - {EKeyInsert, Key_Insert}, - {EKeyLeftArrow, Key_Left}, - {EKeyRightArrow, Key_Right}, - {EKeyUpArrow, Key_Up}, - {EKeyDownArrow, Key_Down}, - {EKeyLeftShift, Key_Shift}, - {EKeyRightShift, Key_Shift}, - {EKeyLeftAlt, Key_Alt}, - {EKeyRightAlt, Key_AltGr}, - {EKeyLeftCtrl, Key_Control}, - {EKeyRightCtrl, Key_Control}, - {EKeyLeftFunc, Key_Super_L}, - {EKeyRightFunc, Key_Super_R}, - {EKeyCapsLock, Key_CapsLock}, - {EKeyNumLock, Key_NumLock}, - {EKeyScrollLock, Key_ScrollLock}, - {EKeyF1, Key_F1}, - {EKeyF2, Key_F2}, - {EKeyF3, Key_F3}, - {EKeyF4, Key_F4}, - {EKeyF5, Key_F5}, - {EKeyF6, Key_F6}, - {EKeyF7, Key_F7}, - {EKeyF8, Key_F8}, - {EKeyF9, Key_F9}, - {EKeyF10, Key_F10}, - {EKeyF11, Key_F11}, - {EKeyF12, Key_F12}, - {EKeyF13, Key_F13}, - {EKeyF14, Key_F14}, - {EKeyF15, Key_F15}, - {EKeyF16, Key_F16}, - {EKeyF17, Key_F17}, - {EKeyF18, Key_F18}, - {EKeyF19, Key_F19}, - {EKeyF20, Key_F20}, - {EKeyF21, Key_F21}, - {EKeyF22, Key_F22}, - {EKeyF23, Key_F23}, - {EKeyF24, Key_F24}, - {EKeyOff, Key_unknown}, - {EKeyIncContrast, Key_unknown}, - {EKeyDecContrast, Key_unknown}, - {EKeyBacklightOn, Key_unknown}, - {EKeyBacklightOff, Key_unknown}, - {EKeyBacklightToggle, Key_unknown}, - {EKeySliderDown, Key_unknown}, - {EKeySliderUp, Key_unknown}, - {EKeyMenu, Key_Menu}, - {EKeyDictaphonePlay, Key_unknown}, - {EKeyDictaphoneStop, Key_unknown}, - {EKeyDictaphoneRecord, Key_unknown}, - {EKeyHelp, Key_unknown}, - {EKeyDial, Key_Call}, - {EKeyScreenDimension0, Key_unknown}, - {EKeyScreenDimension1, Key_unknown}, - {EKeyScreenDimension2, Key_unknown}, - {EKeyScreenDimension3, Key_unknown}, - {EKeyIncVolume, Key_unknown}, - {EKeyDecVolume, Key_unknown}, - {EKeyDevice0, Key_Context1}, // Found by manual testing, left softkey. - {EKeyDevice1, Key_Context2}, // Found by manual testing. - {EKeyDevice2, Key_unknown}, - {EKeyDevice3, Key_Select}, // Found by manual testing. - {EKeyDevice4, Key_unknown}, - {EKeyDevice5, Key_unknown}, - {EKeyDevice6, Key_unknown}, - {EKeyDevice7, Key_unknown}, - {EKeyDevice8, Key_unknown}, - {EKeyDevice9, Key_unknown}, - {EKeyDeviceA, Key_unknown}, - {EKeyDeviceB, Key_unknown}, - {EKeyDeviceC, Key_unknown}, - {EKeyDeviceD, Key_unknown}, - {EKeyDeviceE, Key_unknown}, - {EKeyDeviceF, Key_unknown}, - {EKeyApplication0, Key_Launch0}, - {EKeyApplication1, Key_Launch1}, - {EKeyApplication2, Key_Launch2}, - {EKeyApplication3, Key_Launch3}, - {EKeyApplication4, Key_Launch4}, - {EKeyApplication5, Key_Launch5}, - {EKeyApplication6, Key_Launch6}, - {EKeyApplication7, Key_Launch7}, - {EKeyApplication8, Key_Launch8}, - {EKeyApplication9, Key_Launch9}, - {EKeyApplicationA, Key_LaunchA}, - {EKeyApplicationB, Key_LaunchB}, - {EKeyApplicationC, Key_LaunchC}, - {EKeyApplicationD, Key_LaunchD}, - {EKeyApplicationE, Key_LaunchE}, - {EKeyApplicationF, Key_LaunchF}, - {EKeyYes, Key_Yes}, - {EKeyNo, Key_No}, - {EKeyIncBrightness, Key_unknown}, - {EKeyDecBrightness, Key_unknown}, - {EKeyKeyboardExtend, Key_unknown}, - {EKeyDevice10, Key_unknown}, - {EKeyDevice11, Key_unknown}, - {EKeyDevice12, Key_unknown}, - {EKeyDevice13, Key_unknown}, - {EKeyDevice14, Key_unknown}, - {EKeyDevice15, Key_unknown}, - {EKeyDevice16, Key_unknown}, - {EKeyDevice17, Key_unknown}, - {EKeyDevice18, Key_unknown}, - {EKeyDevice19, Key_unknown}, - {EKeyDevice1A, Key_unknown}, - {EKeyDevice1B, Key_unknown}, - {EKeyDevice1C, Key_unknown}, - {EKeyDevice1D, Key_unknown}, - {EKeyDevice1E, Key_unknown}, - {EKeyDevice1F, Key_unknown}, - {EKeyApplication10, Key_unknown}, - {EKeyApplication11, Key_unknown}, - {EKeyApplication12, Key_unknown}, - {EKeyApplication13, Key_unknown}, - {EKeyApplication14, Key_unknown}, - {EKeyApplication15, Key_unknown}, - {EKeyApplication16, Key_unknown}, - {EKeyApplication17, Key_unknown}, - {EKeyApplication18, Key_unknown}, - {EKeyApplication19, Key_unknown}, - {EKeyApplication1A, Key_unknown}, - {EKeyApplication1B, Key_unknown}, - {EKeyApplication1C, Key_unknown}, - {EKeyApplication1D, Key_unknown}, - {EKeyApplication1E, Key_unknown}, - {EKeyApplication1F, Key_unknown} - }; - const int mapSize = int(sizeof(map)/sizeof(map[0])); - s60ToQtKeyMap.reserve(mapSize + 5); // +5? docs: Ideally, slightly more than number of items - for (int i = 0; i < mapSize; ++i) - s60ToQtKeyMap.insert(map[i].s60Key, map[i].qtKey); -} +#include +struct KeyMapping{ + TKeyCode s60KeyCode; + TStdScanCode s60ScanCode; + Qt::Key qtKey; +}; + +using namespace Qt; + +static const KeyMapping keyMapping[] = { + {EKeyBackspace, EStdKeyBackspace, Key_Backspace}, + {EKeyTab, EStdKeyTab, Key_Tab}, + {EKeyEnter, EStdKeyEnter, Key_Enter}, + {EKeyEscape, EStdKeyEscape, Key_Escape}, + {EKeySpace, EStdKeySpace, Key_Space}, + {EKeyDelete, EStdKeyDelete, Key_Delete}, + {EKeyPrintScreen, EStdKeyPrintScreen, Key_SysReq}, + {EKeyPause, EStdKeyPause, Key_Pause}, + {EKeyHome, EStdKeyHome, Key_Home}, + {EKeyEnd, EStdKeyEnd, Key_End}, + {EKeyPageUp, EStdKeyPageUp, Key_PageUp}, + {EKeyPageDown, EStdKeyPageDown, Key_PageDown}, + {EKeyInsert, EStdKeyInsert, Key_Insert}, + {EKeyLeftArrow, EStdKeyLeftArrow, Key_Left}, + {EKeyRightArrow, EStdKeyRightArrow, Key_Right}, + {EKeyUpArrow, EStdKeyUpArrow, Key_Up}, + {EKeyDownArrow, EStdKeyDownArrow, Key_Down}, + {EKeyLeftShift, EStdKeyLeftShift, Key_Shift}, + {EKeyRightShift, EStdKeyRightShift, Key_Shift}, + {EKeyLeftAlt, EStdKeyLeftAlt, Key_Alt}, + {EKeyRightAlt, EStdKeyRightAlt, Key_AltGr}, + {EKeyLeftCtrl, EStdKeyLeftCtrl, Key_Control}, + {EKeyRightCtrl, EStdKeyRightCtrl, Key_Control}, + {EKeyLeftFunc, EStdKeyLeftFunc, Key_Super_L}, + {EKeyRightFunc, EStdKeyRightFunc, Key_Super_R}, + {EKeyCapsLock, EStdKeyCapsLock, Key_CapsLock}, + {EKeyNumLock, EStdKeyNumLock, Key_NumLock}, + {EKeyScrollLock, EStdKeyScrollLock, Key_ScrollLock}, + {EKeyF1, EStdKeyF1, Key_F1}, + {EKeyF2, EStdKeyF2, Key_F2}, + {EKeyF3, EStdKeyF3, Key_F3}, + {EKeyF4, EStdKeyF4, Key_F4}, + {EKeyF5, EStdKeyF5, Key_F5}, + {EKeyF6, EStdKeyF6, Key_F6}, + {EKeyF7, EStdKeyF7, Key_F7}, + {EKeyF8, EStdKeyF8, Key_F8}, + {EKeyF9, EStdKeyF9, Key_F9}, + {EKeyF10, EStdKeyF10, Key_F10}, + {EKeyF11, EStdKeyF11, Key_F11}, + {EKeyF12, EStdKeyF12, Key_F12}, + {EKeyF13, EStdKeyF13, Key_F13}, + {EKeyF14, EStdKeyF14, Key_F14}, + {EKeyF15, EStdKeyF15, Key_F15}, + {EKeyF16, EStdKeyF16, Key_F16}, + {EKeyF17, EStdKeyF17, Key_F17}, + {EKeyF18, EStdKeyF18, Key_F18}, + {EKeyF19, EStdKeyF19, Key_F19}, + {EKeyF20, EStdKeyF20, Key_F20}, + {EKeyF21, EStdKeyF21, Key_F21}, + {EKeyF22, EStdKeyF22, Key_F22}, + {EKeyF23, EStdKeyF23, Key_F23}, + {EKeyF24, EStdKeyF24, Key_F24}, + {EKeyOff, EStdKeyOff, Key_PowerOff}, +// {EKeyMenu, EStdKeyMenu, Key_Menu}, // Menu is EKeyApplication0 + {EKeyHelp, EStdKeyHelp, Key_Help}, + {EKeyDial, EStdKeyDial, Key_Call}, + {EKeyIncVolume, EStdKeyIncVolume, Key_VolumeUp}, + {EKeyDecVolume, EStdKeyDecVolume, Key_VolumeDown}, + {EKeyDevice0, EStdKeyDevice0, Key_Context1}, // Found by manual testing. + {EKeyDevice1, EStdKeyDevice1, Key_Context2}, // Found by manual testing. + {EKeyDevice3, EStdKeyDevice3, Key_Select}, +// {EKeyDevice7, EStdKeyDevice7, Key_Camera}, //not supported by qt yet + {EKeyApplication0, EStdKeyApplication0, Key_Menu}, // Found by manual testing. + {EKeyApplication1, EStdKeyApplication1, Key_Launch1}, // Found by manual testing. + {EKeyApplication2, EStdKeyApplication2, Key_MediaPlay}, // Found by manual testing. + {EKeyApplication3, EStdKeyApplication3, Key_MediaStop}, // Found by manual testing. + {EKeyApplication4, EStdKeyApplication4, Key_MediaNext}, // Found by manual testing. + {EKeyApplication5, EStdKeyApplication5, Key_MediaPrevious}, // Found by manual testing. + {EKeyApplication6, EStdKeyApplication6, Key_Launch6}, + {EKeyApplication7, EStdKeyApplication7, Key_Launch7}, + {EKeyApplication8, EStdKeyApplication8, Key_Launch8}, + {EKeyApplication9, EStdKeyApplication9, Key_Launch9}, + {EKeyApplicationA, EStdKeyApplicationA, Key_LaunchA}, + {EKeyApplicationB, EStdKeyApplicationB, Key_LaunchB}, + {EKeyApplicationC, EStdKeyApplicationC, Key_LaunchC}, + {EKeyApplicationD, EStdKeyApplicationD, Key_LaunchD}, + {EKeyApplicationE, EStdKeyApplicationE, Key_LaunchE}, + {EKeyApplicationF, EStdKeyApplicationF, Key_LaunchF}, +// {EKeyApplication19, EStdKeyApplication19, Key_CameraFocus}, //not supported by qt yet + {EKeyYes, EStdKeyYes, Key_Yes}, + {EKeyNo, EStdKeyNo, Key_No}, + {TKeyCode(0), TStdScanCode(0), Qt::Key(0)} +}; int QKeyMapperPrivate::mapS60KeyToQt(TUint s60key) { - QHash::const_iterator mapping; - mapping = s60ToQtKeyMap.find(s60key); - if (mapping != s60ToQtKeyMap.end()) { - return *mapping; - } else { - return Qt::Key_unknown; + int res = Qt::Key_unknown; + for (int i = 0; keyMapping[i].s60KeyCode != 0; i++) { + if (keyMapping[i].s60KeyCode == s60key) { + res = keyMapping[i].qtKey; + break; + } } + return res; +} + +int QKeyMapperPrivate::mapS60ScanCodesToQt(TUint s60scanCode) +{ + int res = Qt::Key_unknown; + for (int i = 0; keyMapping[i].s60KeyCode != 0; i++) { + if (keyMapping[i].s60ScanCode == s60scanCode) { + res = keyMapping[i].qtKey; + break; + } + } + return res; } +int QKeyMapperPrivate::mapQtToS60Key(int qtKey) +{ + int res = KErrUnknown; + for (int i = 0; keyMapping[i].s60KeyCode != 0; i++) { + if (keyMapping[i].qtKey == qtKey) { + res = keyMapping[i].s60KeyCode; + break; + } + } + return res; +} + +int QKeyMapperPrivate::mapQtToS60ScanCodes(int qtKey) +{ + int res = KErrUnknown; + for (int i = 0; keyMapping[i].s60KeyCode != 0; i++) { + if (keyMapping[i].qtKey == qtKey) { + res = keyMapping[i].s60ScanCode; + break; + } + } + return res; +} QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qkeymapper_x11.cpp --- a/src/gui/kernel/qkeymapper_x11.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qkeymapper_x11.cpp Mon May 03 13:17:34 2010 +0300 @@ -1073,8 +1073,8 @@ XF86XK_AudioNext, Qt::Key_MediaNext, XF86XK_AudioRecord, Qt::Key_MediaRecord, XF86XK_Mail, Qt::Key_LaunchMail, - XF86XK_MyComputer, Qt::Key_Launch0, - XF86XK_Calculator, Qt::Key_Calculator, + XF86XK_MyComputer, Qt::Key_Launch0, // ### Qt 5: remap properly + XF86XK_Calculator, Qt::Key_Launch1, XF86XK_Memo, Qt::Key_Memo, XF86XK_ToDoList, Qt::Key_ToDoList, XF86XK_Calendar, Qt::Key_Calendar, @@ -1172,7 +1172,7 @@ XF86XK_Bluetooth, Qt::Key_Bluetooth, XF86XK_Suspend, Qt::Key_Suspend, XF86XK_Hibernate, Qt::Key_Hibernate, - XF86XK_Launch0, Qt::Key_Launch2, + XF86XK_Launch0, Qt::Key_Launch2, // ### Qt 5: remap properly XF86XK_Launch1, Qt::Key_Launch3, XF86XK_Launch2, Qt::Key_Launch4, XF86XK_Launch3, Qt::Key_Launch5, diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qmime_win.cpp --- a/src/gui/kernel/qmime_win.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qmime_win.cpp Mon May 03 13:17:34 2010 +0300 @@ -640,14 +640,18 @@ } else if (getCf(formatetc) == CF_INETURL_W) { QList urls = mimeData->urls(); QByteArray result; - QString url = urls.at(0).toString(); - result = QByteArray((const char *)url.utf16(), url.length() * sizeof(ushort)); + if (!urls.isEmpty()) { + QString url = urls.at(0).toString(); + result = QByteArray((const char *)url.utf16(), url.length() * sizeof(ushort)); + } result.append('\0'); result.append('\0'); return setData(result, pmedium); } else if (getCf(formatetc) == CF_INETURL) { QList urls = mimeData->urls(); - QByteArray result = urls.at(0).toString().toLocal8Bit(); + QByteArray result; + if (!urls.isEmpty()) + result = urls.at(0).toString().toLocal8Bit(); return setData(result, pmedium); } } diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qsoftkeymanager.cpp --- a/src/gui/kernel/qsoftkeymanager.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qsoftkeymanager.cpp Mon May 03 13:17:34 2010 +0300 @@ -115,6 +115,8 @@ break; } action->setSoftKeyRole(softKeyRole); + action->setVisible(false); + setForceEnabledInSoftkeys(action); return action; } @@ -168,25 +170,55 @@ { Q_D(QSoftKeyManager); bool ret = false; - QList actions = source.actions(); - for (int i = 0; i < actions.count(); ++i) { - if (actions.at(i)->softKeyRole() != QAction::NoSoftKey) { - d->requestedSoftKeyActions.insert(level, actions.at(i)); + foreach(QAction *action, source.actions()) { + if (action->softKeyRole() != QAction::NoSoftKey + && (action->isVisible() || isForceEnabledInSofkeys(action))) { + d->requestedSoftKeyActions.insert(level, action); ret = true; } } return ret; } + +static bool isChildOf(const QWidget *c, const QWidget *p) +{ + while (c) { + if (c == p) + return true; + c = c->parentWidget(); + } + return false; +} + QWidget *QSoftKeyManager::softkeySource(QWidget *previousSource, bool& recursiveMerging) { Q_D(QSoftKeyManager); QWidget *source = NULL; if (!previousSource) { // Initial source is primarily focuswidget and secondarily activeWindow - source = QApplication::focusWidget(); - if (!source) - source = QApplication::activeWindow(); + QWidget *focus = QApplication::focusWidget(); + QWidget *popup = QApplication::activePopupWidget(); + if (popup) { + if (isChildOf(focus, popup)) + source = focus; + else + source = popup; + } + if (!source) { + QWidget *modal = QApplication::activeModalWidget(); + if (modal) { + if (isChildOf(focus, modal)) + source = focus; + else + source = modal; + } + } + if (!source) { + source = focus; + if (!source) + source = QApplication::activeWindow(); + } } else { // Softkey merging is based on four criterias // 1. Implicit merging is used whenever focus widget does not specify any softkeys @@ -220,6 +252,20 @@ return true; } +void QSoftKeyManager::setForceEnabledInSoftkeys(QAction *action) +{ + action->setProperty(FORCE_ENABLED_PROPERTY, QVariant(true)); +} + +bool QSoftKeyManager::isForceEnabledInSofkeys(QAction *action) +{ + bool ret = false; + QVariant property = action->property(FORCE_ENABLED_PROPERTY); + if (property.isValid() && property.toBool()) + ret = true; + return ret; +} + bool QSoftKeyManager::event(QEvent *e) { #ifndef QT_NO_ACTION diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qsoftkeymanager_p.h --- a/src/gui/kernel/qsoftkeymanager_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qsoftkeymanager_p.h Mon May 03 13:17:34 2010 +0300 @@ -63,7 +63,8 @@ class QSoftKeyManagerPrivate; -const char MENU_ACTION_PROPERTY[] = "_q_menuaction"; +const char MENU_ACTION_PROPERTY[] = "_q_menuAction"; +const char FORCE_ENABLED_PROPERTY[] = "_q_forceEnabledInSoftkeys"; class Q_AUTOTEST_EXPORT QSoftKeyManager : public QObject { @@ -88,6 +89,8 @@ static QAction *createAction(StandardSoftKey standardKey, QWidget *actionWidget); static QAction *createKeyedAction(StandardSoftKey standardKey, Qt::Key key, QWidget *actionWidget); static QString standardSoftKeyText(StandardSoftKey standardKey); + static void setForceEnabledInSoftkeys(QAction *action); + static bool isForceEnabledInSofkeys(QAction *action); protected: bool event(QEvent *e); diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qsoftkeymanager_s60.cpp --- a/src/gui/kernel/qsoftkeymanager_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qsoftkeymanager_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -60,7 +60,7 @@ const int MSK_POSITION = 3; const int RSK_POSITION = 2; -QSoftKeyManagerPrivateS60::QSoftKeyManagerPrivateS60() +QSoftKeyManagerPrivateS60::QSoftKeyManagerPrivateS60() : cbaHasImage(4) // 4 since MSK position index is 3 { cachedCbaIconSize[0] = QSize(0,0); cachedCbaIconSize[1] = QSize(0,0); @@ -73,11 +73,21 @@ // Lets not update softkeys if // 1. We don't have application panes, i.e. cba // 2. Our CBA is not active, i.e. S60 native dialog or menu with custom CBA is shown + // 2.1. Except if thre is no current CBA at all and WindowSoftkeysRespondHint is set + // Note: Cannot use IsDisplayingMenuOrDialog since CBA update can be triggered before // menu/dialog CBA is actually displayed i.e. it is being costructed. CEikButtonGroupContainer *appUiCba = S60->buttonGroupContainer(); + // CEikButtonGroupContainer::Current returns 0 if CBA is not visible at all CEikButtonGroupContainer *currentCba = CEikButtonGroupContainer::Current(); - if (QApplication::testAttribute(Qt::AA_S60DontConstructApplicationPanes) || appUiCba != currentCba) { + // Check if softkey need to be update even they are not visible + bool cbaRespondsWhenInvisible = false; + QWidget *window = QApplication::activeWindow(); + if (window && (window->windowFlags() & Qt::WindowSoftkeysRespondHint)) + cbaRespondsWhenInvisible = true; + + if (QApplication::testAttribute(Qt::AA_S60DontConstructApplicationPanes) + || (appUiCba != currentCba && !cbaRespondsWhenInvisible)) { return true; } return false; @@ -255,10 +265,14 @@ myimage->SetPicture( nBitmap, nMask ); // nBitmap and nMask ownership transfered EikSoftkeyImage::SetImage(cba, *myimage, left); // Takes myimage ownership + cbaHasImage[position] = true; ret = true; } else { // Restore softkey to text based - EikSoftkeyImage::SetLabel(cba, left); + if (cbaHasImage[position]) { + EikSoftkeyImage::SetLabel(cba, left); + cbaHasImage[position] = false; + } } } return ret; @@ -274,7 +288,8 @@ TPtrC nativeText = qt_QString2TPtrC(text); int command = S60_COMMAND_START + position; setNativeSoftkey(cba, position, command, nativeText); - cba.DimCommand(command, !action->isEnabled()); + const bool dimmed = !action->isEnabled() && !QSoftKeyManager::isForceEnabledInSofkeys(action); + cba.DimCommand(command, dimmed); realSoftKeyActions.insert(command, action); return true; } @@ -311,8 +326,12 @@ if (windowType != Qt::Dialog && windowType != Qt::Popup) { QString text(QSoftKeyManager::tr("Exit")); TPtrC nativeText = qt_QString2TPtrC(text); - EikSoftkeyImage::SetLabel(&cba, false); + if (cbaHasImage[RSK_POSITION]) { + EikSoftkeyImage::SetLabel(&cba, false); + cbaHasImage[RSK_POSITION] = false; + } setNativeSoftkey(cba, RSK_POSITION, EAknSoftkeyExit, nativeText); + cba.DimCommand(EAknSoftkeyExit, false); return true; } } diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qsoftkeymanager_s60_p.h --- a/src/gui/kernel/qsoftkeymanager_s60_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qsoftkeymanager_s60_p.h Mon May 03 13:17:34 2010 +0300 @@ -53,6 +53,7 @@ // We mean it. // +#include "qbitarray.h" #include "private/qobject_p.h" #include "private/qsoftkeymanager_common_p.h" @@ -98,6 +99,7 @@ private: QHash realSoftKeyActions; QSize cachedCbaIconSize[4]; + QBitArray cbaHasImage; }; diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qsound.cpp --- a/src/gui/kernel/qsound.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qsound.cpp Mon May 03 13:17:34 2010 +0300 @@ -147,12 +147,13 @@ supports WAVE and AU files. \row \o Mac OS X - \o NSSound is used. All formats that NSSound supports, including QuickTime formats, + \o NSSound is used. All formats that NSSound supports, including QuickTime formats, are supported by Qt for Mac OS X. \row \o Qt for Embedded Linux \o A built-in mixing sound server is used, accessing \c /dev/dsp directly. Only the WAVE format is supported. + \row \o Symbian \o CMdaAudioPlayerUtility is used. All formats that Symbian OS or devices support are supported also by Qt. diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qsound_mac.mm --- a/src/gui/kernel/qsound_mac.mm Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qsound_mac.mm Mon May 03 13:17:34 2010 +0300 @@ -174,6 +174,7 @@ NSSound * const nsSound = [[NSSound alloc] initWithContentsOfFile: nsFileName byReference:YES]; QMacSoundDelegate * const delegate = [[QMacSoundDelegate alloc] initWithQSound:qSound:this]; [nsSound setDelegate:delegate]; + [nsFileName release]; return nsSound; } diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qt_s60_p.h --- a/src/gui/kernel/qt_s60_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qt_s60_p.h Mon May 03 13:17:34 2010 +0300 @@ -212,6 +212,7 @@ #ifdef QT_SYMBIAN_SUPPORTS_ADVANCED_POINTER void translateAdvancedPointerEvent(const TAdvancedPointerEvent *event); #endif + void handleClientAreaChange(); private: static QSymbianControl *lastFocusedControl; diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qt_x11_p.h --- a/src/gui/kernel/qt_x11_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qt_x11_p.h Mon May 03 13:17:34 2010 +0300 @@ -675,6 +675,9 @@ XWacomCursor, XWacomEraser, + XTabletStylus, + XTabletEraser, + NPredefinedAtoms, _QT_SETTINGS_TIMESTAMP = NPredefinedAtoms, diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qtooltip.cpp --- a/src/gui/kernel/qtooltip.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qtooltip.cpp Mon May 03 13:17:34 2010 +0300 @@ -368,7 +368,16 @@ #ifdef Q_WS_MAC - QRect screen = QApplication::desktop()->availableGeometry(getTipScreen(pos, w)); + // When in full screen mode, there is no Dock nor Menu so we can use + // the whole screen for displaying the tooltip. However when not in + // full screen mode we need to save space for the dock, so we use + // availableGeometry instead. + extern bool qt_mac_app_fullscreen; //qapplication_mac.mm + QRect screen; + if(qt_mac_app_fullscreen) + screen = QApplication::desktop()->screenGeometry(getTipScreen(pos, w)); + else + screen = QApplication::desktop()->availableGeometry(getTipScreen(pos, w)); #else QRect screen = QApplication::desktop()->screenGeometry(getTipScreen(pos, w)); #endif diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qwidget.cpp --- a/src/gui/kernel/qwidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qwidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -118,6 +118,10 @@ #include "private/qgraphicssystem_p.h" #include "private/qgesturemanager_p.h" +#ifdef QT_KEYPAD_NAVIGATION +#include "qtabwidget.h" // Needed in inTabWidget() +#endif // QT_KEYPAD_NAVIGATION + // widget/widget data creation count //#define QWIDGET_EXTRA_DEBUG //#define ALIEN_DEBUG @@ -6119,6 +6123,8 @@ previousProxyFocus = topData->proxyWidget->widget()->focusWidget(); if (previousProxyFocus && previousProxyFocus->focusProxy()) previousProxyFocus = previousProxyFocus->focusProxy(); + if (previousProxyFocus == this && !topData->proxyWidget->d_func()->proxyIsGivingFocus) + return; } } #endif @@ -7531,6 +7537,23 @@ QWidget *widget = qobject_cast(childList.at(i)); if (!widget || widget->isWindow() || widget->testAttribute(Qt::WA_WState_Hidden)) continue; +#ifdef QT_MAC_USE_COCOA + // Before doing anything we need to make sure that we don't leave anything in a non-consistent state. + // When hiding a widget we need to make sure that no mouse_down events are active, because + // the mouse_up event will never be received by a hidden widget or one of its descendants. + // The solution is simple, before going through with this we check if there are any mouse_down events in + // progress, if so we check if it is related to this widget or not. If so, we just reset the mouse_down and + // then we continue. + // In X11 and Windows we send a mouse_release event, however we don't do that here because we were already + // ignoring that from before. I.e. Carbon did not send the mouse release event, so we will not send the + // mouse release event. There are two ways to interpret this: + // 1. If we don't send the mouse release event, the widget might get into an inconsistent state, i.e. it + // might be waiting for a release event that will never arrive. + // 2. If we send the mouse release event, then the widget might decide to trigger an action that is not + // supposed to trigger because it is not visible. + if(widget == qt_button_down) + qt_button_down = 0; +#endif // QT_MAC_USE_COCOA if (spontaneous) widget->setAttribute(Qt::WA_Mapped, false); else @@ -7925,13 +7948,16 @@ // set/reset WS_DISABLED style. if(w && w->isWindow() && w->isVisible() && w->isEnabled()) { LONG dwStyle = GetWindowLong(w->winId(), GWL_STYLE); + LONG newStyle = dwStyle; if (setStyle) - dwStyle |= WS_DISABLED; + newStyle |= WS_DISABLED; else - dwStyle &= ~WS_DISABLED; - SetWindowLong(w->winId(), GWL_STYLE, dwStyle); - // we might need to repaint in some situations (eg. menu) - w->repaint(); + newStyle &= ~WS_DISABLED; + if (newStyle != dwStyle) { + SetWindowLong(w->winId(), GWL_STYLE, newStyle); + // we might need to repaint in some situations (eg. menu) + w->repaint(); + } } } #endif @@ -11626,6 +11652,45 @@ } return targetWidget; } + +/*! + \internal + + Tells us if it there is currently a reachable widget by keypad navigation in + a certain \a orientation. + If no navigation is possible, occuring key events in that \a orientation may + be used to interact with the value in the focussed widget, even though it + currently has not the editFocus. + + \sa QWidgetPrivate::widgetInNavigationDirection(), QWidget::hasEditFocus() +*/ +bool QWidgetPrivate::canKeypadNavigate(Qt::Orientation orientation) +{ + return orientation == Qt::Horizontal? + (QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionEast) + || QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionWest)) + :(QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionNorth) + || QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionSouth)); +} +/*! + \internal + + Checks, if the \a widget is inside a QTabWidget. If is is inside + one, left/right key events will be used to switch between tabs in keypad + navigation. If there is no QTabWidget, the horizontal key events can be used +to + interact with the value in the focussed widget, even though it currently has + not the editFocus. + + \sa QWidget::hasEditFocus() +*/ +bool QWidgetPrivate::inTabWidget(QWidget *widget) +{ + for (QWidget *tabWidget = widget; tabWidget; tabWidget = tabWidget->parentWidget()) + if (qobject_cast(tabWidget)) + return true; + return false; +} #endif /*! diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qwidget_mac.mm --- a/src/gui/kernel/qwidget_mac.mm Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qwidget_mac.mm Mon May 03 13:17:34 2010 +0300 @@ -152,6 +152,7 @@ static OSWindowRef qt_root_win = 0; QWidget *mac_mouse_grabber = 0; QWidget *mac_keyboard_grabber = 0; +extern QPointer qt_button_down; //qapplication_mac.cpp #ifndef QT_MAC_USE_COCOA #ifdef QT_NAMESPACE @@ -866,7 +867,6 @@ & ~Qt::WindowMaximized)); QApplication::sendSpontaneousEvent(widget, &e); } - extern QPointer qt_button_down; //qapplication_mac.cpp qt_button_down = 0; } else if(ekind == kEventWindowCollapsed) { if (!widget->isMinimized()) { @@ -894,7 +894,6 @@ //we send a hide to be like X11/Windows QEvent e(QEvent::Hide); QApplication::sendSpontaneousEvent(widget, &e); - extern QPointer qt_button_down; //qapplication_mac.cpp qt_button_down = 0; } else if(ekind == kEventWindowToolbarSwitchMode) { macSendToolbarChangeEvent(widget); @@ -1268,6 +1267,11 @@ if (widget->isVisible() && widget->updatesEnabled()) { //process the actual paint event. if(widget->testAttribute(Qt::WA_WState_InPaintEvent)) qWarning("QWidget::repaint: Recursive repaint detected"); + if (widget->isWindow() && !widget->d_func()->isOpaque + && !widget->testAttribute(Qt::WA_MacBrushedMetal)) { + QRect qrgnRect = qrgn.boundingRect(); + CGContextClearRect(cg, CGRectMake(qrgnRect.x(), qrgnRect.y(), qrgnRect.width(), qrgnRect.height())); + } QPoint redirectionOffset(0, 0); QWidget *tl = widget->window(); @@ -1318,13 +1322,6 @@ widget->d_func()->restoreRedirected(); } - if (widget->isWindow() && !widget->d_func()->isOpaque - && !widget->testAttribute(Qt::WA_MacBrushedMetal)) { - QRect qrgnRect = qrgn.boundingRect(); - CGContextClearRect(cg, CGRectMake(qrgnRect.x(), qrgnRect.y(), qrgnRect.width(), qrgnRect.height())); - } - - if(!HIObjectIsOfClass((HIObjectRef)hiview, kObjectQWidget)) CallNextEventHandler(er, event); @@ -1521,7 +1518,6 @@ if (widget) { qt_event_request_window_change(widget); if (!HIViewIsVisible(HIViewRef(widget->winId()))) { - extern QPointer qt_button_down; //qapplication_mac.cpp if (widget == qt_button_down) qt_button_down = 0; } @@ -1530,7 +1526,6 @@ break; } case kEventClassMouse: { bool send_to_app = false; - extern QPointer qt_button_down; //qapplication_mac.cpp if(qt_button_down) send_to_app = true; if(send_to_app) { @@ -3407,7 +3402,6 @@ Q_Q(QWidget); if((q->windowType() == Qt::Desktop)) //you can't hide the desktop! return; - QMacCocoaAutoReleasePool pool; if(q->isWindow()) { OSWindowRef window = qt_mac_window_for(q); @@ -4475,8 +4469,20 @@ } } + // ### Scroll the dirty regions as well, the following is not correct. + QRegion displayRegion = r.isNull() ? dirtyOnWidget : (dirtyOnWidget & r); + const QVector &rects = dirtyOnWidget.rects(); + const QVector::const_iterator end = rects.end(); + QVector::const_iterator it = rects.begin(); + while (it != end) { + const QRect rect = *it; + const NSRect dirtyRect = NSMakeRect(rect.x() + dx, rect.y() + dy, + rect.width(), rect.height()); + [view setNeedsDisplayInRect:dirtyRect]; + ++it; + } + NSSize deltaSize = NSMakeSize(dx, dy); - [view translateRectsNeedingDisplayInRect:scrollRect by:deltaSize]; [view scrollRect:scrollRect by:deltaSize]; [view setNeedsDisplayInRect:deltaXRect]; [view setNeedsDisplayInRect:deltaYRect]; @@ -4676,8 +4682,10 @@ if (!q->testAttribute(Qt::WA_WState_Created) || !extra) return; - if (extra->hasMask && extra->maskBits.size() != q->size()) { - extra->maskBits = QImage(q->size(), QImage::Format_Mono); + if (extra->hasMask) { + if(extra->maskBits.size() != q->size()) { + extra->maskBits = QImage(q->size(), QImage::Format_Mono); + } extra->maskBits.fill(QColor(Qt::color1).rgba()); extra->maskBits.setNumColors(2); extra->maskBits.setColor(0, QColor(Qt::color0).rgba()); diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qwidget_p.h --- a/src/gui/kernel/qwidget_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qwidget_p.h Mon May 03 13:17:34 2010 +0300 @@ -233,6 +233,15 @@ uint activated : 1; // RWindowBase::Activated has been called /** + * If this bit is set, each native widget receives the signals from the + * Symbian control immediately before and immediately after draw ops are + * sent to the window server for this control: + * void beginNativePaintEvent(const QRect &paintRect); + * void endNativePaintEvent(const QRect &paintRect); + */ + uint receiveNativePaintEvents : 1; + + /** * Defines the behaviour of QSymbianControl::Draw. */ enum NativePaintMode { @@ -257,16 +266,7 @@ Default = Blit }; - NativePaintMode nativePaintMode : 2; - - /** - * If this bit is set, each native widget receives the signals from the - * Symbian control immediately before and immediately after draw ops are - * sent to the window server for this control: - * void beginNativePaintEvent(const QRect &paintRect); - * void endNativePaintEvent(const QRect &paintRect); - */ - uint receiveNativePaintEvents : 1; + NativePaintMode nativePaintMode; #endif }; @@ -472,6 +472,8 @@ #ifdef QT_KEYPAD_NAVIGATION static bool navigateToDirection(Direction direction); static QWidget *widgetInNavigationDirection(Direction direction); + static bool canKeypadNavigate(Qt::Orientation orientation); + static bool inTabWidget(QWidget *widget); #endif void setWindowIconText_sys(const QString &cap); diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qwidget_s60.cpp --- a/src/gui/kernel/qwidget_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qwidget_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -1037,15 +1037,34 @@ return widgetPos; } +static Qt::WindowStates effectiveState(Qt::WindowStates state) +{ + if (state & Qt::WindowMinimized) + return Qt::WindowMinimized; + else if (state & Qt::WindowFullScreen) + return Qt::WindowFullScreen; + else if (state & Qt::WindowMaximized) + return Qt::WindowMaximized; + return Qt::WindowNoState; +} + void QWidget::setWindowState(Qt::WindowStates newstate) { Q_D(QWidget); Qt::WindowStates oldstate = windowState(); - if (oldstate == newstate) + + const TBool isFullscreen = newstate & Qt::WindowFullScreen; + const TBool cbaRequested = windowFlags() & Qt::WindowSoftkeysVisibleHint; + const TBool cbaVisible = CEikButtonGroupContainer::Current() ? true : false; + const TBool softkeyVisibilityChange = isFullscreen && (cbaRequested != cbaVisible); + + if (oldstate == newstate && !softkeyVisibilityChange) return; if (isWindow()) { + const bool wasResized = testAttribute(Qt::WA_Resized); + const bool wasMoved = testAttribute(Qt::WA_Moved); QSymbianControl *window = static_cast(effectiveWinId()); if (window && newstate & Qt::WindowMinimized) { @@ -1058,36 +1077,58 @@ #ifdef Q_WS_S60 // Hide window decoration when switching to fullsccreen / minimized otherwise show decoration. - // The window decoration visibility has to be changed before doing actual window state - // change since in that order the availableGeometry will return directly the right size and + // The window decoration visibility has to be changed before doing actual window state + // change since in that order the availableGeometry will return directly the right size and // we will avoid unnecessarty redraws - CEikStatusPane* statusPane = S60->statusPane(); - CEikButtonGroupContainer* buttonGroup = S60->buttonGroupContainer(); - TBool visible = !(newstate & (Qt::WindowFullScreen | Qt::WindowMinimized)); + CEikStatusPane *statusPane = S60->statusPane(); + CEikButtonGroupContainer *buttonGroup = S60->buttonGroupContainer(); + TBool visible = !(newstate & (Qt::WindowFullScreen | Qt::WindowMinimized)); if (statusPane) statusPane->MakeVisible(visible); - if (buttonGroup) - buttonGroup->MakeVisible(visible); + if (buttonGroup) { + // Visibility + buttonGroup->MakeVisible(visible || (isFullscreen && cbaRequested)); + + // Responsiviness + CEikCba *cba = static_cast( buttonGroup->ButtonGroup() ); // downcast from MEikButtonGroup + TUint cbaFlags = cba->ButtonGroupFlags(); + if(windowFlags() & Qt::WindowSoftkeysRespondHint) + cbaFlags |= EAknCBAFlagRespondWhenInvisible; + else + cbaFlags &= ~EAknCBAFlagRespondWhenInvisible; + cba->SetButtonGroupFlags(cbaFlags); + } #endif // Q_WS_S60 createWinId(); Q_ASSERT(testAttribute(Qt::WA_WState_Created)); // Ensure the initial size is valid, since we store it as normalGeometry below. - if (!testAttribute(Qt::WA_Resized) && !isVisible()) + if (!wasResized && !isVisible()) adjustSize(); QTLWExtra *top = d->topData(); const QRect normalGeometry = (top->normalGeometry.width() < 0) ? geometry() : top->normalGeometry; - if (newstate & Qt::WindowFullScreen) + + const bool cbaVisibilityHint = windowFlags() & Qt::WindowSoftkeysVisibleHint; + if (newstate & Qt::WindowFullScreen && !cbaVisibilityHint) setGeometry(qApp->desktop()->screenGeometry(this)); - else if (newstate & Qt::WindowMaximized) + else if (newstate & Qt::WindowMaximized || ((newstate & Qt::WindowFullScreen) && cbaVisibilityHint)) setGeometry(qApp->desktop()->availableGeometry(this)); else setGeometry(normalGeometry); //restore normal geometry top->normalGeometry = normalGeometry; + + // FixMe QTBUG-8977 + // In some platforms, WA_Resized and WA_Moved are also not set when application window state is + // anything else than normal. In Symbian we can restore them only for normal window state since + // restoring for other modes, will make fluidlauncher to be launched in wrong size (200x100) + if (effectiveState(newstate) == Qt::WindowNoState) { + setAttribute(Qt::WA_Resized, wasResized); + setAttribute(Qt::WA_Moved, wasMoved); + } } data->window_state = newstate; @@ -1220,8 +1261,10 @@ { if (!qt_nograb() && QWidgetPrivate::mouseGrabber == this) { Q_ASSERT(testAttribute(Qt::WA_WState_Created)); - WId id = effectiveWinId(); - id->SetPointerCapture(false); + if(!window()->isModal()) { + WId id = effectiveWinId(); + id->SetPointerCapture(false); + } QWidgetPrivate::mouseGrabber = 0; #ifndef QT_NO_CURSOR QApplication::restoreOverrideCursor(); diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qwidget_win.cpp --- a/src/gui/kernel/qwidget_win.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qwidget_win.cpp Mon May 03 13:17:34 2010 +0300 @@ -2052,6 +2052,8 @@ if (!q || !q->isVisible() || !nativeGesturePanEnabled) return; + if (!QApplicationPrivate::HasTouchSupport) + return; QApplicationPrivate *qAppPriv = QApplicationPrivate::instance(); if (!qAppPriv->SetGestureConfig) return; diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qwidget_x11.cpp --- a/src/gui/kernel/qwidget_x11.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qwidget_x11.cpp Mon May 03 13:17:34 2010 +0300 @@ -369,7 +369,7 @@ // ConfigureNotify ... MapNotify ... Expose enum State { - Initial, Reparented, Mapped + Initial, Mapped } state = Initial; do { @@ -377,33 +377,15 @@ XNextEvent(X11->display, &ev); qApp->x11ProcessEvent(&ev); - if (w->windowFlags() & Qt::X11BypassWindowManagerHint) { - switch (state) { - case Initial: - case Reparented: - if (ev.type == MapNotify && ev.xany.window == winid) - state = Mapped; - break; - case Mapped: - if (ev.type == Expose && ev.xany.window == winid) - return; - break; - } - } else { - switch (state) { - case Initial: - if (ev.type == ReparentNotify && ev.xany.window == winid) - state = Reparented; - break; - case Reparented: - if (ev.type == MapNotify && ev.xany.window == winid) - state = Mapped; - break; - case Mapped: - if (ev.type == Expose && ev.xany.window == winid) - return; - break; - } + switch (state) { + case Initial: + if (ev.type == MapNotify && ev.xany.window == winid) + state = Mapped; + break; + case Mapped: + if (ev.type == Expose && ev.xany.window == winid) + return; + break; } } else { if (!XEventsQueued(X11->display, QueuedAfterFlush)) diff -r 2f34d5167611 -r fcece45ef507 src/gui/kernel/qwinnativepangesturerecognizer_win_p.h --- a/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/kernel/qwinnativepangesturerecognizer_win_p.h Mon May 03 13:17:34 2010 +0300 @@ -54,6 +54,38 @@ // #include +#include + +class IInkRectangle; +class TabletHardwareCapabilities; +class TabletPropertyMetricUnit; +DECLARE_INTERFACE_(IInkTablet, IDispatch) +{ + STDMETHOD(get_Name)(THIS_ BSTR *Name) PURE; + STDMETHOD(get_PlugAndPlayId)(THIS_ BSTR *Id) PURE; + STDMETHOD(get_MaximumInputRectangle)(THIS_ IInkRectangle **Rectangle) PURE; + STDMETHOD(get_HardwareCapabilities)(THIS_ TabletHardwareCapabilities *Capabilities) PURE; + STDMETHOD(IsPacketPropertySupported)(THIS_ BSTR packetPropertyName) PURE; + STDMETHOD(GetPropertyMetrics)(THIS_ BSTR propertyName, long *Minimum, long *Maximum, TabletPropertyMetricUnit *Units, float *Resolution) PURE; +}; +enum TabletDeviceKind +{ + TDK_Mouse = 0, + TDK_Pen = 1, + TDK_Touch = 2 +}; +DECLARE_INTERFACE_(IInkTablet2, IDispatch) +{ + STDMETHOD(get_DeviceKind)(THIS_ TabletDeviceKind *Kind) PURE; +}; +DECLARE_INTERFACE_(IInkTablets, IDispatch) +{ + STDMETHOD(get_Count)(THIS_ long *Count) PURE; + STDMETHOD(get__NewEnum)(THIS_ IUnknown **_NewEnum) PURE; + STDMETHOD(get_DefaultTablet)(THIS_ IInkTablet **DefaultTablet) PURE; + STDMETHOD(Item)(THIS_ long Index, IInkTablet **Tablet) PURE; + STDMETHOD(IsPacketPropertySupported)(THIS_ BSTR packetPropertyName, VARIANT_BOOL *Supported) PURE; +}; QT_BEGIN_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qbackingstore.cpp --- a/src/gui/painting/qbackingstore.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qbackingstore.cpp Mon May 03 13:17:34 2010 +0300 @@ -352,6 +352,10 @@ // Always flush repainted areas. dirtyOnScreen += toClean; +#ifdef Q_WS_QWS + toClean.translate(tlwOffset); +#endif + #ifdef QT_NO_PAINT_DEBUG windowSurface->beginPaint(toClean); #else @@ -766,7 +770,12 @@ if (decorationRegion.isEmpty()) return; - windowSurface->beginPaint(decorationRegion); + //### The QWS decorations do not always paint the pixels they promise to paint. + // This causes painting problems with QWSMemorySurface. Since none of the other + // window surfaces actually use the region, passing an empty region is a safe + // workaround. + + windowSurface->beginPaint(QRegion()); QPaintEngine *engine = windowSurface->paintDevice()->paintEngine(); Q_ASSERT(engine); diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qdrawhelper.cpp --- a/src/gui/painting/qdrawhelper.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qdrawhelper.cpp Mon May 03 13:17:34 2010 +0300 @@ -7174,9 +7174,9 @@ ) { int a = qGray(coverage); - sr = qt_div_255(sr * a); - sg = qt_div_255(sg * a); - sb = qt_div_255(sb * a); + sr = qt_div_255(qt_pow_rgb_invgamma[sr] * a); + sg = qt_div_255(qt_pow_rgb_invgamma[sg] * a); + sb = qt_div_255(qt_pow_rgb_invgamma[sb] * a); int ia = 255 - a; dr = qt_div_255(dr * ia); diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qdrawutil.cpp --- a/src/gui/painting/qdrawutil.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qdrawutil.cpp Mon May 03 13:17:34 2010 +0300 @@ -1361,14 +1361,21 @@ for (int i = 0; i < dataCount; ++i) { QTransform transform = oldTransform; - transform.translate(drawingData[i].point.x(), drawingData[i].point.y()); - transform.rotate(drawingData[i].rotation); + qreal xOffset = 0; + qreal yOffset = 0; + if (drawingData[i].rotation == 0) { + xOffset = drawingData[i].point.x(); + yOffset = drawingData[i].point.y(); + } else { + transform.translate(drawingData[i].point.x(), drawingData[i].point.y()); + transform.rotate(drawingData[i].rotation); + } + painter->setTransform(transform); painter->setOpacity(oldOpacity * drawingData[i].opacity); - painter->setTransform(transform); qreal w = drawingData[i].scaleX * drawingData[i].source.width(); qreal h = drawingData[i].scaleY * drawingData[i].source.height(); - painter->drawPixmap(QRectF(-0.5 * w, -0.5 * h, w, h), pixmap, drawingData[i].source); + painter->drawPixmap(QRectF(-0.5 * w + xOffset, -0.5 * h + yOffset, w, h), pixmap, drawingData[i].source); } painter->setOpacity(oldOpacity); diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qgraphicssystem_raster.cpp --- a/src/gui/painting/qgraphicssystem_raster.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qgraphicssystem_raster.cpp Mon May 03 13:17:34 2010 +0300 @@ -41,19 +41,32 @@ #include "qgraphicssystem_raster_p.h" +#ifdef Q_OS_SYMBIAN +#include "private/qpixmap_s60_p.h" +#include "private/qwindowsurface_s60_p.h" +#else #include "private/qpixmap_raster_p.h" #include "private/qwindowsurface_raster_p.h" +#endif QT_BEGIN_NAMESPACE QPixmapData *QRasterGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const { +#ifdef Q_OS_SYMBIAN + return new QS60PixmapData(type); +#else return new QRasterPixmapData(type); +#endif } QWindowSurface *QRasterGraphicsSystem::createWindowSurface(QWidget *widget) const { +#ifdef Q_OS_SYMBIAN + return new QS60WindowSurface(widget); +#else return new QRasterWindowSurface(widget); +#endif } QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qregion.cpp --- a/src/gui/painting/qregion.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qregion.cpp Mon May 03 13:17:34 2010 +0300 @@ -3134,8 +3134,8 @@ ************************************************************************/ /* $XFree86: xc/lib/X11/PolyReg.c,v 1.1.1.2.8.2 1998/10/04 15:22:49 hohndel Exp $ */ -#define LARGE_COORDINATE 1000000 -#define SMALL_COORDINATE -LARGE_COORDINATE +#define LARGE_COORDINATE INT_MAX +#define SMALL_COORDINATE INT_MIN /* * InsertEdgeInET diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qtransform.h --- a/src/gui/painting/qtransform.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qtransform.h Mon May 03 13:17:34 2010 +0300 @@ -293,7 +293,8 @@ affine._dx *= num; affine._dy *= num; m_33 *= num; - m_dirty |= TxScale; + if (m_dirty < TxScale) + m_dirty = TxScale; return *this; } inline QTransform &QTransform::operator/=(qreal div) @@ -316,7 +317,7 @@ affine._dx += num; affine._dy += num; m_33 += num; - m_dirty |= TxProject; + m_dirty = TxProject; return *this; } inline QTransform &QTransform::operator-=(qreal num) @@ -332,7 +333,7 @@ affine._dx -= num; affine._dy -= num; m_33 -= num; - m_dirty |= TxProject; + m_dirty = TxProject; return *this; } diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qwindowsurface_qws.cpp --- a/src/gui/painting/qwindowsurface_qws.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qwindowsurface_qws.cpp Mon May 03 13:17:34 2010 +0300 @@ -80,7 +80,7 @@ inline bool isWidgetOpaque(const QWidget *w) { - return w->d_func()->isOpaque; + return w->d_func()->isOpaque && !w->testAttribute(Qt::WA_TranslucentBackground); } static inline QScreen *getScreen(const QWidget *w) @@ -873,6 +873,21 @@ return true; } +// ### copied from qwindowsurface_raster.cpp -- should be cross-platform +void QWSMemorySurface::beginPaint(const QRegion &rgn) +{ + if (!isWidgetOpaque(window())) { + QPainter p(&img); + p.setCompositionMode(QPainter::CompositionMode_Source); + const QVector rects = rgn.rects(); + const QColor blank = Qt::transparent; + for (QVector::const_iterator it = rects.begin(); it != rects.end(); ++it) { + p.fillRect(*it, blank); + } + } + QWSWindowSurface::beginPaint(rgn); +} + // from qwindowsurface.cpp extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset); diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qwindowsurface_qws_p.h --- a/src/gui/painting/qwindowsurface_qws_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qwindowsurface_qws_p.h Mon May 03 13:17:34 2010 +0300 @@ -176,6 +176,8 @@ QImage image() const { return img; } QPoint painterOffset() const; + void beginPaint(const QRegion &rgn); + bool lock(int timeout = -1); void unlock(); diff -r 2f34d5167611 -r fcece45ef507 src/gui/painting/qwindowsurface_s60.cpp --- a/src/gui/painting/qwindowsurface_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/painting/qwindowsurface_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -70,13 +70,13 @@ // We create empty CFbsBitmap here -> it will be resized in setGeometry CFbsBitmap *bitmap = q_check_ptr(new CFbsBitmap); // CBase derived object needs check on new qt_symbian_throwIfError( bitmap->Create( TSize(0, 0), mode ) ); - + QS60PixmapData *data = new QS60PixmapData(QPixmapData::PixmapType); if (data) { data->fromSymbianBitmap(bitmap, true); d_ptr->device = QPixmap(data); } - + setStaticContentsSupport(true); } QS60WindowSurface::~QS60WindowSurface() @@ -89,24 +89,15 @@ if (!qt_widget_private(window())->isOpaque) { QS60PixmapData *pixmapData = static_cast(d_ptr->device.data_ptr().data()); pixmapData->beginDataAccess(); - QImage &image = pixmapData->image; - QRgb *data = reinterpret_cast(image.bits()); - const int row_stride = image.bytesPerLine() / 4; - - const QVector rects = rgn.rects(); - for (QVector::const_iterator it = rects.begin(); it != rects.end(); ++it) { - const int x_start = it->x(); - const int width = it->width(); - const int y_start = it->y(); - const int height = it->height(); + QPainter p(&pixmapData->image); + p.setCompositionMode(QPainter::CompositionMode_Source); + const QVector rects = rgn.rects(); + const QColor blank = Qt::transparent; + for (QVector::const_iterator it = rects.begin(); it != rects.end(); ++it) { + p.fillRect(*it, blank); + } - QRgb *row = data + row_stride * y_start; - for (int y = 0; y < height; ++y) { - qt_memfill(row + x_start, 0U, width); - row += row_stride; - } - } pixmapData->endDataAccess(); } } @@ -128,7 +119,7 @@ const QPoint off = offset(widget); QImage *img = &(static_cast(d_ptr->device.data_ptr().data())->image); - + QRect rect(off, widget->size()); rect &= QRect(QPoint(), img->size()); diff -r 2f34d5167611 -r fcece45ef507 src/gui/s60framework/qs60mainapplication.cpp --- a/src/gui/s60framework/qs60mainapplication.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/s60framework/qs60mainapplication.cpp Mon May 03 13:17:34 2010 +0300 @@ -41,6 +41,7 @@ // INCLUDE FILES #include +#include #include "qs60maindocument.h" #include "qs60mainapplication_p.h" #include "qs60mainapplication.h" @@ -57,17 +58,17 @@ return new QS60MainApplication; } -_LIT(KQtWrapperResourceFile, "\\resource\\apps\\s60main.rsc"); +_LIT(KQtWrapperResourceFile, "\\resource\\apps\\s60main" QT_LIBINFIX_UNICODE L".rsc"); /*! \class QS60MainApplication \since 4.6 \brief The QS60MainApplication class provides support for migration from S60. - + \warning This class is provided only to get access to S60 specific functionality in the application framework classes. It is not portable. We strongly recommend against using it in new applications. - + The QS60MainApplication provides a helper class for use in migrating from existing S60 based applications to Qt based applications. It is used in the exact same way as the \c CAknApplication class from diff -r 2f34d5167611 -r fcece45ef507 src/gui/s60framework/qs60mainappui.cpp --- a/src/gui/s60framework/qs60mainappui.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/s60framework/qs60mainappui.cpp Mon May 03 13:17:34 2010 +0300 @@ -45,7 +45,15 @@ #include #include #include -#include +#include +#if defined(QT_LIBINFIX_UNQUOTED) +// Two level macro needed for proper expansion of libinfix +# define QT_S60MAIN_RSG_2(x) +# define QT_S60MAIN_RSG(x) QT_S60MAIN_RSG_2(x) +# include QT_S60MAIN_RSG(QT_LIBINFIX_UNQUOTED) +#else +# include +#endif #include #include "qs60mainappui.h" diff -r 2f34d5167611 -r fcece45ef507 src/gui/s60framework/s60framework.pri --- a/src/gui/s60framework/s60framework.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/s60framework/s60framework.pri Mon May 03 13:17:34 2010 +0300 @@ -4,8 +4,9 @@ minimalAppResource31 = \ "SOURCEPATH s60framework" \ "START RESOURCE s60main.rss" \ + "TARGET s60main$${QT_LIBINFIX}" \ "HEADER" \ - "TARGETPATH resource\apps" \ + "TARGETPATH /resource/apps" \ "END" MMP_RULES += minimalAppResource31 @@ -17,3 +18,5 @@ s60framework/qs60mainapplication.h \ s60framework/qs60mainappui.h \ s60framework/qs60maindocument.h + +!isEmpty(QT_LIBINFIX): DEFINES += QT_LIBINFIX_UNQUOTED=$$QT_LIBINFIX \ No newline at end of file diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/qgtkstyle.cpp --- a/src/gui/styles/qgtkstyle.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/qgtkstyle.cpp Mon May 03 13:17:34 2010 +0300 @@ -3398,6 +3398,9 @@ Q_D(const QGtkStyle); QRect r = QCleanlooksStyle::subElementRect(element, option, widget); + if (!d->isThemeAvailable()) + return r; + switch (element) { case SE_ProgressBarLabel: case SE_ProgressBarContents: diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/qgtkstyle_p.cpp --- a/src/gui/styles/qgtkstyle_p.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/qgtkstyle_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -91,8 +91,8 @@ Ptr_gtk_widget_modify_color QGtkStylePrivate::gtk_widget_modify_fg = 0; Ptr_gtk_widget_modify_color QGtkStylePrivate::gtk_widget_modify_bg = 0; Ptr_gtk_arrow_new QGtkStylePrivate::gtk_arrow_new = 0; -Ptr_gtk_menu_item_new QGtkStylePrivate::gtk_menu_item_new = 0; -Ptr_gtk_check_menu_item_new QGtkStylePrivate::gtk_check_menu_item_new = 0; +Ptr_gtk_menu_item_new_with_label QGtkStylePrivate::gtk_menu_item_new_with_label = 0; +Ptr_gtk_check_menu_item_new_with_label QGtkStylePrivate::gtk_check_menu_item_new_with_label = 0; Ptr_gtk_menu_bar_new QGtkStylePrivate::gtk_menu_bar_new = 0; Ptr_gtk_menu_new QGtkStylePrivate::gtk_menu_new = 0; Ptr_gtk_button_new QGtkStylePrivate::gtk_button_new = 0; @@ -347,8 +347,8 @@ gtk_widget_modify_fg = (Ptr_gtk_widget_modify_color)libgtk.resolve("gtk_widget_modify_fg"); gtk_widget_modify_bg = (Ptr_gtk_widget_modify_color)libgtk.resolve("gtk_widget_modify_bg"); gtk_arrow_new = (Ptr_gtk_arrow_new)libgtk.resolve("gtk_arrow_new"); - gtk_menu_item_new = (Ptr_gtk_menu_item_new)libgtk.resolve("gtk_menu_item_new"); - gtk_check_menu_item_new = (Ptr_gtk_check_menu_item_new)libgtk.resolve("gtk_check_menu_item_new"); + gtk_menu_item_new_with_label = (Ptr_gtk_menu_item_new_with_label)libgtk.resolve("gtk_menu_item_new_with_label"); + gtk_check_menu_item_new_with_label = (Ptr_gtk_check_menu_item_new_with_label)libgtk.resolve("gtk_check_menu_item_new_with_label"); gtk_menu_bar_new = (Ptr_gtk_menu_bar_new)libgtk.resolve("gtk_menu_bar_new"); gtk_menu_new = (Ptr_gtk_menu_new)libgtk.resolve("gtk_menu_new"); gtk_toolbar_new = (Ptr_gtk_toolbar_new)libgtk.resolve("gtk_toolbar_new"); @@ -439,7 +439,7 @@ GtkWidget *gtkMenuBar = QGtkStylePrivate::gtk_menu_bar_new(); setupGtkWidget(gtkMenuBar); - GtkWidget *gtkMenuBarItem = QGtkStylePrivate::gtk_menu_item_new(); + GtkWidget *gtkMenuBarItem = QGtkStylePrivate::gtk_menu_item_new_with_label("X"); gtk_menu_shell_append((GtkMenuShell*)(gtkMenuBar), gtkMenuBarItem); gtk_widget_realize(gtkMenuBarItem); @@ -448,14 +448,11 @@ gtk_menu_item_set_submenu((GtkMenuItem*)(gtkMenuBarItem), gtkMenu); gtk_widget_realize(gtkMenu); - GtkWidget *gtkMenuItem = QGtkStylePrivate::gtk_menu_item_new(); - g_object_set(gtkMenuItem, "label", "X", NULL); - + GtkWidget *gtkMenuItem = QGtkStylePrivate::gtk_menu_item_new_with_label("X"); gtk_menu_shell_append((GtkMenuShell*)gtkMenu, gtkMenuItem); gtk_widget_realize(gtkMenuItem); - GtkWidget *gtkCheckMenuItem = QGtkStylePrivate::gtk_check_menu_item_new(); - g_object_set(gtkCheckMenuItem, "label", "X", NULL); + GtkWidget *gtkCheckMenuItem = QGtkStylePrivate::gtk_check_menu_item_new_with_label("X"); gtk_menu_shell_append((GtkMenuShell*)gtkMenu, gtkCheckMenuItem); gtk_widget_realize(gtkCheckMenuItem); @@ -533,7 +530,7 @@ GtkWidget *gtkButton = QGtkStylePrivate::gtk_button_new(); addWidget(gtkButton); g_signal_connect(gtkButton, "style-set", G_CALLBACK(gtkStyleSetCallback), 0); - addWidget(QGtkStylePrivate::gtk_tool_button_new(NULL, NULL)); + addWidget(QGtkStylePrivate::gtk_tool_button_new(NULL, "Qt")); addWidget(QGtkStylePrivate::gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE)); addWidget(QGtkStylePrivate::gtk_hbutton_box_new()); addWidget(QGtkStylePrivate::gtk_check_button_new()); diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/qgtkstyle_p.h --- a/src/gui/styles/qgtkstyle_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/qgtkstyle_p.h Mon May 03 13:17:34 2010 +0300 @@ -87,9 +87,9 @@ typedef void (*Ptr_gtk_widget_set_default_direction) (GtkTextDirection); typedef void (*Ptr_gtk_widget_modify_color)(GtkWidget *widget, GtkStateType state, const GdkColor *color); typedef GtkWidget* (*Ptr_gtk_arrow_new)(GtkArrowType, GtkShadowType); -typedef GtkWidget* (*Ptr_gtk_menu_item_new)(void); +typedef GtkWidget* (*Ptr_gtk_menu_item_new_with_label)(const gchar *); typedef GtkWidget* (*Ptr_gtk_separator_menu_item_new)(void); -typedef GtkWidget* (*Ptr_gtk_check_menu_item_new)(void); +typedef GtkWidget* (*Ptr_gtk_check_menu_item_new_with_label)(const gchar *); typedef GtkWidget* (*Ptr_gtk_menu_bar_new)(void); typedef GtkWidget* (*Ptr_gtk_menu_new)(void); typedef GtkWidget* (*Ptr_gtk_combo_box_entry_new)(void); @@ -306,9 +306,9 @@ static Ptr_gtk_widget_set_default_direction gtk_widget_set_default_direction; static Ptr_gtk_widget_modify_color gtk_widget_modify_fg; static Ptr_gtk_widget_modify_color gtk_widget_modify_bg; - static Ptr_gtk_menu_item_new gtk_menu_item_new; + static Ptr_gtk_menu_item_new_with_label gtk_menu_item_new_with_label; static Ptr_gtk_arrow_new gtk_arrow_new; - static Ptr_gtk_check_menu_item_new gtk_check_menu_item_new; + static Ptr_gtk_check_menu_item_new_with_label gtk_check_menu_item_new_with_label; static Ptr_gtk_menu_bar_new gtk_menu_bar_new; static Ptr_gtk_menu_new gtk_menu_new; static Ptr_gtk_expander_new gtk_expander_new; diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/qs60style.cpp --- a/src/gui/styles/qs60style.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/qs60style.cpp Mon May 03 13:17:34 2010 +0300 @@ -50,6 +50,7 @@ #include "qcalendarwidget.h" #include "qdial.h" #include "qdialog.h" +#include "qmessagebox.h" #include "qgroupbox.h" #include "qheaderview.h" #include "qlist.h" @@ -61,7 +62,6 @@ #include "qscrollarea.h" #include "qscrollbar.h" #include "qtabbar.h" -#include "qtablewidget.h" #include "qtableview.h" #include "qtextedit.h" #include "qtoolbar.h" @@ -92,10 +92,10 @@ const layoutHeader QS60StylePrivate::m_layoutHeaders[] = { // *** generated layout data *** -{240,320,1,16,"QVGA Landscape"}, -{320,240,1,16,"QVGA Portrait"}, -{360,640,1,16,"NHD Landscape"}, -{640,360,1,16,"NHD Portrait"}, +{240,320,1,17,"QVGA Landscape"}, +{320,240,1,17,"QVGA Portrait"}, +{360,640,1,17,"NHD Landscape"}, +{640,360,1,17,"NHD Portrait"}, {352,800,1,12,"E90 Landscape"} // *** End of generated data *** }; @@ -104,11 +104,11 @@ const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = { // *** generated pixel metrics *** -{5,0,-909,0,0,2,0,0,-1,7,12,19,13,13,6,200,-909,-909,-909,20,13,2,0,0,21,7,18,-909,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1}, -{5,0,-909,0,0,1,0,0,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,-909,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1}, -{7,0,-909,0,0,2,0,0,-1,25,69,28,19,19,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,-909,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,13,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1}, -{7,0,-909,0,0,2,0,0,-1,25,68,28,19,19,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,-909,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,12,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1}, -{7,0,-909,0,0,2,0,0,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,-909,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1} +{5,0,-909,0,0,2,0,0,-1,7,12,19,13,13,6,200,-909,-909,-909,20,13,2,0,0,21,7,18,0,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1, 106}, +{5,0,-909,0,0,1,0,0,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,0,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1, 106}, +{7,0,-909,0,0,2,0,0,-1,25,69,28,19,19,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,0,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,13,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1, 135}, +{7,0,-909,0,0,2,0,0,-1,25,68,28,19,19,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,0,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,12,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1, 135}, +{7,0,-909,0,0,2,0,0,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,0,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1, 106} // *** End of generated data *** }; @@ -127,7 +127,7 @@ {SE_ButtonPressed, QS60StyleEnums::SP_QsnFrButtonTbCenterPressed}, {SE_FrameLineEdit, QS60StyleEnums::SP_QsnFrInputCenter}, {SE_ListHighlight, QS60StyleEnums::SP_QsnFrListCenter}, - {SE_OptionsMenu, QS60StyleEnums::SP_QsnFrPopupCenter}, + {SE_PopupBackground, QS60StyleEnums::SP_QsnFrPopupCenter}, {SE_SettingsList, QS60StyleEnums::SP_QsnFrSetOptCenter}, {SE_TableItem, QS60StyleEnums::SP_QsnFrCaleCenter}, {SE_TableHeaderItem, QS60StyleEnums::SP_QsnFrCaleHeadingCenter}, @@ -250,8 +250,8 @@ case SE_ListHighlight: drawFrame(SF_ListHighlight, painter, rect, flags | SF_PointNorth); break; - case SE_OptionsMenu: - drawFrame(SF_OptionsMenu, painter, rect, flags | SF_PointNorth); + case SE_PopupBackground: + drawFrame(SF_PopupBackground, painter, rect, flags | SF_PointNorth); break; case SE_SettingsList: drawFrame(SF_SettingsList, painter, rect, flags | SF_PointNorth); @@ -307,6 +307,13 @@ short QS60StylePrivate::pixelMetric(int metric) { + //If it is a custom value, need to strip away the base to map to internal + //pixel metric value table + if (metric & QStyle::PM_CustomBase) { + metric -= QStyle::PM_CustomBase; + metric += MAX_NON_CUSTOM_PIXELMETRICS - 1; + } + Q_ASSERT(metric < MAX_PIXELMETRICS); const short returnValue = m_pmPointer[metric]; return returnValue; @@ -407,8 +414,8 @@ { const bool cachedColorExists = m_colorCache.contains(frame); if (!cachedColorExists) { - const int frameCornerWidth = pixelMetric(PM_Custom_FrameCornerWidth); - const int frameCornerHeight = pixelMetric(PM_Custom_FrameCornerHeight); + const int frameCornerWidth = pixelMetric(PM_FrameCornerWidth); + const int frameCornerHeight = pixelMetric(PM_FrameCornerHeight); Q_ASSERT(2 * frameCornerWidth < 32); Q_ASSERT(2 * frameCornerHeight < 32); @@ -630,6 +637,8 @@ fontCategory = QS60StyleEnums::FC_Secondary; } else if (qobject_cast(widget)){ fontCategory = QS60StyleEnums::FC_Title; + } else if (qobject_cast(widget)){ + fontCategory = QS60StyleEnums::FC_Primary; } if (fontCategory != QS60StyleEnums::FC_Undefined) { const bool resolveFontSize = widget->testAttribute(Qt::WA_SetFont) @@ -759,13 +768,29 @@ QApplication::setPalette(widgetPalette, "QMenuBar"); widgetPalette = *palette; + widgetPalette.setColor(QPalette::Text, + s60Color(QS60StyleEnums::CL_QsnTextColors, 22, 0)); + widgetPalette.setColor(QPalette::HighlightedText, + s60Color(QS60StyleEnums::CL_QsnTextColors, 11, 0)); + QApplication::setPalette(widgetPalette, "QMenu"); + widgetPalette = *palette; + widgetPalette.setColor(QPalette::WindowText, s60Color(QS60StyleEnums::CL_QsnTextColors, 4, 0)); + widgetPalette.setColor(QPalette::HighlightedText, + s60Color(QS60StyleEnums::CL_QsnTextColors, 3, 0)); QApplication::setPalette(widgetPalette, "QTabBar"); widgetPalette = *palette; + widgetPalette.setColor(QPalette::HighlightedText, + s60Color(QS60StyleEnums::CL_QsnTextColors, 10, 0)); + QApplication::setPalette(widgetPalette, "QListView"); + widgetPalette = *palette; + widgetPalette.setColor(QPalette::Text, s60Color(QS60StyleEnums::CL_QsnTextColors, 22, 0)); + widgetPalette.setColor(QPalette::HighlightedText, + s60Color(QS60StyleEnums::CL_QsnTextColors, 11, 0)); QApplication::setPalette(widgetPalette, "QTableView"); widgetPalette = *palette; @@ -789,6 +814,8 @@ widgetPalette = *palette; widgetPalette.setColor(QPalette::WindowText, s60Color(QS60StyleEnums::CL_QsnTextColors, 7, 0)); + widgetPalette.setColor(QPalette::HighlightedText, + s60Color(QS60StyleEnums::CL_QsnTextColors, 11, 0)); QApplication::setPalette(widgetPalette, "QRadioButton"); QApplication::setPalette(widgetPalette, "QCheckBox"); widgetPalette = *palette; @@ -850,7 +877,7 @@ case QS60StyleEnums::SP_QgnGrafBarFrameSideL: case QS60StyleEnums::SP_QgnGrafBarFrameSideR: - result.setWidth(pixelMetric(PM_Custom_FrameCornerWidth)); + result.setWidth(pixelMetric(PM_FrameCornerWidth)); break; case QS60StyleEnums::SP_QsnCpScrollHandleTopPressed: @@ -877,15 +904,15 @@ case 7: /* CornerTr */ case 6: /* CornerBl */ case 5: /* CornerBr */ - result.setWidth(pixelMetric(PM_Custom_FrameCornerWidth)); + result.setWidth(pixelMetric(PM_FrameCornerWidth)); // Falltrough intended... case 4: /* SideT */ case 3: /* SideB */ - result.setHeight(pixelMetric(PM_Custom_FrameCornerHeight)); + result.setHeight(pixelMetric(PM_FrameCornerHeight)); break; case 2: /* SideL */ case 1: /* SideR */ - result.setWidth(pixelMetric(PM_Custom_FrameCornerWidth)); + result.setWidth(pixelMetric(PM_FrameCornerWidth)); break; case 0: /* center */ default: @@ -984,7 +1011,6 @@ QS60StylePrivate::SE_SliderGrooveVertical; QS60StylePrivate::drawSkinElement(grooveElement, painter, sliderGroove, flags); } else { - const QRect sliderGroove = subControlRect(control, optionSlider, SC_SliderGroove, widget); const QPoint sliderGrooveCenter = sliderGroove.center(); const bool horizontal = optionSlider->orientation == Qt::Horizontal; painter->save(); @@ -1111,7 +1137,7 @@ drawPrimitive(pe, &toolButton, painter, widget); } - if (toolBtn->text.length()>0 || + if (toolBtn->text.length() > 0 || !toolBtn->icon.isNull()) { const int frameWidth = pixelMetric(PM_DefaultFrameWidth, option, widget); toolButton.rect = button.adjusted(frameWidth, frameWidth, -frameWidth, -frameWidth); @@ -1241,6 +1267,8 @@ case CE_RadioButton: if (const QStyleOptionButton *btn = qstyleoption_cast(option)) { bool isRadio = (element == CE_RadioButton); + QStyleOptionButton subopt = *btn; + // Highlight needs to be drawn first, as it goes "underneath" the text and indicator. if (btn->state & State_HasFocus) { QStyleOptionFocusRect fropt; @@ -1248,8 +1276,10 @@ fropt.rect = subElementRect(isRadio ? SE_RadioButtonFocusRect : SE_CheckBoxFocusRect, btn, widget); drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget); + + subopt.palette.setColor(QPalette::Active, QPalette::WindowText, + subopt.palette.highlightedText().color()); } - QStyleOptionButton subopt = *btn; subopt.rect = subElementRect(isRadio ? SE_RadioButtonIndicator : SE_CheckBoxIndicator, btn, widget); @@ -1349,7 +1379,7 @@ } if (!comboBox->currentText.isEmpty() && !comboBox->editable) { QCommonStyle::drawItemText(painter, - editRect.adjusted(QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth), 0, -1, 0), + editRect.adjusted(QS60StylePrivate::pixelMetric(PM_FrameCornerWidth), 0, -1, 0), visualAlignment(comboBox->direction, Qt::AlignLeft | Qt::AlignVCenter), comboBox->palette, comboBox->state & State_Enabled, comboBox->currentText); } @@ -1408,7 +1438,7 @@ } else { QCommonStyle::drawPrimitive(PE_PanelItemViewItem, &voptAdj, painter, widget);} // draw the focus rect - if (isSelected | hasFocus) { + if (isSelected || hasFocus ) { QRect highlightRect = option->rect.adjusted(1,1,-1,-1); QAbstractItemView::SelectionBehavior selectionBehavior = itemView ? itemView->selectionBehavior() : QAbstractItemView::SelectItems; @@ -1480,15 +1510,10 @@ // draw the text if (!voptAdj.text.isEmpty()) { - if (isSelected) { - if (qobject_cast(widget)) - voptAdj.palette.setColor( - QPalette::Text, QS60StylePrivate::s60Color(QS60StyleEnums::CL_QsnTextColors, 11, 0)); - else - voptAdj.palette.setColor( - QPalette::Text, QS60StylePrivate::s60Color(QS60StyleEnums::CL_QsnTextColors, 10, 0)); - } - painter->setPen(voptAdj.palette.text().color()); + if (isSelected || hasFocus ) + painter->setPen(voptAdj.palette.highlightedText().color()); + else + painter->setPen(voptAdj.palette.text().color()); d->viewItemDrawText(painter, &voptAdj, textRect); } painter->restore(); @@ -1590,7 +1615,7 @@ const bool selected = optionTab.state & State_Selected; if (selected) optionTab.palette.setColor(QPalette::Active, QPalette::WindowText, - QS60StylePrivate::s60Color(QS60StyleEnums::CL_QsnTextColors, 3, option)); + optionTab.palette.highlightedText().color()); const bool verticalTabs = optionTab.shape == QTabBar::RoundedEast || optionTab.shape == QTabBar::RoundedWest @@ -1723,7 +1748,8 @@ if (!styleHint(SH_UnderlineShortcut, menuItem, widget)) text_flags |= Qt::TextHideMnemonic; - if ((option->state & State_Selected) && (option->state & State_Enabled)) + const bool selected = (option->state & State_Selected) && (option->state & State_Enabled); + if (selected) QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ListHighlight, painter, option->rect, flags); QRect iconRect = subElementRect(SE_ItemViewItemDecoration, &optionMenuItem, widget); @@ -1793,6 +1819,10 @@ painter->save(); painter->setOpacity(0.5); } + if (selected) + optionMenuItem.palette.setColor( + QPalette::Active, QPalette::Text, optionMenuItem.palette.highlightedText().color()); + QCommonStyle::drawItemText(painter, textRect, text_flags, optionMenuItem.palette, enabled, optionMenuItem.text, QPalette::Text); @@ -1814,8 +1844,8 @@ painter->save(); QPen linePen = QPen(QS60StylePrivate::s60Color(QS60StyleEnums::CL_QsnLineColors, 1, header)); const int penWidth = (header->orientation == Qt::Horizontal) ? - linePen.width() + QS60StylePrivate::pixelMetric(PM_Custom_BoldLineWidth) - : linePen.width() + QS60StylePrivate::pixelMetric(PM_Custom_ThinLineWidth); + linePen.width() + QS60StylePrivate::pixelMetric(PM_BoldLineWidth) + : linePen.width() + QS60StylePrivate::pixelMetric(PM_ThinLineWidth); linePen.setWidth(penWidth); painter->setPen(linePen); if (header->orientation == Qt::Horizontal){ @@ -1834,7 +1864,7 @@ //Make cornerButton slightly smaller so that it is not on top of table border graphic. QStyleOptionHeader subopt = *header; const int borderTweak = - QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth) >> 1; + QS60StylePrivate::pixelMetric(PM_FrameCornerWidth) >> 1; if (subopt.direction == Qt::LeftToRight) subopt.rect.adjust(borderTweak, borderTweak, 0, -borderTweak); else @@ -1942,40 +1972,37 @@ case CE_MenuScroller: break; case CE_FocusFrame: { - // The pen width should nearly fill the layoutspacings around the widget - const int penWidth = - qMin(pixelMetric(QS60Style::PM_LayoutVerticalSpacing), pixelMetric(QS60Style::PM_LayoutHorizontalSpacing)) - - 2; // But keep 1 pixel distance to the focus widget and 1 pixel to the adjacent widgets - #ifdef QT_KEYPAD_NAVIGATION bool editFocus = false; if (const QFocusFrame *focusFrame = qobject_cast(widget)) { if (focusFrame->widget() && focusFrame->widget()->hasEditFocus()) editFocus = true; } - const qreal opacity = editFocus ? 0.65 : 0.45; // Trial and error factors. Feel free to improve. + const qreal opacity = editFocus ? 1 : 0.75; // Trial and error factors. Feel free to improve. #else - const qreal opacity = 0.5; + const qreal opacity = 0.85; #endif - // Because of Qts coordinate system, we need to tweak the rect by .5 pixels, otherwise it gets blurred. - const qreal rectAdjustment = (penWidth % 2) ? -.5 : 0; - - // Make sure that the pen stroke is inside the rect - const QRectF adjustedRect = - QRectF(option->rect).adjusted( - rectAdjustment + penWidth, - rectAdjustment + penWidth, - -rectAdjustment - penWidth, - -rectAdjustment - penWidth - ); - - const qreal roundRectRadius = penWidth * goldenRatio; + // We need to reduce the focus frame size if LayoutSpacing is smaller than FocusFrameMargin + // Otherwise, we would overlay adjacent widgets. + const int frameHeightReduction = + qMin(0, pixelMetric(QStyle::PM_LayoutVerticalSpacing) + - pixelMetric(QStyle::PM_FocusFrameVMargin)); + const int frameWidthReduction = + qMin(0, pixelMetric(QStyle::PM_LayoutHorizontalSpacing) + - pixelMetric(QStyle::PM_FocusFrameHMargin)); + const int rounding = + qMin(pixelMetric(QStyle::PM_FocusFrameVMargin), + pixelMetric(QStyle::PM_LayoutVerticalSpacing)); + const QRect frameRect = + option->rect.adjusted(-frameWidthReduction, -frameHeightReduction, + frameWidthReduction, frameHeightReduction); + QPainterPath framePath; + framePath.addRoundedRect(frameRect, rounding, rounding); painter->save(); painter->setRenderHint(QPainter::Antialiasing); painter->setOpacity(opacity); - painter->setPen(QPen(option->palette.color(QPalette::Text), penWidth)); - painter->drawRoundedRect(adjustedRect, roundRectRadius, roundRectRadius); + painter->fillPath(framePath, option->palette.color(QPalette::Text)); painter->restore(); } break; @@ -2047,18 +2074,18 @@ break; case PE_IndicatorViewItemCheck: #ifndef QT_NO_ITEMVIEWS - if (const QListView *listItem = (qobject_cast(widget))) { + if (const QAbstractItemView *itemView = (qobject_cast(widget))) { if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast(option)) { const bool checkBoxVisible = vopt->features & QStyleOptionViewItemV2::HasCheckIndicator; - const bool singleSelection = listItem->selectionMode() == - QAbstractItemView::SingleSelection || listItem->selectionMode() == QAbstractItemView::NoSelection; + const bool singleSelection = itemView->selectionMode() == + QAbstractItemView::SingleSelection || itemView->selectionMode() == QAbstractItemView::NoSelection; // draw either checkbox at the beginning if (checkBoxVisible && singleSelection) { drawPrimitive(PE_IndicatorCheckBox, option, painter, widget); // ... or normal "tick" selection at the end. } else if (option->state & State_Selected) { QRect tickRect = option->rect; - const int frameBorderWidth = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth); + const int frameBorderWidth = QS60StylePrivate::pixelMetric(PM_FrameCornerWidth); // adjust tickmark rect to exclude frame border tickRect.adjust(0, -frameBorderWidth, 0, -frameBorderWidth); QS60StyleEnums::SkinParts skinPart = QS60StyleEnums::SP_QgnIndiMarkedAdd; @@ -2139,7 +2166,7 @@ const QS60StyleEnums::SkinParts part = (element == PE_IndicatorSpinUp) ? QS60StyleEnums::SP_QgnGrafScrollArrowUp : QS60StyleEnums::SP_QgnGrafScrollArrowDown; - const int iconMargin = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth) >> 1; + const int iconMargin = QS60StylePrivate::pixelMetric(PM_FrameCornerWidth) >> 1; optionSpinBox.rect.translate(0, (element == PE_IndicatorSpinDown) ? iconMargin : -iconMargin ); QS60StylePrivate::drawSkinPart(part, painter, optionSpinBox.rect, flags); } else { @@ -2153,7 +2180,7 @@ // We want to draw down arrow here for comboboxes as well. QStyleOptionFrame optionsComboBox = *cmb; const QS60StyleEnums::SkinParts part = QS60StyleEnums::SP_QgnGrafScrollArrowDown; - const int iconMargin = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth) >> 1; + const int iconMargin = QS60StylePrivate::pixelMetric(PM_FrameCornerWidth) >> 1; optionsComboBox.rect.translate(0, (element == PE_IndicatorSpinDown) ? iconMargin : -iconMargin ); QS60StylePrivate::drawSkinPart(part, painter, optionsComboBox.rect, flags); } else { @@ -2191,7 +2218,7 @@ if (QS60StylePrivate::canDrawThemeBackground(option->palette.base(), widget) && option->palette.window().texture().cacheKey() == QS60StylePrivate::m_themePalette->window().texture().cacheKey()) - QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_OptionsMenu, painter, option->rect, flags); + QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_PopupBackground, painter, option->rect, flags); else commonStyleDraws = true; } @@ -2287,7 +2314,7 @@ (option->state & State_Open) ? QS60StyleEnums::SP_QgnIndiHlColSuper : QS60StyleEnums::SP_QgnIndiHlExpSuper; int minDimension = qMin(option->rect.width(), option->rect.height()); QRect iconRect(option->rect.topLeft(), QSize(minDimension, minDimension)); - const int magicTweak = 3; + const int magicTweak = 3; int resizeValue = minDimension >> 1; if (!QS60StylePrivate::isTouchSupported()) { minDimension += resizeValue; // Adjust the icon bigger because of empty space in svg icon. @@ -2362,13 +2389,6 @@ if (metricValue == KNotFound) metricValue = QCommonStyle::pixelMetric(metric, option, widget); - if (metric == PM_SubMenuOverlap && widget) { - const QMenu *menu = qobject_cast(widget); - if (menu && menu->activeAction() && menu->activeAction()->menu()) { - const int menuWidth = menu->activeAction()->menu()->sizeHint().width(); - metricValue = -menuWidth; - } - } //if layout direction is mirrored, switch left and right border margins if (option && option->direction == Qt::RightToLeft) { if (metric == PM_LayoutLeftMargin) @@ -2376,6 +2396,12 @@ else if (metric == PM_LayoutRightMargin) metricValue = QS60StylePrivate::pixelMetric(PM_LayoutLeftMargin); } + + if (widget && (metric == PM_LayoutTopMargin)) + if (widget->windowType() == Qt::Dialog) + //double the top layout margin for dialogs, it is very close to real value + //without having to define custom pixel metric + metricValue *= 2; return metricValue; } @@ -2432,9 +2458,9 @@ #ifndef QT_NO_COMBOBOX case CT_ComboBox: { // Fixing Ui design issues with too wide QComboBoxes and greedy SizeHints - // Make sure, that the combobox says within the screen. + // Make sure, that the combobox stays within the screen. const QSize desktopContentSize = QApplication::desktop()->availableGeometry().size() - -QSize(pixelMetric(PM_LayoutLeftMargin) + pixelMetric(PM_LayoutRightMargin), 0); + - QSize(pixelMetric(PM_LayoutLeftMargin) + pixelMetric(PM_LayoutRightMargin), 0); sz = QCommonStyle::sizeFromContents(ct, opt, csz, widget). boundedTo(desktopContentSize); } @@ -2453,6 +2479,15 @@ { int retValue = -1; switch (sh) { + case SH_RequestSoftwareInputPanel: + if (QS60StylePrivate::isSingleClickUi()) + retValue = RSIP_OnMouseClick; + else + retValue = RSIP_OnMouseClickAndAlreadyFocused; + break; + case SH_ComboBox_Popup: + retValue = true; + break; case SH_Table_GridLineColor: retValue = int(QS60StylePrivate::s60Color(QS60StyleEnums::CL_QsnLineColors, 2, 0).rgba()); break; @@ -2506,9 +2541,6 @@ case SH_UnderlineShortcut: retValue = 0; break; - case SH_RequestSoftwareInputPanel: - retValue = RSIP_OnMouseClickAndAlreadyFocused; - break; case SH_FormLayoutWrapPolicy: retValue = QFormLayout::WrapLongRows; break; @@ -2594,14 +2626,22 @@ const int frameThickness = spinbox->frame ? pixelMetric(PM_SpinBoxFrameWidth, spinbox, widget) : 0; const int buttonMargin = spinbox->frame ? 2 : 0; const int buttonContentWidth = QS60StylePrivate::pixelMetric(PM_ButtonIconSize) + 2 * buttonMargin; + // Spinbox buttons should be no larger than one fourth of total width. + // Thus, side-by-side buttons would take half of the total width. + const int maxSize = qMax(spinbox->rect.width() / 4, buttonContentWidth); QSize buttonSize; - buttonSize.setHeight(qMax(8, spinbox->rect.height() - frameThickness)); + buttonSize.setHeight(qMin(maxSize, qMax(8, spinbox->rect.height() - frameThickness))); //width should at least be equal to height buttonSize.setWidth(qMax(buttonSize.height(), buttonContentWidth)); buttonSize = buttonSize.expandedTo(QApplication::globalStrut()); - const int y = frameThickness + spinbox->rect.y(); - const int x = spinbox->rect.x() + spinbox->rect.width() - frameThickness - 2 * buttonSize.width(); + // Normally spinbuttons should be side-by-side, but if spinbox grows very big + // and spinbuttons reach their maximum size, they can be deployed one top of the other. + const bool sideBySide = (buttonSize.height() * 2 < spinbox->rect.height()) ? false : true; + const int y = frameThickness + spinbox->rect.y() + + (spinbox->rect.height() - (sideBySide ? 1 : 2) * buttonSize.height()) / 2; + const int x = spinbox->rect.x() + + spinbox->rect.width() - frameThickness - (sideBySide ? 2 : 1) * buttonSize.width(); switch (scontrol) { case SC_SpinBoxUp: @@ -2612,7 +2652,9 @@ case SC_SpinBoxDown: if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons) return QRect(); - ret = QRect(x + buttonSize.width(), y, buttonSize.width(), buttonSize.height()); + ret = QRect(x + (sideBySide ? buttonSize.width() : 0), + y + (sideBySide ? 0 : buttonSize.height()), + buttonSize.width(), buttonSize.height()); break; case SC_SpinBoxEditField: if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons) @@ -2668,6 +2710,19 @@ height - 2 * frameThickness); } break; + case SC_ComboBoxListBoxPopup: { + const QRect desktopContent = QApplication::desktop()->availableGeometry(); + + // take the size of this and position bottom above available area + QRect popupRect; + const int width = desktopContent.width() - pixelMetric(PM_LayoutRightMargin) - pixelMetric(PM_LayoutLeftMargin); + popupRect.setWidth(width); + popupRect.setHeight(desktopContent.height()); //combobox resets height anyway based on content + popupRect.setBottom(desktopContent.bottom()); + popupRect.translate(pixelMetric(PM_LayoutLeftMargin), 0); + ret = popupRect; + } + break; default: break; } @@ -2742,11 +2797,10 @@ break; case SE_LineEditContents: { // in S60 the input text box doesn't start from line Edit's TL, but - // a bit indented. - QRect lineEditRect = opt->rect; - const int adjustment = opt->rect.height() >> 2; - lineEditRect.adjust(adjustment, 0, 0, 0); - ret = lineEditRect; + // a bit indented (8 pixels). + const int KLineEditDefaultIndention = 8; + ret = visualRect( + opt->direction, opt->rect, opt->rect.adjusted(KLineEditDefaultIndention, 0, 0, 0)); } break; case SE_TabBarTearIndicator: @@ -2822,9 +2876,13 @@ ret = menuItem->rect; if (element == SE_ItemViewItemDecoration) { - if (menuItem->direction == Qt::RightToLeft) - ret.translate(ret.width()-indicatorWidth, 0); - ret.setWidth(indicatorWidth); + if (menuItem->icon.isNull()) { + ret = QRect(); + } else { + if (menuItem->direction == Qt::RightToLeft) + ret.translate(ret.width()-indicatorWidth, 0); + ret.setWidth(indicatorWidth); + } } else { ret = menuItem->rect; if (!menuItem->icon.isNull()) @@ -2884,9 +2942,9 @@ if (qstyleoption_cast(opt)) { // Subtract area needed for line if (opt->state & State_Horizontal) - ret.setHeight(ret.height() - QS60StylePrivate::pixelMetric(PM_Custom_BoldLineWidth)); + ret.setHeight(ret.height() - QS60StylePrivate::pixelMetric(PM_BoldLineWidth)); else - ret.setWidth(ret.width() - QS60StylePrivate::pixelMetric(PM_Custom_ThinLineWidth)); + ret.setWidth(ret.width() - QS60StylePrivate::pixelMetric(PM_ThinLineWidth)); } ret = visualRect(opt->direction, opt->rect, ret); break; @@ -3197,7 +3255,7 @@ /*! \internal - Handle the timer \a event. + Handle the timer \a event. */ void QS60Style::timerEvent(QTimerEvent *event) { diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/qs60style.h --- a/src/gui/styles/qs60style.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/qs60style.h Mon May 03 13:17:34 2010 +0300 @@ -52,6 +52,16 @@ #if !defined(QT_NO_STYLE_S60) +//Public custom pixel metrics values. +//These can be used to fetch custom pixel metric value from outside QS60Style. +enum { + PM_FrameCornerWidth = QStyle::PM_CustomBase + 1, + PM_FrameCornerHeight, + PM_BoldLineWidth, + PM_ThinLineWidth, + PM_MessageBoxHeight + }; + class QS60StylePrivate; class Q_GUI_EXPORT QS60Style : public QCommonStyle diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/qs60style_p.h --- a/src/gui/styles/qs60style_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/qs60style_p.h Mon May 03 13:17:34 2010 +0300 @@ -60,13 +60,8 @@ QT_BEGIN_NAMESPACE const int MAX_NON_CUSTOM_PIXELMETRICS = 92; -const int CUSTOMVALUESCOUNT = 4; -enum { - PM_Custom_FrameCornerWidth = MAX_NON_CUSTOM_PIXELMETRICS, - PM_Custom_FrameCornerHeight, - PM_Custom_BoldLineWidth, - PM_Custom_ThinLineWidth - }; +const int CUSTOMVALUESCOUNT = 5; + const int MAX_PIXELMETRICS = MAX_NON_CUSTOM_PIXELMETRICS + CUSTOMVALUESCOUNT; typedef struct { @@ -416,7 +411,7 @@ SE_TabBarTabWestActive, SE_TabBarTabWestInactive, SE_ListHighlight, - SE_OptionsMenu, + SE_PopupBackground, SE_SettingsList, SE_TableItem, SE_TableHeaderItem, @@ -425,7 +420,7 @@ SE_ToolBarButton, SE_ToolBarButtonPressed, SE_PanelBackground, - SE_ScrollBarHandlePressedHorizontal, //only for 5.0+ + SE_ScrollBarHandlePressedHorizontal, SE_ScrollBarHandlePressedVertical, SE_ButtonInactive, SE_Editor, @@ -437,7 +432,7 @@ SF_ButtonPressed, SF_FrameLineEdit, SF_ListHighlight, - SF_OptionsMenu, + SF_PopupBackground, SF_SettingsList, SF_TableItem, SF_TableHeaderItem, diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/qs60style_s60.cpp --- a/src/gui/styles/qs60style_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/qs60style_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -755,7 +755,7 @@ if (drawn) result = fromFbsBitmap(background, NULL, flags, targetSize); - // if drawing fails in skin server, just ignore the background (probably OOM occured) + // if drawing fails in skin server, just ignore the background (probably OOM case) CleanupStack::PopAndDestroy(4, background); //background, dev, gc, bgContext // QS60WindowSurface::lockBitmapHeap(); @@ -787,7 +787,7 @@ const int currentFrame = QS60StylePrivate::currentAnimationFrame(part); if (constructedFromTheme && aknAnimation && aknAnimation->BitmapAnimData()->FrameArray().Count() > 0) { - //Animation was created succesfully and contains frames, just fetch current frame + //Animation was created successfully and contains frames, just fetch current frame if(currentFrame >= aknAnimation->BitmapAnimData()->FrameArray().Count()) User::Leave(KErrOverflow); const CBitmapFrameData* frameData = aknAnimation->BitmapAnimData()->FrameArray().At(currentFrame); @@ -859,11 +859,9 @@ User::LeaveIfError(bitmapDev->CreateContext(bitmapGc)); CleanupStack::PushL(bitmapGc); -#ifndef Q_SYMBIAN_HAS_EXTENDED_BITMAP_TYPE frame->LockHeap(); memset(frame->DataAddress(), 0, frame->SizeInPixels().iWidth * frame->SizeInPixels().iHeight * 4); // 4: argb bytes frame->UnlockHeap(); -#endif const TRect outerRect(TPoint(0, 0), targetSize); const TRect innerRect = innerRectFromElement(frameElement, outerRect); @@ -978,21 +976,25 @@ TRect QS60StyleModeSpecifics::innerRectFromElement(QS60StylePrivate::SkinFrameElements frameElement, const TRect &outerRect) { - TInt widthShrink = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth); - TInt heightShrink = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerHeight); + TInt widthShrink = QS60StylePrivate::pixelMetric(PM_FrameCornerWidth); + TInt heightShrink = QS60StylePrivate::pixelMetric(PM_FrameCornerHeight); switch(frameElement) { case QS60StylePrivate::SF_PanelBackground: // panel should have slightly slimmer border to enable thin line of background graphics between closest component - widthShrink = widthShrink-2; - heightShrink = heightShrink-2; + widthShrink = widthShrink - 2; + heightShrink = heightShrink - 2; break; case QS60StylePrivate::SF_ToolTip: - widthShrink = widthShrink>>1; - heightShrink = heightShrink>>1; + widthShrink = widthShrink >> 1; + heightShrink = heightShrink >> 1; break; case QS60StylePrivate::SF_ListHighlight: - widthShrink = widthShrink-2; - heightShrink = heightShrink-2; + widthShrink = widthShrink - 2; + heightShrink = heightShrink - 2; + break; + case QS60StylePrivate::SF_PopupBackground: + widthShrink = widthShrink + 5; + heightShrink = heightShrink + 5; break; default: break; @@ -1096,7 +1098,7 @@ activeLayoutIndex += (!landscape) ? 1 : 0; } - m_pmPointer = data[activeLayoutIndex]; + setCurrentLayout(activeLayoutIndex); } Q_GLOBAL_STATIC(QList, m_animations) @@ -1121,7 +1123,7 @@ &KAknsIIDQsnParentColors, &KAknsIIDQsnTextColors }; - Q_ASSERT((int)list <= (int)sizeof(idMap)/sizeof(idMap[0])); + Q_ASSERT((int)list < (int)sizeof(idMap)/sizeof(idMap[0])); const QColor color = QS60StyleModeSpecifics::colorValue(*idMap[(int) list], index - 1); return option ? QS60StylePrivate::stateColor(color, option) : color; } diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/qwindowsmobilestyle.cpp --- a/src/gui/styles/qwindowsmobilestyle.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/qwindowsmobilestyle.cpp Mon May 03 13:17:34 2010 +0300 @@ -4040,25 +4040,26 @@ void QWindowsMobileStylePrivate::tintImagesButton(QColor color) { - if (currentTintButton == color) + if (currentTintButton == color) return; - - imageTabEnd = QImage(tabend_xpm); - imageTabSelectedEnd = QImage(tabselectedend_xpm); - imageTabSelectedBegin = QImage(tabselectedbeginn_xpm); - imageTabMiddle = QImage(tabmiddle_xpm); - tintImage(&imageTabEnd, color, 0.0); - tintImage(&imageTabSelectedEnd, color, 0.0); - tintImage(&imageTabSelectedBegin, color, 0.0); - tintImage(&imageTabMiddle, color, 0.0); - - if (!doubleControls) { - int height = imageTabMiddle.height() / 2 + 1; - imageTabEnd = imageTabEnd.scaledToHeight(height); - imageTabMiddle = imageTabMiddle.scaledToHeight(height); - imageTabSelectedEnd = imageTabSelectedEnd.scaledToHeight(height); - imageTabSelectedBegin = imageTabSelectedBegin.scaledToHeight(height); - } + currentTintButton = color; + + imageTabEnd = QImage(tabend_xpm); + imageTabSelectedEnd = QImage(tabselectedend_xpm); + imageTabSelectedBegin = QImage(tabselectedbeginn_xpm); + imageTabMiddle = QImage(tabmiddle_xpm); + tintImage(&imageTabEnd, color, 0.0); + tintImage(&imageTabSelectedEnd, color, 0.0); + tintImage(&imageTabSelectedBegin, color, 0.0); + tintImage(&imageTabMiddle, color, 0.0); + + if (!doubleControls) { + int height = imageTabMiddle.height() / 2 + 1; + imageTabEnd = imageTabEnd.scaledToHeight(height); + imageTabMiddle = imageTabMiddle.scaledToHeight(height); + imageTabSelectedEnd = imageTabSelectedEnd.scaledToHeight(height); + imageTabSelectedBegin = imageTabSelectedBegin.scaledToHeight(height); + } } void QWindowsMobileStylePrivate::tintImagesHigh(QColor color) @@ -5075,6 +5076,10 @@ color = option->palette.buttonText().color(); QImage image; int xoffset, yoffset; + bool isTabBarArrow = widget && widget->parent() + && widget->inherits("QToolButton") + && widget->parent()->inherits("QTabBar"); + switch (element) { case PE_IndicatorArrowUp: image = d->imageArrowUp; @@ -5089,12 +5094,12 @@ case PE_IndicatorArrowLeft: image = d->imageArrowLeft; xoffset = 8; - yoffset = 2; + yoffset = isTabBarArrow ? 12 : 2; break; case PE_IndicatorArrowRight: image = d->imageArrowRight; xoffset = 8; - yoffset = 2; + yoffset = isTabBarArrow ? 12 : 2; break; case PE_IndicatorArrowUpBig: image = d->imageArrowUpBig; @@ -6948,10 +6953,11 @@ case PM_SliderThickness: ret = d->doubleControls ? windowsMobileSliderThickness * 2: windowsMobileSliderThickness; break; - case PM_TabBarScrollButtonWidth: - ret = d->doubleControls ? 14 * 2 : 18; - case PM_CheckBoxLabelSpacing: - case PM_RadioButtonLabelSpacing: + case PM_TabBarScrollButtonWidth: + ret = d->doubleControls ? 14 * 2 : 18; + break; + case PM_CheckBoxLabelSpacing: + case PM_RadioButtonLabelSpacing: ret = d->doubleControls ? 6 * 2 : 6; break; // Returns the number of pixels to use for the business part of the diff -r 2f34d5167611 -r fcece45ef507 src/gui/styles/styles.pri --- a/src/gui/styles/styles.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/styles/styles.pri Mon May 03 13:17:34 2010 +0300 @@ -164,17 +164,17 @@ } contains( styles, s60 ):contains(QT_CONFIG, s60) { - HEADERS += \ - styles/qs60style.h \ - styles/qs60style_p.h - SOURCES += styles/qs60style.cpp - symbian { - SOURCES += styles/qs60style_s60.cpp - LIBS += -lAknIcon -lAKNSKINS -lAKNSKINSRV -lFontUtils -legul -lbmpanim - } else { - SOURCES += styles/qs60style_simulated.cpp - RESOURCES += styles/qstyle_s60_simulated.qrc - } + HEADERS += \ + styles/qs60style.h \ + styles/qs60style_p.h + SOURCES += styles/qs60style.cpp + symbian { + SOURCES += styles/qs60style_s60.cpp + LIBS += -lAknIcon -lAKNSKINS -lAKNSKINSRV -lFontUtils -legul -lbmpanim + } else { + SOURCES += styles/qs60style_simulated.cpp + RESOURCES += styles/qstyle_s60_simulated.qrc + } } else { - DEFINES += QT_NO_STYLE_S60 + DEFINES += QT_NO_STYLE_S60 } diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qfontdatabase_s60.cpp --- a/src/gui/text/qfontdatabase_s60.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qfontdatabase_s60.cpp Mon May 03 13:17:34 2010 +0300 @@ -332,6 +332,11 @@ return false; } +bool QFontDatabase::removeAllApplicationFonts() +{ + return false; +} + bool QFontDatabase::supportsThreadedFontRendering() { return false; diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qfontengine.cpp --- a/src/gui/text/qfontengine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qfontengine.cpp Mon May 03 13:17:34 2010 +0300 @@ -379,6 +379,15 @@ Q_ASSERT(positions.size() == glyphs_out.size()); } +void QFontEngine::getGlyphBearings(glyph_t glyph, qreal *leftBearing, qreal *rightBearing) +{ + glyph_metrics_t gi = boundingBox(glyph); + bool isValid = gi.isValid(); + if (leftBearing != 0) + *leftBearing = isValid ? gi.x.toReal() : 0.0; + if (rightBearing != 0) + *rightBearing = isValid ? (gi.xoff - gi.x - gi.width).toReal() : 0.0; +} glyph_metrics_t QFontEngine::tightBoundingBox(const QGlyphLayout &glyphs) { @@ -1385,6 +1394,12 @@ return overall; } +void QFontEngineMulti::getGlyphBearings(glyph_t glyph, qreal *leftBearing, qreal *rightBearing) +{ + int which = highByte(glyph); + engine(which)->getGlyphBearings(stripped(glyph), leftBearing, rightBearing); +} + void QFontEngineMulti::addOutlineToPath(qreal x, qreal y, const QGlyphLayout &glyphs, QPainterPath *path, QTextItem::RenderFlags flags) { diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qfontengine_p.h --- a/src/gui/text/qfontengine_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qfontengine_p.h Mon May 03 13:17:34 2010 +0300 @@ -206,6 +206,8 @@ virtual qreal minLeftBearing() const { return qreal(); } virtual qreal minRightBearing() const { return qreal(); } + virtual void getGlyphBearings(glyph_t glyph, qreal *leftBearing = 0, qreal *rightBearing = 0); + virtual const char *name() const = 0; virtual bool canRender(const QChar *string, int len) = 0; @@ -374,6 +376,7 @@ virtual void recalcAdvances(QGlyphLayout *, QTextEngine::ShaperFlags) const; virtual void doKerning(QGlyphLayout *, QTextEngine::ShaperFlags) const; virtual void addOutlineToPath(qreal, qreal, const QGlyphLayout &, QPainterPath *, QTextItem::RenderFlags flags); + virtual void getGlyphBearings(glyph_t glyph, qreal *leftBearing = 0, qreal *rightBearing = 0); virtual QFixed ascent() const; virtual QFixed descent() const; diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qfontengine_win.cpp --- a/src/gui/text/qfontengine_win.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qfontengine_win.cpp Mon May 03 13:17:34 2010 +0300 @@ -39,6 +39,11 @@ ** ****************************************************************************/ +#if _WIN32_WINNT < 0x0500 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0500 +#endif + #include "qfontengine_p.h" #include "qtextengine_p.h" #include @@ -649,6 +654,30 @@ static const int char_table_entries = sizeof(char_table)/sizeof(ushort); +void QFontEngineWin::getGlyphBearings(glyph_t glyph, qreal *leftBearing, qreal *rightBearing) +{ + HDC hdc = shared_dc(); + SelectObject(hdc, hfont); + +#ifndef Q_WS_WINCE + if (ttf) +#endif + + { + ABC abcWidths; + GetCharABCWidthsI(hdc, glyph, 1, 0, &abcWidths); + if (leftBearing) + *leftBearing = abcWidths.abcA; + if (rightBearing) + *rightBearing = abcWidths.abcC; + } + +#ifndef Q_WS_WINCE + else { + QFontEngine::getGlyphBearings(glyph, leftBearing, rightBearing); + } +#endif +} qreal QFontEngineWin::minLeftBearing() const { diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qfontengine_win_p.h --- a/src/gui/text/qfontengine_win_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qfontengine_win_p.h Mon May 03 13:17:34 2010 +0300 @@ -106,6 +106,8 @@ virtual QImage alphaMapForGlyph(glyph_t, const QTransform &xform); virtual QImage alphaRGBMapForGlyph(glyph_t t, int margin, const QTransform &xform); + virtual void getGlyphBearings(glyph_t glyph, qreal *leftBearing = 0, qreal *rightBearing = 0); + int getGlyphIndexes(const QChar *ch, int numChars, QGlyphLayout *glyphs, bool mirrored) const; void getCMap(); diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qfontmetrics.cpp --- a/src/gui/text/qfontmetrics.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qfontmetrics.cpp Mon May 03 13:17:34 2010 +0300 @@ -472,8 +472,9 @@ int nglyphs = 9; engine->stringToCMap(&ch, 1, &glyphs, &nglyphs, 0); // ### can nglyphs != 1 happen at all? Not currently I think - glyph_metrics_t gi = engine->boundingBox(glyphs.glyphs[0]); - return qRound(gi.x); + qreal lb; + engine->getGlyphBearings(glyphs.glyphs[0], &lb); + return qRound(lb); } /*! @@ -506,8 +507,9 @@ int nglyphs = 9; engine->stringToCMap(&ch, 1, &glyphs, &nglyphs, 0); // ### can nglyphs != 1 happen at all? Not currently I think - glyph_metrics_t gi = engine->boundingBox(glyphs.glyphs[0]); - return qRound(gi.xoff - gi.x - gi.width); + qreal rb; + engine->getGlyphBearings(glyphs.glyphs[0], 0, &rb); + return qRound(rb); } /*! @@ -1317,8 +1319,9 @@ int nglyphs = 9; engine->stringToCMap(&ch, 1, &glyphs, &nglyphs, 0); // ### can nglyphs != 1 happen at all? Not currently I think - glyph_metrics_t gi = engine->boundingBox(glyphs.glyphs[0]); - return gi.x.toReal(); + qreal lb; + engine->getGlyphBearings(glyphs.glyphs[0], &lb); + return lb; } /*! @@ -1351,8 +1354,10 @@ int nglyphs = 9; engine->stringToCMap(&ch, 1, &glyphs, &nglyphs, 0); // ### can nglyphs != 1 happen at all? Not currently I think - glyph_metrics_t gi = engine->boundingBox(glyphs.glyphs[0]); - return (gi.xoff - gi.x - gi.width).toReal(); + qreal rb; + engine->getGlyphBearings(glyphs.glyphs[0], 0, &rb); + return rb; + } /*! diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qtextengine.cpp --- a/src/gui/text/qtextengine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qtextengine.cpp Mon May 03 13:17:34 2010 +0300 @@ -81,7 +81,7 @@ void generate(int start, int length, QFont::Capitalization caps) { if ((int)caps == (int)QFont::SmallCaps) - generateScriptItemsSmallCaps(m_string.utf16(), start, length); + generateScriptItemsSmallCaps(reinterpret_cast(m_string.unicode()), start, length); else if(caps == QFont::Capitalize) generateScriptItemsCapitalize(start, length); else if(caps != QFont::MixedCase) { @@ -1434,9 +1434,7 @@ layoutData->hasBidi = bidiItemize(const_cast(this), analysis, control); } - const ushort *unicode = layoutData->string.utf16(); - // correctly assign script, isTab and isObject to the script analysis - const ushort *uc = unicode; + const ushort *uc = reinterpret_cast(layoutData->string.unicode()); const ushort *e = uc + length; int lastScript = QUnicodeTables::Common; while (uc < e) { diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qtextformat.cpp --- a/src/gui/text/qtextformat.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qtextformat.cpp Mon May 03 13:17:34 2010 +0300 @@ -3085,7 +3085,8 @@ f.d = new QTextFormatPrivate; f.d->resolveFont(defaultFnt); - hashes.insert(hash, idx); + if (!hashes.contains(hash, idx)) + hashes.insert(hash, idx); } QT_CATCH(...) { formats.pop_back(); diff -r 2f34d5167611 -r fcece45ef507 src/gui/text/qtextlayout.cpp --- a/src/gui/text/qtextlayout.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/text/qtextlayout.cpp Mon May 03 13:17:34 2010 +0300 @@ -1644,28 +1644,67 @@ struct LineBreakHelper { - LineBreakHelper() : glyphCount(0), maxGlyphs(0), manualWrap(false) {} + LineBreakHelper() + : glyphCount(0), maxGlyphs(0), currentPosition(0), fontEngine(0), logClusters(0), + manualWrap(false) + { + } + QScriptLine tmpData; QScriptLine spaceData; + QGlyphLayout glyphs; + int glyphCount; int maxGlyphs; + int currentPosition; QFixed minw; QFixed softHyphenWidth; QFixed rightBearing; + QFixed minimumRightBearing; + + QFontEngine *fontEngine; + const unsigned short *logClusters; bool manualWrap; bool checkFullOtherwiseExtend(QScriptLine &line); + + QFixed calculateNewWidth(const QScriptLine &line) const { + return line.textWidth + tmpData.textWidth + spaceData.textWidth + softHyphenWidth + - qMin(rightBearing, QFixed()); + } + + inline glyph_t currentGlyph() const + { + Q_ASSERT(currentPosition > 0); + return glyphs.glyphs[logClusters[currentPosition - 1]]; + } + + inline void adjustRightBearing() + { + if (currentPosition <= 0) + return; + + qreal rb; + fontEngine->getGlyphBearings(currentGlyph(), 0, &rb); + rightBearing = qMin(QFixed(), QFixed::fromReal(rb)); + } + + inline void resetRightBearing() + { + rightBearing = QFixed(1); // Any positive number is defined as invalid since only + // negative right bearings are interesting to us. + } }; inline bool LineBreakHelper::checkFullOtherwiseExtend(QScriptLine &line) { LB_DEBUG("possible break width %f, spacew=%f", tmpData.textWidth.toReal(), spaceData.textWidth.toReal()); - QFixed newWidth = line.textWidth + tmpData.textWidth + spaceData.textWidth + softHyphenWidth + rightBearing; + QFixed newWidth = calculateNewWidth(line); if (line.length && !manualWrap && (newWidth > line.width || glyphCount > maxGlyphs)) return true; @@ -1741,13 +1780,12 @@ Qt::Alignment alignment = eng->option.alignment(); const HB_CharAttributes *attributes = eng->attributes(); - int pos = line.from; + lbh.currentPosition = line.from; int end = 0; - QGlyphLayout glyphs; - const unsigned short *logClusters = eng->layoutData->logClustersPtr; + lbh.logClusters = eng->layoutData->logClustersPtr; while (newItem < eng->layoutData->items.size()) { - lbh.rightBearing = 0; + lbh.resetRightBearing(); lbh.softHyphenWidth = 0; if (newItem != item) { item = newItem; @@ -1755,13 +1793,19 @@ if (!current.num_glyphs) { eng->shape(item); attributes = eng->attributes(); - logClusters = eng->layoutData->logClustersPtr; + lbh.logClusters = eng->layoutData->logClustersPtr; } - pos = qMax(line.from, current.position); + lbh.currentPosition = qMax(line.from, current.position); end = current.position + eng->length(item); - glyphs = eng->shapedGlyphs(¤t); + lbh.glyphs = eng->shapedGlyphs(¤t); } const QScriptItem ¤t = eng->layoutData->items[item]; + QFontEngine *fontEngine = eng->fontEngine(current); + if (lbh.fontEngine != fontEngine) { + lbh.fontEngine = fontEngine; + lbh.minimumRightBearing = qMin(QFixed(), + QFixed::fromReal(fontEngine->minRightBearing())); + } lbh.tmpData.leading = qMax(lbh.tmpData.leading + lbh.tmpData.ascent, current.leading + current.ascent) - qMax(lbh.tmpData.ascent, @@ -1791,8 +1835,8 @@ if (!line.length && !lbh.tmpData.length) line.setDefaultHeight(eng); if (eng->option.flags() & QTextOption::ShowLineAndParagraphSeparators) { - addNextCluster(pos, end, lbh.tmpData, lbh.glyphCount, - current, logClusters, glyphs); + addNextCluster(lbh.currentPosition, end, lbh.tmpData, lbh.glyphCount, + current, lbh.logClusters, lbh.glyphs); } else { lbh.tmpData.length++; } @@ -1811,10 +1855,10 @@ ++lbh.glyphCount; if (lbh.checkFullOtherwiseExtend(line)) goto found; - } else if (attributes[pos].whiteSpace) { - while (pos < end && attributes[pos].whiteSpace) - addNextCluster(pos, end, lbh.spaceData, lbh.glyphCount, - current, logClusters, glyphs); + } else if (attributes[lbh.currentPosition].whiteSpace) { + while (lbh.currentPosition < end && attributes[lbh.currentPosition].whiteSpace) + addNextCluster(lbh.currentPosition, end, lbh.spaceData, lbh.glyphCount, + current, lbh.logClusters, lbh.glyphs); if (!lbh.manualWrap && lbh.spaceData.textWidth > line.width) { lbh.spaceData.textWidth = line.width; // ignore spaces that fall out of the line. @@ -1823,19 +1867,19 @@ } else { bool sb_or_ws = false; do { - addNextCluster(pos, end, lbh.tmpData, lbh.glyphCount, - current, logClusters, glyphs); - - if (attributes[pos].whiteSpace || attributes[pos-1].lineBreakType != HB_NoBreak) { + addNextCluster(lbh.currentPosition, end, lbh.tmpData, lbh.glyphCount, + current, lbh.logClusters, lbh.glyphs); + + if (attributes[lbh.currentPosition].whiteSpace || attributes[lbh.currentPosition-1].lineBreakType != HB_NoBreak) { sb_or_ws = true; break; - } else if (breakany && attributes[pos].charStop) { + } else if (breakany && attributes[lbh.currentPosition].charStop) { break; } - } while (pos < end); + } while (lbh.currentPosition < end); lbh.minw = qMax(lbh.tmpData.textWidth, lbh.minw); - if (pos && attributes[pos - 1].lineBreakType == HB_SoftHyphen) { + if (lbh.currentPosition && attributes[lbh.currentPosition - 1].lineBreakType == HB_SoftHyphen) { // if we are splitting up a word because of // a soft hyphen then we ... // @@ -1853,41 +1897,39 @@ // and thus become invisible again. // if (line.length) - lbh.softHyphenWidth = glyphs.advances_x[logClusters[pos - 1]]; + lbh.softHyphenWidth = lbh.glyphs.advances_x[lbh.logClusters[lbh.currentPosition - 1]]; else if (breakany) - lbh.tmpData.textWidth += glyphs.advances_x[logClusters[pos - 1]]; + lbh.tmpData.textWidth += lbh.glyphs.advances_x[lbh.logClusters[lbh.currentPosition - 1]]; } // The actual width of the text needs to take the right bearing into account. The // right bearing is left-ward, which means that if the rightmost pixel is to the right // of the advance of the glyph, the bearing will be negative. We flip the sign // for the code to be more readable. Logic borrowed from qfontmetrics.cpp. - if (pos) { - QFontEngine *fontEngine = eng->fontEngine(current); - glyph_t glyph = glyphs.glyphs[logClusters[pos - 1]]; - glyph_metrics_t gi = fontEngine->boundingBox(glyph); - if (gi.isValid()) - lbh.rightBearing = qMax(QFixed(), -(gi.xoff - gi.x - gi.width)); - } - - if ((sb_or_ws|breakany) && lbh.checkFullOtherwiseExtend(line)) { - if (!breakany) { - line.textWidth += lbh.softHyphenWidth; + // We ignore the right bearing if the minimum negative bearing is too little to + // expand the text beyond the edge. + if (sb_or_ws|breakany) { + if (lbh.calculateNewWidth(line) + lbh.minimumRightBearing > line.width) + lbh.adjustRightBearing(); + if (lbh.checkFullOtherwiseExtend(line)) { + if (!breakany) { + line.textWidth += lbh.softHyphenWidth; + } + + goto found; } - - line.textWidth += lbh.rightBearing; - - goto found; } } - if (pos == end) + if (lbh.currentPosition == end) newItem = item + 1; } LB_DEBUG("reached end of line"); lbh.checkFullOtherwiseExtend(line); - line.textWidth += lbh.rightBearing; - found: + if (lbh.rightBearing > 0) // If right bearing has not yet been adjusted + lbh.adjustRightBearing(); + line.textWidth -= qMin(QFixed(), lbh.rightBearing); + if (line.length == 0) { LB_DEBUG("no break available in line, adding temp: length %d, width %f, space: length %d, width %f", lbh.tmpData.length, lbh.tmpData.textWidth.toReal(), diff -r 2f34d5167611 -r fcece45ef507 src/gui/util/qsystemtrayicon_mac.mm --- a/src/gui/util/qsystemtrayicon_mac.mm Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/util/qsystemtrayicon_mac.mm Mon May 03 13:17:34 2010 +0300 @@ -530,7 +530,11 @@ [item setToolTip:(NSString*)QCFString::toCFStringRef(action->toolTip())]; const QIcon icon = action->icon(); if(!icon.isNull()) { +#ifndef QT_MAC_USE_COCOA + const short scale = GetMBarHeight(); +#else const short scale = [[NSApp mainMenu] menuBarHeight]; +#endif NSImage *nsimage = static_cast(qt_mac_create_nsimage(icon.pixmap(QSize(scale, scale)))); [item setImage: nsimage]; [nsimage release]; diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qabstractslider.cpp --- a/src/gui/widgets/qabstractslider.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qabstractslider.cpp Mon May 03 13:17:34 2010 +0300 @@ -47,9 +47,6 @@ #ifndef QT_NO_ACCESSIBILITY #include "qaccessible.h" #endif -#ifdef QT_KEYPAD_NAVIGATION -#include "qtabwidget.h" // Needed in inTabWidget() -#endif // QT_KEYPAD_NAVIGATION #include QT_BEGIN_NAMESPACE @@ -702,7 +699,7 @@ stepsToScroll = qBound(-pageStep, int(offset * pageStep), pageStep); offset_accumulated = 0; } else { - // Calculate how many lines to scroll. Depending on what delta is (and + // Calculate how many lines to scroll. Depending on what delta is (and // offset), we might end up with a fraction (e.g. scroll 1.3 lines). We can // only scroll whole lines, so we keep the reminder until next event. qreal stepsToScrollF = @@ -749,45 +746,7 @@ } #endif -#ifdef QT_KEYPAD_NAVIGATION -/*! - \internal - Tells us if it there is currently a reachable widget by keypad navigation in - a certain \a orientation. - If no navigation is possible, occuring key events in that \a orientation may - be used to interact with the value in the focussed widget, even though it - currently has not the editFocus. - - \sa QWidgetPrivate::widgetInNavigationDirection(), QWidget::hasEditFocus() -*/ -inline static bool canKeypadNavigate(Qt::Orientation orientation) -{ - return orientation == Qt::Horizontal? - (QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionEast) - || QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionWest)) - :(QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionNorth) - || QWidgetPrivate::widgetInNavigationDirection(QWidgetPrivate::DirectionSouth)); -} -/*! - \internal - - Checks, if the \a widget is inside a QTabWidget. If is is inside - one, left/right key events will be used to switch between tabs in keypad - navigation. If there is no QTabWidget, the horizontal key events can be used to - interact with the value in the focussed widget, even though it currently has - not the editFocus. - - \sa QWidget::hasEditFocus() -*/ -inline static bool inTabWidget(QWidget *widget) -{ - for (QWidget *tabWidget = widget; tabWidget; tabWidget = tabWidget->parentWidget()) - if (qobject_cast(tabWidget)) - return true; - return false; -} -#endif // QT_KEYPAD_NAVIGATION /*! \reimp */ @@ -853,7 +812,8 @@ if (QApplication::keypadNavigationEnabled() && (!hasEditFocus() && QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder || d->orientation == Qt::Vertical - || !hasEditFocus() && (canKeypadNavigate(Qt::Horizontal) || inTabWidget(this)))) { + || !hasEditFocus() + && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) || QWidgetPrivate::inTabWidget(this)))) { ev->ignore(); return; } @@ -872,7 +832,8 @@ if (QApplication::keypadNavigationEnabled() && (!hasEditFocus() && QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder || d->orientation == Qt::Vertical - || !hasEditFocus() && (canKeypadNavigate(Qt::Horizontal) || inTabWidget(this)))) { + || !hasEditFocus() + && (QWidgetPrivate::canKeypadNavigate(Qt::Horizontal) || QWidgetPrivate::inTabWidget(this)))) { ev->ignore(); return; } @@ -892,7 +853,7 @@ if (QApplication::keypadNavigationEnabled() && (QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder || d->orientation == Qt::Horizontal - || !hasEditFocus() && canKeypadNavigate(Qt::Vertical))) { + || !hasEditFocus() && QWidgetPrivate::canKeypadNavigate(Qt::Vertical))) { ev->ignore(); break; } @@ -905,7 +866,7 @@ if (QApplication::keypadNavigationEnabled() && (QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder || d->orientation == Qt::Horizontal - || !hasEditFocus() && canKeypadNavigate(Qt::Vertical))) { + || !hasEditFocus() && QWidgetPrivate::canKeypadNavigate(Qt::Vertical))) { ev->ignore(); break; } diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qcombobox.cpp --- a/src/gui/widgets/qcombobox.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qcombobox.cpp Mon May 03 13:17:34 2010 +0300 @@ -532,9 +532,11 @@ QStyleOptionComboBox opt = comboStyleOption(); const bool usePopup = combo->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, combo); #ifndef QT_NO_SCROLLBAR +#ifndef Q_WS_S60 if (usePopup) view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); #endif +#endif if (combo->style()->styleHint(QStyle::SH_ComboBox_ListMouseTracking, &opt, combo) || usePopup) { view->setMouseTracking(true); @@ -2416,24 +2418,44 @@ // Position horizontally. listRect.moveLeft(above.x()); +#ifndef Q_WS_S60 // Position vertically so the curently selected item lines up // with the combo box. const QRect currentItemRect = view()->visualRect(view()->currentIndex()); const int offset = listRect.top() - currentItemRect.top(); listRect.moveTop(above.y() + offset - listRect.top()); +#endif // Clamp the listRect height and vertical position so we don't expand outside the // available screen geometry.This may override the vertical position, but it is more // important to show as much as possible of the popup. const int height = !boundToScreen ? listRect.height() : qMin(listRect.height(), screen.height()); +#ifdef Q_WS_S60 + //popup needs to be stretched with screen minimum dimension + listRect.setHeight(qMin(screen.height(), screen.width())); +#else listRect.setHeight(height); +#endif + if (boundToScreen) { if (listRect.top() < screen.top()) listRect.moveTop(screen.top()); if (listRect.bottom() > screen.bottom()) listRect.moveBottom(screen.bottom()); } +#ifdef Q_WS_S60 + if (screen.width() < screen.height()) { + // in portait, menu should be positioned above softkeys + listRect.moveBottom(screen.bottom()); + } else { + // landscape, menu should be at the right and horizontally centered + listRect.setWidth(listRect.height()); + listRect.moveCenter(screen.center()); + (opt.direction == Qt::LeftToRight) ? listRect.setRight(screen.right()) : + listRect.setLeft(screen.left()); + } +#endif } else if (!boundToScreen || listRect.height() <= belowHeight) { listRect.moveTopLeft(below); } else if (listRect.height() <= aboveHeight) { @@ -2642,6 +2664,34 @@ if (d->lineEdit) d->updateLineEditGeometry(); d->setLayoutItemMargins(QStyle::SE_ComboBoxLayoutItem); + +#ifdef Q_WS_S60 + if (d->container) { + QStyleOptionComboBox opt; + initStyleOption(&opt); + + if (style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, this)) { + const QRect screen = d->popupGeometry(QApplication::desktop()->screenNumber(this)); + + QRect listRect(style()->subControlRect(QStyle::CC_ComboBox, &opt, + QStyle::SC_ComboBoxListBoxPopup, this)); + listRect.setHeight(qMin(screen.height(), screen.width())); + + if (screen.width() < screen.height()) { + // in portait, menu should be positioned above softkeys + listRect.moveBottom(screen.bottom()); + } else { + // landscape, menu should be at the right and horizontally centered + listRect.setWidth(listRect.height()); + listRect.moveCenter(screen.center()); + (opt.direction == Qt::LeftToRight) ? listRect.setRight(screen.right()) : + listRect.setLeft(screen.left()); + } + d->container->setGeometry(listRect); + } + } +#endif + // ### need to update scrollers etc. as well here break; case QEvent::EnabledChange: diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qcombobox_p.h --- a/src/gui/widgets/qcombobox_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qcombobox_p.h Mon May 03 13:17:34 2010 +0300 @@ -270,7 +270,9 @@ const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionMenuItem opt = getStyleOption(option, index); +#ifndef Q_WS_S60 painter->fillRect(option.rect, opt.palette.background()); +#endif mCombo->style()->drawControl(QStyle::CE_MenuItem, &opt, painter, mCombo); } QSize sizeHint(const QStyleOptionViewItem &option, diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qdockarealayout.cpp --- a/src/gui/widgets/qdockarealayout.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qdockarealayout.cpp Mon May 03 13:17:34 2010 +0300 @@ -1990,16 +1990,19 @@ #ifdef QT_NO_TABBAR const int tabBarShape = 0; #endif - QDockAreaLayoutInfo *info = new QDockAreaLayoutInfo(sep, dockPos, o, - tabBarShape, mainWindow); - QDockAreaLayoutItem item(info); + QDockAreaLayoutItem item(new QDockAreaLayoutInfo(sep, dockPos, o, + tabBarShape, mainWindow)); stream >> item.pos >> item.size >> dummy >> dummy; - if (!info->restoreState(stream, widgets, testing)) + //we need to make sure the element is in the list so the dock widget can eventually be docked correctly + if (!testing) + item_list.append(item); + + //here we need to make sure we change the item in the item_list + QDockAreaLayoutItem &lastItem = testing ? item : item_list.last(); + + if (!lastItem.subinfo->restoreState(stream, widgets, testing)) return false; - if (!testing) { - item_list.append(item); - } } else { return false; } diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qlinecontrol.cpp --- a/src/gui/widgets/qlinecontrol.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qlinecontrol.cpp Mon May 03 13:17:34 2010 +0300 @@ -65,7 +65,7 @@ Updates the display text based of the current edit text If the text has changed will emit displayTextChanged() */ -void QLineControl::updateDisplayText() +void QLineControl::updateDisplayText(bool forceUpdate) { QString orig = m_textLayout.text(); QString str; @@ -102,7 +102,7 @@ m_textLayout.endLayout(); m_ascent = qRound(l.ascent()); - if (str != orig) + if (str != orig || forceUpdate) emit displayTextChanged(str); } @@ -476,7 +476,7 @@ } } m_textLayout.setAdditionalFormats(formats); - updateDisplayText(); + updateDisplayText(/*force*/ true); if (cursorPositionChanged) emitCursorPositionChanged(); if (isGettingInput) diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qlinecontrol_p.h --- a/src/gui/widgets/qlinecontrol_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qlinecontrol_p.h Mon May 03 13:17:34 2010 +0300 @@ -239,7 +239,7 @@ void init(const QString &txt); void removeSelectedText(); void internalSetText(const QString &txt, int pos = -1, bool edited = true); - void updateDisplayText(); + void updateDisplayText(bool forceUpdate = false); void internalInsert(const QString &s); void internalDelete(bool wasBackspace = false); diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qlineedit_p.cpp --- a/src/gui/widgets/qlineedit_p.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qlineedit_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -129,12 +129,12 @@ void QLineEditPrivate::_q_selectionChanged() { Q_Q(QLineEdit); - if (control->preeditAreaText().isEmpty()) { + if (!control->text().isEmpty() && control->preeditAreaText().isEmpty()) { QStyleOptionFrameV2 opt; q->initStyleOption(&opt); bool showCursor = control->hasSelectedText() ? q->style()->styleHint(QStyle::SH_BlinkCursorWhenTextSelected, &opt, q): - true; + q->hasFocus(); setCursorVisible(showCursor); } diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qmainwindow.cpp --- a/src/gui/widgets/qmainwindow.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qmainwindow.cpp Mon May 03 13:17:34 2010 +0300 @@ -65,9 +65,6 @@ extern OSWindowRef qt_mac_window_for(const QWidget *); // qwidget_mac.cpp QT_END_NAMESPACE #endif -#ifdef QT_SOFTKEYS_ENABLED -#include -#endif QT_BEGIN_NAMESPACE @@ -80,9 +77,6 @@ #ifdef Q_WS_MAC , useHIToolBar(false) #endif -#ifdef QT_SOFTKEYS_ENABLED - , menuBarAction(0) -#endif #if !defined(QT_NO_DOCKWIDGET) && !defined(QT_NO_CURSOR) , hasOldCursor(false) , cursorAdjusted(false) #endif @@ -94,9 +88,6 @@ #ifdef Q_WS_MAC bool useHIToolBar; #endif -#ifdef QT_SOFTKEYS_ENABLED - QAction *menuBarAction; -#endif void init(); QList hoverSeparator; QPoint hoverPos; @@ -117,9 +108,6 @@ const int metric = q->style()->pixelMetric(QStyle::PM_ToolBarIconSize, 0, q); iconSize = QSize(metric, metric); q->setAttribute(Qt::WA_Hover); -#ifdef QT_SOFTKEYS_ENABLED - menuBarAction = QSoftKeyManager::createAction(QSoftKeyManager::MenuSoftKey, q); -#endif } /* @@ -491,13 +479,6 @@ oldMenuBar->deleteLater(); } d->layout->setMenuBar(menuBar); - -#ifdef QT_SOFTKEYS_ENABLED - if (menuBar) - addAction(d->menuBarAction); - else - removeAction(d->menuBarAction); -#endif } /*! @@ -1426,11 +1407,6 @@ } break; #endif -#ifdef QT_SOFTKEYS_ENABLED - case QEvent::LanguageChange: - d->menuBarAction->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::MenuSoftKey)); - break; -#endif default: break; } diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qmainwindowlayout_mac.mm --- a/src/gui/widgets/qmainwindowlayout_mac.mm Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qmainwindowlayout_mac.mm Mon May 03 13:17:34 2010 +0300 @@ -463,6 +463,8 @@ NSToolbarItem *item = static_cast(it.key()); [[qt_mac_window_for(layoutState.mainWindow->window()) toolbar] removeItemAtIndex:toolbarItemsCopy.indexOf(item)]; + unifiedToolbarHash.remove(item); + qtoolbarsInUnifiedToolbarList.removeAll(toolbar); #endif break; } diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qmenu.cpp --- a/src/gui/widgets/qmenu.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qmenu.cpp Mon May 03 13:17:34 2010 +0300 @@ -168,8 +168,8 @@ #ifdef QT_SOFTKEYS_ENABLED selectAction = QSoftKeyManager::createKeyedAction(QSoftKeyManager::SelectSoftKey, Qt::Key_Select, q); cancelAction = QSoftKeyManager::createKeyedAction(QSoftKeyManager::CancelSoftKey, Qt::Key_Back, q); - selectAction->setVisible(false); // Don't show these in the menu - cancelAction->setVisible(false); + selectAction->setPriority(QAction::HighPriority); + cancelAction->setPriority(QAction::HighPriority); q->addAction(selectAction); q->addAction(cancelAction); #endif diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qmenu_p.h --- a/src/gui/widgets/qmenu_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qmenu_p.h Mon May 03 13:17:34 2010 +0300 @@ -347,7 +347,7 @@ void syncAction(QWceMenuAction *); inline void syncAction(QAction *a) { syncAction(findAction(a)); } void removeAction(QWceMenuAction *); - void rebuild(bool reCreate = false); + void rebuild(); inline void removeAction(QAction *a) { removeAction(findAction(a)); } inline QWceMenuAction *findAction(QAction *a) { for(int i = 0; i < actionItems.size(); i++) { diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qmenu_symbian.cpp --- a/src/gui/widgets/qmenu_symbian.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qmenu_symbian.cpp Mon May 03 13:17:34 2010 +0300 @@ -256,6 +256,14 @@ { SymbianMenuItem* menu = qt_symbian_find_menu(id, symbianMenus); if (menu) { + // Normally first AddMenuItemL call for menuPane will create the item array. + // However if we don't have any items, we still need the item array. Otherwise + // menupane will crash. That's why we create item array here manually, and + // AddMenuItemL will then use the existing array. + CEikMenuPane::CItemArray* itemArray = q_check_ptr(new CEikMenuPane::CItemArray); + menuPane->SetItemArray(itemArray); + menuPane->SetItemArrayOwnedExternally(EFalse); + for (int i = 0; i < menu->children.count(); ++i) QT_TRAP_THROWING(menuPane->AddMenuItemL(menu->children.at(i)->menuItemData)); } @@ -316,6 +324,14 @@ symbian_menubar = 0; } +void QMenuBarPrivate::reparentMenuBar(QWidget *oldParent, QWidget *newParent) +{ + if (menubars()->contains(oldParent)) { + QMenuBarPrivate *object = menubars()->take(oldParent); + menubars()->insert(newParent, object); + } +} + QMenuBarPrivate::QSymbianMenuBarPrivate::QSymbianMenuBarPrivate(QMenuBarPrivate *menubar) { d = menubar; diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qmenu_wince.cpp --- a/src/gui/widgets/qmenu_wince.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qmenu_wince.cpp Mon May 03 13:17:34 2010 +0300 @@ -101,7 +101,6 @@ COLORREF clrBk; }; -typedef int (WINAPI *superfunc)(int, int); typedef BOOL (WINAPI *AygCreateMenuBar)(qt_SHMENUBARINFO*); typedef HRESULT (WINAPI *AygEnableSoftKey)(HWND,UINT,BOOL,BOOL); @@ -254,6 +253,12 @@ } } +// Removes all items from the menu without destroying the handles. +static void qt_wce_clear_menu(HMENU hMenu) +{ + while (RemoveMenu(hMenu, 0, MF_BYPOSITION)); +} + /*! \internal @@ -404,7 +409,8 @@ QMenuPrivate::QWceMenuPrivate::~QWceMenuPrivate() { qt_wce_delete_action_list(&actionItems); - menuHandle = 0; + if (menuHandle) + DestroyMenu(menuHandle); } void QMenuPrivate::QWceMenuPrivate::addAction(QAction *a, QWceMenuAction *before) { @@ -439,14 +445,17 @@ if (!wce_menu) wce_menu = new QWceMenuPrivate; if (!wce_menu->menuHandle || create) - wce_menu->rebuild(create); + wce_menu->rebuild(); return wce_menu->menuHandle; } -void QMenuPrivate::QWceMenuPrivate::rebuild(bool reCreate) { - if (menuHandle && !reCreate) - DestroyMenu(menuHandle); - menuHandle = CreatePopupMenu(); +void QMenuPrivate::QWceMenuPrivate::rebuild() +{ + if (!menuHandle) + menuHandle = CreatePopupMenu(); + else + qt_wce_clear_menu(menuHandle); + for (int i = 0; i < actionItems.size(); ++i) { QWceMenuAction *action = actionItems.at(i); action->menuHandle = menuHandle; @@ -522,6 +531,7 @@ resourceHandle = IDR_MAIN_MENU5; } Q_ASSERT_X(menubarHandle, "rebuild !created", "menubar already deleted"); + qt_wce_clear_menu(menuHandle); DestroyWindow(menubarHandle); menubarHandle = qt_wce_create_menubar(parentWindowHandle, qt_wce_get_module_handle(), resourceHandle); Q_ASSERT_X(menubarHandle, "rebuild classic menu", "cannot create menubar from resource"); @@ -563,6 +573,7 @@ leftButtonIsMenu = (leftButtonAction && leftButtonAction->menu()); Q_ASSERT_X(menubarHandle, "rebuild !created", "menubar already deleted"); + qt_wce_clear_menu(menuHandle); DestroyWindow(menubarHandle); if (leftButtonIsMenu) { menubarHandle = qt_wce_create_menubar(parentWindowHandle, qt_wce_get_module_handle(), IDR_MAIN_MENU2); diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qmenubar.cpp --- a/src/gui/widgets/qmenubar.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qmenubar.cpp Mon May 03 13:17:34 2010 +0300 @@ -71,6 +71,10 @@ extern bool qt_wince_is_mobile(); //defined in qguifunctions_wce.cpp #endif +#ifdef QT_SOFTKEYS_ENABLED +#include +#endif + QT_BEGIN_NAMESPACE class QMenuBarExtension : public QToolButton @@ -740,17 +744,14 @@ QApplication::setAttribute(Qt::AA_DontUseNativeMenuBar, true); } #endif -#ifdef Q_WS_S60 - symbianCreateMenuBar(q->parentWidget()); - if(symbian_menubar) - q->hide(); -#endif - q->setBackgroundRole(QPalette::Button); oldWindow = oldParent = 0; #ifdef QT3_SUPPORT doAutoResize = false; #endif +#ifdef QT_SOFTKEYS_ENABLED + menuBarAction = 0; +#endif handleReparent(); q->setMouseTracking(q->style()->styleHint(QStyle::SH_MenuBar_MouseTracking, 0, q)); @@ -1384,10 +1385,37 @@ wce_menubar->rebuild(); #endif #ifdef Q_WS_S60 - if (symbian_menubar) + + // Construct symbian_menubar when this code path is entered first time + // and when newParent != NULL + if (!symbian_menubar) + symbianCreateMenuBar(newParent); + + // Reparent and rebuild menubar when parent is changed + if (symbian_menubar) { + if (oldParent != newParent) + reparentMenuBar(oldParent, newParent); + q->hide(); symbian_menubar->rebuild(); -#endif + } +#ifdef QT_SOFTKEYS_ENABLED + // Constuct menuBarAction when this code path is entered first time + if (!menuBarAction) { + if (newParent) { + menuBarAction = QSoftKeyManager::createAction(QSoftKeyManager::MenuSoftKey, newParent); + newParent->addAction(menuBarAction); + } + } else { + // If reparenting i.e. we already have menuBarAction, remove it from old parent + // and add for a new parent + if (oldParent) + oldParent->removeAction(menuBarAction); + if (newParent) + newParent->addAction(menuBarAction); + } +#endif // QT_SOFTKEYS_ENABLED +#endif // Q_WS_S60 } #ifdef QT3_SUPPORT @@ -1440,7 +1468,13 @@ || e->type() == QEvent::ApplicationFontChange) { d->itemsDirty = true; d->updateGeometries(); +#ifdef QT_SOFTKEYS_ENABLED + } else if (e->type() == QEvent::LanguageChange) { + if (d->menuBarAction) + d->menuBarAction->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::MenuSoftKey)); +#endif } + QWidget::changeEvent(e); } diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qmenubar_p.h --- a/src/gui/widgets/qmenubar_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qmenubar_p.h Mon May 03 13:17:34 2010 +0300 @@ -243,6 +243,7 @@ #ifdef Q_WS_S60 void symbianCreateMenuBar(QWidget *); void symbianDestroyMenuBar(); + void reparentMenuBar(QWidget *oldParent, QWidget *newParent); struct QSymbianMenuBarPrivate { QList actionItems; QMenuBarPrivate *d; @@ -267,7 +268,9 @@ } *symbian_menubar; static int symbianCommands(int command); - +#ifdef QT_SOFTKEYS_ENABLED + QAction *menuBarAction; +#endif #endif }; #endif diff -r 2f34d5167611 -r fcece45ef507 src/gui/widgets/qspinbox.cpp --- a/src/gui/widgets/qspinbox.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/gui/widgets/qspinbox.cpp Mon May 03 13:17:34 2010 +0300 @@ -448,11 +448,12 @@ } /*! - This virtual function is used by the spin box whenever it needs - to display the given \a value. The default implementation returns - a string containing \a value printed in the standard way using - QWidget::locale().toString(). Reimplementations may return anything. (See - the example in the detailed description.) + This virtual function is used by the spin box whenever it needs to + display the given \a value. The default implementation returns a + string containing \a value printed in the standard way using + QWidget::locale().toString(), but with the thousand separator + removed. Reimplementations may return anything. (See the example + in the detailed description.) Note: QSpinBox does not call this function for specialValueText() and that neither prefix() nor suffix() should be included in the @@ -461,7 +462,7 @@ If you reimplement this, you may also need to reimplement valueFromText() and validate() - \sa valueFromText(), validate() + \sa valueFromText(), validate(), QLocale::groupSeparator() */ QString QSpinBox::textFromValue(int value) const @@ -869,7 +870,7 @@ If you reimplement this, you may also need to reimplement valueFromText(). - \sa valueFromText() + \sa valueFromText(), QLocale::groupSeparator() */ diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/audio.pri --- a/src/multimedia/audio/audio.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/audio.pri Mon May 03 13:17:34 2010 +0300 @@ -41,6 +41,21 @@ !wince*:LIBS += -lwinmm wince*:LIBS += -lcoredll +} else:symbian { + INCLUDEPATH += /epoc32/include/mmf/common + INCLUDEPATH += /epoc32/include/mmf/server + + HEADERS += $$PWD/qaudio_symbian_p.h \ + $$PWD/qaudiodeviceinfo_symbian_p.h \ + $$PWD/qaudioinput_symbian_p.h \ + $$PWD/qaudiooutput_symbian_p.h + + SOURCES += $$PWD/qaudio_symbian_p.cpp \ + $$PWD/qaudiodeviceinfo_symbian_p.cpp \ + $$PWD/qaudioinput_symbian_p.cpp \ + $$PWD/qaudiooutput_symbian_p.cpp + + LIBS += -lmmfdevsound } else:unix { unix:contains(QT_CONFIG, alsa) { linux-*|freebsd-*|openbsd-*:{ diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudio_symbian_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/multimedia/audio/qaudio_symbian_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,395 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qaudio_symbian_p.h" +#include + +QT_BEGIN_NAMESPACE + +namespace SymbianAudio { + +DevSoundCapabilities::DevSoundCapabilities(CMMFDevSound &devsound, + QAudio::Mode mode) +{ + QT_TRAP_THROWING(constructL(devsound, mode)); +} + +DevSoundCapabilities::~DevSoundCapabilities() +{ + m_fourCC.Close(); +} + +void DevSoundCapabilities::constructL(CMMFDevSound &devsound, + QAudio::Mode mode) +{ + m_caps = devsound.Capabilities(); + + TMMFPrioritySettings settings; + + switch (mode) { + case QAudio::AudioOutput: + settings.iState = EMMFStatePlaying; + devsound.GetSupportedInputDataTypesL(m_fourCC, settings); + break; + + case QAudio::AudioInput: + settings.iState = EMMFStateRecording; + devsound.GetSupportedInputDataTypesL(m_fourCC, settings); + break; + + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode"); + } +} + +namespace Utils { + +//----------------------------------------------------------------------------- +// Static data +//----------------------------------------------------------------------------- + +// Sample rate / frequency + +typedef TMMFSampleRate SampleRateNative; +typedef int SampleRateQt; + +const int SampleRateCount = 12; + +const SampleRateNative SampleRateListNative[SampleRateCount] = { + EMMFSampleRate8000Hz + , EMMFSampleRate11025Hz + , EMMFSampleRate12000Hz + , EMMFSampleRate16000Hz + , EMMFSampleRate22050Hz + , EMMFSampleRate24000Hz + , EMMFSampleRate32000Hz + , EMMFSampleRate44100Hz + , EMMFSampleRate48000Hz + , EMMFSampleRate64000Hz + , EMMFSampleRate88200Hz + , EMMFSampleRate96000Hz +}; + +const SampleRateQt SampleRateListQt[SampleRateCount] = { + 8000 + , 11025 + , 12000 + , 16000 + , 22050 + , 24000 + , 32000 + , 44100 + , 48000 + , 64000 + , 88200 + , 96000 +}; + +// Channels + +typedef TMMFMonoStereo ChannelsNative; +typedef int ChannelsQt; + +const int ChannelsCount = 2; + +const ChannelsNative ChannelsListNative[ChannelsCount] = { + EMMFMono + , EMMFStereo +}; + +const ChannelsQt ChannelsListQt[ChannelsCount] = { + 1 + , 2 +}; + +// Encoding + +const int EncodingCount = 6; + +const TUint32 EncodingFourCC[EncodingCount] = { + KMMFFourCCCodePCM8 // 0 + , KMMFFourCCCodePCMU8 // 1 + , KMMFFourCCCodePCM16 // 2 + , KMMFFourCCCodePCMU16 // 3 + , KMMFFourCCCodePCM16B // 4 + , KMMFFourCCCodePCMU16B // 5 +}; + +// The characterised DevSound API specification states that the iEncoding +// field in TMMFCapabilities is ignored, and that the FourCC should be used +// to specify the PCM encoding. +// See "SGL.GT0287.102 Multimedia DevSound Baseline Compatibility.doc" in the +// mm_info/mm_docs repository. +const TMMFSoundEncoding EncodingNative[EncodingCount] = { + EMMFSoundEncoding16BitPCM // 0 + , EMMFSoundEncoding16BitPCM // 1 + , EMMFSoundEncoding16BitPCM // 2 + , EMMFSoundEncoding16BitPCM // 3 + , EMMFSoundEncoding16BitPCM // 4 + , EMMFSoundEncoding16BitPCM // 5 +}; + + +const int EncodingSampleSize[EncodingCount] = { + 8 // 0 + , 8 // 1 + , 16 // 2 + , 16 // 3 + , 16 // 4 + , 16 // 5 +}; + +const QAudioFormat::Endian EncodingByteOrder[EncodingCount] = { + QAudioFormat::LittleEndian // 0 + , QAudioFormat::LittleEndian // 1 + , QAudioFormat::LittleEndian // 2 + , QAudioFormat::LittleEndian // 3 + , QAudioFormat::BigEndian // 4 + , QAudioFormat::BigEndian // 5 +}; + +const QAudioFormat::SampleType EncodingSampleType[EncodingCount] = { + QAudioFormat::SignedInt // 0 + , QAudioFormat::UnSignedInt // 1 + , QAudioFormat::SignedInt // 2 + , QAudioFormat::UnSignedInt // 3 + , QAudioFormat::SignedInt // 4 + , QAudioFormat::UnSignedInt // 5 +}; + + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +// Helper functions for implementing parameter conversions + +template +bool findValue(const Input *inputArray, int length, Input input, int &index) { + bool result = false; + for (int i=0; !result && i +bool convertValue(const Input *inputArray, const Output *outputArray, + int length, Input input, Output &output) { + int index; + const bool result = findValue(inputArray, length, input, index); + if (result) + output = outputArray[index]; + return result; +} + +/** + * Macro which is used to generate the implementation of the conversion + * functions. The implementation is just a wrapper around the templated + * convertValue function, e.g. + * + * CONVERSION_FUNCTION_IMPL(SampleRate, Qt, Native) + * + * expands to + * + * bool SampleRateQtToNative(int input, TMMFSampleRate &output) { + * return convertValue + * (SampleRateListQt, SampleRateListNative, SampleRateCount, + * input, output); + * } + */ +#define CONVERSION_FUNCTION_IMPL(FieldLc, Field, Input, Output) \ +bool FieldLc##Input##To##Output(Field##Input input, Field##Output &output) { \ + return convertValue(Field##List##Input, \ + Field##List##Output, Field##Count, input, output); \ +} + +//----------------------------------------------------------------------------- +// Local helper functions +//----------------------------------------------------------------------------- + +CONVERSION_FUNCTION_IMPL(sampleRate, SampleRate, Qt, Native) +CONVERSION_FUNCTION_IMPL(sampleRate, SampleRate, Native, Qt) +CONVERSION_FUNCTION_IMPL(channels, Channels, Qt, Native) +CONVERSION_FUNCTION_IMPL(channels, Channels, Native, Qt) + +bool sampleInfoQtToNative(int inputSampleSize, + QAudioFormat::Endian inputByteOrder, + QAudioFormat::SampleType inputSampleType, + TUint32 &outputFourCC, + TMMFSoundEncoding &outputEncoding) { + + bool found = false; + + for (int i=0; i &frequencies, + QList &channels, + QList &sampleSizes, + QList &byteOrders, + QList &sampleTypes) { + + frequencies.clear(); + sampleSizes.clear(); + byteOrders.clear(); + sampleTypes.clear(); + channels.clear(); + + for (int i=0; i +#include +#include +#include + +QT_BEGIN_NAMESPACE + +namespace SymbianAudio { + +/** + * Default values used by audio input and output classes, when underlying + * DevSound instance has not yet been created. + */ + +const int DefaultBufferSize = 4096; // bytes +const int DefaultNotifyInterval = 1000; // ms + +/** + * Enumeration used to track state of internal DevSound instances. + * Values are translated to the corresponding QAudio::State values by + * SymbianAudio::Utils::stateNativeToQt. + */ +enum State { + ClosedState + , InitializingState + , ActiveState + , IdleState + , SuspendedState +}; + +/* + * Helper class for querying DevSound codec / format support + */ +class DevSoundCapabilities { +public: + DevSoundCapabilities(CMMFDevSound &devsound, QAudio::Mode mode); + ~DevSoundCapabilities(); + + const RArray& fourCC() const { return m_fourCC; } + const TMMFCapabilities& caps() const { return m_caps; } + +private: + void constructL(CMMFDevSound &devsound, QAudio::Mode mode); + +private: + RArray m_fourCC; + TMMFCapabilities m_caps; +}; + +namespace Utils { + +/** + * Convert native audio capabilities to QAudio lists. + */ +void capabilitiesNativeToQt(const DevSoundCapabilities &caps, + QList &frequencies, + QList &channels, + QList &sampleSizes, + QList &byteOrders, + QList &sampleTypes); + +/** + * Check whether format is supported. + */ +bool isFormatSupported(const QAudioFormat &format, + const DevSoundCapabilities &caps); + +/** + * Convert QAudioFormat to native format types. + * + * Note that, despite the name, DevSound uses TMMFCapabilities to specify + * single formats as well as capabilities. + * + * Note that this function does not modify outputFormat.iBufferSize. + */ +bool formatQtToNative(const QAudioFormat &inputFormat, + TUint32 &outputFourCC, + TMMFCapabilities &outputFormat); + +/** + * Convert internal states to QAudio states. + */ +QAudio::State stateNativeToQt(State nativeState, + QAudio::State initializingState); + +/** + * Convert data length to number of samples. + */ +qint64 bytesToSamples(const QAudioFormat &format, qint64 length); + +/** + * Convert number of samples to data length. + */ +qint64 samplesToBytes(const QAudioFormat &format, qint64 samples); + +} // namespace Utils +} // namespace SymbianAudio + +QT_END_NAMESPACE + +#endif diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudiodevicefactory.cpp --- a/src/multimedia/audio/qaudiodevicefactory.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/qaudiodevicefactory.cpp Mon May 03 13:17:34 2010 +0300 @@ -58,6 +58,10 @@ #include "qaudiodeviceinfo_alsa_p.h" #include "qaudiooutput_alsa_p.h" #include "qaudioinput_alsa_p.h" +#elif defined(Q_OS_SYMBIAN) +#include "qaudiodeviceinfo_symbian_p.h" +#include "qaudiooutput_symbian_p.h" +#include "qaudioinput_symbian_p.h" #endif #endif @@ -128,7 +132,7 @@ { QList devices; #ifndef QT_NO_AUDIO_BACKEND -#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA)) +#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA) || defined(Q_OS_SYMBIAN)) foreach (const QByteArray &handle, QAudioDeviceInfoInternal::availableDevices(mode)) devices << QAudioDeviceInfo(QLatin1String("builtin"), handle, mode); #endif @@ -158,7 +162,7 @@ return QAudioDeviceInfo(QLatin1String("default"), list.at(0), QAudio::AudioInput); } #ifndef QT_NO_AUDIO_BACKEND -#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA)) +#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA) || defined(Q_OS_SYMBIAN)) return QAudioDeviceInfo(QLatin1String("builtin"), QAudioDeviceInfoInternal::defaultInputDevice(), QAudio::AudioInput); #endif #endif @@ -175,7 +179,7 @@ return QAudioDeviceInfo(QLatin1String("default"), list.at(0), QAudio::AudioOutput); } #ifndef QT_NO_AUDIO_BACKEND -#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA)) +#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA) || defined(Q_OS_SYMBIAN)) return QAudioDeviceInfo(QLatin1String("builtin"), QAudioDeviceInfoInternal::defaultOutputDevice(), QAudio::AudioOutput); #endif #endif @@ -187,7 +191,7 @@ QAbstractAudioDeviceInfo *rc = 0; #ifndef QT_NO_AUDIO_BACKEND -#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA)) +#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA) || defined(Q_OS_SYMBIAN)) if (realm == QLatin1String("builtin")) return new QAudioDeviceInfoInternal(handle, mode); #endif @@ -216,7 +220,7 @@ if (deviceInfo.isNull()) return new QNullInputDevice(); #ifndef QT_NO_AUDIO_BACKEND -#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA)) +#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA) || defined(Q_OS_SYMBIAN)) if (deviceInfo.realm() == QLatin1String("builtin")) return new QAudioInputPrivate(deviceInfo.handle(), format); #endif @@ -235,7 +239,7 @@ if (deviceInfo.isNull()) return new QNullOutputDevice(); #ifndef QT_NO_AUDIO_BACKEND -#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA)) +#if (defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(HAS_ALSA) || defined(Q_OS_SYMBIAN)) if (deviceInfo.realm() == QLatin1String("builtin")) return new QAudioOutputPrivate(deviceInfo.handle(), format); #endif diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudiodeviceinfo_symbian_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/multimedia/audio/qaudiodeviceinfo_symbian_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,200 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qaudiodeviceinfo_symbian_p.h" +#include "qaudio_symbian_p.h" + +QT_BEGIN_NAMESPACE + +QAudioDeviceInfoInternal::QAudioDeviceInfoInternal(QByteArray device, + QAudio::Mode mode) + : m_deviceName(QLatin1String(device)) + , m_mode(mode) + , m_updated(false) +{ + QT_TRAP_THROWING(m_devsound.reset(CMMFDevSound::NewL())); +} + +QAudioDeviceInfoInternal::~QAudioDeviceInfoInternal() +{ + +} + +QAudioFormat QAudioDeviceInfoInternal::preferredFormat() const +{ + QAudioFormat format; + switch (m_mode) { + case QAudio::AudioOutput: + format.setFrequency(44100); + format.setChannels(2); + format.setSampleSize(16); + format.setByteOrder(QAudioFormat::LittleEndian); + format.setSampleType(QAudioFormat::SignedInt); + format.setCodec(QLatin1String("audio/pcm")); + break; + + case QAudio::AudioInput: + format.setFrequency(8000); + format.setChannels(1); + format.setSampleSize(16); + format.setByteOrder(QAudioFormat::LittleEndian); + format.setSampleType(QAudioFormat::SignedInt); + format.setCodec(QLatin1String("audio/pcm")); + break; + + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode"); + } + + if (!isFormatSupported(format)) { + if (m_frequencies.size()) + format.setFrequency(m_frequencies[0]); + if (m_channels.size()) + format.setChannels(m_channels[0]); + if (m_sampleSizes.size()) + format.setSampleSize(m_sampleSizes[0]); + if (m_byteOrders.size()) + format.setByteOrder(m_byteOrders[0]); + if (m_sampleTypes.size()) + format.setSampleType(m_sampleTypes[0]); + } + + return format; +} + +bool QAudioDeviceInfoInternal::isFormatSupported( + const QAudioFormat &format) const +{ + getSupportedFormats(); + const bool supported = + m_codecs.contains(format.codec()) + && m_frequencies.contains(format.frequency()) + && m_channels.contains(format.channels()) + && m_sampleSizes.contains(format.sampleSize()) + && m_byteOrders.contains(format.byteOrder()) + && m_sampleTypes.contains(format.sampleType()); + + return supported; +} + +QAudioFormat QAudioDeviceInfoInternal::nearestFormat(const QAudioFormat &format) const +{ + if (isFormatSupported(format)) + return format; + else + return preferredFormat(); +} + +QString QAudioDeviceInfoInternal::deviceName() const +{ + return m_deviceName; +} + +QStringList QAudioDeviceInfoInternal::codecList() +{ + getSupportedFormats(); + return m_codecs; +} + +QList QAudioDeviceInfoInternal::frequencyList() +{ + getSupportedFormats(); + return m_frequencies; +} + +QList QAudioDeviceInfoInternal::channelsList() +{ + getSupportedFormats(); + return m_channels; +} + +QList QAudioDeviceInfoInternal::sampleSizeList() +{ + getSupportedFormats(); + return m_sampleSizes; +} + +QList QAudioDeviceInfoInternal::byteOrderList() +{ + getSupportedFormats(); + return m_byteOrders; +} + +QList QAudioDeviceInfoInternal::sampleTypeList() +{ + getSupportedFormats(); + return m_sampleTypes; +} + +QByteArray QAudioDeviceInfoInternal::defaultInputDevice() +{ + return QByteArray("default"); +} + +QByteArray QAudioDeviceInfoInternal::defaultOutputDevice() +{ + return QByteArray("default"); +} + +QList QAudioDeviceInfoInternal::availableDevices(QAudio::Mode) +{ + QList result; + result += QByteArray("default"); + return result; +} + +void QAudioDeviceInfoInternal::getSupportedFormats() const +{ + if (!m_updated) { + QScopedPointer caps( + new SymbianAudio::DevSoundCapabilities(*m_devsound, m_mode)); + + SymbianAudio::Utils::capabilitiesNativeToQt(*caps, + m_frequencies, m_channels, m_sampleSizes, + m_byteOrders, m_sampleTypes); + + m_codecs.append(QLatin1String("audio/pcm")); + + m_updated = true; + } +} + +QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudiodeviceinfo_symbian_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/multimedia/audio/qaudiodeviceinfo_symbian_p.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QAUDIODEVICEINFO_SYMBIAN_P_H +#define QAUDIODEVICEINFO_SYMBIAN_P_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QAudioDeviceInfoInternal + : public QAbstractAudioDeviceInfo +{ + Q_OBJECT + +public: + QAudioDeviceInfoInternal(QByteArray device, QAudio::Mode mode); + ~QAudioDeviceInfoInternal(); + + // QAbstractAudioDeviceInfo + QAudioFormat preferredFormat() const; + bool isFormatSupported(const QAudioFormat &format) const; + QAudioFormat nearestFormat(const QAudioFormat &format) const; + QString deviceName() const; + QStringList codecList(); + QList frequencyList(); + QList channelsList(); + QList sampleSizeList(); + QList byteOrderList(); + QList sampleTypeList(); + static QByteArray defaultInputDevice(); + static QByteArray defaultOutputDevice(); + static QList availableDevices(QAudio::Mode); + +private: + void getSupportedFormats() const; + +private: + QScopedPointer m_devsound; + + QString m_deviceName; + QAudio::Mode m_mode; + + // Mutable to allow lazy initialization when called from const-qualified + // public functions (isFormatSupported, nearestFormat) + mutable bool m_updated; + mutable QStringList m_codecs; + mutable QList m_frequencies; + mutable QList m_channels; + mutable QList m_sampleSizes; + mutable QList m_byteOrders; + mutable QList m_sampleTypes; +}; + +QT_END_NAMESPACE + +#endif diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudioinput.cpp --- a/src/multimedia/audio/qaudioinput.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/qaudioinput.cpp Mon May 03 13:17:34 2010 +0300 @@ -95,7 +95,7 @@ format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::UnSignedInt); - if (QAudioDeviceInfo info(QAudioDeviceInfo::defaultInputDevice()); + QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice(); if (!info.isFormatSupported(format)) { qWarning()<<"default format not supported try to use nearest"; format = info.nearestFormat(format); diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudioinput_alsa_p.cpp --- a/src/multimedia/audio/qaudioinput_alsa_p.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/qaudioinput_alsa_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -121,6 +121,11 @@ err = snd_pcm_prepare(handle); if(err < 0) reset = true; + else { + bytesAvailable = bytesReady(); + if (bytesAvailable <= 0) + reset = true; + } } else if((err == -ESTRPIPE)||(err == -EIO)) { errorState = QAudio::IOError; @@ -443,6 +448,7 @@ if(deviceState != QAudio::ActiveState && deviceState != QAudio::IdleState) return 0; int frames = snd_pcm_avail_update(handle); + if (frames < 0) return frames; if((int)frames > (int)buffer_frames) frames = buffer_frames; @@ -459,6 +465,20 @@ bytesAvailable = bytesReady(); + if (bytesAvailable < 0) { + // bytesAvailable as negative is error code, try to recover from it. + xrun_recovery(bytesAvailable); + bytesAvailable = bytesReady(); + if (bytesAvailable < 0) { + // recovery failed must stop and set error. + close(); + errorState = QAudio::IOError; + deviceState = QAudio::StoppedState; + emit stateChanged(deviceState); + return 0; + } + } + int count=0, err = 0; while(count < 5) { int chunks = bytesAvailable/period_size; @@ -588,7 +608,11 @@ qint64 QAudioInputPrivate::processedUSecs() const { - return qint64(1000000) * totalTimeValue / settings.frequency(); + qint64 result = qint64(1000000) * totalTimeValue / + (settings.channels()*(settings.sampleSize()/8)) / + settings.frequency(); + + return result; } void QAudioInputPrivate::suspend() diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudioinput_mac_p.cpp --- a/src/multimedia/audio/qaudioinput_mac_p.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/qaudioinput_mac_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -54,17 +54,16 @@ #include #include -#include #include #include "qaudio_mac_p.h" #include "qaudioinput_mac_p.h" - +#include "qaudiodeviceinfo_mac_p.h" QT_BEGIN_NAMESPACE -namespace +namespace QtMultimediaInternal { static const int default_buffer_size = 4 * 1024; @@ -169,8 +168,10 @@ void reset() { - for (UInt32 i = 0; i < bfs->mNumberBuffers; ++i) + for (UInt32 i = 0; i < bfs->mNumberBuffers; ++i) { bfs->mBuffers[i].mDataByteSize = dataSize; + bfs->mBuffers[i].mData = 0; + } } private: @@ -227,6 +228,7 @@ QObject* parent): QObject(parent), m_deviceError(false), + m_audioConverter(0), m_inputFormat(inputFormat), m_outputFormat(outputFormat) { @@ -238,7 +240,7 @@ m_flushTimer = new QTimer(this); connect(m_flushTimer, SIGNAL(timeout()), SLOT(flushBuffer())); - if (inputFormat.mSampleRate != outputFormat.mSampleRate) { + if (toQAudioFormat(inputFormat) != toQAudioFormat(outputFormat)) { if (AudioConverterNew(&m_inputFormat, &m_outputFormat, &m_audioConverter) != noErr) { qWarning() << "QAudioInput: Unable to create an Audio Converter"; m_audioConverter = 0; @@ -517,13 +519,14 @@ if (QAudio::Mode(mode) == QAudio::AudioOutput) errorCode = QAudio::OpenError; else { + audioDeviceInfo = new QAudioDeviceInfoInternal(device, QAudio::AudioInput); isOpen = false; audioDeviceId = AudioDeviceID(did); audioUnit = 0; startTime = 0; totalFrames = 0; audioBuffer = 0; - internalBufferSize = default_buffer_size; + internalBufferSize = QtMultimediaInternal::default_buffer_size; clockFrequency = AudioGetHostClockFrequency() / 1000; errorCode = QAudio::NoError; stateCode = QAudio::StoppedState; @@ -537,6 +540,7 @@ QAudioInputPrivate::~QAudioInputPrivate() { close(); + delete audioDeviceInfo; } bool QAudioInputPrivate::open() @@ -574,7 +578,7 @@ 1, &enable, sizeof(enable)) != noErr) { - qWarning() << "QAudioInput: Unabled to switch to input mode (Enable Input)"; + qWarning() << "QAudioInput: Unable to switch to input mode (Enable Input)"; return false; } @@ -585,7 +589,7 @@ 0, &enable, sizeof(enable)) != noErr) { - qWarning() << "QAudioInput: Unabled to switch to input mode (Disable output)"; + qWarning() << "QAudioInput: Unable to switch to input mode (Disable output)"; return false; } @@ -616,35 +620,40 @@ } // Set format + // Wanted streamFormat = toAudioStreamBasicDescription(audioFormat); - size = sizeof(deviceFormat); - if (AudioUnitGetProperty(audioUnit, - kAudioUnitProperty_StreamFormat, - kAudioUnitScope_Input, - 1, - &deviceFormat, - &size) != noErr) { - qWarning() << "QAudioInput: Unable to retrieve device format"; - return false; - } - - // If the device frequency is different to the requested use a converter - if (deviceFormat.mSampleRate != streamFormat.mSampleRate) { - AudioUnitSetProperty(audioUnit, + // Required on unit + if (audioFormat == audioDeviceInfo->preferredFormat()) { + deviceFormat = streamFormat; + AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &deviceFormat, - sizeof(streamFormat)); + sizeof(deviceFormat)); } else { - AudioUnitSetProperty(audioUnit, - kAudioUnitProperty_StreamFormat, - kAudioUnitScope_Output, - 1, - &streamFormat, - sizeof(streamFormat)); + size = sizeof(deviceFormat); + if (AudioUnitGetProperty(audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, + 1, + &deviceFormat, + &size) != noErr) { + qWarning() << "QAudioInput: Unable to retrieve device format"; + return false; + } + + if (AudioUnitSetProperty(audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, + 1, + &deviceFormat, + sizeof(deviceFormat)) != noErr) { + qWarning() << "QAudioInput: Unable to set device format"; + return false; + } } // Setup buffers @@ -661,20 +670,20 @@ } // Allocate buffer - periodSizeBytes = (numberOfFrames * streamFormat.mSampleRate / deviceFormat.mSampleRate) * - streamFormat.mBytesPerFrame; + periodSizeBytes = numberOfFrames * streamFormat.mBytesPerFrame; + if (internalBufferSize < periodSizeBytes * 2) internalBufferSize = periodSizeBytes * 2; else internalBufferSize -= internalBufferSize % streamFormat.mBytesPerFrame; - audioBuffer = new QAudioInputBuffer(internalBufferSize, + audioBuffer = new QtMultimediaInternal::QAudioInputBuffer(internalBufferSize, periodSizeBytes, deviceFormat, streamFormat, this); - audioIO = new MacInputDevice(audioBuffer, this); + audioIO = new QtMultimediaInternal::MacInputDevice(audioBuffer, this); // Init if (AudioUnitInitialize(audioUnit) != noErr) { @@ -707,7 +716,7 @@ { QIODevice* op = device; - if (!open()) { + if (!audioFormat.isValid() || !open()) { stateCode = QAudio::StoppedState; errorCode = QAudio::OpenError; return audioIO; @@ -804,6 +813,12 @@ void QAudioInputPrivate::setNotifyInterval(int milliSeconds) { + if (intervalTimer->interval() == milliSeconds) + return; + + if (milliSeconds <= 0) + milliSeconds = 0; + intervalTimer->setInterval(milliSeconds); } @@ -883,7 +898,8 @@ void QAudioInputPrivate::startTimers() { audioBuffer->startFlushTimer(); - intervalTimer->start(); + if (intervalTimer->interval() > 0) + intervalTimer->start(); } void QAudioInputPrivate::stopTimers() diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudioinput_mac_p.h --- a/src/multimedia/audio/qaudioinput_mac_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/qaudioinput_mac_p.h Mon May 03 13:17:34 2010 +0300 @@ -74,8 +74,9 @@ class QTimer; class QIODevice; +class QAbstractAudioDeviceInfo; -namespace +namespace QtMultimediaInternal { class QAudioInputBuffer; } @@ -97,13 +98,14 @@ UInt64 startTime; QAudio::Error errorCode; QAudio::State stateCode; - QAudioInputBuffer* audioBuffer; + QtMultimediaInternal::QAudioInputBuffer* audioBuffer; QMutex mutex; QWaitCondition threadFinished; QAtomicInt audioThreadState; QTimer* intervalTimer; AudioStreamBasicDescription streamFormat; AudioStreamBasicDescription deviceFormat; + QAbstractAudioDeviceInfo *audioDeviceInfo; QAudioInputPrivate(const QByteArray& device, QAudioFormat const& format); ~QAudioInputPrivate(); diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudioinput_symbian_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/multimedia/audio/qaudioinput_symbian_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,594 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qaudioinput_symbian_p.h" + +QT_BEGIN_NAMESPACE + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +const int PushInterval = 50; // ms + + +//----------------------------------------------------------------------------- +// Private class +//----------------------------------------------------------------------------- + +SymbianAudioInputPrivate::SymbianAudioInputPrivate( + QAudioInputPrivate *audioDevice) + : m_audioDevice(audioDevice) +{ + +} + +SymbianAudioInputPrivate::~SymbianAudioInputPrivate() +{ + +} + +qint64 SymbianAudioInputPrivate::readData(char *data, qint64 len) +{ + qint64 totalRead = 0; + + if (m_audioDevice->state() == QAudio::ActiveState || + m_audioDevice->state() == QAudio::IdleState) { + + while (totalRead < len) { + const qint64 read = m_audioDevice->read(data + totalRead, + len - totalRead); + if (read > 0) + totalRead += read; + else + break; + } + } + + return totalRead; +} + +qint64 SymbianAudioInputPrivate::writeData(const char *data, qint64 len) +{ + Q_UNUSED(data) + Q_UNUSED(len) + return 0; +} + +void SymbianAudioInputPrivate::dataReady() +{ + emit readyRead(); +} + + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +QAudioInputPrivate::QAudioInputPrivate(const QByteArray &device, + const QAudioFormat &format) + : m_device(device) + , m_format(format) + , m_clientBufferSize(SymbianAudio::DefaultBufferSize) + , m_notifyInterval(SymbianAudio::DefaultNotifyInterval) + , m_notifyTimer(new QTimer(this)) + , m_error(QAudio::NoError) + , m_internalState(SymbianAudio::ClosedState) + , m_externalState(QAudio::StoppedState) + , m_pullMode(false) + , m_sink(0) + , m_pullTimer(new QTimer(this)) + , m_devSoundBuffer(0) + , m_devSoundBufferSize(0) + , m_totalBytesReady(0) + , m_devSoundBufferPos(0) + , m_totalSamplesRecorded(0) +{ + connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify())); + + SymbianAudio::Utils::formatQtToNative(m_format, m_nativeFourCC, + m_nativeFormat); + + m_pullTimer->setInterval(PushInterval); + connect(m_pullTimer.data(), SIGNAL(timeout()), this, SLOT(pullData())); +} + +QAudioInputPrivate::~QAudioInputPrivate() +{ + close(); +} + +QIODevice* QAudioInputPrivate::start(QIODevice *device) +{ + stop(); + + open(); + if (SymbianAudio::ClosedState != m_internalState) { + if (device) { + m_pullMode = true; + m_sink = device; + } else { + m_sink = new SymbianAudioInputPrivate(this); + m_sink->open(QIODevice::ReadOnly | QIODevice::Unbuffered); + } + + m_elapsed.restart(); + } + + return m_sink; +} + +void QAudioInputPrivate::stop() +{ + close(); +} + +void QAudioInputPrivate::reset() +{ + m_totalSamplesRecorded += getSamplesRecorded(); + m_devSound->Stop(); + startRecording(); +} + +void QAudioInputPrivate::suspend() +{ + if (SymbianAudio::ActiveState == m_internalState + || SymbianAudio::IdleState == m_internalState) { + m_notifyTimer->stop(); + m_pullTimer->stop(); + m_devSound->Pause(); + const qint64 samplesRecorded = getSamplesRecorded(); + m_totalSamplesRecorded += samplesRecorded; + + if (m_devSoundBuffer) { + m_devSoundBufferQ.append(m_devSoundBuffer); + m_devSoundBuffer = 0; + } + + setState(SymbianAudio::SuspendedState); + } +} + +void QAudioInputPrivate::resume() +{ + if (SymbianAudio::SuspendedState == m_internalState) + startDataTransfer(); +} + +int QAudioInputPrivate::bytesReady() const +{ + Q_ASSERT(m_devSoundBufferPos <= m_totalBytesReady); + return m_totalBytesReady - m_devSoundBufferPos; +} + +int QAudioInputPrivate::periodSize() const +{ + return bufferSize(); +} + +void QAudioInputPrivate::setBufferSize(int value) +{ + // Note that DevSound does not allow its client to specify the buffer size. + // This functionality is available via custom interfaces, but since these + // cannot be guaranteed to work across all DevSound implementations, we + // do not use them here. + // In order to comply with the expected bevahiour of QAudioInput, we store + // the value and return it from bufferSize(), but the underlying DevSound + // buffer size remains unchanged. + if (value > 0) + m_clientBufferSize = value; +} + +int QAudioInputPrivate::bufferSize() const +{ + return m_devSoundBufferSize ? m_devSoundBufferSize : m_clientBufferSize; +} + +void QAudioInputPrivate::setNotifyInterval(int ms) +{ + if (ms > 0) { + const int oldNotifyInterval = m_notifyInterval; + m_notifyInterval = ms; + if (m_notifyTimer->isActive() && ms != oldNotifyInterval) + m_notifyTimer->start(m_notifyInterval); + } +} + +int QAudioInputPrivate::notifyInterval() const +{ + return m_notifyInterval; +} + +qint64 QAudioInputPrivate::processedUSecs() const +{ + int samplesPlayed = 0; + if (m_devSound && SymbianAudio::SuspendedState != m_internalState) + samplesPlayed = getSamplesRecorded(); + + // Protect against division by zero + Q_ASSERT_X(m_format.frequency() > 0, Q_FUNC_INFO, "Invalid frequency"); + + const qint64 result = qint64(1000000) * + (samplesPlayed + m_totalSamplesRecorded) + / m_format.frequency(); + + return result; +} + +qint64 QAudioInputPrivate::elapsedUSecs() const +{ + const qint64 result = (QAudio::StoppedState == state()) ? + 0 : m_elapsed.elapsed() * 1000; + return result; +} + +QAudio::Error QAudioInputPrivate::error() const +{ + return m_error; +} + +QAudio::State QAudioInputPrivate::state() const +{ + return m_externalState; +} + +QAudioFormat QAudioInputPrivate::format() const +{ + return m_format; +} + +//----------------------------------------------------------------------------- +// MDevSoundObserver implementation +//----------------------------------------------------------------------------- + +void QAudioInputPrivate::InitializeComplete(TInt aError) +{ + Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState, + Q_FUNC_INFO, "Invalid state"); + + if (KErrNone == aError) + startRecording(); +} + +void QAudioInputPrivate::ToneFinished(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound's tone playback functions, so should + // never receive this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void QAudioInputPrivate::BufferToBeFilled(CMMFBuffer *aBuffer) +{ + Q_UNUSED(aBuffer) + // This class doesn't use DevSound in play mode, so should never receive + // this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void QAudioInputPrivate::PlayError(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound in play mode, so should never receive + // this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void QAudioInputPrivate::BufferToBeEmptied(CMMFBuffer *aBuffer) +{ + // Following receipt of this callback, DevSound should not provide another + // buffer until we have returned the current one. + Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held"); + + CMMFDataBuffer *const buffer = static_cast(aBuffer); + + if (!m_devSoundBufferSize) + m_devSoundBufferSize = buffer->Data().MaxLength(); + + m_totalBytesReady += buffer->Data().Length(); + + if (SymbianAudio::SuspendedState == m_internalState) { + m_devSoundBufferQ.append(buffer); + } else { + // Will be returned to DevSound by bufferEmptied(). + m_devSoundBuffer = buffer; + m_devSoundBufferPos = 0; + + if (bytesReady() && !m_pullMode) + pushData(); + } +} + +void QAudioInputPrivate::RecordError(TInt aError) +{ + Q_UNUSED(aError) + setError(QAudio::IOError); +} + +void QAudioInputPrivate::ConvertError(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound's format conversion functions, so + // should never receive this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void QAudioInputPrivate::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg) +{ + Q_UNUSED(aMessageType) + Q_UNUSED(aMsg) + // Ignore this callback. +} + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void QAudioInputPrivate::open() +{ + Q_ASSERT_X(SymbianAudio::ClosedState == m_internalState, + Q_FUNC_INFO, "DevSound already opened"); + + QT_TRAP_THROWING( m_devSound.reset(CMMFDevSound::NewL()) ) + + QScopedPointer caps( + new SymbianAudio::DevSoundCapabilities(*m_devSound, QAudio::AudioInput)); + + int err = SymbianAudio::Utils::isFormatSupported(m_format, *caps) ? + KErrNone : KErrNotSupported; + + if (KErrNone == err) { + setState(SymbianAudio::InitializingState); + TRAP(err, m_devSound->InitializeL(*this, m_nativeFourCC, + EMMFStateRecording)); + } + + if (KErrNone != err) { + setError(QAudio::OpenError); + m_devSound.reset(); + } +} + +void QAudioInputPrivate::startRecording() +{ + const int samplesRecorded = m_devSound->SamplesRecorded(); + Q_ASSERT(samplesRecorded == 0); + + TRAPD(err, startDevSoundL()); + if (KErrNone == err) { + startDataTransfer(); + } else { + setError(QAudio::OpenError); + close(); + } +} + +void QAudioInputPrivate::startDevSoundL() +{ + TMMFCapabilities nativeFormat = m_devSound->Config(); + m_nativeFormat.iBufferSize = nativeFormat.iBufferSize; + m_devSound->SetConfigL(m_nativeFormat); + m_devSound->RecordInitL(); +} + +void QAudioInputPrivate::startDataTransfer() +{ + m_notifyTimer->start(m_notifyInterval); + + if (m_pullMode) + m_pullTimer->start(); + + if (bytesReady()) { + setState(SymbianAudio::ActiveState); + if (!m_pullMode) + pushData(); + } else { + if (SymbianAudio::SuspendedState == m_internalState) + setState(SymbianAudio::ActiveState); + else + setState(SymbianAudio::IdleState); + } +} + +CMMFDataBuffer* QAudioInputPrivate::currentBuffer() const +{ + CMMFDataBuffer *result = m_devSoundBuffer; + if (!result && !m_devSoundBufferQ.empty()) + result = m_devSoundBufferQ.front(); + return result; +} + +void QAudioInputPrivate::pushData() +{ + Q_ASSERT_X(bytesReady(), Q_FUNC_INFO, "No data available"); + Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, "pushData called when in pull mode"); + qobject_cast(m_sink)->dataReady(); +} + +qint64 QAudioInputPrivate::read(char *data, qint64 len) +{ + // SymbianAudioInputPrivate is ready to read data + + Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, + "read called when in pull mode"); + + qint64 bytesRead = 0; + + CMMFDataBuffer *buffer = 0; + while ((buffer = currentBuffer()) && (bytesRead < len)) { + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + TDesC8 &inputBuffer = buffer->Data(); + + const qint64 inputBytes = bytesReady(); + const qint64 outputBytes = len - bytesRead; + const qint64 copyBytes = outputBytes < inputBytes ? + outputBytes : inputBytes; + + memcpy(data, inputBuffer.Ptr() + m_devSoundBufferPos, copyBytes); + + m_devSoundBufferPos += copyBytes; + data += copyBytes; + bytesRead += copyBytes; + + if (!bytesReady()) + bufferEmptied(); + } + + return bytesRead; +} + +void QAudioInputPrivate::pullData() +{ + Q_ASSERT_X(m_pullMode, Q_FUNC_INFO, + "pullData called when in push mode"); + + CMMFDataBuffer *buffer = 0; + while (buffer = currentBuffer()) { + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + TDesC8 &inputBuffer = buffer->Data(); + + const qint64 inputBytes = bytesReady(); + const qint64 bytesPushed = m_sink->write( + (char*)inputBuffer.Ptr() + m_devSoundBufferPos, inputBytes); + + m_devSoundBufferPos += bytesPushed; + + if (!bytesReady()) + bufferEmptied(); + + if (!bytesPushed) + break; + } +} + +void QAudioInputPrivate::bufferEmptied() +{ + m_devSoundBufferPos = 0; + + if (m_devSoundBuffer) { + m_totalBytesReady -= m_devSoundBuffer->Data().Length(); + m_devSoundBuffer = 0; + m_devSound->RecordData(); + } else { + Q_ASSERT(!m_devSoundBufferQ.empty()); + m_totalBytesReady -= m_devSoundBufferQ.front()->Data().Length(); + m_devSoundBufferQ.erase(m_devSoundBufferQ.begin()); + + // If the queue has been emptied, resume transfer from the hardware + if (m_devSoundBufferQ.empty()) + m_devSound->RecordInitL(); + } + + Q_ASSERT(m_totalBytesReady >= 0); +} + +void QAudioInputPrivate::close() +{ + m_notifyTimer->stop(); + m_pullTimer->stop(); + + m_error = QAudio::NoError; + + if (m_devSound) + m_devSound->Stop(); + m_devSound.reset(); + m_devSoundBuffer = 0; + m_devSoundBufferSize = 0; + m_totalBytesReady = 0; + + if (!m_pullMode) // m_sink is owned + delete m_sink; + m_pullMode = false; + m_sink = 0; + + m_devSoundBufferQ.clear(); + m_devSoundBufferPos = 0; + m_totalSamplesRecorded = 0; + + setState(SymbianAudio::ClosedState); +} + +qint64 QAudioInputPrivate::getSamplesRecorded() const +{ + qint64 result = 0; + if (m_devSound) + result = qint64(m_devSound->SamplesRecorded()); + return result; +} + +void QAudioInputPrivate::setError(QAudio::Error error) +{ + m_error = error; + + // Although no state transition actually occurs here, a stateChanged event + // must be emitted to inform the client that the call to start() was + // unsuccessful. + if (QAudio::OpenError == error) + emit stateChanged(QAudio::StoppedState); + + // Close the DevSound instance. This causes a transition to StoppedState. + // This must be done asynchronously in case the current function was called + // from a DevSound event handler, in which case deleting the DevSound + // instance may cause an exception. + QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection); +} + +void QAudioInputPrivate::setState(SymbianAudio::State newInternalState) +{ + const QAudio::State oldExternalState = m_externalState; + m_internalState = newInternalState; + m_externalState = SymbianAudio::Utils::stateNativeToQt( + m_internalState, initializingState()); + + if (m_externalState != oldExternalState) + emit stateChanged(m_externalState); +} + +QAudio::State QAudioInputPrivate::initializingState() const +{ + return QAudio::IdleState; +} + +QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudioinput_symbian_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/multimedia/audio/qaudioinput_symbian_p.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,188 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QAUDIOINPUT_SYMBIAN_P_H +#define QAUDIOINPUT_SYMBIAN_P_H + +#include +#include +#include +#include +#include "qaudio_symbian_p.h" + +QT_BEGIN_NAMESPACE + +class QAudioInputPrivate; + +class SymbianAudioInputPrivate : public QIODevice +{ + friend class QAudioInputPrivate; + Q_OBJECT +public: + SymbianAudioInputPrivate(QAudioInputPrivate *audio); + ~SymbianAudioInputPrivate(); + + qint64 readData(char *data, qint64 len); + qint64 writeData(const char *data, qint64 len); + + void dataReady(); + +private: + QAudioInputPrivate *const m_audioDevice; +}; + +class QAudioInputPrivate + : public QAbstractAudioInput + , public MDevSoundObserver +{ + friend class SymbianAudioInputPrivate; + Q_OBJECT +public: + QAudioInputPrivate(const QByteArray &device, + const QAudioFormat &audioFormat); + ~QAudioInputPrivate(); + + // QAbstractAudioInput + QIODevice* start(QIODevice *device = 0); + void stop(); + void reset(); + void suspend(); + void resume(); + int bytesReady() const; + int periodSize() const; + void setBufferSize(int value); + int bufferSize() const; + void setNotifyInterval(int milliSeconds); + int notifyInterval() const; + qint64 processedUSecs() const; + qint64 elapsedUSecs() const; + QAudio::Error error() const; + QAudio::State state() const; + QAudioFormat format() const; + + // MDevSoundObserver + void InitializeComplete(TInt aError); + void ToneFinished(TInt aError); + void BufferToBeFilled(CMMFBuffer *aBuffer); + void PlayError(TInt aError); + void BufferToBeEmptied(CMMFBuffer *aBuffer); + void RecordError(TInt aError); + void ConvertError(TInt aError); + void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg); + +private slots: + void pullData(); + +private: + void open(); + void startRecording(); + void startDevSoundL(); + void startDataTransfer(); + CMMFDataBuffer* currentBuffer() const; + void pushData(); + qint64 read(char *data, qint64 len); + void bufferEmptied(); + Q_INVOKABLE void close(); + + qint64 getSamplesRecorded() const; + + void setError(QAudio::Error error); + void setState(SymbianAudio::State state); + + QAudio::State initializingState() const; + +private: + const QByteArray m_device; + const QAudioFormat m_format; + + int m_clientBufferSize; + int m_notifyInterval; + QScopedPointer m_notifyTimer; + QTime m_elapsed; + QAudio::Error m_error; + + SymbianAudio::State m_internalState; + QAudio::State m_externalState; + + bool m_pullMode; + QIODevice *m_sink; + + QScopedPointer m_pullTimer; + + QScopedPointer m_devSound; + TUint32 m_nativeFourCC; + TMMFCapabilities m_nativeFormat; + + // Latest buffer provided by DevSound, to be empied of data. + CMMFDataBuffer *m_devSoundBuffer; + + int m_devSoundBufferSize; + + // Total amount of data in buffers provided by DevSound + int m_totalBytesReady; + + // Queue of buffers returned after call to CMMFDevSound::Pause(). + QList m_devSoundBufferQ; + + // Current read position within m_devSoundBuffer + qint64 m_devSoundBufferPos; + + // Samples recorded up to the last call to suspend(). It is necessary + // to cache this because suspend() is implemented using + // CMMFDevSound::Stop(), which resets DevSound's SamplesRecorded() counter. + quint32 m_totalSamplesRecorded; + +}; + +QT_END_NAMESPACE + +#endif diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudiooutput_alsa_p.cpp --- a/src/multimedia/audio/qaudiooutput_alsa_p.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/qaudiooutput_alsa_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -369,10 +369,52 @@ } } if ( !fatal ) { + unsigned int maxBufferTime = 0; + unsigned int minBufferTime = 0; + unsigned int maxPeriodTime = 0; + unsigned int minPeriodTime = 0; + + err = snd_pcm_hw_params_get_buffer_time_max(hwparams, &maxBufferTime, &dir); + if ( err >= 0) + err = snd_pcm_hw_params_get_buffer_time_min(hwparams, &minBufferTime, &dir); + if ( err >= 0) + err = snd_pcm_hw_params_get_period_time_max(hwparams, &maxPeriodTime, &dir); + if ( err >= 0) + err = snd_pcm_hw_params_get_period_time_min(hwparams, &minPeriodTime, &dir); + + if ( err < 0 ) { + fatal = true; + errMessage = QString::fromLatin1("QAudioOutput: buffer/period min and max: err = %1").arg(err); + } else { + if (maxBufferTime < buffer_time || buffer_time < minBufferTime || maxPeriodTime < period_time || minPeriodTime > period_time) { +#ifdef DEBUG_AUDIO + qDebug()<<"defaults out of range"; + qDebug()<<"pmin="<interval() == milliSeconds) + return; + + if (milliSeconds <= 0) + milliSeconds = 0; + intervalTimer->setInterval(milliSeconds); } @@ -622,7 +628,8 @@ void QAudioOutputPrivate::startTimers() { audioBuffer->startFillTimer(); - intervalTimer->start(); + if (intervalTimer->interval() > 0) + intervalTimer->start(); } void QAudioOutputPrivate::stopTimers() diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudiooutput_mac_p.h --- a/src/multimedia/audio/qaudiooutput_mac_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/qaudiooutput_mac_p.h Mon May 03 13:17:34 2010 +0300 @@ -74,7 +74,7 @@ class QIODevice; -namespace +namespace QtMultimediaInternal { class QAudioOutputBuffer; } @@ -96,7 +96,7 @@ UInt64 startTime; AudioStreamBasicDescription deviceFormat; AudioStreamBasicDescription streamFormat; - QAudioOutputBuffer* audioBuffer; + QtMultimediaInternal::QAudioOutputBuffer* audioBuffer; QAtomicInt audioThreadState; QWaitCondition threadFinished; QMutex mutex; diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudiooutput_symbian_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/multimedia/audio/qaudiooutput_symbian_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,697 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qaudiooutput_symbian_p.h" + +QT_BEGIN_NAMESPACE + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +const int UnderflowTimerInterval = 50; // ms + + +//----------------------------------------------------------------------------- +// Private class +//----------------------------------------------------------------------------- + +SymbianAudioOutputPrivate::SymbianAudioOutputPrivate( + QAudioOutputPrivate *audioDevice) + : m_audioDevice(audioDevice) +{ + +} + +SymbianAudioOutputPrivate::~SymbianAudioOutputPrivate() +{ + +} + +qint64 SymbianAudioOutputPrivate::readData(char *data, qint64 len) +{ + Q_UNUSED(data) + Q_UNUSED(len) + return 0; +} + +qint64 SymbianAudioOutputPrivate::writeData(const char *data, qint64 len) +{ + qint64 totalWritten = 0; + + if (m_audioDevice->state() == QAudio::ActiveState || + m_audioDevice->state() == QAudio::IdleState) { + + while (totalWritten < len) { + const qint64 written = m_audioDevice->pushData(data + totalWritten, + len - totalWritten); + if (written > 0) + totalWritten += written; + else + break; + } + } + + return totalWritten; +} + + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +QAudioOutputPrivate::QAudioOutputPrivate(const QByteArray &device, + const QAudioFormat &format) + : m_device(device) + , m_format(format) + , m_clientBufferSize(SymbianAudio::DefaultBufferSize) + , m_notifyInterval(SymbianAudio::DefaultNotifyInterval) + , m_notifyTimer(new QTimer(this)) + , m_error(QAudio::NoError) + , m_internalState(SymbianAudio::ClosedState) + , m_externalState(QAudio::StoppedState) + , m_pullMode(false) + , m_source(0) + , m_devSoundBuffer(0) + , m_devSoundBufferSize(0) + , m_bytesWritten(0) + , m_pushDataReady(false) + , m_bytesPadding(0) + , m_underflow(false) + , m_lastBuffer(false) + , m_underflowTimer(new QTimer(this)) + , m_samplesPlayed(0) + , m_totalSamplesPlayed(0) +{ + connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify())); + + SymbianAudio::Utils::formatQtToNative(m_format, m_nativeFourCC, + m_nativeFormat); + + m_underflowTimer->setInterval(UnderflowTimerInterval); + connect(m_underflowTimer.data(), SIGNAL(timeout()), this, + SLOT(underflowTimerExpired())); +} + +QAudioOutputPrivate::~QAudioOutputPrivate() +{ + close(); +} + +QIODevice* QAudioOutputPrivate::start(QIODevice *device) +{ + stop(); + + // We have to set these before the call to open() because of the + // logic in initializingState() + if (device) { + m_pullMode = true; + m_source = device; + } + + open(); + + if (SymbianAudio::ClosedState != m_internalState) { + if (device) { + connect(m_source, SIGNAL(readyRead()), this, SLOT(dataReady())); + } else { + m_source = new SymbianAudioOutputPrivate(this); + m_source->open(QIODevice::WriteOnly | QIODevice::Unbuffered); + } + + m_elapsed.restart(); + } + + return m_source; +} + +void QAudioOutputPrivate::stop() +{ + close(); +} + +void QAudioOutputPrivate::reset() +{ + m_totalSamplesPlayed += getSamplesPlayed(); + m_devSound->Stop(); + m_bytesPadding = 0; + startPlayback(); +} + +void QAudioOutputPrivate::suspend() +{ + if (SymbianAudio::ActiveState == m_internalState + || SymbianAudio::IdleState == m_internalState) { + m_notifyTimer->stop(); + m_underflowTimer->stop(); + + const qint64 samplesWritten = SymbianAudio::Utils::bytesToSamples( + m_format, m_bytesWritten); + + const qint64 samplesPlayed = getSamplesPlayed(); + + m_bytesWritten = 0; + + // CMMFDevSound::Pause() is not guaranteed to work correctly in all + // implementations, for play-mode DevSound sessions. We therefore + // have to implement suspend() by calling CMMFDevSound::Stop(). + // Because this causes buffered data to be dropped, we replace the + // lost data with silence following a call to resume(), in order to + // ensure that processedUSecs() returns the correct value. + m_devSound->Stop(); + m_totalSamplesPlayed += samplesPlayed; + + // Calculate the amount of data dropped + const qint64 paddingSamples = samplesWritten - samplesPlayed; + m_bytesPadding = SymbianAudio::Utils::samplesToBytes(m_format, + paddingSamples); + + setState(SymbianAudio::SuspendedState); + } +} + +void QAudioOutputPrivate::resume() +{ + if (SymbianAudio::SuspendedState == m_internalState) + startPlayback(); +} + +int QAudioOutputPrivate::bytesFree() const +{ + int result = 0; + if (m_devSoundBuffer) { + const TDes8 &outputBuffer = m_devSoundBuffer->Data(); + result = outputBuffer.MaxLength() - outputBuffer.Length(); + } + return result; +} + +int QAudioOutputPrivate::periodSize() const +{ + return bufferSize(); +} + +void QAudioOutputPrivate::setBufferSize(int value) +{ + // Note that DevSound does not allow its client to specify the buffer size. + // This functionality is available via custom interfaces, but since these + // cannot be guaranteed to work across all DevSound implementations, we + // do not use them here. + // In order to comply with the expected bevahiour of QAudioOutput, we store + // the value and return it from bufferSize(), but the underlying DevSound + // buffer size remains unchanged. + if (value > 0) + m_clientBufferSize = value; +} + +int QAudioOutputPrivate::bufferSize() const +{ + return m_devSoundBufferSize ? m_devSoundBufferSize : m_clientBufferSize; +} + +void QAudioOutputPrivate::setNotifyInterval(int ms) +{ + if (ms > 0) { + const int oldNotifyInterval = m_notifyInterval; + m_notifyInterval = ms; + if (m_notifyTimer->isActive() && ms != oldNotifyInterval) + m_notifyTimer->start(m_notifyInterval); + } +} + +int QAudioOutputPrivate::notifyInterval() const +{ + return m_notifyInterval; +} + +qint64 QAudioOutputPrivate::processedUSecs() const +{ + int samplesPlayed = 0; + if (m_devSound && SymbianAudio::SuspendedState != m_internalState) + samplesPlayed = getSamplesPlayed(); + + // Protect against division by zero + Q_ASSERT_X(m_format.frequency() > 0, Q_FUNC_INFO, "Invalid frequency"); + + const qint64 result = qint64(1000000) * + (samplesPlayed + m_totalSamplesPlayed) + / m_format.frequency(); + + return result; +} + +qint64 QAudioOutputPrivate::elapsedUSecs() const +{ + const qint64 result = (QAudio::StoppedState == state()) ? + 0 : m_elapsed.elapsed() * 1000; + return result; +} + +QAudio::Error QAudioOutputPrivate::error() const +{ + return m_error; +} + +QAudio::State QAudioOutputPrivate::state() const +{ + return m_externalState; +} + +QAudioFormat QAudioOutputPrivate::format() const +{ + return m_format; +} + +//----------------------------------------------------------------------------- +// MDevSoundObserver implementation +//----------------------------------------------------------------------------- + +void QAudioOutputPrivate::InitializeComplete(TInt aError) +{ + Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState, + Q_FUNC_INFO, "Invalid state"); + + if (KErrNone == aError) + startPlayback(); +} + +void QAudioOutputPrivate::ToneFinished(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound's tone playback functions, so should + // never receive this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void QAudioOutputPrivate::BufferToBeFilled(CMMFBuffer *aBuffer) +{ + // Following receipt of this callback, DevSound should not provide another + // buffer until we have returned the current one. + Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held"); + + // Will be returned to DevSound by bufferFilled(). + m_devSoundBuffer = static_cast(aBuffer); + + if (!m_devSoundBufferSize) + m_devSoundBufferSize = m_devSoundBuffer->Data().MaxLength(); + + writePaddingData(); + + if (m_pullMode && isDataReady() && !m_bytesPadding) + pullData(); +} + +void QAudioOutputPrivate::PlayError(TInt aError) +{ + switch (aError) { + case KErrUnderflow: + m_underflow = true; + if (m_pullMode && !m_lastBuffer) + setError(QAudio::UnderrunError); + else + setState(SymbianAudio::IdleState); + break; + default: + setError(QAudio::IOError); + break; + } +} + +void QAudioOutputPrivate::BufferToBeEmptied(CMMFBuffer *aBuffer) +{ + Q_UNUSED(aBuffer) + // This class doesn't use DevSound in record mode, so should never receive + // this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void QAudioOutputPrivate::RecordError(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound in record mode, so should never receive + // this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void QAudioOutputPrivate::ConvertError(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound's format conversion functions, so + // should never receive this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void QAudioOutputPrivate::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg) +{ + Q_UNUSED(aMessageType) + Q_UNUSED(aMsg) + // Ignore this callback. +} + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void QAudioOutputPrivate::dataReady() +{ + // Client-provided QIODevice has data ready to read. + + Q_ASSERT_X(m_source->bytesAvailable(), Q_FUNC_INFO, + "readyRead signal received, but no data available"); + + if (!m_bytesPadding) + pullData(); +} + +void QAudioOutputPrivate::underflowTimerExpired() +{ + const TInt samplesPlayed = getSamplesPlayed(); + if (m_samplesPlayed && (samplesPlayed == m_samplesPlayed)) { + setError(QAudio::UnderrunError); + } else { + m_samplesPlayed = samplesPlayed; + m_underflowTimer->start(); + } +} + +void QAudioOutputPrivate::open() +{ + Q_ASSERT_X(SymbianAudio::ClosedState == m_internalState, + Q_FUNC_INFO, "DevSound already opened"); + + QT_TRAP_THROWING( m_devSound.reset(CMMFDevSound::NewL()) ) + + QScopedPointer caps( + new SymbianAudio::DevSoundCapabilities(*m_devSound, + QAudio::AudioOutput)); + + int err = SymbianAudio::Utils::isFormatSupported(m_format, *caps) ? + KErrNone : KErrNotSupported; + + if (KErrNone == err) { + setState(SymbianAudio::InitializingState); + TRAP(err, m_devSound->InitializeL(*this, m_nativeFourCC, + EMMFStatePlaying)); + } + + if (KErrNone != err) { + setError(QAudio::OpenError); + m_devSound.reset(); + } +} + +void QAudioOutputPrivate::startPlayback() +{ + TRAPD(err, startDevSoundL()); + if (KErrNone == err) { + if (isDataReady()) + setState(SymbianAudio::ActiveState); + else + setState(SymbianAudio::IdleState); + + m_notifyTimer->start(m_notifyInterval); + m_underflow = false; + + Q_ASSERT(m_devSound->SamplesPlayed() == 0); + + writePaddingData(); + + if (m_pullMode && m_source->bytesAvailable() && !m_bytesPadding) + dataReady(); + } else { + setError(QAudio::OpenError); + close(); + } +} + +void QAudioOutputPrivate::startDevSoundL() +{ + TMMFCapabilities nativeFormat = m_devSound->Config(); + m_nativeFormat.iBufferSize = nativeFormat.iBufferSize; + m_devSound->SetConfigL(m_nativeFormat); + m_devSound->PlayInitL(); +} + +void QAudioOutputPrivate::writePaddingData() +{ + // See comments in suspend() + + while (m_devSoundBuffer && m_bytesPadding) { + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + TDes8 &outputBuffer = m_devSoundBuffer->Data(); + const qint64 outputBytes = bytesFree(); + const qint64 paddingBytes = outputBytes < m_bytesPadding ? + outputBytes : m_bytesPadding; + unsigned char *ptr = const_cast(outputBuffer.Ptr()); + Mem::FillZ(ptr, paddingBytes); + outputBuffer.SetLength(outputBuffer.Length() + paddingBytes); + m_bytesPadding -= paddingBytes; + + if (m_pullMode && m_source->atEnd()) + lastBufferFilled(); + if (paddingBytes == outputBytes) + bufferFilled(); + } +} + +qint64 QAudioOutputPrivate::pushData(const char *data, qint64 len) +{ + // Data has been written to SymbianAudioOutputPrivate + + Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, + "pushData called when in pull mode"); + + const unsigned char *const inputPtr = + reinterpret_cast(data); + qint64 bytesWritten = 0; + + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + while (m_devSoundBuffer && (bytesWritten < len)) { + // writePaddingData() is called from BufferToBeFilled(), so we should + // never have any padding data left at this point. + Q_ASSERT_X(0 == m_bytesPadding, Q_FUNC_INFO, + "Padding bytes remaining in pushData"); + + TDes8 &outputBuffer = m_devSoundBuffer->Data(); + + const qint64 outputBytes = bytesFree(); + const qint64 inputBytes = len - bytesWritten; + const qint64 copyBytes = outputBytes < inputBytes ? + outputBytes : inputBytes; + + outputBuffer.Append(inputPtr + bytesWritten, copyBytes); + bytesWritten += copyBytes; + + bufferFilled(); + } + + m_pushDataReady = (bytesWritten < len); + + // If DevSound is still initializing (m_internalState == InitializingState), + // we cannot transition m_internalState to ActiveState, but we must emit + // an (external) state change from IdleState to ActiveState. The following + // call triggers this signal. + setState(m_internalState); + + return bytesWritten; +} + +void QAudioOutputPrivate::pullData() +{ + Q_ASSERT_X(m_pullMode, Q_FUNC_INFO, + "pullData called when in push mode"); + + if (m_bytesPadding) + m_bytesPadding = 1; + + // writePaddingData() is called by BufferToBeFilled() before pullData(), + // so we should never have any padding data left at this point. + Q_ASSERT_X(0 == m_bytesPadding, Q_FUNC_INFO, + "Padding bytes remaining in pullData"); + + qint64 inputBytes = m_source->bytesAvailable(); + while (m_devSoundBuffer && inputBytes) { + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + TDes8 &outputBuffer = m_devSoundBuffer->Data(); + + const qint64 outputBytes = bytesFree(); + const qint64 copyBytes = outputBytes < inputBytes ? + outputBytes : inputBytes; + + char *outputPtr = (char*)(outputBuffer.Ptr() + outputBuffer.Length()); + const qint64 bytesCopied = m_source->read(outputPtr, copyBytes); + Q_ASSERT(bytesCopied == copyBytes); + outputBuffer.SetLength(outputBuffer.Length() + bytesCopied); + inputBytes -= bytesCopied; + + if (m_source->atEnd()) + lastBufferFilled(); + else if (copyBytes == outputBytes) + bufferFilled(); + } +} + +void QAudioOutputPrivate::bufferFilled() +{ + Q_ASSERT_X(m_devSoundBuffer, Q_FUNC_INFO, "No buffer to return"); + + const TDes8 &outputBuffer = m_devSoundBuffer->Data(); + m_bytesWritten += outputBuffer.Length(); + + m_devSoundBuffer = 0; + + m_samplesPlayed = getSamplesPlayed(); + m_underflowTimer->start(); + + if (QAudio::UnderrunError == m_error) + m_error = QAudio::NoError; + + m_devSound->PlayData(); +} + +void QAudioOutputPrivate::lastBufferFilled() +{ + Q_ASSERT_X(m_devSoundBuffer, Q_FUNC_INFO, "No buffer to fill"); + Q_ASSERT_X(!m_lastBuffer, Q_FUNC_INFO, "Last buffer already sent"); + m_lastBuffer = true; + m_devSoundBuffer->SetLastBuffer(ETrue); + bufferFilled(); +} + +void QAudioOutputPrivate::close() +{ + m_notifyTimer->stop(); + m_underflowTimer->stop(); + + m_error = QAudio::NoError; + + if (m_devSound) + m_devSound->Stop(); + m_devSound.reset(); + m_devSoundBuffer = 0; + m_devSoundBufferSize = 0; + + if (!m_pullMode) // m_source is owned + delete m_source; + m_pullMode = false; + m_source = 0; + + m_bytesWritten = 0; + m_pushDataReady = false; + m_bytesPadding = 0; + m_underflow = false; + m_lastBuffer = false; + m_samplesPlayed = 0; + m_totalSamplesPlayed = 0; + + setState(SymbianAudio::ClosedState); +} + +qint64 QAudioOutputPrivate::getSamplesPlayed() const +{ + qint64 result = 0; + if (m_devSound) { + const qint64 samplesWritten = SymbianAudio::Utils::bytesToSamples( + m_format, m_bytesWritten); + + if (m_underflow) { + result = samplesWritten; + } else { + // This is necessary because some DevSound implementations report + // that they have played more data than has actually been provided to them + // by the client. + const qint64 devSoundSamplesPlayed(m_devSound->SamplesPlayed()); + result = qMin(devSoundSamplesPlayed, samplesWritten); + } + } + return result; +} + +void QAudioOutputPrivate::setError(QAudio::Error error) +{ + m_error = error; + + // Although no state transition actually occurs here, a stateChanged event + // must be emitted to inform the client that the call to start() was + // unsuccessful. + if (QAudio::OpenError == error) + emit stateChanged(QAudio::StoppedState); + + if (QAudio::UnderrunError == error) + setState(SymbianAudio::IdleState); + else + // Close the DevSound instance. This causes a transition to + // StoppedState. This must be done asynchronously in case the + // current function was called from a DevSound event handler, in which + // case deleting the DevSound instance may cause an exception. + QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection); +} + +void QAudioOutputPrivate::setState(SymbianAudio::State newInternalState) +{ + const QAudio::State oldExternalState = m_externalState; + m_internalState = newInternalState; + m_externalState = SymbianAudio::Utils::stateNativeToQt( + m_internalState, initializingState()); + + if (m_externalState != oldExternalState) + emit stateChanged(m_externalState); +} + +bool QAudioOutputPrivate::isDataReady() const +{ + return (m_source && m_source->bytesAvailable()) + || m_bytesPadding + || m_pushDataReady; +} + +QAudio::State QAudioOutputPrivate::initializingState() const +{ + return isDataReady() ? QAudio::ActiveState : QAudio::IdleState; +} + +QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudiooutput_symbian_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/multimedia/audio/qaudiooutput_symbian_p.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,210 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QAUDIOOUTPUT_SYMBIAN_P_H +#define QAUDIOOUTPUT_SYMBIAN_P_H + +#include +#include +#include +#include +#include "qaudio_symbian_p.h" + +QT_BEGIN_NAMESPACE + +class QAudioOutputPrivate; + +class SymbianAudioOutputPrivate : public QIODevice +{ + friend class QAudioOutputPrivate; + Q_OBJECT +public: + SymbianAudioOutputPrivate(QAudioOutputPrivate *audio); + ~SymbianAudioOutputPrivate(); + + qint64 readData(char *data, qint64 len); + qint64 writeData(const char *data, qint64 len); + +private: + QAudioOutputPrivate *const m_audioDevice; +}; + +class QAudioOutputPrivate + : public QAbstractAudioOutput + , public MDevSoundObserver +{ + friend class SymbianAudioOutputPrivate; + Q_OBJECT +public: + QAudioOutputPrivate(const QByteArray &device, + const QAudioFormat &audioFormat); + ~QAudioOutputPrivate(); + + // QAbstractAudioOutput + QIODevice* start(QIODevice *device = 0); + void stop(); + void reset(); + void suspend(); + void resume(); + int bytesFree() const; + int periodSize() const; + void setBufferSize(int value); + int bufferSize() const; + void setNotifyInterval(int milliSeconds); + int notifyInterval() const; + qint64 processedUSecs() const; + qint64 elapsedUSecs() const; + QAudio::Error error() const; + QAudio::State state() const; + QAudioFormat format() const; + + // MDevSoundObserver + void InitializeComplete(TInt aError); + void ToneFinished(TInt aError); + void BufferToBeFilled(CMMFBuffer *aBuffer); + void PlayError(TInt aError); + void BufferToBeEmptied(CMMFBuffer *aBuffer); + void RecordError(TInt aError); + void ConvertError(TInt aError); + void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg); + +private slots: + void dataReady(); + void underflowTimerExpired(); + +private: + void open(); + void startPlayback(); + void startDevSoundL(); + void writePaddingData(); + qint64 pushData(const char *data, qint64 len); + void pullData(); + void bufferFilled(); + void lastBufferFilled(); + Q_INVOKABLE void close(); + + qint64 getSamplesPlayed() const; + + void setError(QAudio::Error error); + void setState(SymbianAudio::State state); + + bool isDataReady() const; + QAudio::State initializingState() const; + +private: + const QByteArray m_device; + const QAudioFormat m_format; + + int m_clientBufferSize; + int m_notifyInterval; + QScopedPointer m_notifyTimer; + QTime m_elapsed; + QAudio::Error m_error; + + SymbianAudio::State m_internalState; + QAudio::State m_externalState; + + bool m_pullMode; + QIODevice *m_source; + + QScopedPointer m_devSound; + TUint32 m_nativeFourCC; + TMMFCapabilities m_nativeFormat; + + // Buffer provided by DevSound, to be filled with data. + CMMFDataBuffer *m_devSoundBuffer; + + int m_devSoundBufferSize; + + // Number of bytes transferred from QIODevice to QAudioOutput. It is + // necessary to count this because data is dropped when suspend() is + // called. The difference between the position reported by DevSound and + // this value allows us to calculate m_bytesPadding; + quint32 m_bytesWritten; + + // True if client has provided data while the audio subsystem was not + // ready to consume it. + bool m_pushDataReady; + + // Number of zero bytes which will be written when client calls resume(). + quint32 m_bytesPadding; + + // True if PlayError(KErrUnderflow) has been called. + bool m_underflow; + + // True if a buffer marked with the "last buffer" flag has been provided + // to DevSound. + bool m_lastBuffer; + + // Some DevSound implementations ignore all underflow errors raised by the + // audio driver, unless the last buffer flag has been set by the client. + // In push-mode playback, this flag will never be set, so the underflow + // error will never be reported. In order to work around this, a timer + // is used, which gets reset every time the client provides more data. If + // the timer expires, an underflow error is raised by this object. + QScopedPointer m_underflowTimer; + + // Result of previous call to CMMFDevSound::SamplesPlayed(). This value is + // used to determine whether, when m_underflowTimer expires, an + // underflow error has actually occurred. + quint32 m_samplesPlayed; + + // Samples played up to the last call to suspend(). It is necessary + // to cache this because suspend() is implemented using + // CMMFDevSound::Stop(), which resets DevSound's SamplesPlayed() counter. + quint32 m_totalSamplesPlayed; + +}; + +QT_END_NAMESPACE + +#endif diff -r 2f34d5167611 -r fcece45ef507 src/multimedia/audio/qaudiooutput_win32_p.cpp --- a/src/multimedia/audio/qaudiooutput_win32_p.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/multimedia/audio/qaudiooutput_win32_p.cpp Mon May 03 13:17:34 2010 +0300 @@ -455,6 +455,9 @@ bool QAudioOutputPrivate::deviceReady() { + if(deviceState == QAudio::StoppedState) + return false; + if(pullMode) { int chunks = bytesAvailable/period_size; #ifdef DEBUG_AUDIO diff -r 2f34d5167611 -r fcece45ef507 src/network/access/qhttpnetworkconnection.cpp --- a/src/network/access/qhttpnetworkconnection.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/access/qhttpnetworkconnection.cpp Mon May 03 13:17:34 2010 +0300 @@ -416,13 +416,25 @@ lowPriorityQueue.prepend(pair); break; } + // this used to be called via invokeMethod and a QueuedConnection + // It is the only place _q_startNextRequest is called directly without going + // through the event loop using a QueuedConnection. + // This is dangerous because of recursion that might occur when emitting + // signals as DirectConnection from this code path. Therefore all signal + // emissions that can come out from this code path need to + // be QueuedConnection. + // We are currently trying to fine-tune this. _q_startNextRequest(); + + return reply; } void QHttpNetworkConnectionPrivate::requeueRequest(const HttpMessagePair &pair) { + Q_Q(QHttpNetworkConnection); + QHttpNetworkRequest request = pair.first; switch (request.priority()) { case QHttpNetworkRequest::HighPriority: @@ -433,8 +445,8 @@ lowPriorityQueue.prepend(pair); break; } - // this used to be called via invokeMethod and a QueuedConnection - _q_startNextRequest(); + + QMetaObject::invokeMethod(q, "_q_startNextRequest", Qt::QueuedConnection); } void QHttpNetworkConnectionPrivate::dequeueAndSendRequest(QAbstractSocket *socket) @@ -682,6 +694,8 @@ +// This function must be called from the event loop. The only +// exception is documented in QHttpNetworkConnectionPrivate::queueRequest void QHttpNetworkConnectionPrivate::_q_startNextRequest() { //resend the necessary ones. diff -r 2f34d5167611 -r fcece45ef507 src/network/access/qhttpnetworkconnectionchannel.cpp --- a/src/network/access/qhttpnetworkconnectionchannel.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp Mon May 03 13:17:34 2010 +0300 @@ -58,6 +58,28 @@ // TODO: Put channel specific stuff here so it does not polute qhttpnetworkconnection.cpp +QHttpNetworkConnectionChannel::QHttpNetworkConnectionChannel() + : socket(0) + , state(IdleState) + , reply(0) + , written(0) + , bytesTotal(0) + , resendCurrent(false) + , lastStatus(0) + , pendingEncrypt(false) + , reconnectAttempts(2) + , authMehtod(QAuthenticatorPrivate::None) + , proxyAuthMehtod(QAuthenticatorPrivate::None) +#ifndef QT_NO_OPENSSL + , ignoreAllSslErrors(false) +#endif + , pipeliningSupported(PipeliningSupportUnknown) + , connection(0) +{ + // Inlining this function in the header leads to compiler error on + // release-armv5, on at least timebox 9.2 and 10.1. +} + void QHttpNetworkConnectionChannel::init() { #ifndef QT_NO_OPENSSL @@ -353,6 +375,7 @@ replyPrivate->autoDecompress = false; } if (replyPrivate->statusCode == 100) { + replyPrivate->clearHttpLayerInformation(); replyPrivate->state = QHttpNetworkReplyPrivate::ReadingStatusState; break; // ignore } @@ -459,6 +482,8 @@ } else { reconnectAttempts--; reply->d_func()->clear(); + reply->d_func()->connection = connection; + reply->d_func()->connectionChannel = this; closeAndResendCurrentRequest(); } } @@ -679,7 +704,11 @@ connection->d_func()->requeueRequest(alreadyPipelinedRequests.at(i)); alreadyPipelinedRequests.clear(); - QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); + // only run when the QHttpNetworkConnection is not currently being destructed, e.g. + // this function is called from _q_disconnected which is called because + // of ~QHttpNetworkConnectionPrivate + if (qobject_cast(connection)) + QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); } void QHttpNetworkConnectionChannel::eatWhitespace() @@ -858,7 +887,14 @@ void QHttpNetworkConnectionChannel::_q_connected() { // improve performance since we get the request sent by the kernel ASAP - socket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + //socket->setSocketOption(QAbstractSocket::LowDelayOption, 1); + // We have this commented out now. It did not have the effect we wanted. If we want to + // do this properly, Qt has to combine multiple HTTP requests into one buffer + // and send this to the kernel in one syscall and then the kernel immediately sends + // it as one TCP packet because of TCP_NODELAY. + // However, this code is currently not in Qt, so we rely on the kernel combining + // the requests into one TCP packet. + // not sure yet if it helps, but it makes sense socket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); @@ -925,7 +961,7 @@ errorCode = QNetworkReply::UnknownNetworkError; break; } - QPointer that = connection; + QPointer that = connection; QString errorString = connection->d_func()->errorDetail(errorCode, socket, socket->errorString()); if (send2Reply) { if (reply) { @@ -980,8 +1016,16 @@ sendRequest(); // otherwise we do nothing } + #endif +void QHttpNetworkConnectionChannel::setConnection(QHttpNetworkConnection *c) +{ + // Inlining this function in the header leads to compiler error on + // release-armv5, on at least timebox 9.2 and 10.1. + connection = c; +} + QT_END_NAMESPACE #include "moc_qhttpnetworkconnectionchannel_p.cpp" diff -r 2f34d5167611 -r fcece45ef507 src/network/access/qhttpnetworkconnectionchannel_p.h --- a/src/network/access/qhttpnetworkconnectionchannel_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/access/qhttpnetworkconnectionchannel_p.h Mon May 03 13:17:34 2010 +0300 @@ -65,6 +65,7 @@ #include #include +#include "qhttpnetworkconnection_p.h" #ifndef QT_NO_HTTP @@ -80,7 +81,6 @@ class QHttpNetworkRequest; class QHttpNetworkReply; class QByteArray; -class QHttpNetworkConnection; #ifndef HttpMessagePair typedef QPair HttpMessagePair; @@ -127,18 +127,10 @@ QList alreadyPipelinedRequests; - QHttpNetworkConnectionChannel() : socket(0), state(IdleState), reply(0), written(0), bytesTotal(0), resendCurrent(false), - lastStatus(0), pendingEncrypt(false), reconnectAttempts(2), - authMehtod(QAuthenticatorPrivate::None), proxyAuthMehtod(QAuthenticatorPrivate::None) -#ifndef QT_NO_OPENSSL - , ignoreAllSslErrors(false) -#endif - , pipeliningSupported(PipeliningSupportUnknown) - , connection(0) - {} - - void setConnection(QHttpNetworkConnection *c) {connection = c;} - QHttpNetworkConnection *connection; + QHttpNetworkConnectionChannel(); + + void setConnection(QHttpNetworkConnection *c); + QPointer connection; void init(); void close(); @@ -187,8 +179,6 @@ #endif }; - - QT_END_NAMESPACE #endif // QT_NO_HTTP diff -r 2f34d5167611 -r fcece45ef507 src/network/access/qhttpnetworkreply.cpp --- a/src/network/access/qhttpnetworkreply.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/access/qhttpnetworkreply.cpp Mon May 03 13:17:34 2010 +0300 @@ -219,7 +219,7 @@ { } -void QHttpNetworkReplyPrivate::clear() +void QHttpNetworkReplyPrivate::clearHttpLayerInformation() { state = NothingDoneState; statusCode = 100; @@ -229,16 +229,22 @@ currentChunkSize = 0; currentChunkRead = 0; connectionCloseEnabled = true; - connection = 0; - connectionChannel = 0; #ifndef QT_NO_COMPRESS if (initInflate) inflateEnd(&inflateStrm); #endif initInflate = false; streamEnd = false; + fields.clear(); +} + +// TODO: Isn't everything HTTP layer related? We don't need to set connection and connectionChannel to 0 at all +void QHttpNetworkReplyPrivate::clear() +{ + connection = 0; + connectionChannel = 0; autoDecompress = false; - fields.clear(); + clearHttpLayerInformation(); } // QHttpNetworkReplyPrivate @@ -539,6 +545,11 @@ || fragment.endsWith("\r\n\n") || fragment.endsWith("\n\n")) allHeaders = true; + + // there is another case: We have no headers. Then the fragment equals just the line ending + if ((fragment.length() == 2 && fragment.endsWith("\r\n")) + || (fragment.length() == 1 && fragment.endsWith("\n"))) + allHeaders = true; } } } while (!allHeaders && haveRead > 0); diff -r 2f34d5167611 -r fcece45ef507 src/network/access/qhttpnetworkreply_p.h --- a/src/network/access/qhttpnetworkreply_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/access/qhttpnetworkreply_p.h Mon May 03 13:17:34 2010 +0300 @@ -172,6 +172,7 @@ bool findChallenge(bool forProxy, QByteArray &challenge) const; QAuthenticatorPrivate::Method authenticationMethod(bool isProxy) const; void clear(); + void clearHttpLayerInformation(); qint64 readReplyBodyRaw(QIODevice *in, QByteDataBuffer *out, qint64 size); qint64 readReplyBodyChunked(QIODevice *in, QByteDataBuffer *out); diff -r 2f34d5167611 -r fcece45ef507 src/network/access/qnetworkaccessmanager.cpp --- a/src/network/access/qnetworkaccessmanager.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/access/qnetworkaccessmanager.cpp Mon May 03 13:17:34 2010 +0300 @@ -107,7 +107,8 @@ object, which holds the common configuration and settings for the requests it sends. It contains the proxy and cache configuration, as well as the signals related to such issues, and reply signals that can be used to - monitor the progress of a network operation. + monitor the progress of a network operation. One QNetworkAccessManager + should be enough for the whole Qt application. Once a QNetworkAccessManager object has been created, the application can use it to send requests over the network. A group of standard functions @@ -118,6 +119,7 @@ A simple download off the network could be accomplished with: \snippet doc/src/snippets/code/src_network_access_qnetworkaccessmanager.cpp 0 + QNetworkAccessManager has an asynchronous API. When the \tt replyFinished slot above is called, the parameter it takes is the QNetworkReply object containing the downloaded data as well as meta-data (headers, etc.). @@ -127,6 +129,11 @@ delete it inside the slot connected to finished(). You can use the deleteLater() function. + \note QNetworkAccessManager queues the requests it receives. The number + of requests executed in parallel is dependent on the protocol. + Currently, for the HTTP protocol on desktop platforms, 6 requests are + executed in parallel for one host/port combination. + A more involved example, assuming the manager is already existent, can be: \snippet doc/src/snippets/code/src_network_access_qnetworkaccessmanager.cpp 1 diff -r 2f34d5167611 -r fcece45ef507 src/network/kernel/qhostinfo.cpp --- a/src/network/kernel/qhostinfo.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/kernel/qhostinfo.cpp Mon May 03 13:17:34 2010 +0300 @@ -112,6 +112,13 @@ To retrieve the name of the local host, use the static QHostInfo::localHostName() function. + \note Since Qt 4.6.1 QHostInfo is using multiple threads for DNS lookup + instead of one dedicated DNS thread. This improves performance, + but also changes the order of signal emissions when using lookupHost() + compared to previous versions of Qt. + \note Since Qt 4.6.3 QHostInfo is using a small internal 60 second DNS cache + for performance improvements. + \sa QAbstractSocket, {http://www.rfc-editor.org/rfc/rfc3492.txt}{RFC 3492} */ @@ -181,9 +188,26 @@ receiver, member, Qt::QueuedConnection); result.data()->emitResultsReady(hostInfo); #else - QHostInfoRunnable* runnable = new QHostInfoRunnable(name, id); - QObject::connect(&runnable->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); - theHostInfoLookupManager()->scheduleLookup(runnable); + QHostInfoLookupManager *manager = theHostInfoLookupManager(); + if (manager) { + // the application is still alive + if (manager->cache.isEnabled()) { + // check cache first + bool valid = false; + QHostInfo info = manager->cache.get(name, &valid); + if (valid) { + info.setLookupId(id); + QHostInfoResult result; + QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); + result.emitResultsReady(info); + return id; + } + } + // cache is not enabled or it was not in the cache, do normal lookup + QHostInfoRunnable* runnable = new QHostInfoRunnable(name, id); + QObject::connect(&runnable->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); + manager->scheduleLookup(runnable); + } #endif return id; @@ -418,14 +442,24 @@ return; } - // check cache - // FIXME + QHostInfo hostInfo; - // if not in cache: OS lookup - QHostInfo hostInfo = QHostInfoAgent::fromName(toBeLookedUp); - - // save to cache - // FIXME + // QHostInfo::lookupHost already checks the cache. However we need to check + // it here too because it might have been cache saved by another QHostInfoRunnable + // in the meanwhile while this QHostInfoRunnable was scheduled but not running + if (manager->cache.isEnabled()) { + // check the cache first + bool valid = false; + hostInfo = manager->cache.get(toBeLookedUp, &valid); + if (!valid) { + // not in cache, we need to do the lookup and store the result in the cache + hostInfo = QHostInfoAgent::fromName(toBeLookedUp); + manager->cache.put(toBeLookedUp, hostInfo); + } + } else { + // cache is not enabled, just do the lookup and continue + hostInfo = QHostInfoAgent::fromName(toBeLookedUp); + } // check aborted again if (manager->wasAborted(id)) { @@ -445,12 +479,18 @@ QHostInfoLookupManager::QHostInfoLookupManager() : mutex(QMutex::Recursive), wasDeleted(false) { moveToThread(QCoreApplicationPrivate::mainThread()); + connect(QCoreApplication::instance(), SIGNAL(destroyed()), SLOT(waitForThreadPoolDone()), Qt::DirectConnection); threadPool.setMaxThreadCount(5); // do 5 DNS lookups in parallel } QHostInfoLookupManager::~QHostInfoLookupManager() { wasDeleted = true; + + // don't qDeleteAll currentLookups, the QThreadPool has ownership + qDeleteAll(postponedLookups); + qDeleteAll(scheduledLookups); + qDeleteAll(finishedLookups); } void QHostInfoLookupManager::work() @@ -570,6 +610,106 @@ work(); } +// This function returns immediatly when we had a result in the cache, else it will later emit a signal +QHostInfo qt_qhostinfo_lookup(const QString &name, QObject *receiver, const char *member, bool *valid, int *id) +{ + *valid = false; + *id = -1; + + // check cache + QHostInfoLookupManager* manager = theHostInfoLookupManager(); + if (manager && manager->cache.isEnabled()) { + QHostInfo info = manager->cache.get(name, valid); + if (*valid) { + return info; + } + } + + // was not in cache, trigger lookup + *id = QHostInfo::lookupHost(name, receiver, member); + + // return empty response, valid==false + return QHostInfo(); +} + +void qt_qhostinfo_clear_cache() +{ + QHostInfoLookupManager* manager = theHostInfoLookupManager(); + if (manager) { + manager->cache.clear(); + } +} + +void Q_AUTOTEST_EXPORT qt_qhostinfo_enable_cache(bool e) +{ + QHostInfoLookupManager* manager = theHostInfoLookupManager(); + if (manager) { + manager->cache.setEnabled(e); + } +} + +// cache for 60 seconds +// cache 64 items +QHostInfoCache::QHostInfoCache() : max_age(60), enabled(true), cache(64) +{ +#ifdef QT_QHOSTINFO_CACHE_DISABLED_BY_DEFAULT + enabled = false; +#endif +} + +bool QHostInfoCache::isEnabled() +{ + return enabled; +} + +// this function is currently only used for the auto tests +// and not usable by public API +void QHostInfoCache::setEnabled(bool e) +{ + enabled = e; +} + + +QHostInfo QHostInfoCache::get(const QString &name, bool *valid) +{ + QMutexLocker locker(&this->mutex); + + *valid = false; + if (cache.contains(name)) { + QHostInfoCacheElement *element = cache.object(name); + if (element->age.elapsed() < max_age*1000) + *valid = true; + return element->info; + + // FIXME idea: + // if too old but not expired, trigger a new lookup + // to freshen our cache + } + + return QHostInfo(); +} + +void QHostInfoCache::put(const QString &name, const QHostInfo &info) +{ + // if the lookup failed, don't cache + if (info.error() != QHostInfo::NoError) + return; + + QHostInfoCacheElement* element = new QHostInfoCacheElement(); + element->info = info; + element->age = QTime(); + element->age.start(); + + QMutexLocker locker(&this->mutex); + cache.insert(name, element); // cache will take ownership +} + +void QHostInfoCache::clear() +{ + QMutexLocker locker(&this->mutex); + cache.clear(); +} + #endif // QT_NO_THREAD QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/network/kernel/qhostinfo_p.h --- a/src/network/kernel/qhostinfo_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/kernel/qhostinfo_p.h Mon May 03 13:17:34 2010 +0300 @@ -68,6 +68,8 @@ #include "QtCore/qrunnable.h" #include "QtCore/qlist.h" #include "QtCore/qqueue.h" +#include +#include #endif QT_BEGIN_NAMESPACE @@ -111,6 +113,34 @@ }; #ifndef QT_NO_THREAD +// These functions are outside of the QHostInfo class and strictly internal. +// Do NOT use them outside of QAbstractSocket. +QHostInfo Q_NETWORK_EXPORT qt_qhostinfo_lookup(const QString &name, QObject *receiver, const char *member, bool *valid, int *id); +void Q_NETWORK_EXPORT qt_qhostinfo_clear_cache(); +void Q_AUTOTEST_EXPORT qt_qhostinfo_enable_cache(bool e); + +class QHostInfoCache +{ +public: + QHostInfoCache(); + const int max_age; // seconds + + QHostInfo get(const QString &name, bool *valid); + void put(const QString &name, const QHostInfo &info); + void clear(); + + bool isEnabled(); + void setEnabled(bool e); +private: + bool enabled; + struct QHostInfoCacheElement { + QHostInfo info; + QTime age; + }; + QCache cache; + QMutex mutex; +}; + // the following classes are used for the (normal) case: We use multiple threads to lookup DNS class QHostInfoRunnable : public QRunnable @@ -141,6 +171,7 @@ void lookupFinished(QHostInfoRunnable *r); bool wasAborted(int id); + QHostInfoCache cache; protected: QList currentLookups; // in progress QList postponedLookups; // postponed because in progress for same host @@ -153,7 +184,11 @@ QMutex mutex; bool wasDeleted; + +private slots: + void waitForThreadPoolDone() { threadPool.waitForDone(); } }; + #endif QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/network/socket/qabstractsocket.cpp --- a/src/network/socket/qabstractsocket.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/socket/qabstractsocket.cpp Mon May 03 13:17:34 2010 +0300 @@ -172,6 +172,10 @@ This signal is emitted after connectToHost() has been called and the host lookup has succeeded. + \note Since Qt 4.6.3 QAbstractSocket may emit hostFound() + directly from the connectToHost() call since a DNS result could have been + cached. + \sa connected() */ @@ -181,6 +185,10 @@ This signal is emitted after connectToHost() has been called and a connection has been successfully established. + \note On some operating systems the connected() signal may + be directly emitted from the connectToHost() call for connections + to the localhost. + \sa connectToHost(), disconnected() */ @@ -354,6 +362,8 @@ #include "qabstractsocket.h" #include "qabstractsocket_p.h" +#include "private/qhostinfo_p.h" + #include #include #include @@ -1369,8 +1379,20 @@ return; #endif } else { - if (d->threadData->eventDispatcher) - d->hostLookupId = QHostInfo::lookupHost(hostName, this, SLOT(_q_startConnecting(QHostInfo))); + if (d->threadData->eventDispatcher) { + // this internal API for QHostInfo either immediatly gives us the desired + // QHostInfo from cache or later calls the _q_startConnecting slot. + bool immediateResultValid = false; + QHostInfo hostInfo = qt_qhostinfo_lookup(hostName, + this, + SLOT(_q_startConnecting(QHostInfo)), + &immediateResultValid, + &d->hostLookupId); + if (immediateResultValid) { + d->hostLookupId = -1; + d->_q_startConnecting(hostInfo); + } + } } #if defined(QABSTRACTSOCKET_DEBUG) diff -r 2f34d5167611 -r fcece45ef507 src/network/ssl/qsslkey.cpp --- a/src/network/ssl/qsslkey.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/network/ssl/qsslkey.cpp Mon May 03 13:17:34 2010 +0300 @@ -119,9 +119,7 @@ if (!bio) return; - void *phrase = passPhrase.isEmpty() - ? (void *)0 - : (void *)passPhrase.constData(); + void *phrase = (void *)passPhrase.constData(); if (algorithm == QSsl::Rsa) { RSA *result = (type == QSsl::PublicKey) diff -r 2f34d5167611 -r fcece45ef507 src/opengl/gl2paintengineex/qglengineshadersource_p.h --- a/src/opengl/gl2paintengineex/qglengineshadersource_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/opengl/gl2paintengineex/qglengineshadersource_p.h Mon May 03 13:17:34 2010 +0300 @@ -331,9 +331,14 @@ varying highp vec2 textureCoords; \n\ uniform lowp sampler2D imageTexture; \n\ lowp vec4 srcPixel() \n\ - { \n\ - return texture2D(imageTexture, textureCoords); \n\ - }\n"; + { \n" +#ifdef QT_OPENGL_ES_2 + // work-around for driver bug + "return 1.0 * texture2D(imageTexture, textureCoords); \n" +#else + "return texture2D(imageTexture, textureCoords); \n" +#endif + "}\n"; static const char* const qglslCustomSrcFragmentShader = "\n\ varying highp vec2 textureCoords; \n\ diff -r 2f34d5167611 -r fcece45ef507 src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp Mon May 03 13:17:34 2010 +0300 @@ -1597,6 +1597,7 @@ delete d->shaderManager; d->shaderManager = 0; + d->currentBrush = QBrush(); #ifdef QT_OPENGL_CACHE_AS_VBOS if (!d->unusedVBOSToClean.isEmpty()) { diff -r 2f34d5167611 -r fcece45ef507 src/opengl/qgl.cpp --- a/src/opengl/qgl.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/opengl/qgl.cpp Mon May 03 13:17:34 2010 +0300 @@ -5451,7 +5451,7 @@ quint32 level = 0; quint32 width = pvrHeader->width; quint32 height = pvrHeader->height; - while (bufferSize > 0 && level < pvrHeader->mipMapCount) { + while (bufferSize > 0 && level <= pvrHeader->mipMapCount) { quint32 size = (qMax(width, minWidth) * qMax(height, minHeight) * pvrHeader->bitsPerPixel) / 8; diff -r 2f34d5167611 -r fcece45ef507 src/opengl/qgl_p.h --- a/src/opengl/qgl_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/opengl/qgl_p.h Mon May 03 13:17:34 2010 +0300 @@ -80,13 +80,19 @@ #define q_vertexTypeEnum GL_FIXED #endif //QT_OPENGL_ES_1_CL -#ifdef QT_OPENGL_ES +#if defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2) QT_BEGIN_INCLUDE_NAMESPACE + #if defined(QT_OPENGL_ES_2) -#include +# include +#endif + +#if defined(QT_GLES_EGL) +# include #else -#include +# include #endif + QT_END_INCLUDE_NAMESPACE #endif @@ -572,7 +578,7 @@ } // One resource per group of shared contexts. -class Q_AUTOTEST_EXPORT QGLContextResource +class Q_OPENGL_EXPORT QGLContextResource { public: typedef void (*FreeFunc)(void *); diff -r 2f34d5167611 -r fcece45ef507 src/openvg/openvg.pro --- a/src/openvg/openvg.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/openvg/openvg.pro Mon May 03 13:17:34 2010 +0300 @@ -3,7 +3,6 @@ gui DEFINES+=QT_BUILD_OPENVG_LIB -DEFINES += QVG_SCISSOR_CLIP contains(QT_CONFIG, shivavg) { DEFINES += QVG_NO_DRAW_GLYPHS @@ -34,6 +33,8 @@ qwindowsurface_vgegl.cpp } +symbian: DEFINES += QVG_RECREATE_ON_SIZE_CHANGE QVG_SCISSOR_CLIP + include(../qbase.pri) unix:QMAKE_PKGCONFIG_REQUIRES = QtCore QtGui diff -r 2f34d5167611 -r fcece45ef507 src/openvg/qpaintengine_vg.cpp --- a/src/openvg/qpaintengine_vg.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/openvg/qpaintengine_vg.cpp Mon May 03 13:17:34 2010 +0300 @@ -131,9 +131,8 @@ void draw(VGPath path, const QPen& pen, const QBrush& brush, VGint rule = VG_EVEN_ODD); void stroke(VGPath path, const QPen& pen); void fill(VGPath path, const QBrush& brush, VGint rule = VG_EVEN_ODD); - inline void releasePath(VGPath path); - VGPath vectorPathToVGPath(const QVectorPath& path, bool forceNewPath = false); - VGPath painterPathToVGPath(const QPainterPath& path, bool forceNewPath = false); + VGPath vectorPathToVGPath(const QVectorPath& path); + VGPath painterPathToVGPath(const QPainterPath& path); VGPath roundedRectPath(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode); VGPaintType setBrush (VGPaint paint, const QBrush& brush, VGMatrixMode mode, @@ -179,13 +178,12 @@ VGPath roundRectPath; // Cached path for quick drawing of rounded rects. #endif - VGPath reusablePath; // Reusable path for vectorPathToVGPath(), etc. - QTransform transform; // Currently active transform. bool simpleTransform; // True if the transform is simple (non-projective). qreal penScale; // Pen scaling factor from "transform". QTransform pathTransform; // Calculated VG path transformation. + QTransform glyphTransform; // Calculated VG glyph transformation. QTransform imageTransform; // Calculated VG image transformation. bool pathTransformSet; // True if path transform set in the VG context. @@ -353,8 +351,6 @@ roundRectPath = 0; #endif - reusablePath = 0; - simpleTransform = true; pathTransformSet = false; penScale = 1.0; @@ -451,15 +447,6 @@ VG_PATH_CAPABILITY_ALL); vgAppendPathData(linePath, 2, segments, coords); #endif - - // This path can be reused over and over by calling vgClearPath(). - reusablePath = vgCreatePath(VG_PATH_FORMAT_STANDARD, - VG_PATH_DATATYPE_F, - 1.0f, // scale - 0.0f, // bias - 32 + 1, // segmentCapacityHint - 32 * 2, // coordCapacityHint - VG_PATH_CAPABILITY_ALL); } void QVGPaintEnginePrivate::destroy() @@ -479,8 +466,6 @@ if (roundRectPath) vgDestroyPath(roundRectPath); #endif - if (reusablePath) - vgDestroyPath(reusablePath); #if !defined(QVG_NO_DRAW_GLYPHS) QVGFontCache::Iterator it; @@ -516,79 +501,67 @@ void QVGPaintEnginePrivate::updateTransform(QPaintDevice *pdev) { - VGfloat devh = pdev->height() - 1; + VGfloat devh = pdev->height(); // Construct the VG transform by combining the Qt transform with // the following viewport transformation: - // | 1 0 0 | | 1 0 0.5 | | 1 0 0.5 | - // | 0 -1 devh | * | 0 1 -0.5 | = | 0 -1 (0.5 + devh) | - // | 0 0 1 | | 0 0 1 | | 0 0 1 | + // | 1 0 0 | + // | 0 -1 devh | + // | 0 0 1 | + // The glyph transform uses a slightly different transformation: + // | 1 0 0 | | 1 0 0.5 | | 1 0 0.5 | + // | 0 -1 devh - 1 | * | 0 1 -0.5 | = | 0 -1 (devh - 0.5) | + // | 0 0 1 | | 0 0 1 | | 0 0 1 | // The full VG transform is effectively: // 1. Apply the user's transformation matrix. - // 2. Translate by (0.5, -0.5) to correct for Qt and VG putting - // the centre of the pixel at different positions. + // 2. Translate glyphs by an extra (0.5, -0.5). // 3. Flip the co-ordinate system upside down. QTransform viewport(1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, - 0.5f, devh + 0.5f, 1.0f); - - // Compute the path transform and determine if it is projective. - pathTransform = transform * viewport; - bool projective = (pathTransform.m13() != 0.0f || - pathTransform.m23() != 0.0f || - pathTransform.m33() != 1.0f); - + 0.0f, devh, 1.0f); + QTransform gviewport(1.0f, 0.0f, 0.0f, + 0.0f, -1.0f, 0.0f, + 0.5f, devh - 0.5f, 1.0f); + + // Compute the path transform and determine if it is projective. + pathTransform = transform * viewport; + glyphTransform = transform * gviewport; + bool projective = (pathTransform.m13() != 0.0f || + pathTransform.m23() != 0.0f || + pathTransform.m33() != 1.0f); if (projective) { // The engine cannot do projective path transforms for us, // so we will have to convert the co-ordinates ourselves. // Change the matrix to just the viewport transformation. pathTransform = viewport; + glyphTransform = gviewport; simpleTransform = false; } else { simpleTransform = true; } pathTransformSet = false; - // The image transform is always the full transformation, - // because it can be projective. It also does not need the - // (0.5, -0.5) translation because vgDrawImage() implicitly - // adds 0.5 to each co-ordinate. - QTransform viewport2(1.0f, 0.0f, 0.0f, - 0.0f, -1.0f, 0.0f, - 0.0f, devh, 1.0f); - imageTransform = transform * viewport2; + // The image transform is always the full transformation, + imageTransform = transform * viewport; // Calculate the scaling factor to use for turning cosmetic pens // into ordinary non-cosmetic pens. qt_scaleForTransform(transform, &penScale); } -inline void QVGPaintEnginePrivate::releasePath(VGPath path) -{ - if (path == reusablePath) - vgClearPath(path, VG_PATH_CAPABILITY_ALL); - else - vgDestroyPath(path); -} - -VGPath QVGPaintEnginePrivate::vectorPathToVGPath(const QVectorPath& path, bool forceNewPath) +VGPath QVGPaintEnginePrivate::vectorPathToVGPath(const QVectorPath& path) { int count = path.elementCount(); const qreal *points = path.points(); const QPainterPath::ElementType *elements = path.elements(); - VGPath vgpath; - if (forceNewPath) { - vgpath = vgCreatePath(VG_PATH_FORMAT_STANDARD, - VG_PATH_DATATYPE_F, - 1.0f, // scale - 0.0f, // bias - count + 1, // segmentCapacityHint - count * 2, // coordCapacityHint - VG_PATH_CAPABILITY_ALL); - } else { - vgpath = reusablePath; - } + VGPath vgpath = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, + 1.0f, // scale + 0.0f, // bias + count + 1, // segmentCapacityHint + count * 2, // coordCapacityHint + VG_PATH_CAPABILITY_ALL); // Size is sufficient segments for drawRoundedRect() paths. QVarLengthArray segments; @@ -760,22 +733,17 @@ return vgpath; } -VGPath QVGPaintEnginePrivate::painterPathToVGPath(const QPainterPath& path, bool forceNewPath) +VGPath QVGPaintEnginePrivate::painterPathToVGPath(const QPainterPath& path) { int count = path.elementCount(); - VGPath vgpath; - if (forceNewPath) { - vgpath = vgCreatePath(VG_PATH_FORMAT_STANDARD, - VG_PATH_DATATYPE_F, - 1.0f, // scale - 0.0f, // bias - count + 1, // segmentCapacityHint - count * 2, // coordCapacityHint - VG_PATH_CAPABILITY_ALL); - } else { - vgpath = reusablePath; - } + VGPath vgpath = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, + 1.0f, // scale + 0.0f, // bias + count + 1, // segmentCapacityHint + count * 2, // coordCapacityHint + VG_PATH_CAPABILITY_ALL); if (count == 0) return vgpath; @@ -994,7 +962,13 @@ vgModifyPathCoords(vgpath, 0, 9, pts); } #else - VGPath vgpath = reusablePath; + VGPath vgpath = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, + 1.0f, // scale + 0.0f, // bias + 10, // segmentCapacityHint + 17 * 2, // coordCapacityHint + VG_PATH_CAPABILITY_ALL); vgAppendPathData(vgpath, 10, roundedrect_types, pts); #endif @@ -1550,7 +1524,7 @@ d->draw(vgpath, s->pen, s->brush, VG_EVEN_ODD); else d->draw(vgpath, s->pen, s->brush, VG_NON_ZERO); - d->releasePath(vgpath); + vgDestroyPath(vgpath); } void QVGPaintEngine::fill(const QVectorPath &path, const QBrush &brush) @@ -1561,7 +1535,7 @@ d->fill(vgpath, brush, VG_EVEN_ODD); else d->fill(vgpath, brush, VG_NON_ZERO); - d->releasePath(vgpath); + vgDestroyPath(vgpath); } void QVGPaintEngine::stroke(const QVectorPath &path, const QPen &pen) @@ -1569,7 +1543,7 @@ Q_D(QVGPaintEngine); VGPath vgpath = d->vectorPathToVGPath(path); d->stroke(vgpath, pen); - d->releasePath(vgpath); + vgDestroyPath(vgpath); } // Determine if a co-ordinate transform is simple enough to allow @@ -1765,7 +1739,7 @@ default: break; } - d->releasePath(vgpath); + vgDestroyPath(vgpath); vgSeti(VG_MASKING, VG_TRUE); d->maskValid = true; @@ -2082,7 +2056,7 @@ default: break; } - d->releasePath(vgpath); + vgDestroyPath(vgpath); vgSeti(VG_MASKING, VG_TRUE); d->maskValid = true; @@ -2096,7 +2070,7 @@ void QVGPaintEnginePrivate::ensureMask (QVGPaintEngine *engine, int width, int height) { - scissorMask = false; + scissorMask = false; if (maskIsSet) { vgMask(VG_INVALID_HANDLE, VG_FILL_MASK, 0, 0, width, height); maskRect = QRect(); @@ -2522,7 +2496,7 @@ VGPath vgpath = d->roundedRectPath(rect, xrad, yrad, mode); d->draw(vgpath, s->pen, s->brush); #if defined(QVG_NO_MODIFY_PATH) - d->releasePath(vgpath); + vgDestroyPath(vgpath); #endif } else { QPaintEngineEx::drawRoundedRect(rect, xrad, yrad, mode); @@ -2671,7 +2645,13 @@ Q_D(QVGPaintEngine); if (d->simpleTransform) { QVGPainterState *s = state(); - VGPath path = d->reusablePath; + VGPath path = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, + 1.0f, // scale + 0.0f, // bias + 4, // segmentCapacityHint + 12, // coordCapacityHint + VG_PATH_CAPABILITY_ALL); static VGubyte segments[4] = { VG_MOVE_TO_ABS, VG_SCCWARC_TO_REL, @@ -2695,7 +2675,7 @@ coords[11] = 0.0f; vgAppendPathData(path, 4, segments, coords); d->draw(path, s->pen, s->brush); - d->releasePath(path); + vgDestroyPath(path); } else { // The projective transform version of an ellipse is difficult. // Generate a QVectorPath containing cubic curves and transform that. @@ -2719,7 +2699,7 @@ d->draw(vgpath, s->pen, s->brush, VG_EVEN_ODD); else d->draw(vgpath, s->pen, s->brush, VG_NON_ZERO); - d->releasePath(vgpath); + vgDestroyPath(vgpath); } void QVGPaintEngine::drawPoints(const QPointF *points, int pointCount) @@ -2794,7 +2774,13 @@ { Q_D(QVGPaintEngine); QVGPainterState *s = state(); - VGPath path = d->reusablePath; + VGPath path = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, + 1.0f, // scale + 0.0f, // bias + pointCount + 1, // segmentCapacityHint + pointCount * 2, // coordCapacityHint + VG_PATH_CAPABILITY_ALL); QVarLengthArray coords; QVarLengthArray segments; for (int i = 0; i < pointCount; ++i, ++points) { @@ -2828,14 +2814,20 @@ d->draw(path, s->pen, s->brush, VG_EVEN_ODD); break; } - d->releasePath(path); + vgDestroyPath(path); } void QVGPaintEngine::drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode) { Q_D(QVGPaintEngine); QVGPainterState *s = state(); - VGPath path = d->reusablePath; + VGPath path = vgCreatePath(VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, + 1.0f, // scale + 0.0f, // bias + pointCount + 1, // segmentCapacityHint + pointCount * 2, // coordCapacityHint + VG_PATH_CAPABILITY_ALL); QVarLengthArray coords; QVarLengthArray segments; for (int i = 0; i < pointCount; ++i, ++points) { @@ -2869,7 +2861,7 @@ d->draw(path, s->pen, s->brush, VG_EVEN_ODD); break; } - d->releasePath(path); + vgDestroyPath(path); } void QVGPaintEnginePrivate::setImageOptions() @@ -3268,7 +3260,7 @@ ti.fontEngine->getUnscaledGlyph(glyph, &path, &metrics); VGPath vgPath; if (!path.isEmpty()) { - vgPath = d->painterPathToVGPath(path, true); + vgPath = d->painterPathToVGPath(path); } else { // Probably a "space" character with no visible outline. vgPath = VG_INVALID_HANDLE; @@ -3328,7 +3320,7 @@ } // Set the transformation to use for drawing the current glyphs. - QTransform glyphTransform(d->pathTransform); + QTransform glyphTransform(d->glyphTransform); glyphTransform.translate(p.x(), p.y()); #if defined(QVG_NO_IMAGE_GLYPHS) glyphTransform.scale(glyphCache->scaleX, glyphCache->scaleY); @@ -3661,10 +3653,10 @@ } else { // Set the path transform to the default viewport transformation. - VGfloat devh = screenSize.height() - 1; + VGfloat devh = screenSize.height(); QTransform viewport(1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, - -0.5f, devh + 0.5f, 1.0f); + 0.0f, devh, 1.0f); d->setTransform(VG_MATRIX_PATH_USER_TO_SURFACE, viewport); // Set the brush to use to fill the background. @@ -3700,10 +3692,10 @@ } // Set the image transformation and modes. - VGfloat devh = screenSize.height() - 1; + VGfloat devh = screenSize.height(); QTransform transform(1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, - -0.5f, devh + 0.5f, 1.0f); + 0.0f, devh, 1.0f); transform.translate(offset.x(), offset.y()); d->setTransform(VG_MATRIX_IMAGE_USER_TO_SURFACE, transform); d->setImageMode(VG_DRAW_IMAGE_NORMAL); diff -r 2f34d5167611 -r fcece45ef507 src/openvg/qpixmapdata_vg.cpp --- a/src/openvg/qpixmapdata_vg.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/openvg/qpixmapdata_vg.cpp Mon May 03 13:17:34 2010 +0300 @@ -39,15 +39,16 @@ ** ****************************************************************************/ -#include "../src/gui/egl/qegl_p.h" #include "qpixmapdata_vg_p.h" #include "qpaintengine_vg_p.h" #include #include "qvg_p.h" #include "qvgimagepool_p.h" +#if defined(Q_OS_SYMBIAN) #include #include +#endif #ifdef QT_SYMBIAN_SUPPORTS_SGIMAGE #include typedef EGLImageKHR (*pfnEglCreateImageKHR)(EGLDisplay, EGLContext, EGLenum, EGLClientBuffer, EGLint*); @@ -465,13 +466,9 @@ void QVGPixmapData::fromNativeType(void* pixmap, NativeType type) { + if (type == QPixmapData::SgImage && pixmap) { #if defined(QT_SYMBIAN_SUPPORTS_SGIMAGE) && !defined(QT_NO_EGL) - if (type == QPixmapData::SgImage && pixmap) { RSgImage *sgImage = reinterpret_cast(pixmap); - // when "0" used as argument then - // default display, context are used - if (!context) - context = qt_vg_create_context(0, QInternal::Pixmap); destroyImages(); prevSize = QSize(); @@ -510,7 +507,7 @@ } const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE}; - EGLImageKHR eglImage = eglCreateImageKHR(context->display(), + EGLImageKHR eglImage = eglCreateImageKHR(QEglContext::display(), EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, (EGLClientBuffer)sgImage, @@ -541,6 +538,7 @@ // release stuff eglDestroyImageKHR(QEglContext::display(), eglImage); driver.Close(); +#endif } else if (type == QPixmapData::FbsBitmap) { CFbsBitmap *bitmap = reinterpret_cast(pixmap); @@ -586,16 +584,12 @@ if(deleteSourceBitmap) delete bitmap; } -#else - Q_UNUSED(pixmap); - Q_UNUSED(type); -#endif } void* QVGPixmapData::toNativeType(NativeType type) { + if (type == QPixmapData::SgImage) { #if defined(QT_SYMBIAN_SUPPORTS_SGIMAGE) && !defined(QT_NO_EGL) - if (type == QPixmapData::SgImage) { toVGImage(); if (!isValid() || vgImage == VG_INVALID_HANDLE) @@ -630,7 +624,7 @@ } const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE}; - EGLImageKHR eglImage = eglCreateImageKHR(context->display(), + EGLImageKHR eglImage = eglCreateImageKHR(QEglContext::display(), EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, (EGLClientBuffer)sgImage, @@ -662,6 +656,7 @@ eglDestroyImageKHR(QEglContext::display(), eglImage); driver.Close(); return reinterpret_cast(sgImage); +#endif } else if (type == QPixmapData::FbsBitmap) { CFbsBitmap *bitmap = q_check_ptr(new CFbsBitmap); @@ -683,10 +678,7 @@ return reinterpret_cast(bitmap); } -#else - Q_UNUSED(type); return 0; -#endif } #endif //Q_OS_SYMBIAN diff -r 2f34d5167611 -r fcece45ef507 src/openvg/qwindowsurface_vgegl.cpp --- a/src/openvg/qwindowsurface_vgegl.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/openvg/qwindowsurface_vgegl.cpp Mon May 03 13:17:34 2010 +0300 @@ -39,14 +39,12 @@ ** ****************************************************************************/ -#include "../src/gui/egl/qegl_p.h" #include "qwindowsurface_vgegl_p.h" #include "qpaintengine_vg_p.h" #include "qpixmapdata_vg_p.h" #include "qvgimagepool_p.h" #include "qvg_p.h" - #if !defined(QT_NO_EGL) QT_BEGIN_NAMESPACE @@ -179,9 +177,8 @@ pd->prev->next = pd->next; } else { QVGSharedContext *shared = sharedContext(); - if (shared) { + if (shared) shared->firstPixmap = pd->next; - } } } @@ -233,9 +230,9 @@ // Set the swap interval for the display. QByteArray interval = qgetenv("QT_VG_SWAP_INTERVAL"); if (!interval.isEmpty()) - eglSwapInterval(context->display(), interval.toInt()); + eglSwapInterval(QEglContext::display(), interval.toInt()); else - eglSwapInterval(context->display(), 1); + eglSwapInterval(QEglContext::display(), 1); #ifdef EGL_RENDERABLE_TYPE // Has the user specified an explicit EGL configuration to use? @@ -249,16 +246,16 @@ EGLint matching = 0; EGLConfig cfg; if (eglChooseConfig - (context->display(), properties, &cfg, 1, &matching) && + (QEglContext::display(), properties, &cfg, 1, &matching) && matching > 0) { // Check that the selected configuration actually supports OpenVG // and then create the context with it. EGLint id = 0; EGLint type = 0; eglGetConfigAttrib - (context->display(), cfg, EGL_CONFIG_ID, &id); + (QEglContext::display(), cfg, EGL_CONFIG_ID, &id); eglGetConfigAttrib - (context->display(), cfg, EGL_RENDERABLE_TYPE, &type); + (QEglContext::display(), cfg, EGL_RENDERABLE_TYPE, &type); if (cfgId == id && (type & EGL_OPENVG_BIT) != 0) { context->setConfig(cfg); if (!context->createContext()) { @@ -337,7 +334,7 @@ shared->engine = 0; shared->context->doneCurrent(); if (shared->surface != EGL_NO_SURFACE) { - eglDestroySurface(shared->context->display(), shared->surface); + eglDestroySurface(QEglContext::display(), shared->surface); shared->surface = EGL_NO_SURFACE; } delete shared->context; @@ -415,7 +412,7 @@ attribs[4] = EGL_NONE; } shared->surface = eglCreatePbufferSurface - (shared->context->display(), shared->context->config(), attribs); + (QEglContext::display(), shared->context->config(), attribs); } return shared->surface; } @@ -558,7 +555,7 @@ context->makeCurrent(mainSurface()); recreateBackBuffer = false; if (backBufferSurface != EGL_NO_SURFACE) { - eglDestroySurface(context->display(), backBufferSurface); + eglDestroySurface(QEglContext::display(), backBufferSurface); backBufferSurface = EGL_NO_SURFACE; } if (backBuffer != VG_INVALID_HANDLE) { @@ -571,7 +568,7 @@ if (backBuffer != VG_INVALID_HANDLE) { // Create an EGL surface for rendering into the VGImage. backBufferSurface = eglCreatePbufferFromClientBuffer - (context->display(), EGL_OPENVG_IMAGE, + (QEglContext::display(), EGL_OPENVG_IMAGE, (EGLClientBuffer)(backBuffer), context->config(), NULL); if (backBufferSurface == EGL_NO_SURFACE) { @@ -707,7 +704,7 @@ #if defined(QVG_DIRECT_TO_WINDOW) // Did we get a direct to window rendering surface? EGLint buffer = 0; - if (eglQueryContext(context->display(), context->context(), + if (eglQueryContext(QEglContext::display(), context->context(), EGL_RENDER_BUFFER, &buffer) && buffer == EGL_SINGLE_BUFFER) { needToSwap = false; @@ -717,7 +714,7 @@ // Try to force the surface back buffer to preserve its contents. if (needToSwap) { eglGetError(); // Clear error state first. - eglSurfaceAttrib(context->display(), surface, + eglSurfaceAttrib(QEglContext::display(), surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED); if (eglGetError() != EGL_SUCCESS) { qWarning("QVG: could not enable preserved swap"); diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/audio.pro --- a/src/plugins/audio/audio.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/audio/audio.pro Mon May 03 13:17:34 2010 +0300 @@ -1,9 +1,3 @@ TEMPLATE = subdirs SUBDIRS = -contains(QT_CONFIG, audio-backend) { - symbian { - SUBDIRS += symbian - } -} - diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/main.cpp --- a/src/plugins/audio/symbian/main.cpp Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include - -#include -#include -#include -#include - -#include "symbianaudiodeviceinfo.h" -#include "symbianaudioinput.h" -#include "symbianaudiooutput.h" - -QT_BEGIN_NAMESPACE - -class SymbianAudioPlugin : public QAudioEnginePlugin -{ -public: - SymbianAudioPlugin(QObject *parent = 0); - ~SymbianAudioPlugin(); - - QStringList keys() const; - - QList availableDevices(QAudio::Mode) const; - QAbstractAudioInput* createInput(const QByteArray& device, - const QAudioFormat& format = QAudioFormat()); - QAbstractAudioOutput* createOutput(const QByteArray& device, - const QAudioFormat& format = QAudioFormat()); - QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, - QAudio::Mode mode); -}; - -SymbianAudioPlugin::SymbianAudioPlugin(QObject *parent) - : QAudioEnginePlugin(parent) -{ - -} - -SymbianAudioPlugin::~SymbianAudioPlugin() -{ - -} - -QStringList SymbianAudioPlugin::keys() const -{ - QStringList keys(QLatin1String("default")); - keys << QLatin1String("default"); - return keys; -} - -QList SymbianAudioPlugin::availableDevices(QAudio::Mode mode) const -{ - Q_UNUSED(mode) - QList devices; - devices.append("default"); - return devices; -} - -QAbstractAudioInput* SymbianAudioPlugin::createInput( - const QByteArray &device, const QAudioFormat &format) -{ - return new SymbianAudioInput(device, format); -} - -QAbstractAudioOutput* SymbianAudioPlugin::createOutput( - const QByteArray &device, const QAudioFormat &format) -{ - return new SymbianAudioOutput(device, format); -} - -QAbstractAudioDeviceInfo* SymbianAudioPlugin::createDeviceInfo( - const QByteArray& device, QAudio::Mode mode) -{ - return new SymbianAudioDeviceInfo(device, mode); -} - -Q_EXPORT_STATIC_PLUGIN(SymbianAudioPlugin) -Q_EXPORT_PLUGIN2(qaudio, SymbianAudioPlugin) - -QT_END_NAMESPACE - diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbian.pro --- a/src/plugins/audio/symbian/symbian.pro Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -QT += multimedia -TARGET = qaudio - -# Paths to DevSound headers -INCLUDEPATH += /epoc32/include/mmf/common -INCLUDEPATH += /epoc32/include/mmf/server - -HEADERS += \ - symbianaudio.h \ - symbianaudiodeviceinfo.h \ - symbianaudioinput.h \ - symbianaudiooutput.h \ - symbianaudioutils.h - -SOURCES += \ - main.cpp \ - symbianaudiodeviceinfo.cpp \ - symbianaudioinput.cpp \ - symbianaudiooutput.cpp \ - symbianaudioutils.cpp - -LIBS += -lmmfdevsound - -QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/audio -target.path = $$[QT_INSTALL_PLUGINS]/audio -INSTALLS += target - -include(../../qpluginbase.pri) - -TARGET.UID3 = 0x2001E630 - diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbianaudio.h --- a/src/plugins/audio/symbian/symbianaudio.h Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SYMBIANAUDIO_H -#define SYMBIANAUDIO_H - -#include - -QT_BEGIN_NAMESPACE - -namespace SymbianAudio { - -/** - * Default values used by audio input and output classes, when underlying - * DevSound instance has not yet been created. - */ - -const int DefaultBufferSize = 4096; // bytes -const int DefaultNotifyInterval = 1000; // ms - -/** - * Enumeration used to track state of internal DevSound instances. - * Values are translated to the corresponding QAudio::State values by - * SymbianAudio::Utils::stateNativeToQt. - */ -enum State { - ClosedState - , InitializingState - , ActiveState - , IdleState - , SuspendedState -}; - -} // namespace SymbianAudio - -QT_END_NAMESPACE - -#endif diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbianaudiodeviceinfo.cpp --- a/src/plugins/audio/symbian/symbianaudiodeviceinfo.cpp Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,191 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "symbianaudiodeviceinfo.h" -#include "symbianaudioutils.h" - -QT_BEGIN_NAMESPACE - -SymbianAudioDeviceInfo::SymbianAudioDeviceInfo(QByteArray device, - QAudio::Mode mode) - : m_deviceName(device) - , m_mode(mode) - , m_updated(false) -{ - QT_TRAP_THROWING(m_devsound.reset(CMMFDevSound::NewL())); -} - -SymbianAudioDeviceInfo::~SymbianAudioDeviceInfo() -{ - -} - -QAudioFormat SymbianAudioDeviceInfo::preferredFormat() const -{ - QAudioFormat format; - switch (m_mode) { - case QAudio::AudioOutput: - format.setFrequency(44100); - format.setChannels(2); - format.setSampleSize(16); - format.setByteOrder(QAudioFormat::LittleEndian); - format.setSampleType(QAudioFormat::SignedInt); - format.setCodec(QLatin1String("audio/pcm")); - break; - - case QAudio::AudioInput: - format.setFrequency(8000); - format.setChannels(1); - format.setSampleSize(16); - format.setByteOrder(QAudioFormat::LittleEndian); - format.setSampleType(QAudioFormat::SignedInt); - format.setCodec(QLatin1String("audio/pcm")); - break; - - default: - Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode"); - } - - if (!isFormatSupported(format)) { - if (m_frequencies.size()) - format.setFrequency(m_frequencies[0]); - if (m_channels.size()) - format.setChannels(m_channels[0]); - if (m_sampleSizes.size()) - format.setSampleSize(m_sampleSizes[0]); - if (m_byteOrders.size()) - format.setByteOrder(m_byteOrders[0]); - if (m_sampleTypes.size()) - format.setSampleType(m_sampleTypes[0]); - } - - return format; -} - -bool SymbianAudioDeviceInfo::isFormatSupported( - const QAudioFormat &format) const -{ - getSupportedFormats(); - const bool supported = - m_codecs.contains(format.codec()) - && m_frequencies.contains(format.frequency()) - && m_channels.contains(format.channels()) - && m_sampleSizes.contains(format.sampleSize()) - && m_byteOrders.contains(format.byteOrder()) - && m_sampleTypes.contains(format.sampleType()); - - return supported; -} - -QAudioFormat SymbianAudioDeviceInfo::nearestFormat(const QAudioFormat &format) const -{ - if (isFormatSupported(format)) - return format; - else - return preferredFormat(); -} - -QString SymbianAudioDeviceInfo::deviceName() const -{ - return m_deviceName; -} - -QStringList SymbianAudioDeviceInfo::codecList() -{ - getSupportedFormats(); - return m_codecs; -} - -QList SymbianAudioDeviceInfo::frequencyList() -{ - getSupportedFormats(); - return m_frequencies; -} - -QList SymbianAudioDeviceInfo::channelsList() -{ - getSupportedFormats(); - return m_channels; -} - -QList SymbianAudioDeviceInfo::sampleSizeList() -{ - getSupportedFormats(); - return m_sampleSizes; -} - -QList SymbianAudioDeviceInfo::byteOrderList() -{ - getSupportedFormats(); - return m_byteOrders; -} - -QList SymbianAudioDeviceInfo::sampleTypeList() -{ - getSupportedFormats(); - return m_sampleTypes; -} - -QList SymbianAudioDeviceInfo::deviceList(QAudio::Mode mode) -{ - Q_UNUSED(mode) - QList devices; - devices.append("default"); - return devices; -} - -void SymbianAudioDeviceInfo::getSupportedFormats() const -{ - if (!m_updated) { - QScopedPointer caps( - new SymbianAudio::DevSoundCapabilities(*m_devsound, m_mode)); - - SymbianAudio::Utils::capabilitiesNativeToQt(*caps, - m_frequencies, m_channels, m_sampleSizes, - m_byteOrders, m_sampleTypes); - - m_codecs.append(QLatin1String("audio/pcm")); - - m_updated = true; - } -} - -QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbianaudiodeviceinfo.h --- a/src/plugins/audio/symbian/symbianaudiodeviceinfo.h Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SYMBIANAUDIODEVICEINFO_H -#define SYMBIANAUDIODEVICEINFO_H - -#include -#include - -QT_BEGIN_NAMESPACE - -class SymbianAudioDeviceInfo - : public QAbstractAudioDeviceInfo -{ - Q_OBJECT - -public: - SymbianAudioDeviceInfo(QByteArray device, QAudio::Mode mode); - ~SymbianAudioDeviceInfo(); - - // QAbstractAudioDeviceInfo - QAudioFormat preferredFormat() const; - bool isFormatSupported(const QAudioFormat &format) const; - QAudioFormat nearestFormat(const QAudioFormat &format) const; - QString deviceName() const; - QStringList codecList(); - QList frequencyList(); - QList channelsList(); - QList sampleSizeList(); - QList byteOrderList(); - QList sampleTypeList(); - QList deviceList(QAudio::Mode); - -private: - void getSupportedFormats() const; - -private: - QScopedPointer m_devsound; - - QString m_deviceName; - QAudio::Mode m_mode; - - // Mutable to allow lazy initialization when called from const-qualified - // public functions (isFormatSupported, nearestFormat) - mutable bool m_updated; - mutable QStringList m_codecs; - mutable QList m_frequencies; - mutable QList m_channels; - mutable QList m_sampleSizes; - mutable QList m_byteOrders; - mutable QList m_sampleTypes; -}; - -QT_END_NAMESPACE - -#endif diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbianaudioinput.cpp --- a/src/plugins/audio/symbian/symbianaudioinput.cpp Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,595 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "symbianaudioinput.h" -#include "symbianaudioutils.h" - -QT_BEGIN_NAMESPACE - -//----------------------------------------------------------------------------- -// Constants -//----------------------------------------------------------------------------- - -const int PushInterval = 50; // ms - - -//----------------------------------------------------------------------------- -// Private class -//----------------------------------------------------------------------------- - -SymbianAudioInputPrivate::SymbianAudioInputPrivate( - SymbianAudioInput *audioDevice) - : m_audioDevice(audioDevice) -{ - -} - -SymbianAudioInputPrivate::~SymbianAudioInputPrivate() -{ - -} - -qint64 SymbianAudioInputPrivate::readData(char *data, qint64 len) -{ - qint64 totalRead = 0; - - if (m_audioDevice->state() == QAudio::ActiveState || - m_audioDevice->state() == QAudio::IdleState) { - - while (totalRead < len) { - const qint64 read = m_audioDevice->read(data + totalRead, - len - totalRead); - if (read > 0) - totalRead += read; - else - break; - } - } - - return totalRead; -} - -qint64 SymbianAudioInputPrivate::writeData(const char *data, qint64 len) -{ - Q_UNUSED(data) - Q_UNUSED(len) - return 0; -} - -void SymbianAudioInputPrivate::dataReady() -{ - emit readyRead(); -} - - -//----------------------------------------------------------------------------- -// Public functions -//----------------------------------------------------------------------------- - -SymbianAudioInput::SymbianAudioInput(const QByteArray &device, - const QAudioFormat &format) - : m_device(device) - , m_format(format) - , m_clientBufferSize(SymbianAudio::DefaultBufferSize) - , m_notifyInterval(SymbianAudio::DefaultNotifyInterval) - , m_notifyTimer(new QTimer(this)) - , m_error(QAudio::NoError) - , m_internalState(SymbianAudio::ClosedState) - , m_externalState(QAudio::StoppedState) - , m_pullMode(false) - , m_sink(0) - , m_pullTimer(new QTimer(this)) - , m_devSoundBuffer(0) - , m_devSoundBufferSize(0) - , m_totalBytesReady(0) - , m_devSoundBufferPos(0) - , m_totalSamplesRecorded(0) -{ - connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify())); - - SymbianAudio::Utils::formatQtToNative(m_format, m_nativeFourCC, - m_nativeFormat); - - m_pullTimer->setInterval(PushInterval); - connect(m_pullTimer.data(), SIGNAL(timeout()), this, SLOT(pullData())); -} - -SymbianAudioInput::~SymbianAudioInput() -{ - close(); -} - -QIODevice* SymbianAudioInput::start(QIODevice *device) -{ - stop(); - - open(); - if (SymbianAudio::ClosedState != m_internalState) { - if (device) { - m_pullMode = true; - m_sink = device; - } else { - m_sink = new SymbianAudioInputPrivate(this); - m_sink->open(QIODevice::ReadOnly | QIODevice::Unbuffered); - } - - m_elapsed.restart(); - } - - return m_sink; -} - -void SymbianAudioInput::stop() -{ - close(); -} - -void SymbianAudioInput::reset() -{ - m_totalSamplesRecorded += getSamplesRecorded(); - m_devSound->Stop(); - startRecording(); -} - -void SymbianAudioInput::suspend() -{ - if (SymbianAudio::ActiveState == m_internalState - || SymbianAudio::IdleState == m_internalState) { - m_notifyTimer->stop(); - m_pullTimer->stop(); - m_devSound->Pause(); - const qint64 samplesRecorded = getSamplesRecorded(); - m_totalSamplesRecorded += samplesRecorded; - - if (m_devSoundBuffer) { - m_devSoundBufferQ.append(m_devSoundBuffer); - m_devSoundBuffer = 0; - } - - setState(SymbianAudio::SuspendedState); - } -} - -void SymbianAudioInput::resume() -{ - if (SymbianAudio::SuspendedState == m_internalState) - startDataTransfer(); -} - -int SymbianAudioInput::bytesReady() const -{ - Q_ASSERT(m_devSoundBufferPos <= m_totalBytesReady); - return m_totalBytesReady - m_devSoundBufferPos; -} - -int SymbianAudioInput::periodSize() const -{ - return bufferSize(); -} - -void SymbianAudioInput::setBufferSize(int value) -{ - // Note that DevSound does not allow its client to specify the buffer size. - // This functionality is available via custom interfaces, but since these - // cannot be guaranteed to work across all DevSound implementations, we - // do not use them here. - // In order to comply with the expected bevahiour of QAudioInput, we store - // the value and return it from bufferSize(), but the underlying DevSound - // buffer size remains unchanged. - if (value > 0) - m_clientBufferSize = value; -} - -int SymbianAudioInput::bufferSize() const -{ - return m_devSoundBufferSize ? m_devSoundBufferSize : m_clientBufferSize; -} - -void SymbianAudioInput::setNotifyInterval(int ms) -{ - if (ms > 0) { - const int oldNotifyInterval = m_notifyInterval; - m_notifyInterval = ms; - if (m_notifyTimer->isActive() && ms != oldNotifyInterval) - m_notifyTimer->start(m_notifyInterval); - } -} - -int SymbianAudioInput::notifyInterval() const -{ - return m_notifyInterval; -} - -qint64 SymbianAudioInput::processedUSecs() const -{ - int samplesPlayed = 0; - if (m_devSound && SymbianAudio::SuspendedState != m_internalState) - samplesPlayed = getSamplesRecorded(); - - // Protect against division by zero - Q_ASSERT_X(m_format.frequency() > 0, Q_FUNC_INFO, "Invalid frequency"); - - const qint64 result = qint64(1000000) * - (samplesPlayed + m_totalSamplesRecorded) - / m_format.frequency(); - - return result; -} - -qint64 SymbianAudioInput::elapsedUSecs() const -{ - const qint64 result = (QAudio::StoppedState == state()) ? - 0 : m_elapsed.elapsed() * 1000; - return result; -} - -QAudio::Error SymbianAudioInput::error() const -{ - return m_error; -} - -QAudio::State SymbianAudioInput::state() const -{ - return m_externalState; -} - -QAudioFormat SymbianAudioInput::format() const -{ - return m_format; -} - -//----------------------------------------------------------------------------- -// MDevSoundObserver implementation -//----------------------------------------------------------------------------- - -void SymbianAudioInput::InitializeComplete(TInt aError) -{ - Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState, - Q_FUNC_INFO, "Invalid state"); - - if (KErrNone == aError) - startRecording(); -} - -void SymbianAudioInput::ToneFinished(TInt aError) -{ - Q_UNUSED(aError) - // This class doesn't use DevSound's tone playback functions, so should - // never receive this callback. - Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); -} - -void SymbianAudioInput::BufferToBeFilled(CMMFBuffer *aBuffer) -{ - Q_UNUSED(aBuffer) - // This class doesn't use DevSound in play mode, so should never receive - // this callback. - Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); -} - -void SymbianAudioInput::PlayError(TInt aError) -{ - Q_UNUSED(aError) - // This class doesn't use DevSound in play mode, so should never receive - // this callback. - Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); -} - -void SymbianAudioInput::BufferToBeEmptied(CMMFBuffer *aBuffer) -{ - // Following receipt of this callback, DevSound should not provide another - // buffer until we have returned the current one. - Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held"); - - CMMFDataBuffer *const buffer = static_cast(aBuffer); - - if (!m_devSoundBufferSize) - m_devSoundBufferSize = buffer->Data().MaxLength(); - - m_totalBytesReady += buffer->Data().Length(); - - if (SymbianAudio::SuspendedState == m_internalState) { - m_devSoundBufferQ.append(buffer); - } else { - // Will be returned to DevSound by bufferEmptied(). - m_devSoundBuffer = buffer; - m_devSoundBufferPos = 0; - - if (bytesReady() && !m_pullMode) - pushData(); - } -} - -void SymbianAudioInput::RecordError(TInt aError) -{ - Q_UNUSED(aError) - setError(QAudio::IOError); -} - -void SymbianAudioInput::ConvertError(TInt aError) -{ - Q_UNUSED(aError) - // This class doesn't use DevSound's format conversion functions, so - // should never receive this callback. - Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); -} - -void SymbianAudioInput::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg) -{ - Q_UNUSED(aMessageType) - Q_UNUSED(aMsg) - // Ignore this callback. -} - -//----------------------------------------------------------------------------- -// Private functions -//----------------------------------------------------------------------------- - -void SymbianAudioInput::open() -{ - Q_ASSERT_X(SymbianAudio::ClosedState == m_internalState, - Q_FUNC_INFO, "DevSound already opened"); - - QT_TRAP_THROWING( m_devSound.reset(CMMFDevSound::NewL()) ) - - QScopedPointer caps( - new SymbianAudio::DevSoundCapabilities(*m_devSound, QAudio::AudioInput)); - - int err = SymbianAudio::Utils::isFormatSupported(m_format, *caps) ? - KErrNone : KErrNotSupported; - - if (KErrNone == err) { - setState(SymbianAudio::InitializingState); - TRAP(err, m_devSound->InitializeL(*this, m_nativeFourCC, - EMMFStateRecording)); - } - - if (KErrNone != err) { - setError(QAudio::OpenError); - m_devSound.reset(); - } -} - -void SymbianAudioInput::startRecording() -{ - const int samplesRecorded = m_devSound->SamplesRecorded(); - Q_ASSERT(samplesRecorded == 0); - - TRAPD(err, startDevSoundL()); - if (KErrNone == err) { - startDataTransfer(); - } else { - setError(QAudio::OpenError); - close(); - } -} - -void SymbianAudioInput::startDevSoundL() -{ - TMMFCapabilities nativeFormat = m_devSound->Config(); - m_nativeFormat.iBufferSize = nativeFormat.iBufferSize; - m_devSound->SetConfigL(m_nativeFormat); - m_devSound->RecordInitL(); -} - -void SymbianAudioInput::startDataTransfer() -{ - m_notifyTimer->start(m_notifyInterval); - - if (m_pullMode) - m_pullTimer->start(); - - if (bytesReady()) { - setState(SymbianAudio::ActiveState); - if (!m_pullMode) - pushData(); - } else { - if (SymbianAudio::SuspendedState == m_internalState) - setState(SymbianAudio::ActiveState); - else - setState(SymbianAudio::IdleState); - } -} - -CMMFDataBuffer* SymbianAudioInput::currentBuffer() const -{ - CMMFDataBuffer *result = m_devSoundBuffer; - if (!result && !m_devSoundBufferQ.empty()) - result = m_devSoundBufferQ.front(); - return result; -} - -void SymbianAudioInput::pushData() -{ - Q_ASSERT_X(bytesReady(), Q_FUNC_INFO, "No data available"); - Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, "pushData called when in pull mode"); - qobject_cast(m_sink)->dataReady(); -} - -qint64 SymbianAudioInput::read(char *data, qint64 len) -{ - // SymbianAudioInputPrivate is ready to read data - - Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, - "read called when in pull mode"); - - qint64 bytesRead = 0; - - CMMFDataBuffer *buffer = 0; - while ((buffer = currentBuffer()) && (bytesRead < len)) { - if (SymbianAudio::IdleState == m_internalState) - setState(SymbianAudio::ActiveState); - - TDesC8 &inputBuffer = buffer->Data(); - - const qint64 inputBytes = bytesReady(); - const qint64 outputBytes = len - bytesRead; - const qint64 copyBytes = outputBytes < inputBytes ? - outputBytes : inputBytes; - - memcpy(data, inputBuffer.Ptr() + m_devSoundBufferPos, copyBytes); - - m_devSoundBufferPos += copyBytes; - data += copyBytes; - bytesRead += copyBytes; - - if (!bytesReady()) - bufferEmptied(); - } - - return bytesRead; -} - -void SymbianAudioInput::pullData() -{ - Q_ASSERT_X(m_pullMode, Q_FUNC_INFO, - "pullData called when in push mode"); - - CMMFDataBuffer *buffer = 0; - while (buffer = currentBuffer()) { - if (SymbianAudio::IdleState == m_internalState) - setState(SymbianAudio::ActiveState); - - TDesC8 &inputBuffer = buffer->Data(); - - const qint64 inputBytes = bytesReady(); - const qint64 bytesPushed = m_sink->write( - (char*)inputBuffer.Ptr() + m_devSoundBufferPos, inputBytes); - - m_devSoundBufferPos += bytesPushed; - - if (!bytesReady()) - bufferEmptied(); - - if (!bytesPushed) - break; - } -} - -void SymbianAudioInput::bufferEmptied() -{ - m_devSoundBufferPos = 0; - - if (m_devSoundBuffer) { - m_totalBytesReady -= m_devSoundBuffer->Data().Length(); - m_devSoundBuffer = 0; - m_devSound->RecordData(); - } else { - Q_ASSERT(!m_devSoundBufferQ.empty()); - m_totalBytesReady -= m_devSoundBufferQ.front()->Data().Length(); - m_devSoundBufferQ.erase(m_devSoundBufferQ.begin()); - - // If the queue has been emptied, resume transfer from the hardware - if (m_devSoundBufferQ.empty()) - m_devSound->RecordInitL(); - } - - Q_ASSERT(m_totalBytesReady >= 0); -} - -void SymbianAudioInput::close() -{ - m_notifyTimer->stop(); - m_pullTimer->stop(); - - m_error = QAudio::NoError; - - if (m_devSound) - m_devSound->Stop(); - m_devSound.reset(); - m_devSoundBuffer = 0; - m_devSoundBufferSize = 0; - m_totalBytesReady = 0; - - if (!m_pullMode) // m_sink is owned - delete m_sink; - m_pullMode = false; - m_sink = 0; - - m_devSoundBufferQ.clear(); - m_devSoundBufferPos = 0; - m_totalSamplesRecorded = 0; - - setState(SymbianAudio::ClosedState); -} - -qint64 SymbianAudioInput::getSamplesRecorded() const -{ - qint64 result = 0; - if (m_devSound) - result = qint64(m_devSound->SamplesRecorded()); - return result; -} - -void SymbianAudioInput::setError(QAudio::Error error) -{ - m_error = error; - - // Although no state transition actually occurs here, a stateChanged event - // must be emitted to inform the client that the call to start() was - // unsuccessful. - if (QAudio::OpenError == error) - emit stateChanged(QAudio::StoppedState); - - // Close the DevSound instance. This causes a transition to StoppedState. - // This must be done asynchronously in case the current function was called - // from a DevSound event handler, in which case deleting the DevSound - // instance may cause an exception. - QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection); -} - -void SymbianAudioInput::setState(SymbianAudio::State newInternalState) -{ - const QAudio::State oldExternalState = m_externalState; - m_internalState = newInternalState; - m_externalState = SymbianAudio::Utils::stateNativeToQt( - m_internalState, initializingState()); - - if (m_externalState != oldExternalState) - emit stateChanged(m_externalState); -} - -QAudio::State SymbianAudioInput::initializingState() const -{ - return QAudio::IdleState; -} - -QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbianaudioinput.h --- a/src/plugins/audio/symbian/symbianaudioinput.h Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SYMBIANAUDIOINPUT_H -#define SYMBIANAUDIOINPUT_H - -#include -#include -#include -#include -#include "symbianaudio.h" - -QT_BEGIN_NAMESPACE - -class SymbianAudioInput; - -class SymbianAudioInputPrivate : public QIODevice -{ - friend class SymbianAudioInput; - Q_OBJECT -public: - SymbianAudioInputPrivate(SymbianAudioInput *audio); - ~SymbianAudioInputPrivate(); - - qint64 readData(char *data, qint64 len); - qint64 writeData(const char *data, qint64 len); - - void dataReady(); - -private: - SymbianAudioInput *const m_audioDevice; -}; - -class SymbianAudioInput - : public QAbstractAudioInput - , public MDevSoundObserver -{ - friend class SymbianAudioInputPrivate; - Q_OBJECT -public: - SymbianAudioInput(const QByteArray &device, - const QAudioFormat &audioFormat); - ~SymbianAudioInput(); - - // QAbstractAudioInput - QIODevice* start(QIODevice *device = 0); - void stop(); - void reset(); - void suspend(); - void resume(); - int bytesReady() const; - int periodSize() const; - void setBufferSize(int value); - int bufferSize() const; - void setNotifyInterval(int milliSeconds); - int notifyInterval() const; - qint64 processedUSecs() const; - qint64 elapsedUSecs() const; - QAudio::Error error() const; - QAudio::State state() const; - QAudioFormat format() const; - - // MDevSoundObserver - void InitializeComplete(TInt aError); - void ToneFinished(TInt aError); - void BufferToBeFilled(CMMFBuffer *aBuffer); - void PlayError(TInt aError); - void BufferToBeEmptied(CMMFBuffer *aBuffer); - void RecordError(TInt aError); - void ConvertError(TInt aError); - void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg); - -private slots: - void pullData(); - -private: - void open(); - void startRecording(); - void startDevSoundL(); - void startDataTransfer(); - CMMFDataBuffer* currentBuffer() const; - void pushData(); - qint64 read(char *data, qint64 len); - void bufferEmptied(); - Q_INVOKABLE void close(); - - qint64 getSamplesRecorded() const; - - void setError(QAudio::Error error); - void setState(SymbianAudio::State state); - - QAudio::State initializingState() const; - -private: - const QByteArray m_device; - const QAudioFormat m_format; - - int m_clientBufferSize; - int m_notifyInterval; - QScopedPointer m_notifyTimer; - QTime m_elapsed; - QAudio::Error m_error; - - SymbianAudio::State m_internalState; - QAudio::State m_externalState; - - bool m_pullMode; - QIODevice *m_sink; - - QScopedPointer m_pullTimer; - - QScopedPointer m_devSound; - TUint32 m_nativeFourCC; - TMMFCapabilities m_nativeFormat; - - // Latest buffer provided by DevSound, to be empied of data. - CMMFDataBuffer *m_devSoundBuffer; - - int m_devSoundBufferSize; - - // Total amount of data in buffers provided by DevSound - int m_totalBytesReady; - - // Queue of buffers returned after call to CMMFDevSound::Pause(). - QList m_devSoundBufferQ; - - // Current read position within m_devSoundBuffer - qint64 m_devSoundBufferPos; - - // Samples recorded up to the last call to suspend(). It is necessary - // to cache this because suspend() is implemented using - // CMMFDevSound::Stop(), which resets DevSound's SamplesRecorded() counter. - quint32 m_totalSamplesRecorded; - -}; - -QT_END_NAMESPACE - -#endif diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbianaudiooutput.cpp --- a/src/plugins/audio/symbian/symbianaudiooutput.cpp Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,697 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "symbianaudiooutput.h" -#include "symbianaudioutils.h" - -QT_BEGIN_NAMESPACE - -//----------------------------------------------------------------------------- -// Constants -//----------------------------------------------------------------------------- - -const int UnderflowTimerInterval = 50; // ms - - -//----------------------------------------------------------------------------- -// Private class -//----------------------------------------------------------------------------- - -SymbianAudioOutputPrivate::SymbianAudioOutputPrivate( - SymbianAudioOutput *audioDevice) - : m_audioDevice(audioDevice) -{ - -} - -SymbianAudioOutputPrivate::~SymbianAudioOutputPrivate() -{ - -} - -qint64 SymbianAudioOutputPrivate::readData(char *data, qint64 len) -{ - Q_UNUSED(data) - Q_UNUSED(len) - return 0; -} - -qint64 SymbianAudioOutputPrivate::writeData(const char *data, qint64 len) -{ - qint64 totalWritten = 0; - - if (m_audioDevice->state() == QAudio::ActiveState || - m_audioDevice->state() == QAudio::IdleState) { - - while (totalWritten < len) { - const qint64 written = m_audioDevice->pushData(data + totalWritten, - len - totalWritten); - if (written > 0) - totalWritten += written; - else - break; - } - } - - return totalWritten; -} - - -//----------------------------------------------------------------------------- -// Public functions -//----------------------------------------------------------------------------- - -SymbianAudioOutput::SymbianAudioOutput(const QByteArray &device, - const QAudioFormat &format) - : m_device(device) - , m_format(format) - , m_clientBufferSize(SymbianAudio::DefaultBufferSize) - , m_notifyInterval(SymbianAudio::DefaultNotifyInterval) - , m_notifyTimer(new QTimer(this)) - , m_error(QAudio::NoError) - , m_internalState(SymbianAudio::ClosedState) - , m_externalState(QAudio::StoppedState) - , m_pullMode(false) - , m_source(0) - , m_devSoundBuffer(0) - , m_devSoundBufferSize(0) - , m_bytesWritten(0) - , m_pushDataReady(false) - , m_bytesPadding(0) - , m_underflow(false) - , m_lastBuffer(false) - , m_underflowTimer(new QTimer(this)) - , m_samplesPlayed(0) - , m_totalSamplesPlayed(0) -{ - connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify())); - - SymbianAudio::Utils::formatQtToNative(m_format, m_nativeFourCC, - m_nativeFormat); - - m_underflowTimer->setInterval(UnderflowTimerInterval); - connect(m_underflowTimer.data(), SIGNAL(timeout()), this, - SLOT(underflowTimerExpired())); -} - -SymbianAudioOutput::~SymbianAudioOutput() -{ - close(); -} - -QIODevice* SymbianAudioOutput::start(QIODevice *device) -{ - stop(); - - // We have to set these before the call to open() because of the - // logic in initializingState() - if (device) { - m_pullMode = true; - m_source = device; - } - - open(); - - if (SymbianAudio::ClosedState != m_internalState) { - if (device) { - connect(m_source, SIGNAL(readyRead()), this, SLOT(dataReady())); - } else { - m_source = new SymbianAudioOutputPrivate(this); - m_source->open(QIODevice::WriteOnly | QIODevice::Unbuffered); - } - - m_elapsed.restart(); - } - - return m_source; -} - -void SymbianAudioOutput::stop() -{ - close(); -} - -void SymbianAudioOutput::reset() -{ - m_totalSamplesPlayed += getSamplesPlayed(); - m_devSound->Stop(); - m_bytesPadding = 0; - startPlayback(); -} - -void SymbianAudioOutput::suspend() -{ - if (SymbianAudio::ActiveState == m_internalState - || SymbianAudio::IdleState == m_internalState) { - m_notifyTimer->stop(); - m_underflowTimer->stop(); - - const qint64 samplesWritten = SymbianAudio::Utils::bytesToSamples( - m_format, m_bytesWritten); - m_bytesWritten = 0; - - const qint64 samplesPlayed = getSamplesPlayed(); - - // CMMFDevSound::Pause() is not guaranteed to work correctly in all - // implementations, for play-mode DevSound sessions. We therefore - // have to implement suspend() by calling CMMFDevSound::Stop(). - // Because this causes buffered data to be dropped, we replace the - // lost data with silence following a call to resume(), in order to - // ensure that processedUSecs() returns the correct value. - m_devSound->Stop(); - m_totalSamplesPlayed += samplesPlayed; - - // Calculate the amount of data dropped - const qint64 paddingSamples = samplesWritten - samplesPlayed; - m_bytesPadding = SymbianAudio::Utils::samplesToBytes(m_format, - paddingSamples); - - setState(SymbianAudio::SuspendedState); - } -} - -void SymbianAudioOutput::resume() -{ - if (SymbianAudio::SuspendedState == m_internalState) - startPlayback(); -} - -int SymbianAudioOutput::bytesFree() const -{ - int result = 0; - if (m_devSoundBuffer) { - const TDes8 &outputBuffer = m_devSoundBuffer->Data(); - result = outputBuffer.MaxLength() - outputBuffer.Length(); - } - return result; -} - -int SymbianAudioOutput::periodSize() const -{ - return bufferSize(); -} - -void SymbianAudioOutput::setBufferSize(int value) -{ - // Note that DevSound does not allow its client to specify the buffer size. - // This functionality is available via custom interfaces, but since these - // cannot be guaranteed to work across all DevSound implementations, we - // do not use them here. - // In order to comply with the expected bevahiour of QAudioOutput, we store - // the value and return it from bufferSize(), but the underlying DevSound - // buffer size remains unchanged. - if (value > 0) - m_clientBufferSize = value; -} - -int SymbianAudioOutput::bufferSize() const -{ - return m_devSoundBufferSize ? m_devSoundBufferSize : m_clientBufferSize; -} - -void SymbianAudioOutput::setNotifyInterval(int ms) -{ - if (ms > 0) { - const int oldNotifyInterval = m_notifyInterval; - m_notifyInterval = ms; - if (m_notifyTimer->isActive() && ms != oldNotifyInterval) - m_notifyTimer->start(m_notifyInterval); - } -} - -int SymbianAudioOutput::notifyInterval() const -{ - return m_notifyInterval; -} - -qint64 SymbianAudioOutput::processedUSecs() const -{ - int samplesPlayed = 0; - if (m_devSound && SymbianAudio::SuspendedState != m_internalState) - samplesPlayed = getSamplesPlayed(); - - // Protect against division by zero - Q_ASSERT_X(m_format.frequency() > 0, Q_FUNC_INFO, "Invalid frequency"); - - const qint64 result = qint64(1000000) * - (samplesPlayed + m_totalSamplesPlayed) - / m_format.frequency(); - - return result; -} - -qint64 SymbianAudioOutput::elapsedUSecs() const -{ - const qint64 result = (QAudio::StoppedState == state()) ? - 0 : m_elapsed.elapsed() * 1000; - return result; -} - -QAudio::Error SymbianAudioOutput::error() const -{ - return m_error; -} - -QAudio::State SymbianAudioOutput::state() const -{ - return m_externalState; -} - -QAudioFormat SymbianAudioOutput::format() const -{ - return m_format; -} - -//----------------------------------------------------------------------------- -// MDevSoundObserver implementation -//----------------------------------------------------------------------------- - -void SymbianAudioOutput::InitializeComplete(TInt aError) -{ - Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState, - Q_FUNC_INFO, "Invalid state"); - - if (KErrNone == aError) - startPlayback(); -} - -void SymbianAudioOutput::ToneFinished(TInt aError) -{ - Q_UNUSED(aError) - // This class doesn't use DevSound's tone playback functions, so should - // never receive this callback. - Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); -} - -void SymbianAudioOutput::BufferToBeFilled(CMMFBuffer *aBuffer) -{ - // Following receipt of this callback, DevSound should not provide another - // buffer until we have returned the current one. - Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held"); - - // Will be returned to DevSound by bufferFilled(). - m_devSoundBuffer = static_cast(aBuffer); - - if (!m_devSoundBufferSize) - m_devSoundBufferSize = m_devSoundBuffer->Data().MaxLength(); - - writePaddingData(); - - if (m_pullMode && isDataReady() && !m_bytesPadding) - pullData(); -} - -void SymbianAudioOutput::PlayError(TInt aError) -{ - switch (aError) { - case KErrUnderflow: - m_underflow = true; - if (m_pullMode && !m_lastBuffer) - setError(QAudio::UnderrunError); - else - setState(SymbianAudio::IdleState); - break; - default: - setError(QAudio::IOError); - break; - } -} - -void SymbianAudioOutput::BufferToBeEmptied(CMMFBuffer *aBuffer) -{ - Q_UNUSED(aBuffer) - // This class doesn't use DevSound in record mode, so should never receive - // this callback. - Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); -} - -void SymbianAudioOutput::RecordError(TInt aError) -{ - Q_UNUSED(aError) - // This class doesn't use DevSound in record mode, so should never receive - // this callback. - Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); -} - -void SymbianAudioOutput::ConvertError(TInt aError) -{ - Q_UNUSED(aError) - // This class doesn't use DevSound's format conversion functions, so - // should never receive this callback. - Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); -} - -void SymbianAudioOutput::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg) -{ - Q_UNUSED(aMessageType) - Q_UNUSED(aMsg) - // Ignore this callback. -} - -//----------------------------------------------------------------------------- -// Private functions -//----------------------------------------------------------------------------- - -void SymbianAudioOutput::dataReady() -{ - // Client-provided QIODevice has data ready to read. - - Q_ASSERT_X(m_source->bytesAvailable(), Q_FUNC_INFO, - "readyRead signal received, but no data available"); - - if (!m_bytesPadding) - pullData(); -} - -void SymbianAudioOutput::underflowTimerExpired() -{ - const TInt samplesPlayed = getSamplesPlayed(); - if (m_samplesPlayed && (samplesPlayed == m_samplesPlayed)) { - setError(QAudio::UnderrunError); - } else { - m_samplesPlayed = samplesPlayed; - m_underflowTimer->start(); - } -} - -void SymbianAudioOutput::open() -{ - Q_ASSERT_X(SymbianAudio::ClosedState == m_internalState, - Q_FUNC_INFO, "DevSound already opened"); - - QT_TRAP_THROWING( m_devSound.reset(CMMFDevSound::NewL()) ) - - QScopedPointer caps( - new SymbianAudio::DevSoundCapabilities(*m_devSound, - QAudio::AudioOutput)); - - int err = SymbianAudio::Utils::isFormatSupported(m_format, *caps) ? - KErrNone : KErrNotSupported; - - if (KErrNone == err) { - setState(SymbianAudio::InitializingState); - TRAP(err, m_devSound->InitializeL(*this, m_nativeFourCC, - EMMFStatePlaying)); - } - - if (KErrNone != err) { - setError(QAudio::OpenError); - m_devSound.reset(); - } -} - -void SymbianAudioOutput::startPlayback() -{ - TRAPD(err, startDevSoundL()); - if (KErrNone == err) { - if (isDataReady()) - setState(SymbianAudio::ActiveState); - else - setState(SymbianAudio::IdleState); - - m_notifyTimer->start(m_notifyInterval); - m_underflow = false; - - Q_ASSERT(m_devSound->SamplesPlayed() == 0); - - writePaddingData(); - - if (m_pullMode && m_source->bytesAvailable() && !m_bytesPadding) - dataReady(); - } else { - setError(QAudio::OpenError); - close(); - } -} - -void SymbianAudioOutput::startDevSoundL() -{ - TMMFCapabilities nativeFormat = m_devSound->Config(); - m_nativeFormat.iBufferSize = nativeFormat.iBufferSize; - m_devSound->SetConfigL(m_nativeFormat); - m_devSound->PlayInitL(); -} - -void SymbianAudioOutput::writePaddingData() -{ - // See comments in suspend() - - while (m_devSoundBuffer && m_bytesPadding) { - if (SymbianAudio::IdleState == m_internalState) - setState(SymbianAudio::ActiveState); - - TDes8 &outputBuffer = m_devSoundBuffer->Data(); - const qint64 outputBytes = bytesFree(); - const qint64 paddingBytes = outputBytes < m_bytesPadding ? - outputBytes : m_bytesPadding; - unsigned char *ptr = const_cast(outputBuffer.Ptr()); - Mem::FillZ(ptr, paddingBytes); - outputBuffer.SetLength(outputBuffer.Length() + paddingBytes); - m_bytesPadding -= paddingBytes; - - if (m_pullMode && m_source->atEnd()) - lastBufferFilled(); - if (paddingBytes == outputBytes) - bufferFilled(); - } -} - -qint64 SymbianAudioOutput::pushData(const char *data, qint64 len) -{ - // Data has been written to SymbianAudioOutputPrivate - - Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, - "pushData called when in pull mode"); - - const unsigned char *const inputPtr = - reinterpret_cast(data); - qint64 bytesWritten = 0; - - if (SymbianAudio::IdleState == m_internalState) - setState(SymbianAudio::ActiveState); - - while (m_devSoundBuffer && (bytesWritten < len)) { - // writePaddingData() is called from BufferToBeFilled(), so we should - // never have any padding data left at this point. - Q_ASSERT_X(0 == m_bytesPadding, Q_FUNC_INFO, - "Padding bytes remaining in pushData"); - - TDes8 &outputBuffer = m_devSoundBuffer->Data(); - - const qint64 outputBytes = bytesFree(); - const qint64 inputBytes = len - bytesWritten; - const qint64 copyBytes = outputBytes < inputBytes ? - outputBytes : inputBytes; - - outputBuffer.Append(inputPtr + bytesWritten, copyBytes); - bytesWritten += copyBytes; - - bufferFilled(); - } - - m_pushDataReady = (bytesWritten < len); - - // If DevSound is still initializing (m_internalState == InitializingState), - // we cannot transition m_internalState to ActiveState, but we must emit - // an (external) state change from IdleState to ActiveState. The following - // call triggers this signal. - setState(m_internalState); - - return bytesWritten; -} - -void SymbianAudioOutput::pullData() -{ - Q_ASSERT_X(m_pullMode, Q_FUNC_INFO, - "pullData called when in push mode"); - - if (m_bytesPadding) - m_bytesPadding = 1; - - // writePaddingData() is called by BufferToBeFilled() before pullData(), - // so we should never have any padding data left at this point. - Q_ASSERT_X(0 == m_bytesPadding, Q_FUNC_INFO, - "Padding bytes remaining in pullData"); - - qint64 inputBytes = m_source->bytesAvailable(); - while (m_devSoundBuffer && inputBytes) { - if (SymbianAudio::IdleState == m_internalState) - setState(SymbianAudio::ActiveState); - - TDes8 &outputBuffer = m_devSoundBuffer->Data(); - - const qint64 outputBytes = bytesFree(); - const qint64 copyBytes = outputBytes < inputBytes ? - outputBytes : inputBytes; - - char *outputPtr = (char*)(outputBuffer.Ptr() + outputBuffer.Length()); - const qint64 bytesCopied = m_source->read(outputPtr, copyBytes); - Q_ASSERT(bytesCopied == copyBytes); - outputBuffer.SetLength(outputBuffer.Length() + bytesCopied); - inputBytes -= bytesCopied; - - if (m_source->atEnd()) - lastBufferFilled(); - else if (copyBytes == outputBytes) - bufferFilled(); - } -} - -void SymbianAudioOutput::bufferFilled() -{ - Q_ASSERT_X(m_devSoundBuffer, Q_FUNC_INFO, "No buffer to return"); - - const TDes8 &outputBuffer = m_devSoundBuffer->Data(); - m_bytesWritten += outputBuffer.Length(); - - m_devSoundBuffer = 0; - - m_samplesPlayed = getSamplesPlayed(); - m_underflowTimer->start(); - - if (QAudio::UnderrunError == m_error) - m_error = QAudio::NoError; - - m_devSound->PlayData(); -} - -void SymbianAudioOutput::lastBufferFilled() -{ - Q_ASSERT_X(m_devSoundBuffer, Q_FUNC_INFO, "No buffer to fill"); - Q_ASSERT_X(!m_lastBuffer, Q_FUNC_INFO, "Last buffer already sent"); - m_lastBuffer = true; - m_devSoundBuffer->SetLastBuffer(ETrue); - bufferFilled(); -} - -void SymbianAudioOutput::close() -{ - m_notifyTimer->stop(); - m_underflowTimer->stop(); - - m_error = QAudio::NoError; - - if (m_devSound) - m_devSound->Stop(); - m_devSound.reset(); - m_devSoundBuffer = 0; - m_devSoundBufferSize = 0; - - if (!m_pullMode) // m_source is owned - delete m_source; - m_pullMode = false; - m_source = 0; - - m_bytesWritten = 0; - m_pushDataReady = false; - m_bytesPadding = 0; - m_underflow = false; - m_lastBuffer = false; - m_samplesPlayed = 0; - m_totalSamplesPlayed = 0; - - setState(SymbianAudio::ClosedState); -} - -qint64 SymbianAudioOutput::getSamplesPlayed() const -{ - qint64 result = 0; - if (m_devSound) { - const qint64 samplesWritten = SymbianAudio::Utils::bytesToSamples( - m_format, m_bytesWritten); - - if (m_underflow) { - result = samplesWritten; - } else { - // This is necessary because some DevSound implementations report - // that they have played more data than has actually been provided to them - // by the client. - const qint64 devSoundSamplesPlayed(m_devSound->SamplesPlayed()); - result = qMin(devSoundSamplesPlayed, samplesWritten); - } - } - return result; -} - -void SymbianAudioOutput::setError(QAudio::Error error) -{ - m_error = error; - - // Although no state transition actually occurs here, a stateChanged event - // must be emitted to inform the client that the call to start() was - // unsuccessful. - if (QAudio::OpenError == error) - emit stateChanged(QAudio::StoppedState); - - if (QAudio::UnderrunError == error) - setState(SymbianAudio::IdleState); - else - // Close the DevSound instance. This causes a transition to - // StoppedState. This must be done asynchronously in case the - // current function was called from a DevSound event handler, in which - // case deleting the DevSound instance may cause an exception. - QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection); -} - -void SymbianAudioOutput::setState(SymbianAudio::State newInternalState) -{ - const QAudio::State oldExternalState = m_externalState; - m_internalState = newInternalState; - m_externalState = SymbianAudio::Utils::stateNativeToQt( - m_internalState, initializingState()); - - if (m_externalState != oldExternalState) - emit stateChanged(m_externalState); -} - -bool SymbianAudioOutput::isDataReady() const -{ - return (m_source && m_source->bytesAvailable()) - || m_bytesPadding - || m_pushDataReady; -} - -QAudio::State SymbianAudioOutput::initializingState() const -{ - return isDataReady() ? QAudio::ActiveState : QAudio::IdleState; -} - -QT_END_NAMESPACE diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbianaudiooutput.h --- a/src/plugins/audio/symbian/symbianaudiooutput.h Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,199 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef SYMBIANAUDIOOUTPUT_H -#define SYMBIANAUDIOOUTPUT_H - -#include -#include -#include -#include -#include "symbianaudio.h" - -QT_BEGIN_NAMESPACE - -class SymbianAudioOutput; - -class SymbianAudioOutputPrivate : public QIODevice -{ - friend class SymbianAudioOutput; - Q_OBJECT -public: - SymbianAudioOutputPrivate(SymbianAudioOutput *audio); - ~SymbianAudioOutputPrivate(); - - qint64 readData(char *data, qint64 len); - qint64 writeData(const char *data, qint64 len); - -private: - SymbianAudioOutput *const m_audioDevice; -}; - -class SymbianAudioOutput - : public QAbstractAudioOutput - , public MDevSoundObserver -{ - friend class SymbianAudioOutputPrivate; - Q_OBJECT -public: - SymbianAudioOutput(const QByteArray &device, - const QAudioFormat &audioFormat); - ~SymbianAudioOutput(); - - // QAbstractAudioOutput - QIODevice* start(QIODevice *device = 0); - void stop(); - void reset(); - void suspend(); - void resume(); - int bytesFree() const; - int periodSize() const; - void setBufferSize(int value); - int bufferSize() const; - void setNotifyInterval(int milliSeconds); - int notifyInterval() const; - qint64 processedUSecs() const; - qint64 elapsedUSecs() const; - QAudio::Error error() const; - QAudio::State state() const; - QAudioFormat format() const; - - // MDevSoundObserver - void InitializeComplete(TInt aError); - void ToneFinished(TInt aError); - void BufferToBeFilled(CMMFBuffer *aBuffer); - void PlayError(TInt aError); - void BufferToBeEmptied(CMMFBuffer *aBuffer); - void RecordError(TInt aError); - void ConvertError(TInt aError); - void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg); - -private slots: - void dataReady(); - void underflowTimerExpired(); - -private: - void open(); - void startPlayback(); - void startDevSoundL(); - void writePaddingData(); - qint64 pushData(const char *data, qint64 len); - void pullData(); - void bufferFilled(); - void lastBufferFilled(); - Q_INVOKABLE void close(); - - qint64 getSamplesPlayed() const; - - void setError(QAudio::Error error); - void setState(SymbianAudio::State state); - - bool isDataReady() const; - QAudio::State initializingState() const; - -private: - const QByteArray m_device; - const QAudioFormat m_format; - - int m_clientBufferSize; - int m_notifyInterval; - QScopedPointer m_notifyTimer; - QTime m_elapsed; - QAudio::Error m_error; - - SymbianAudio::State m_internalState; - QAudio::State m_externalState; - - bool m_pullMode; - QIODevice *m_source; - - QScopedPointer m_devSound; - TUint32 m_nativeFourCC; - TMMFCapabilities m_nativeFormat; - - // Buffer provided by DevSound, to be filled with data. - CMMFDataBuffer *m_devSoundBuffer; - - int m_devSoundBufferSize; - - // Number of bytes transferred from QIODevice to QAudioOutput. It is - // necessary to count this because data is dropped when suspend() is - // called. The difference between the position reported by DevSound and - // this value allows us to calculate m_bytesPadding; - quint32 m_bytesWritten; - - // True if client has provided data while the audio subsystem was not - // ready to consume it. - bool m_pushDataReady; - - // Number of zero bytes which will be written when client calls resume(). - quint32 m_bytesPadding; - - // True if PlayError(KErrUnderflow) has been called. - bool m_underflow; - - // True if a buffer marked with the "last buffer" flag has been provided - // to DevSound. - bool m_lastBuffer; - - // Some DevSound implementations ignore all underflow errors raised by the - // audio driver, unless the last buffer flag has been set by the client. - // In push-mode playback, this flag will never be set, so the underflow - // error will never be reported. In order to work around this, a timer - // is used, which gets reset every time the client provides more data. If - // the timer expires, an underflow error is raised by this object. - QScopedPointer m_underflowTimer; - - // Result of previous call to CMMFDevSound::SamplesPlayed(). This value is - // used to determine whether, when m_underflowTimer expires, an - // underflow error has actually occurred. - quint32 m_samplesPlayed; - - // Samples played up to the last call to suspend(). It is necessary - // to cache this because suspend() is implemented using - // CMMFDevSound::Stop(), which resets DevSound's SamplesPlayed() counter. - quint32 m_totalSamplesPlayed; - -}; - -QT_END_NAMESPACE - -#endif diff -r 2f34d5167611 -r fcece45ef507 src/plugins/audio/symbian/symbianaudioutils.cpp --- a/src/plugins/audio/symbian/symbianaudioutils.cpp Fri Apr 16 15:50:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,395 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtMultimedia module 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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "symbianaudioutils.h" -#include - -QT_BEGIN_NAMESPACE - -namespace SymbianAudio { - -DevSoundCapabilities::DevSoundCapabilities(CMMFDevSound &devsound, - QAudio::Mode mode) -{ - QT_TRAP_THROWING(constructL(devsound, mode)); -} - -DevSoundCapabilities::~DevSoundCapabilities() -{ - m_fourCC.Close(); -} - -void DevSoundCapabilities::constructL(CMMFDevSound &devsound, - QAudio::Mode mode) -{ - m_caps = devsound.Capabilities(); - - TMMFPrioritySettings settings; - - switch (mode) { - case QAudio::AudioOutput: - settings.iState = EMMFStatePlaying; - devsound.GetSupportedInputDataTypesL(m_fourCC, settings); - break; - - case QAudio::AudioInput: - settings.iState = EMMFStateRecording; - devsound.GetSupportedInputDataTypesL(m_fourCC, settings); - break; - - default: - Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode"); - } -} - -namespace Utils { - -//----------------------------------------------------------------------------- -// Static data -//----------------------------------------------------------------------------- - -// Sample rate / frequency - -typedef TMMFSampleRate SampleRateNative; -typedef int SampleRateQt; - -const int SampleRateCount = 12; - -const SampleRateNative SampleRateListNative[SampleRateCount] = { - EMMFSampleRate8000Hz - , EMMFSampleRate11025Hz - , EMMFSampleRate12000Hz - , EMMFSampleRate16000Hz - , EMMFSampleRate22050Hz - , EMMFSampleRate24000Hz - , EMMFSampleRate32000Hz - , EMMFSampleRate44100Hz - , EMMFSampleRate48000Hz - , EMMFSampleRate64000Hz - , EMMFSampleRate88200Hz - , EMMFSampleRate96000Hz -}; - -const SampleRateQt SampleRateListQt[SampleRateCount] = { - 8000 - , 11025 - , 12000 - , 16000 - , 22050 - , 24000 - , 32000 - , 44100 - , 48000 - , 64000 - , 88200 - , 96000 -}; - -// Channels - -typedef TMMFMonoStereo ChannelsNative; -typedef int ChannelsQt; - -const int ChannelsCount = 2; - -const ChannelsNative ChannelsListNative[ChannelsCount] = { - EMMFMono - , EMMFStereo -}; - -const ChannelsQt ChannelsListQt[ChannelsCount] = { - 1 - , 2 -}; - -// Encoding - -const int EncodingCount = 6; - -const TUint32 EncodingFourCC[EncodingCount] = { - KMMFFourCCCodePCM8 // 0 - , KMMFFourCCCodePCMU8 // 1 - , KMMFFourCCCodePCM16 // 2 - , KMMFFourCCCodePCMU16 // 3 - , KMMFFourCCCodePCM16B // 4 - , KMMFFourCCCodePCMU16B // 5 -}; - -// The characterised DevSound API specification states that the iEncoding -// field in TMMFCapabilities is ignored, and that the FourCC should be used -// to specify the PCM encoding. -// See "SGL.GT0287.102 Multimedia DevSound Baseline Compatibility.doc" in the -// mm_info/mm_docs repository. -const TMMFSoundEncoding EncodingNative[EncodingCount] = { - EMMFSoundEncoding16BitPCM // 0 - , EMMFSoundEncoding16BitPCM // 1 - , EMMFSoundEncoding16BitPCM // 2 - , EMMFSoundEncoding16BitPCM // 3 - , EMMFSoundEncoding16BitPCM // 4 - , EMMFSoundEncoding16BitPCM // 5 -}; - - -const int EncodingSampleSize[EncodingCount] = { - 8 // 0 - , 8 // 1 - , 16 // 2 - , 16 // 3 - , 16 // 4 - , 16 // 5 -}; - -const QAudioFormat::Endian EncodingByteOrder[EncodingCount] = { - QAudioFormat::LittleEndian // 0 - , QAudioFormat::LittleEndian // 1 - , QAudioFormat::LittleEndian // 2 - , QAudioFormat::LittleEndian // 3 - , QAudioFormat::BigEndian // 4 - , QAudioFormat::BigEndian // 5 -}; - -const QAudioFormat::SampleType EncodingSampleType[EncodingCount] = { - QAudioFormat::SignedInt // 0 - , QAudioFormat::UnSignedInt // 1 - , QAudioFormat::SignedInt // 2 - , QAudioFormat::UnSignedInt // 3 - , QAudioFormat::SignedInt // 4 - , QAudioFormat::UnSignedInt // 5 -}; - - -//----------------------------------------------------------------------------- -// Private functions -//----------------------------------------------------------------------------- - -// Helper functions for implementing parameter conversions - -template -bool findValue(const Input *inputArray, int length, Input input, int &index) { - bool result = false; - for (int i=0; !result && i -bool convertValue(const Input *inputArray, const Output *outputArray, - int length, Input input, Output &output) { - int index; - const bool result = findValue(inputArray, length, input, index); - if (result) - output = outputArray[index]; - return result; -} - -/** - * Macro which is used to generate the implementation of the conversion - * functions. The implementation is just a wrapper around the templated - * convertValue function, e.g. - * - * CONVERSION_FUNCTION_IMPL(SampleRate, Qt, Native) - * - * expands to - * - * bool SampleRateQtToNative(int input, TMMFSampleRate &output) { - * return convertValue - * (SampleRateListQt, SampleRateListNative, SampleRateCount, - * input, output); - * } - */ -#define CONVERSION_FUNCTION_IMPL(FieldLc, Field, Input, Output) \ -bool FieldLc##Input##To##Output(Field##Input input, Field##Output &output) { \ - return convertValue(Field##List##Input, \ - Field##List##Output, Field##Count, input, output); \ -} - -//----------------------------------------------------------------------------- -// Local helper functions -//----------------------------------------------------------------------------- - -CONVERSION_FUNCTION_IMPL(sampleRate, SampleRate, Qt, Native) -CONVERSION_FUNCTION_IMPL(sampleRate, SampleRate, Native, Qt) -CONVERSION_FUNCTION_IMPL(channels, Channels, Qt, Native) -CONVERSION_FUNCTION_IMPL(channels, Channels, Native, Qt) - -bool sampleInfoQtToNative(int inputSampleSize, - QAudioFormat::Endian inputByteOrder, - QAudioFormat::SampleType inputSampleType, - TUint32 &outputFourCC, - TMMFSoundEncoding &outputEncoding) { - - bool found = false; - - for (int i=0; i &frequencies, - QList &channels, - QList &sampleSizes, - QList &byteOrders, - QList &sampleTypes) { - - frequencies.clear(); - sampleSizes.clear(); - byteOrders.clear(); - sampleTypes.clear(); - channels.clear(); - - for (int i=0; i -#include -#include -#include -#include "symbianaudio.h" - -QT_BEGIN_NAMESPACE - -namespace SymbianAudio { - -/* - * Helper class for querying DevSound codec / format support - */ -class DevSoundCapabilities { -public: - DevSoundCapabilities(CMMFDevSound &devsound, QAudio::Mode mode); - ~DevSoundCapabilities(); - - const RArray& fourCC() const { return m_fourCC; } - const TMMFCapabilities& caps() const { return m_caps; } - -private: - void constructL(CMMFDevSound &devsound, QAudio::Mode mode); - -private: - RArray m_fourCC; - TMMFCapabilities m_caps; -}; - -namespace Utils { - -/** - * Convert native audio capabilities to QAudio lists. - */ -void capabilitiesNativeToQt(const DevSoundCapabilities &caps, - QList &frequencies, - QList &channels, - QList &sampleSizes, - QList &byteOrders, - QList &sampleTypes); - -/** - * Check whether format is supported. - */ -bool isFormatSupported(const QAudioFormat &format, - const DevSoundCapabilities &caps); - -/** - * Convert QAudioFormat to native format types. - * - * Note that, despite the name, DevSound uses TMMFCapabilities to specify - * single formats as well as capabilities. - * - * Note that this function does not modify outputFormat.iBufferSize. - */ -bool formatQtToNative(const QAudioFormat &inputFormat, - TUint32 &outputFourCC, - TMMFCapabilities &outputFormat); - -/** - * Convert internal states to QAudio states. - */ -QAudio::State stateNativeToQt(State nativeState, - QAudio::State initializingState); - -/** - * Convert data length to number of samples. - */ -qint64 bytesToSamples(const QAudioFormat &format, qint64 length); - -/** - * Convert number of samples to data length. - */ -qint64 samplesToBytes(const QAudioFormat &format, qint64 samples); - -} // namespace Utils -} // namespace SymbianAudio - -QT_END_NAMESPACE - -#endif diff -r 2f34d5167611 -r fcece45ef507 src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp Mon May 03 13:17:34 2010 +0300 @@ -68,11 +68,10 @@ }; enum CompositionModeStatus { - PorterDuff_None = 0x00, - PorterDuff_SupportedBlits = 0x01, - PorterDuff_SupportedPrimitives = 0x02, - PorterDuff_SupportedOpaquePrimitives = 0x04, - PorterDuff_Dirty = 0x10 + PorterDuff_None = 0x0, + PorterDuff_Supported = 0x1, + PorterDuff_PremultiplyColors = 0x2, + PorterDuff_AlwaysBlend = 0x4 }; enum ClipType { @@ -97,7 +96,6 @@ inline void unlock(); static inline void unlock(QDirectFBPaintDevice *device); - inline bool testCompositionMode(const QPen *pen, const QBrush *brush, const QColor *color = 0) const; inline bool isSimpleBrush(const QBrush &brush) const; void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos); @@ -130,6 +128,7 @@ ClipType clipType; QDirectFBPaintDevice *dfbDevice; uint compositionModeStatus; + bool isPremultiplied; bool inClip; QRect currentClip; @@ -168,7 +167,7 @@ static QCache imageCache(4*1024*1024); // 4 MB #endif -#if defined QT_DIRECTFB_WARN_ON_RASTERFALLBACKS || defined QT_DIRECTFB_DISABLE_RASTERFALLBACKS +#if defined QT_DIRECTFB_WARN_ON_RASTERFALLBACKS || defined QT_DIRECTFB_DISABLE_RASTERFALLBACKS || defined QT_DEBUG #define VOID_ARG() static_cast(false) enum PaintOperation { DRAW_RECTS = 0x0001, DRAW_LINES = 0x0002, DRAW_IMAGE = 0x0004, @@ -178,9 +177,89 @@ FILL_RECT = 0x1000, DRAW_COLORSPANS = 0x2000, DRAW_ROUNDED_RECT = 0x4000, ALL = 0xffff }; + +#ifdef QT_DEBUG +static void initRasterFallbacksMasks(int *warningMask, int *disableMask) +{ + struct { + const char *name; + PaintOperation operation; + } const operations[] = { + { "DRAW_RECTS", DRAW_RECTS }, + { "DRAW_LINES", DRAW_LINES }, + { "DRAW_IMAGE", DRAW_IMAGE }, + { "DRAW_PIXMAP", DRAW_PIXMAP }, + { "DRAW_TILED_PIXMAP", DRAW_TILED_PIXMAP }, + { "STROKE_PATH", STROKE_PATH }, + { "DRAW_PATH", DRAW_PATH }, + { "DRAW_POINTS", DRAW_POINTS }, + { "DRAW_ELLIPSE", DRAW_ELLIPSE }, + { "DRAW_POLYGON", DRAW_POLYGON }, + { "DRAW_TEXT", DRAW_TEXT }, + { "FILL_PATH", FILL_PATH }, + { "FILL_RECT", FILL_RECT }, + { "DRAW_COLORSPANS", DRAW_COLORSPANS }, + { "DRAW_ROUNDED_RECT", DRAW_ROUNDED_RECT }, + { "ALL", ALL }, + { 0, ALL } + }; + + QStringList warning = QString::fromLatin1(qgetenv("QT_DIRECTFB_WARN_ON_RASTERFALLBACKS")).toUpper().split(QLatin1Char('|'), + QString::SkipEmptyParts); + QStringList disable = QString::fromLatin1(qgetenv("QT_DIRECTFB_DISABLE_RASTERFALLBACKS")).toUpper().split(QLatin1Char('|'), + QString::SkipEmptyParts); + *warningMask = 0; + *disableMask = 0; + if (!warning.isEmpty() || !disable.isEmpty()) { + for (int i=0; operations[i].name; ++i) { + const QString name = QString::fromLatin1(operations[i].name); + int idx = warning.indexOf(name); + if (idx != -1) { + *warningMask |= operations[i].operation; + warning.erase(warning.begin() + idx); + } + idx = disable.indexOf(name); + if (idx != -1) { + *disableMask |= operations[i].operation; + disable.erase(disable.begin() + idx); + } + } + } + if (!warning.isEmpty()) { + qWarning("QDirectFBPaintEngine QT_DIRECTFB_WARN_ON_RASTERFALLBACKS Unknown operation(s): %s", + qPrintable(warning.join(QLatin1String("|")))); + } + if (!disable.isEmpty()) { + qWarning("QDirectFBPaintEngine QT_DIRECTFB_DISABLE_RASTERFALLBACKS Unknown operation(s): %s", + qPrintable(disable.join(QLatin1String("|")))); + } + +} #endif +static inline int rasterFallbacksMask(bool warn) +{ #ifdef QT_DIRECTFB_WARN_ON_RASTERFALLBACKS + if (warn) + return QT_DIRECTFB_WARN_ON_RASTERFALLBACKS; +#endif +#ifdef QT_DIRECTFB_DISABLE_RASTERFALLBACKS + if (!warn) + return QT_DIRECTFB_DISABLE_RASTERFALLBACKS; +#endif +#ifndef QT_DEBUG + return 0; +#else + static int warnMask = -1; + static int disableMask = -1; + if (warnMask == -1) + initRasterFallbacksMasks(&warnMask, &disableMask); + return warn ? warnMask : disableMask; +#endif +} +#endif + +#if defined QT_DIRECTFB_WARN_ON_RASTERFALLBACKS || defined QT_DEBUG template static void rasterFallbackWarn(const char *msg, const char *func, const device *dev, uint transformationType, bool simplePen, @@ -190,25 +269,31 @@ const char *nameThree, const T3 &three); #endif -#if defined QT_DIRECTFB_WARN_ON_RASTERFALLBACKS && defined QT_DIRECTFB_DISABLE_RASTERFALLBACKS +#if defined QT_DEBUG || (defined QT_DIRECTFB_WARN_ON_RASTERFALLBACKS && defined QT_DIRECTFB_DISABLE_RASTERFALLBACKS) #define RASTERFALLBACK(op, one, two, three) \ - if (op & (QT_DIRECTFB_WARN_ON_RASTERFALLBACKS)) \ - rasterFallbackWarn("Disabled raster engine operation", \ - __FUNCTION__, state()->painter->device(), \ - d_func()->transformationType, \ - d_func()->simplePen, \ - d_func()->clipType, \ - d_func()->compositionModeStatus, \ - #one, one, #two, two, #three, three); \ - if (op & (QT_DIRECTFB_DISABLE_RASTERFALLBACKS)) \ - return; + { \ + const bool disable = op & rasterFallbacksMask(false); \ + if (op & rasterFallbacksMask(true)) \ + rasterFallbackWarn(disable \ + ? "Disabled raster engine operation" \ + : "Falling back to raster engine for", \ + __FUNCTION__, \ + state()->painter->device(), \ + d_func()->transformationType, \ + d_func()->simplePen, \ + d_func()->clipType, \ + d_func()->compositionModeStatus, \ + #one, one, #two, two, #three, three); \ + if (disable) \ + return; \ + } #elif defined QT_DIRECTFB_DISABLE_RASTERFALLBACKS -#define RASTERFALLBACK(op, one, two, three) \ - if (op & (QT_DIRECTFB_DISABLE_RASTERFALLBACKS)) \ +#define RASTERFALLBACK(op, one, two, three) \ + if (op & rasterFallbacksMask(false)) \ return; #elif defined QT_DIRECTFB_WARN_ON_RASTERFALLBACKS #define RASTERFALLBACK(op, one, two, three) \ - if (op & (QT_DIRECTFB_WARN_ON_RASTERFALLBACKS)) \ + if (op & rasterFallbacksMask(true)) \ rasterFallbackWarn("Falling back to raster engine for", \ __FUNCTION__, state()->painter->device(), \ d_func()->transformationType, \ @@ -287,6 +372,7 @@ qFatal("QDirectFBPaintEngine used on an invalid device: 0x%x", device->devType()); } + d->isPremultiplied = QDirectFBScreen::isPremultiplied(d->dfbDevice->format()); d->prepare(d->dfbDevice); gccaps = AllFeatures; @@ -413,7 +499,7 @@ || !d->simplePen || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip || !d->isSimpleBrush(brush) - || !d->testCompositionMode(&pen, &brush)) { + || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { RASTERFALLBACK(DRAW_RECTS, rectCount, VOID_ARG(), VOID_ARG()); d->lock(); QRasterPaintEngine::drawRects(rects, rectCount); @@ -443,7 +529,7 @@ || !d->simplePen || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip || !d->isSimpleBrush(brush) - || !d->testCompositionMode(&pen, &brush)) { + || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { RASTERFALLBACK(DRAW_RECTS, rectCount, VOID_ARG(), VOID_ARG()); d->lock(); QRasterPaintEngine::drawRects(rects, rectCount); @@ -468,7 +554,7 @@ const QPen &pen = state()->pen; if (!d->simplePen || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip - || !d->testCompositionMode(&pen, 0)) { + || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { RASTERFALLBACK(DRAW_LINES, lineCount, VOID_ARG(), VOID_ARG()); d->lock(); QRasterPaintEngine::drawLines(lines, lineCount); @@ -488,7 +574,7 @@ const QPen &pen = state()->pen; if (!d->simplePen || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip - || !d->testCompositionMode(&pen, 0)) { + || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { RASTERFALLBACK(DRAW_LINES, lineCount, VOID_ARG(), VOID_ARG()); d->lock(); QRasterPaintEngine::drawLines(lines, lineCount); @@ -526,7 +612,7 @@ */ #if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE - if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) + if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported) || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) || (!d->supportsStretchBlit() && state()->matrix.mapRect(r).size() != sr.size()) @@ -575,7 +661,7 @@ QPixmapData *data = pixmap.pixmapData(); Q_ASSERT(data->classId() == QPixmapData::DirectFBClass); QDirectFBPixmapData *dfbData = static_cast(data); - if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) + if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported) || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) || (!d->supportsStretchBlit() && state()->matrix.mapRect(r).size() != sr.size())) { @@ -606,7 +692,7 @@ RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset); d->lock(); QRasterPaintEngine::drawTiledPixmap(r, pixmap, offset); - } else if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) + } else if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported) || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) || (!d->supportsStretchBlit() && state()->matrix.isScaling())) { @@ -719,20 +805,21 @@ if (d->clipType != QDirectFBPaintEnginePrivate::ComplexClip) { switch (brush.style()) { case Qt::SolidPattern: { - if (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported - || !d->testCompositionMode(0, &brush)) { - break; - } const QColor color = brush.color(); if (!color.isValid()) return; + + if (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported + || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { + break; + } d->setDFBColor(color); const QRect r = state()->matrix.mapRect(rect).toRect(); CLIPPED_PAINT(d->surface->FillRectangle(d->surface, r.x(), r.y(), r.width(), r.height())); return; } case Qt::TexturePattern: { - if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) + if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported) || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) || (!d->supportsStretchBlit() && state()->matrix.isScaling())) { break; @@ -760,7 +847,7 @@ Q_D(QDirectFBPaintEngine); if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) - || !d->testCompositionMode(0, 0, &color)) { + || !(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_Supported)) { RASTERFALLBACK(FILL_RECT, rect, color, VOID_ARG()); d->lock(); QRasterPaintEngine::fillRect(rect, color); @@ -804,7 +891,7 @@ : surface(0), antialiased(false), simplePen(false), transformationType(0), opacity(255), clipType(ClipUnset), dfbDevice(0), - compositionModeStatus(0), inClip(false), q(p) + compositionModeStatus(0), isPremultiplied(false), inClip(false), q(p) { fb = QDirectFBScreen::instance()->dfb(); surfaceCache = new SurfaceCache; @@ -820,36 +907,6 @@ return (brush.style() == Qt::NoBrush) || (brush.style() == Qt::SolidPattern && !antialiased); } -bool QDirectFBPaintEnginePrivate::testCompositionMode(const QPen *pen, const QBrush *brush, const QColor *color) const -{ - Q_ASSERT(!pen || pen->style() == Qt::NoPen || pen->style() == Qt::SolidLine); - Q_ASSERT(!brush || brush->style() == Qt::NoBrush || brush->style() == Qt::SolidPattern); - switch (compositionModeStatus & (QDirectFBPaintEnginePrivate::PorterDuff_SupportedOpaquePrimitives - |QDirectFBPaintEnginePrivate::PorterDuff_SupportedPrimitives)) { - case QDirectFBPaintEnginePrivate::PorterDuff_SupportedPrimitives: - return true; - case QDirectFBPaintEnginePrivate::PorterDuff_SupportedOpaquePrimitives: - if (pen && pen->style() == Qt::SolidLine && pen->color().alpha() != 255) - return false; - if (brush) { - if (brush->style() == Qt::SolidPattern && brush->color().alpha() != 255) { - return false; - } - } else if (color && color->alpha() != 255) { - return false; - } - return true; - case QDirectFBPaintEnginePrivate::PorterDuff_None: - return false; - default: - // ### PorterDuff_SupportedOpaquePrimitives|PorterDuff_SupportedPrimitives can't be combined - break; - } - Q_ASSERT(0); - return false; -} - - void QDirectFBPaintEnginePrivate::lock() { // We will potentially get a new pointer to the buffer after a @@ -912,21 +969,23 @@ static const bool forceRasterFallBack = qgetenv("QT_DIRECTFB_FORCE_RASTER").toInt() > 0; if (forceRasterFallBack) { - compositionModeStatus = 0; + compositionModeStatus = PorterDuff_None; return; } - compositionModeStatus = PorterDuff_SupportedBlits; + compositionModeStatus = PorterDuff_Supported|PorterDuff_PremultiplyColors|PorterDuff_AlwaysBlend; switch (mode) { case QPainter::CompositionMode_Clear: surface->SetPorterDuff(surface, DSPD_CLEAR); break; case QPainter::CompositionMode_Source: surface->SetPorterDuff(surface, DSPD_SRC); - compositionModeStatus |= PorterDuff_SupportedOpaquePrimitives; + compositionModeStatus &= ~PorterDuff_AlwaysBlend; + if (!isPremultiplied) + compositionModeStatus &= ~PorterDuff_PremultiplyColors; break; case QPainter::CompositionMode_SourceOver: - compositionModeStatus |= PorterDuff_SupportedPrimitives; + compositionModeStatus &= ~PorterDuff_AlwaysBlend; surface->SetPorterDuff(surface, DSPD_SRC_OVER); break; case QPainter::CompositionMode_DestinationOver: @@ -934,6 +993,8 @@ break; case QPainter::CompositionMode_SourceIn: surface->SetPorterDuff(surface, DSPD_SRC_IN); + if (!isPremultiplied) + compositionModeStatus &= ~PorterDuff_PremultiplyColors; break; case QPainter::CompositionMode_DestinationIn: surface->SetPorterDuff(surface, DSPD_DST_IN); @@ -944,6 +1005,11 @@ case QPainter::CompositionMode_DestinationOut: surface->SetPorterDuff(surface, DSPD_DST_OUT); break; +#if (Q_DIRECTFB_VERSION >= 0x010209) + case QPainter::CompositionMode_Destination: + surface->SetPorterDuff(surface, DSPD_DST); + break; +#endif #if (Q_DIRECTFB_VERSION >= 0x010000) case QPainter::CompositionMode_SourceAtop: surface->SetPorterDuff(surface, DSPD_SRC_ATOP); @@ -959,7 +1025,7 @@ break; #endif default: - compositionModeStatus = 0; + compositionModeStatus = PorterDuff_None; break; } } @@ -981,9 +1047,6 @@ } surface->SetColor(surface, 0xff, 0xff, 0xff, opacity); surface->SetBlittingFlags(surface, blittingFlags); - if (compositionModeStatus & PorterDuff_Dirty) { - setCompositionMode(q->state()->composition_mode); - } } static inline uint ALPHA_MUL(uint x, uint a) @@ -996,12 +1059,20 @@ void QDirectFBPaintEnginePrivate::setDFBColor(const QColor &color) { Q_ASSERT(surface); + Q_ASSERT(compositionModeStatus & PorterDuff_Supported); const quint8 alpha = (opacity == 255 ? color.alpha() : ALPHA_MUL(color.alpha(), opacity)); - surface->SetColor(surface, color.red(), color.green(), color.blue(), alpha); - surface->SetPorterDuff(surface, DSPD_NONE); - surface->SetDrawingFlags(surface, alpha == 255 ? DSDRAW_NOFX : DSDRAW_BLEND); - compositionModeStatus |= PorterDuff_Dirty; + QColor col; + if (compositionModeStatus & PorterDuff_PremultiplyColors) { + col = QColor(ALPHA_MUL(color.red(), alpha), + ALPHA_MUL(color.green(), alpha), + ALPHA_MUL(color.blue(), alpha), + alpha); + } else { + col = QColor(color.red(), color.green(), color.blue(), alpha); + } + surface->SetColor(surface, col.red(), col.green(), col.blue(), col.alpha()); + surface->SetDrawingFlags(surface, alpha == 255 && !(compositionModeStatus & PorterDuff_AlwaysBlend) ? DSDRAW_NOFX : DSDRAW_BLEND); } IDirectFBSurface *QDirectFBPaintEnginePrivate::getSurface(const QImage &img, bool *release) @@ -1283,7 +1354,7 @@ } } -#ifdef QT_DIRECTFB_WARN_ON_RASTERFALLBACKS +#if defined QT_DIRECTFB_WARN_ON_RASTERFALLBACKS || defined QT_DEBUG template inline const T *ptr(const T &t) { return &t; } template <> inline const bool* ptr(const bool &) { return 0; } template diff -r 2f34d5167611 -r fcece45ef507 src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp --- a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp Mon May 03 13:17:34 2010 +0300 @@ -174,6 +174,8 @@ bool QDirectFBPixmapData::fromFile(const QString &filename, const char *format, Qt::ImageConversionFlags flags) { + if (!QFile::exists(filename)) + return false; if (flags == Qt::AutoColor) { if (filename.startsWith(QLatin1Char(':'))) { // resource QFile file(filename); @@ -288,27 +290,22 @@ void QDirectFBPixmapData::fromImage(const QImage &img, Qt::ImageConversionFlags flags) { - if (img.depth() == 1 || img.format() == QImage::Format_RGB32) { - fromImage(img.convertToFormat(screen->alphaPixmapFormat()), flags); - return; - } - - if (img.hasAlphaChannel() + if (img.depth() == 1) { + alpha = true; #ifndef QT_NO_DIRECTFB_OPAQUE_DETECTION - && (flags & Qt::NoOpaqueDetection || QDirectFBPixmapData::hasAlphaChannel(img)) + } else if (flags & Qt::NoOpaqueDetection || QDirectFBPixmapData::hasAlphaChannel(img)) { + alpha = true; +#else + } else if (img.hasAlphaChannel()) { + alpha = true; #endif - ) { - alpha = true; - imageFormat = screen->alphaPixmapFormat(); - } else { - alpha = false; - imageFormat = screen->pixelFormat(); } + imageFormat = alpha ? screen->alphaPixmapFormat() : screen->pixelFormat(); QImage image; - if (flags != Qt::AutoColor) { + if ((flags & ~Qt::NoOpaqueDetection) != Qt::AutoColor) { image = img.convertToFormat(imageFormat, flags); flags = Qt::AutoColor; - } else if (img.format() == QImage::Format_RGB32) { + } else if (img.format() == QImage::Format_RGB32 || img.depth() == 1) { image = img.convertToFormat(imageFormat, flags); } else { image = img; @@ -425,7 +422,7 @@ Q_ASSERT(dfbSurface); - alpha = (color.alpha() < 255); + alpha |= (color.alpha() < 255); if (alpha && isOpaqueFormat(imageFormat)) { QSize size; diff -r 2f34d5167611 -r fcece45ef507 src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp --- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp Mon May 03 13:17:34 2010 +0300 @@ -1126,6 +1126,8 @@ if (displayArgs.contains(QLatin1String("boundingrectflip"), Qt::CaseInsensitive)) { d_ptr->directFBFlags |= BoundingRectFlip; + } else if (displayArgs.contains(QLatin1String("nopartialflip"), Qt::CaseInsensitive)) { + d_ptr->directFBFlags |= NoPartialFlip; } #ifdef QT_DIRECTFB_IMAGECACHE @@ -1139,6 +1141,8 @@ #endif d_ptr->dfb->SetCooperativeLevel(d_ptr->dfb, DFSCL_FULLSCREEN); + const bool forcePremultiplied = displayArgs.contains(QLatin1String("forcepremultiplied"), Qt::CaseInsensitive); + DFBSurfaceDescription description; memset(&description, 0, sizeof(DFBSurfaceDescription)); IDirectFBSurface *surface; @@ -1167,7 +1171,7 @@ description.caps |= capabilities[i].cap; } - if (displayArgs.contains(QLatin1String("forcepremultiplied"), Qt::CaseInsensitive)) { + if (forcePremultiplied) { description.caps |= DSCAPS_PREMULTIPLIED; } @@ -1217,6 +1221,8 @@ d_ptr->alphaPixmapFormat = QImage::Format_ARGB32_Premultiplied; break; case QImage::Format_ARGB32: + if (forcePremultiplied) + d_ptr->alphaPixmapFormat = pixelFormat = QImage::Format_ARGB32_Premultiplied; case QImage::Format_ARGB32_Premultiplied: case QImage::Format_ARGB4444_Premultiplied: case QImage::Format_ARGB8555_Premultiplied: @@ -1674,7 +1680,7 @@ uchar *QDirectFBScreen::lockSurface(IDirectFBSurface *surface, DFBSurfaceLockFlags flags, int *bpl) { - void *mem; + void *mem = 0; const DFBResult result = surface->Lock(surface, flags, &mem, bpl); if (result != DFB_OK) { DirectFBError("QDirectFBScreen::lockSurface()", result); @@ -1683,11 +1689,22 @@ return reinterpret_cast(mem); } +static inline bool isFullUpdate(IDirectFBSurface *surface, const QRegion ®ion, const QPoint &offset) +{ + if (offset == QPoint(0, 0) && region.rectCount() == 1) { + QSize size; + surface->GetSize(surface, &size.rwidth(), &size.rheight()); + if (region.boundingRect().size() == size) + return true; + } + return false; +} void QDirectFBScreen::flipSurface(IDirectFBSurface *surface, DFBSurfaceFlipFlags flipFlags, const QRegion ®ion, const QPoint &offset) { - if (!(flipFlags & DSFLIP_BLIT)) { + if (d_ptr->directFBFlags & NoPartialFlip + || (!(flipFlags & DSFLIP_BLIT) && QT_PREPEND_NAMESPACE(isFullUpdate(surface, region, offset)))) { surface->Flip(surface, 0, flipFlags); } else { if (!(d_ptr->directFBFlags & BoundingRectFlip) && region.rectCount() > 1) { diff -r 2f34d5167611 -r fcece45ef507 src/plugins/gfxdrivers/directfb/qdirectfbscreen.h --- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h Mon May 03 13:17:34 2010 +0300 @@ -144,7 +144,8 @@ NoFlags = 0x00, VideoOnly = 0x01, SystemOnly = 0x02, - BoundingRectFlip = 0x04 + BoundingRectFlip = 0x04, + NoPartialFlip = 0x08 }; Q_DECLARE_FLAGS(DirectFBFlags, DirectFBFlag); diff -r 2f34d5167611 -r fcece45ef507 src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp --- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp Mon May 03 13:17:34 2010 +0300 @@ -61,6 +61,7 @@ #endif , flipFlags(flip) , boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip) + , flushPending(false) { #ifdef QT_NO_DIRECTFB_WM mode = Offscreen; @@ -80,6 +81,7 @@ #endif , flipFlags(flip) , boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip) + , flushPending(false) { SurfaceFlags flags = 0; if (!widget || widget->window()->windowOpacity() == 0xff) @@ -92,10 +94,6 @@ mode = Offscreen; flags = Buffered; } -#else - noSystemBackground = widget && widget->testAttribute(Qt::WA_NoSystemBackground); - if (noSystemBackground) - flags &= ~Opaque; #endif setSurfaceFlags(flags); #ifdef QT_DIRECTFB_TIMING @@ -134,33 +132,35 @@ if (!layer) qFatal("QDirectFBWindowSurface: Unable to get primary display layer!"); + updateIsOpaque(); + DFBWindowDescription description; memset(&description, 0, sizeof(DFBWindowDescription)); + description.flags = DWDESC_CAPS|DWDESC_HEIGHT|DWDESC_WIDTH|DWDESC_POSX|DWDESC_POSY|DWDESC_SURFACE_CAPS|DWDESC_PIXELFORMAT; description.caps = DWCAPS_NODECORATION; - description.flags = DWDESC_CAPS|DWDESC_SURFACE_CAPS|DWDESC_PIXELFORMAT|DWDESC_HEIGHT|DWDESC_WIDTH|DWDESC_POSX|DWDESC_POSY; -#if (Q_DIRECTFB_VERSION >= 0x010200) - description.flags |= DWDESC_OPTIONS; -#endif + description.surface_caps = DSCAPS_NONE; + imageFormat = screen->pixelFormat(); - if (noSystemBackground) { + if (!(surfaceFlags() & Opaque)) { + imageFormat = screen->alphaPixmapFormat(); description.caps |= DWCAPS_ALPHACHANNEL; #if (Q_DIRECTFB_VERSION >= 0x010200) + description.flags |= DWDESC_OPTIONS; description.options |= DWOP_ALPHACHANNEL; #endif } - + description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(imageFormat); description.posx = rect.x(); description.posy = rect.y(); description.width = rect.width(); description.height = rect.height(); - description.surface_caps = DSCAPS_NONE; + + if (QDirectFBScreen::isPremultiplied(imageFormat)) + description.surface_caps = DSCAPS_PREMULTIPLIED; + if (screen->directFBFlags() & QDirectFBScreen::VideoOnly) description.surface_caps |= DSCAPS_VIDEOONLY; - const QImage::Format format = (noSystemBackground ? screen->alphaPixmapFormat() : screen->pixelFormat()); - description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(format); - if (QDirectFBScreen::isPremultiplied(format)) - description.surface_caps = DSCAPS_PREMULTIPLIED; DFBResult result = layer->CreateWindow(layer, &description, &dfbWindow); @@ -182,7 +182,6 @@ Q_ASSERT(!dfbSurface); dfbWindow->GetSurface(dfbWindow, &dfbSurface); - updateFormat(); } static DFBResult setWindowGeometry(IDirectFBWindow *dfbWindow, const QRect &old, const QRect &rect) @@ -267,15 +266,17 @@ } } else { // mode == Offscreen if (!dfbSurface) { - dfbSurface = screen->createDFBSurface(rect.size(), screen->pixelFormat(), QDirectFBScreen::DontTrackSurface); + dfbSurface = screen->createDFBSurface(rect.size(), surfaceFlags() & Opaque ? screen->pixelFormat() : screen->alphaPixmapFormat(), + QDirectFBScreen::DontTrackSurface); } } if (result != DFB_OK) DirectFBErrorFatal("QDirectFBWindowSurface::setGeometry()", result); #endif } - if (oldSurface != dfbSurface) - updateFormat(); + if (oldSurface != dfbSurface) { + imageFormat = dfbSurface ? QDirectFBScreen::getImageFormat(dfbSurface) : QImage::Format_Invalid; + } if (oldRect.size() != rect.size()) { QWSWindowSurface::setGeometry(rect); @@ -296,32 +297,23 @@ if (state.size() == sizeof(this)) { sibling = *reinterpret_cast(state.constData()); Q_ASSERT(sibling); - sibling->setSurfaceFlags(surfaceFlags()); + setSurfaceFlags(sibling->surfaceFlags()); } } -static inline void scrollSurface(IDirectFBSurface *surface, const QRect &r, int dx, int dy) -{ - const DFBRectangle rect = { r.x(), r.y(), r.width(), r.height() }; - surface->Blit(surface, surface, &rect, r.x() + dx, r.y() + dy); - const DFBRegion region = { rect.x + dx, rect.y + dy, r.right() + dx, r.bottom() + dy }; - surface->Flip(surface, ®ion, DSFLIP_BLIT); -} - bool QDirectFBWindowSurface::scroll(const QRegion ®ion, int dx, int dy) { - if (!dfbSurface || !(flipFlags & DSFLIP_BLIT) || region.isEmpty()) + if (!dfbSurface || !(flipFlags & DSFLIP_BLIT) || region.rectCount() != 1) return false; - dfbSurface->SetBlittingFlags(dfbSurface, DSBLIT_NOFX); - if (region.rectCount() == 1) { - scrollSurface(dfbSurface, region.boundingRect(), dx, dy); + if (flushPending) { + dfbSurface->Flip(dfbSurface, 0, DSFLIP_BLIT); } else { - const QVector rects = region.rects(); - const int n = rects.size(); - for (int i=0; iSetBlittingFlags(dfbSurface, DSBLIT_NOFX); + const QRect r = region.boundingRect(); + const DFBRectangle rect = { r.x(), r.y(), r.width(), r.height() }; + dfbSurface->Blit(dfbSurface, dfbSurface, &rect, r.x() + dx, r.y() + dy); return true; } @@ -359,8 +351,6 @@ const quint8 windowOpacity = quint8(win->windowOpacity() * 0xff); const QRect windowGeometry = geometry(); #ifdef QT_DIRECTFB_WM - const bool wasNoSystemBackground = noSystemBackground; - noSystemBackground = win->testAttribute(Qt::WA_NoSystemBackground); quint8 currentOpacity; Q_ASSERT(dfbWindow); dfbWindow->GetOpacity(dfbWindow, ¤tOpacity); @@ -368,18 +358,9 @@ dfbWindow->SetOpacity(dfbWindow, windowOpacity); } - setOpaque(noSystemBackground || windowOpacity != 0xff); - if (wasNoSystemBackground != noSystemBackground) { - releaseSurface(); - dfbWindow->Release(dfbWindow); - dfbWindow = 0; - createWindow(windowGeometry); - win->update(); - return; - } screen->flipSurface(dfbSurface, flipFlags, region, offset); #else - setOpaque(windowOpacity != 0xff); + setOpaque(windowOpacity == 0xff); if (mode == Offscreen) { screen->exposeRegion(region.translated(offset + geometry().topLeft()), 0); } else { @@ -396,6 +377,7 @@ timer.restart(); } #endif + flushPending = false; } void QDirectFBWindowSurface::beginPaint(const QRegion &) @@ -403,6 +385,7 @@ if (!engine) { engine = new QDirectFBPaintEngine(this); } + flushPending = true; } void QDirectFBWindowSurface::endPaint(const QRegion &) @@ -442,11 +425,6 @@ return dfbSurface; } -void QDirectFBWindowSurface::updateFormat() -{ - imageFormat = dfbSurface ? QDirectFBScreen::getImageFormat(dfbSurface) : QImage::Format_Invalid; -} - void QDirectFBWindowSurface::releaseSurface() { if (dfbSurface) { @@ -465,9 +443,37 @@ } } +void QDirectFBWindowSurface::updateIsOpaque() +{ + const QWidget *win = window(); + Q_ASSERT(win); + if (win->testAttribute(Qt::WA_OpaquePaintEvent) || win->testAttribute(Qt::WA_PaintOnScreen)) { + setOpaque(true); + return; + } + + if (qFuzzyCompare(static_cast(win->windowOpacity()), 1.0f)) { + const QPalette &pal = win->palette(); + + if (win->autoFillBackground()) { + const QBrush &autoFillBrush = pal.brush(win->backgroundRole()); + if (autoFillBrush.style() != Qt::NoBrush && autoFillBrush.isOpaque()) { + setOpaque(true); + return; + } + } + + if (win->isWindow() && !win->testAttribute(Qt::WA_NoSystemBackground)) { + const QBrush &windowBrush = win->palette().brush(QPalette::Window); + if (windowBrush.style() != Qt::NoBrush && windowBrush.isOpaque()) { + setOpaque(true); + return; + } + } + } + setOpaque(false); +} QT_END_NAMESPACE #endif // QT_NO_QWS_DIRECTFB - - diff -r 2f34d5167611 -r fcece45ef507 src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h --- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h Mon May 03 13:17:34 2010 +0300 @@ -97,8 +97,8 @@ IDirectFBWindow *directFBWindow() const; #endif private: + void updateIsOpaque(); void setOpaque(bool opaque); - void updateFormat(); void releaseSurface(); QDirectFBWindowSurface *sibling; @@ -113,8 +113,8 @@ #endif DFBSurfaceFlipFlags flipFlags; - bool noSystemBackground; bool boundingRectFlip; + bool flushPending; #ifdef QT_DIRECTFB_TIMING int frames; QTime timer; diff -r 2f34d5167611 -r fcece45ef507 src/plugins/gfxdrivers/vnc/qscreenvnc_qws.cpp --- a/src/plugins/gfxdrivers/vnc/qscreenvnc_qws.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/gfxdrivers/vnc/qscreenvnc_qws.cpp Mon May 03 13:17:34 2010 +0300 @@ -325,6 +325,36 @@ { 0xffe8, Qt::Key_Meta }, { 0xffe9, Qt::Key_Alt }, { 0xffea, Qt::Key_Alt }, + + { 0xffb0, Qt::Key_0 }, + { 0xffb1, Qt::Key_1 }, + { 0xffb2, Qt::Key_2 }, + { 0xffb3, Qt::Key_3 }, + { 0xffb4, Qt::Key_4 }, + { 0xffb5, Qt::Key_5 }, + { 0xffb6, Qt::Key_6 }, + { 0xffb7, Qt::Key_7 }, + { 0xffb8, Qt::Key_8 }, + { 0xffb9, Qt::Key_9 }, + + { 0xff8d, Qt::Key_Return }, + { 0xffaa, Qt::Key_Asterisk }, + { 0xffab, Qt::Key_Plus }, + { 0xffad, Qt::Key_Minus }, + { 0xffae, Qt::Key_Period }, + { 0xffaf, Qt::Key_Slash }, + + { 0xff95, Qt::Key_Home }, + { 0xff96, Qt::Key_Left }, + { 0xff97, Qt::Key_Up }, + { 0xff98, Qt::Key_Right }, + { 0xff99, Qt::Key_Down }, + { 0xff9a, Qt::Key_PageUp }, + { 0xff9b, Qt::Key_PageDown }, + { 0xff9c, Qt::Key_End }, + { 0xff9e, Qt::Key_Insert }, + { 0xff9f, Qt::Key_Delete }, + { 0, 0 } }; @@ -483,6 +513,10 @@ keycode = keyMap[i].keycode; i++; } + + if (keycode >= ' ' && keycode <= '~') + unicode = keycode; + if (!keycode) { if (key <= 0xff) { unicode = key; @@ -2129,6 +2163,9 @@ if (QScreenDriverFactory::keys().contains(driver, Qt::CaseInsensitive)) { const int id = getDisplayId(dspec); QScreen *s = qt_get_screen(id, dspec.toLatin1().constData()); + if (s->pixelFormat() == QImage::Format_Indexed8 + || s->pixelFormat() == QImage::Format_Invalid && s->depth() == 8) + qFatal("QVNCScreen: unsupported screen format"); setScreen(s); } else { // create virtual screen #if Q_BYTE_ORDER == Q_BIG_ENDIAN diff -r 2f34d5167611 -r fcece45ef507 src/plugins/imageformats/jpeg/qjpeghandler.cpp --- a/src/plugins/imageformats/jpeg/qjpeghandler.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/imageformats/jpeg/qjpeghandler.cpp Mon May 03 13:17:34 2010 +0300 @@ -1188,7 +1188,11 @@ return false; } - return device->peek(2) == "\xFF\xD8"; + char buffer[2]; + if (device->peek(buffer, 2) != 2) + return false; + + return uchar(buffer[0]) == 0xff && uchar(buffer[1]) == 0xd8; } bool QJpegHandler::read(QImage *image) diff -r 2f34d5167611 -r fcece45ef507 src/plugins/phonon/mmf/mmf.pro --- a/src/plugins/phonon/mmf/mmf.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/phonon/mmf/mmf.pro Mon May 03 13:17:34 2010 +0300 @@ -20,13 +20,16 @@ # '#include ' picks up the Symbian header, as intended. PREPEND_INCLUDEPATH = /epoc32/include +PREPEND_INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty + INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE HEADERS += \ $$PHONON_MMF_DIR/abstractaudioeffect.h \ $$PHONON_MMF_DIR/abstractmediaplayer.h \ $$PHONON_MMF_DIR/abstractplayer.h \ - $$PHONON_MMF_DIR/ancestormovemonitor.h \ + $$PHONON_MMF_DIR/abstractvideooutput.h \ + $$PHONON_MMF_DIR/abstractvideoplayer.h \ $$PHONON_MMF_DIR/audioequalizer.h \ $$PHONON_MMF_DIR/audiooutput.h \ $$PHONON_MMF_DIR/audioplayer.h \ @@ -40,23 +43,22 @@ $$PHONON_MMF_DIR/loudness.h \ $$PHONON_MMF_DIR/mediaobject.h \ $$PHONON_MMF_DIR/mmf_medianode.h \ - $$PHONON_MMF_DIR/mmf_videoplayer.h \ $$PHONON_MMF_DIR/stereowidening.h \ $$PHONON_MMF_DIR/objectdump.h \ $$PHONON_MMF_DIR/objectdump_symbian.h \ $$PHONON_MMF_DIR/objecttree.h \ $$PHONON_MMF_DIR/utils.h \ - $$PHONON_MMF_DIR/videooutput.h \ $$PHONON_MMF_DIR/videowidget.h SOURCES += \ $$PHONON_MMF_DIR/abstractaudioeffect.cpp \ $$PHONON_MMF_DIR/abstractmediaplayer.cpp \ $$PHONON_MMF_DIR/abstractplayer.cpp \ - $$PHONON_MMF_DIR/ancestormovemonitor.cpp \ $$PHONON_MMF_DIR/audioequalizer.cpp \ $$PHONON_MMF_DIR/audiooutput.cpp \ $$PHONON_MMF_DIR/audioplayer.cpp \ + $$PHONON_MMF_DIR/abstractvideooutput.cpp \ + $$PHONON_MMF_DIR/abstractvideoplayer.cpp \ $$PHONON_MMF_DIR/backend.cpp \ $$PHONON_MMF_DIR/bassboost.cpp \ $$PHONON_MMF_DIR/dummyplayer.cpp \ @@ -66,15 +68,34 @@ $$PHONON_MMF_DIR/loudness.cpp \ $$PHONON_MMF_DIR/mediaobject.cpp \ $$PHONON_MMF_DIR/mmf_medianode.cpp \ - $$PHONON_MMF_DIR/mmf_videoplayer.cpp \ $$PHONON_MMF_DIR/stereowidening.cpp \ $$PHONON_MMF_DIR/objectdump.cpp \ $$PHONON_MMF_DIR/objectdump_symbian.cpp \ $$PHONON_MMF_DIR/objecttree.cpp \ $$PHONON_MMF_DIR/utils.cpp \ - $$PHONON_MMF_DIR/videooutput.cpp \ $$PHONON_MMF_DIR/videowidget.cpp +# Test for whether the build environment supports video rendering to graphics +# surfaces. +exists($${EPOCROOT}epoc32/include/platform/videoplayer2.h) { + HEADERS += \ + $$PHONON_MMF_DIR/videooutput_surface.h \ + $$PHONON_MMF_DIR/videoplayer_surface.h + SOURCES += \ + $$PHONON_MMF_DIR/videooutput_surface.cpp \ + $$PHONON_MMF_DIR/videoplayer_surface.cpp + DEFINES += PHONON_MMF_VIDEO_SURFACES +} else { + HEADERS += \ + $$PHONON_MMF_DIR/ancestormovemonitor.h \ + $$PHONON_MMF_DIR/videooutput_dsa.h \ + $$PHONON_MMF_DIR/videoplayer_dsa.h + SOURCES += \ + $$PHONON_MMF_DIR/ancestormovemonitor.cpp \ + $$PHONON_MMF_DIR/videooutput_dsa.cpp \ + $$PHONON_MMF_DIR/videoplayer_dsa.cpp \ +} + LIBS += -lcone LIBS += -lws32 diff -r 2f34d5167611 -r fcece45ef507 src/plugins/qpluginbase.pri --- a/src/plugins/qpluginbase.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/qpluginbase.pri Mon May 03 13:17:34 2010 +0300 @@ -17,5 +17,11 @@ symbian: { TARGET.EPOCALLOWDLLDATA=1 TARGET.CAPABILITY = All -Tcb + TARGET = $${TARGET}$${QT_LIBINFIX} load(armcc_warnings) + + # load the environment specific feature definitions + exists($${EPOCROOT}epoc32/tools/qt/mkspecs/features/environment.prf) { + load($${EPOCROOT}epoc32/tools/qt/mkspecs/features/environment.prf) + } } diff -r 2f34d5167611 -r fcece45ef507 src/plugins/s60/3_1/3_1.pro --- a/src/plugins/s60/3_1/3_1.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/s60/3_1/3_1.pro Mon May 03 13:17:34 2010 +0300 @@ -1,6 +1,6 @@ include(../s60pluginbase.pri) -TARGET = qts60plugin_3_1 +TARGET = qts60plugin_3_1$${QT_LIBINFIX} SOURCES += ../src/qlocale_3_1.cpp \ ../src/qdesktopservices_3_1.cpp \ diff -r 2f34d5167611 -r fcece45ef507 src/plugins/s60/3_2/3_2.pro --- a/src/plugins/s60/3_2/3_2.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/s60/3_2/3_2.pro Mon May 03 13:17:34 2010 +0300 @@ -1,6 +1,6 @@ include(../s60pluginbase.pri) -TARGET = qts60plugin_3_2 +TARGET = qts60plugin_3_2$${QT_LIBINFIX} contains(S60_VERSION, 3.1) { SOURCES += ../src/qlocale_3_1.cpp \ diff -r 2f34d5167611 -r fcece45ef507 src/plugins/s60/5_0/5_0.pro --- a/src/plugins/s60/5_0/5_0.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/s60/5_0/5_0.pro Mon May 03 13:17:34 2010 +0300 @@ -1,6 +1,6 @@ include(../s60pluginbase.pri) -TARGET = qts60plugin_5_0 +TARGET = qts60plugin_5_0$${QT_LIBINFIX} contains(S60_VERSION, 3.1) { SOURCES += ../src/qlocale_3_1.cpp \ diff -r 2f34d5167611 -r fcece45ef507 src/plugins/sqldrivers/odbc/odbc.pro --- a/src/plugins/sqldrivers/odbc/odbc.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/sqldrivers/odbc/odbc.pro Mon May 03 13:17:34 2010 +0300 @@ -8,6 +8,7 @@ !contains( LIBS, .*odbc.* ) { LIBS *= $$QT_LFLAGS_ODBC } + DEFINES += UNICODE } win32 { diff -r 2f34d5167611 -r fcece45ef507 src/plugins/sqldrivers/sqlite/sqlite.pro --- a/src/plugins/sqldrivers/sqlite/sqlite.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/plugins/sqldrivers/sqlite/sqlite.pro Mon May 03 13:17:34 2010 +0300 @@ -14,4 +14,6 @@ QMAKE_CXXFLAGS *= $$QT_CFLAGS_SQLITE } +wince*: DEFINES += HAVE_LOCALTIME_S=0 + include(../qsqldriverbase.pri) diff -r 2f34d5167611 -r fcece45ef507 src/qt_install.pri --- a/src/qt_install.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/src/qt_install.pri Mon May 03 13:17:34 2010 +0300 @@ -7,13 +7,6 @@ INSTALLS += target #headers -!symbian: { - HEADER_INSTALL_PATH = $$[QT_INSTALL_HEADERS] -} else { - # :QTP: QT_BOOTSTRAPPED qmake doesn't seem to take care of -headerdir - HEADER_INSTALL_PATH = /epoc32/include/mw -} - qt_install_headers { INSTALL_HEADERS = $$SYNCQT.HEADER_FILES equals(TARGET, QtCore) { @@ -21,34 +14,21 @@ INSTALL_HEADERS *= $$QT_BUILD_TREE/src/corelib/global/qconfig.h \ $$QT_SOURCE_TREE/src/corelib/arch/$$QT_ARCH/arch } - # :QTP: avoid duplicate exports for qconfig.h and qxmlstream.h - symbian: { - equals(TARGET, QtXml) { - INSTALL_HEADERS -= ../xml/stream/qxmlstream.h - } - equals(TARGET, QtCore) { - INSTALL_HEADERS -= $$QT_BUILD_TREE/src/corelib/global/qconfig.h - } - equals(TARGET, phonon) { - INSTALL_HEADERS -= ../../include/phonon_compat/Phonon/Phonon \ - ../../include/phonon/Phonon/Phonon - } - } equals(TARGET, phonon) { - class_headers.path = $$HEADER_INSTALL_PATH/$$TARGET + class_headers.path = $$[QT_INSTALL_HEADERS]/$$TARGET } else { flat_headers.files = $$INSTALL_HEADERS - flat_headers.path = $$HEADER_INSTALL_PATH/Qt + flat_headers.path = $$[QT_INSTALL_HEADERS]/Qt INSTALLS += flat_headers - class_headers.path = $$HEADER_INSTALL_PATH/$$TARGET + class_headers.path = $$[QT_INSTALL_HEADERS]/$$TARGET } class_headers.files = $$SYNCQT.HEADER_CLASSES INSTALLS += class_headers targ_headers.files = $$INSTALL_HEADERS - targ_headers.path = $$HEADER_INSTALL_PATH/$$TARGET + targ_headers.path = $$[QT_INSTALL_HEADERS]/$$TARGET INSTALLS += targ_headers contains(QT_CONFIG,private_tests) { diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/bwins/QtCoreu.def --- a/src/s60installs/bwins/QtCoreu.def Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/bwins/QtCoreu.def Mon May 03 13:17:34 2010 +0300 @@ -4399,4 +4399,22 @@ ?sender@SignalEvent@QStateMachine@@QBEPAVQObject@@XZ @ 4398 NONAME ; class QObject * QStateMachine::SignalEvent::sender(void) const ?signalIndex@SignalEvent@QStateMachine@@QBEHXZ @ 4399 NONAME ; int QStateMachine::SignalEvent::signalIndex(void) const ?disconnectOne@QMetaObject@@SA_NPBVQObject@@H0H@Z @ 4400 NONAME ; bool QMetaObject::disconnectOne(class QObject const *, int, class QObject const *, int) + ?QBasicAtomicInt_fetchAndAddRelease@@YAHPCHH@Z @ 4401 NONAME ; int QBasicAtomicInt_fetchAndAddRelease(int volatile *, int) + ?QBasicAtomicPointer_testAndSetRelaxed@@YA_NPCRAXPAX1@Z @ 4402 NONAME ; bool QBasicAtomicPointer_testAndSetRelaxed(void * volatile *, void *, void *) + ?QBasicAtomicInt_fetchAndAddRelaxed@@YAHPCHH@Z @ 4403 NONAME ; int QBasicAtomicInt_fetchAndAddRelaxed(int volatile *, int) + ?QBasicAtomicPointer_testAndSetRelease@@YA_NPCRAXPAX1@Z @ 4404 NONAME ; bool QBasicAtomicPointer_testAndSetRelease(void * volatile *, void *, void *) + ?QBasicAtomicInt_fetchAndStoreRelease@@YAHPCHH@Z @ 4405 NONAME ; int QBasicAtomicInt_fetchAndStoreRelease(int volatile *, int) + ?QBasicAtomicPointer_fetchAndAddAcquire@@YAPAXPCRAXH@Z @ 4406 NONAME ; void * QBasicAtomicPointer_fetchAndAddAcquire(void * volatile *, int) + ?QBasicAtomicPointer_fetchAndAddRelease@@YAPAXPCRAXH@Z @ 4407 NONAME ; void * QBasicAtomicPointer_fetchAndAddRelease(void * volatile *, int) + ?QBasicAtomicPointer_testAndSetAcquire@@YA_NPCRAXPAX1@Z @ 4408 NONAME ; bool QBasicAtomicPointer_testAndSetAcquire(void * volatile *, void *, void *) + ?QBasicAtomicPointer_fetchAndStoreAcquire@@YAPAXPCRAXPAX@Z @ 4409 NONAME ; void * QBasicAtomicPointer_fetchAndStoreAcquire(void * volatile *, void *) + ?QBasicAtomicPointer_fetchAndAddRelaxed@@YAPAXPCRAXH@Z @ 4410 NONAME ; void * QBasicAtomicPointer_fetchAndAddRelaxed(void * volatile *, int) + ?QBasicAtomicInt_testAndSetAcquire@@YA_NPCHHH@Z @ 4411 NONAME ; bool QBasicAtomicInt_testAndSetAcquire(int volatile *, int, int) + ?QBasicAtomicPointer_fetchAndStoreRelaxed@@YAPAXPCRAXPAX@Z @ 4412 NONAME ; void * QBasicAtomicPointer_fetchAndStoreRelaxed(void * volatile *, void *) + ?QBasicAtomicInt_fetchAndStoreRelaxed@@YAHPCHH@Z @ 4413 NONAME ; int QBasicAtomicInt_fetchAndStoreRelaxed(int volatile *, int) + ?QBasicAtomicInt_testAndSetRelaxed@@YA_NPCHHH@Z @ 4414 NONAME ; bool QBasicAtomicInt_testAndSetRelaxed(int volatile *, int, int) + ?QBasicAtomicPointer_fetchAndStoreRelease@@YAPAXPCRAXPAX@Z @ 4415 NONAME ; void * QBasicAtomicPointer_fetchAndStoreRelease(void * volatile *, void *) + ?QBasicAtomicInt_testAndSetRelease@@YA_NPCHHH@Z @ 4416 NONAME ; bool QBasicAtomicInt_testAndSetRelease(int volatile *, int, int) + ?QBasicAtomicInt_fetchAndStoreAcquire@@YAHPCHH@Z @ 4417 NONAME ; int QBasicAtomicInt_fetchAndStoreAcquire(int volatile *, int) + ?QBasicAtomicInt_fetchAndAddAcquire@@YAHPCHH@Z @ 4418 NONAME ; int QBasicAtomicInt_fetchAndAddAcquire(int volatile *, int) diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/bwins/QtGuiu.def --- a/src/s60installs/bwins/QtGuiu.def Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/bwins/QtGuiu.def Mon May 03 13:17:34 2010 +0300 @@ -8995,7 +8995,7 @@ ?setFocus@QTextControl@@QAEX_NW4FocusReason@Qt@@@Z @ 8994 NONAME ; void QTextControl::setFocus(bool, enum Qt::FocusReason) ?setFocus@QWidget@@QAEXW4FocusReason@Qt@@@Z @ 8995 NONAME ; void QWidget::setFocus(enum Qt::FocusReason) ?setFocus@QWidget@@QAEXXZ @ 8996 NONAME ; void QWidget::setFocus(void) - ?setFocusHelper@QGraphicsItemPrivate@@QAEXW4FocusReason@Qt@@_N@Z @ 8997 NONAME ; void QGraphicsItemPrivate::setFocusHelper(enum Qt::FocusReason, bool) + ?setFocusHelper@QGraphicsItemPrivate@@QAEXW4FocusReason@Qt@@_N@Z @ 8997 NONAME ABSENT ; void QGraphicsItemPrivate::setFocusHelper(enum Qt::FocusReason, bool) ?setFocusItem@QGraphicsScene@@QAEXPAVQGraphicsItem@@W4FocusReason@Qt@@@Z @ 8998 NONAME ; void QGraphicsScene::setFocusItem(class QGraphicsItem *, enum Qt::FocusReason) ?setFocusPolicy@QGraphicsWidget@@QAEXW4FocusPolicy@Qt@@@Z @ 8999 NONAME ; void QGraphicsWidget::setFocusPolicy(enum Qt::FocusPolicy) ?setFocusPolicy@QWidget@@QAEXW4FocusPolicy@Qt@@@Z @ 9000 NONAME ; void QWidget::setFocusPolicy(enum Qt::FocusPolicy) @@ -11922,7 +11922,7 @@ ?updateCachedClipPathFromSetPosHelper@QGraphicsItemPrivate@@QAEXABVQPointF@@@Z @ 11921 NONAME ABSENT ; void QGraphicsItemPrivate::updateCachedClipPathFromSetPosHelper(class QPointF const &) ?updateCell@QCalendarWidget@@IAEXABVQDate@@@Z @ 11922 NONAME ; void QCalendarWidget::updateCell(class QDate const &) ?updateCells@QCalendarWidget@@IAEXXZ @ 11923 NONAME ; void QCalendarWidget::updateCells(void) - ?updateDisplayText@QLineControl@@AAEXXZ @ 11924 NONAME ; void QLineControl::updateDisplayText(void) + ?updateDisplayText@QLineControl@@AAEXXZ @ 11924 NONAME ABSENT ; void QLineControl::updateDisplayText(void) ?updateEditorData@QAbstractItemView@@MAEXXZ @ 11925 NONAME ; void QAbstractItemView::updateEditorData(void) ?updateEditorGeometries@QAbstractItemView@@MAEXXZ @ 11926 NONAME ; void QAbstractItemView::updateEditorGeometries(void) ?updateEditorGeometry@QAbstractItemDelegate@@UBEXPAVQWidget@@ABVQStyleOptionViewItem@@ABVQModelIndex@@@Z @ 11927 NONAME ; void QAbstractItemDelegate::updateEditorGeometry(class QWidget *, class QStyleOptionViewItem const &, class QModelIndex const &) const @@ -12550,55 +12550,62 @@ ?updateChildWithGraphicsEffectFlagRecursively@QGraphicsItemPrivate@@QAEXXZ @ 12549 NONAME ; void QGraphicsItemPrivate::updateChildWithGraphicsEffectFlagRecursively(void) ?isOpacityNull@QGraphicsItemPrivate@@SA_NM@Z @ 12550 NONAME ; bool QGraphicsItemPrivate::isOpacityNull(float) ?isOpacityNull@QGraphicsItemPrivate@@QBE_NXZ @ 12551 NONAME ; bool QGraphicsItemPrivate::isOpacityNull(void) const - ?api@QEglContext@@QBE?AW4API@QEgl@@XZ @ 12552 NONAME ; enum QEgl::API QEglContext::api(void) const - ?chooseConfig@QEglContext@@QAE_NABVQEglProperties@@W4PixelFormatMatch@QEgl@@@Z @ 12553 NONAME ; bool QEglContext::chooseConfig(class QEglProperties const &, enum QEgl::PixelFormatMatch) - ?destroySurface@QEglContext@@QAEXH@Z @ 12554 NONAME ; void QEglContext::destroySurface(int) - ?lazyDoneCurrent@QEglContext@@QAE_NXZ @ 12555 NONAME ; bool QEglContext::lazyDoneCurrent(void) - ?waitNative@QEglContext@@QAEXXZ @ 12556 NONAME ; void QEglContext::waitNative(void) - ?context@QEglContext@@QBEHXZ @ 12557 NONAME ; int QEglContext::context(void) const - ?configAttrib@QEglContext@@QBE_NHPAH@Z @ 12558 NONAME ; bool QEglContext::configAttrib(int, int *) const - ??0QEglProperties@@QAE@ABV0@@Z @ 12559 NONAME ; QEglProperties::QEglProperties(class QEglProperties const &) - ?config@QEglContext@@QBEHXZ @ 12560 NONAME ; int QEglContext::config(void) const + ?api@QEglContext@@QBE?AW4API@QEgl@@XZ @ 12552 NONAME ; enum QEgl::API QEglContext::api(void) const + ?chooseConfig@QEglContext@@QAE_NABVQEglProperties@@W4PixelFormatMatch@QEgl@@@Z @ 12553 NONAME ; bool QEglContext::chooseConfig(class QEglProperties const &, enum QEgl::PixelFormatMatch) + ?destroySurface@QEglContext@@QAEXH@Z @ 12554 NONAME ; void QEglContext::destroySurface(int) + ?lazyDoneCurrent@QEglContext@@QAE_NXZ @ 12555 NONAME ; bool QEglContext::lazyDoneCurrent(void) + ?waitNative@QEglContext@@QAEXXZ @ 12556 NONAME ; void QEglContext::waitNative(void) + ?context@QEglContext@@QBEHXZ @ 12557 NONAME ; int QEglContext::context(void) const + ?configAttrib@QEglContext@@QBE_NHPAH@Z @ 12558 NONAME ; bool QEglContext::configAttrib(int, int *) const + ??0QEglProperties@@QAE@ABV0@@Z @ 12559 NONAME ; QEglProperties::QEglProperties(class QEglProperties const &) + ?config@QEglContext@@QBEHXZ @ 12560 NONAME ; int QEglContext::config(void) const ?openDisplay@QEglContext@@QAE_NPAVQPaintDevice@@@Z @ 12561 NONAME ABSENT ; bool QEglContext::openDisplay(class QPaintDevice *) - ?error@QEglContext@@SAHXZ @ 12562 NONAME ; int QEglContext::error(void) - ?swapBuffers@QEglContext@@QAE_NH@Z @ 12563 NONAME ; bool QEglContext::swapBuffers(int) - ?setApi@QEglContext@@QAEXW4API@QEgl@@@Z @ 12564 NONAME ; void QEglContext::setApi(enum QEgl::API) - ?makeCurrent@QEglContext@@QAE_NH@Z @ 12565 NONAME ; bool QEglContext::makeCurrent(int) - ?createSurface@QEglContext@@QAEHPAVQPaintDevice@@PBVQEglProperties@@@Z @ 12566 NONAME ; int QEglContext::createSurface(class QPaintDevice *, class QEglProperties const *) - ?dumpAllConfigs@QEglContext@@QAEXXZ @ 12567 NONAME ; void QEglContext::dumpAllConfigs(void) - ?reduceConfiguration@QEglProperties@@QAE_NXZ @ 12568 NONAME ; bool QEglProperties::reduceConfiguration(void) - ?removeValue@QEglProperties@@QAE_NH@Z @ 12569 NONAME ; bool QEglProperties::removeValue(int) - ?toString@QEglProperties@@QBE?AVQString@@XZ @ 12570 NONAME ; class QString QEglProperties::toString(void) const - ?dumpAllConfigs@QEglProperties@@SAXXZ @ 12571 NONAME ; void QEglProperties::dumpAllConfigs(void) + ?error@QEglContext@@SAHXZ @ 12562 NONAME ; int QEglContext::error(void) + ?swapBuffers@QEglContext@@QAE_NH@Z @ 12563 NONAME ; bool QEglContext::swapBuffers(int) + ?setApi@QEglContext@@QAEXW4API@QEgl@@@Z @ 12564 NONAME ; void QEglContext::setApi(enum QEgl::API) + ?makeCurrent@QEglContext@@QAE_NH@Z @ 12565 NONAME ; bool QEglContext::makeCurrent(int) + ?createSurface@QEglContext@@QAEHPAVQPaintDevice@@PBVQEglProperties@@@Z @ 12566 NONAME ; int QEglContext::createSurface(class QPaintDevice *, class QEglProperties const *) + ?dumpAllConfigs@QEglContext@@QAEXXZ @ 12567 NONAME ; void QEglContext::dumpAllConfigs(void) + ?reduceConfiguration@QEglProperties@@QAE_NXZ @ 12568 NONAME ; bool QEglProperties::reduceConfiguration(void) + ?removeValue@QEglProperties@@QAE_NH@Z @ 12569 NONAME ; bool QEglProperties::removeValue(int) + ?toString@QEglProperties@@QBE?AVQString@@XZ @ 12570 NONAME ; class QString QEglProperties::toString(void) const + ?dumpAllConfigs@QEglProperties@@SAXXZ @ 12571 NONAME ; void QEglProperties::dumpAllConfigs(void) ?defaultDisplay@QEglContext@@SAHPAVQPaintDevice@@@Z @ 12572 NONAME ABSENT ; int QEglContext::defaultDisplay(class QPaintDevice *) - ?configProperties@QEglContext@@QBE?AVQEglProperties@@H@Z @ 12573 NONAME ; class QEglProperties QEglContext::configProperties(int) const - ?properties@QEglProperties@@QBEPBHXZ @ 12574 NONAME ; int const * QEglProperties::properties(void) const - ??0QEglContext@@QAE@XZ @ 12575 NONAME ; QEglContext::QEglContext(void) - ??1QEglContext@@QAE@XZ @ 12576 NONAME ; QEglContext::~QEglContext(void) - ?isValid@QEglContext@@QBE_NXZ @ 12577 NONAME ; bool QEglContext::isValid(void) const - ?value@QEglProperties@@QBEHH@Z @ 12578 NONAME ; int QEglProperties::value(int) const - ?clearError@QEglContext@@SAXXZ @ 12579 NONAME ; void QEglContext::clearError(void) - ??0QEglProperties@@QAE@H@Z @ 12580 NONAME ; QEglProperties::QEglProperties(int) - ?setValue@QEglProperties@@QAEXHH@Z @ 12581 NONAME ; void QEglProperties::setValue(int, int) - ?setPaintDeviceFormat@QEglProperties@@QAEXPAVQPaintDevice@@@Z @ 12582 NONAME ; void QEglProperties::setPaintDeviceFormat(class QPaintDevice *) + ?configProperties@QEglContext@@QBE?AVQEglProperties@@H@Z @ 12573 NONAME ; class QEglProperties QEglContext::configProperties(int) const + ?properties@QEglProperties@@QBEPBHXZ @ 12574 NONAME ; int const * QEglProperties::properties(void) const + ??0QEglContext@@QAE@XZ @ 12575 NONAME ; QEglContext::QEglContext(void) + ??1QEglContext@@QAE@XZ @ 12576 NONAME ; QEglContext::~QEglContext(void) + ?isValid@QEglContext@@QBE_NXZ @ 12577 NONAME ; bool QEglContext::isValid(void) const + ?value@QEglProperties@@QBEHH@Z @ 12578 NONAME ; int QEglProperties::value(int) const + ?clearError@QEglContext@@SAXXZ @ 12579 NONAME ; void QEglContext::clearError(void) + ??0QEglProperties@@QAE@H@Z @ 12580 NONAME ; QEglProperties::QEglProperties(int) + ?setValue@QEglProperties@@QAEXHH@Z @ 12581 NONAME ; void QEglProperties::setValue(int, int) + ?setPaintDeviceFormat@QEglProperties@@QAEXPAVQPaintDevice@@@Z @ 12582 NONAME ; void QEglProperties::setPaintDeviceFormat(class QPaintDevice *) ?destroy@QEglContext@@QAEXXZ @ 12583 NONAME ABSENT ; void QEglContext::destroy(void) - ?setRenderableType@QEglProperties@@QAEXW4API@QEgl@@@Z @ 12584 NONAME ; void QEglProperties::setRenderableType(enum QEgl::API) - ?setContext@QEglContext@@QAEXH@Z @ 12585 NONAME ; void QEglContext::setContext(int) - ?waitClient@QEglContext@@QAEXXZ @ 12586 NONAME ; void QEglContext::waitClient(void) - ?isEmpty@QEglProperties@@QBE_NXZ @ 12587 NONAME ; bool QEglProperties::isEmpty(void) const + ?setRenderableType@QEglProperties@@QAEXW4API@QEgl@@@Z @ 12584 NONAME ; void QEglProperties::setRenderableType(enum QEgl::API) + ?setContext@QEglContext@@QAEXH@Z @ 12585 NONAME ; void QEglContext::setContext(int) + ?waitClient@QEglContext@@QAEXXZ @ 12586 NONAME ; void QEglContext::waitClient(void) + ?isEmpty@QEglProperties@@QBE_NXZ @ 12587 NONAME ; bool QEglProperties::isEmpty(void) const ?getDisplay@QEglContext@@CAHPAVQPaintDevice@@@Z @ 12588 NONAME ABSENT ; int QEglContext::getDisplay(class QPaintDevice *) - ?isSharing@QEglContext@@QBE_NXZ @ 12589 NONAME ; bool QEglContext::isSharing(void) const - ?isCurrent@QEglContext@@QBE_NXZ @ 12590 NONAME ; bool QEglContext::isCurrent(void) const - ??0QEglProperties@@QAE@XZ @ 12591 NONAME ; QEglProperties::QEglProperties(void) - ?extensions@QEglContext@@SA?AVQString@@XZ @ 12592 NONAME ; class QString QEglContext::extensions(void) - ?setCurrentContext@QEglContext@@CAXW4API@QEgl@@PAV1@@Z @ 12593 NONAME ; void QEglContext::setCurrentContext(enum QEgl::API, class QEglContext *) - ??1QEglProperties@@QAE@XZ @ 12594 NONAME ; QEglProperties::~QEglProperties(void) - ?createContext@QEglContext@@QAE_NPAV1@PBVQEglProperties@@@Z @ 12595 NONAME ; bool QEglContext::createContext(class QEglContext *, class QEglProperties const *) - ?setConfig@QEglContext@@QAEXH@Z @ 12596 NONAME ; void QEglContext::setConfig(int) - ?hasExtension@QEglContext@@SA_NPBD@Z @ 12597 NONAME ; bool QEglContext::hasExtension(char const *) - ?doneCurrent@QEglContext@@QAE_NXZ @ 12598 NONAME ; bool QEglContext::doneCurrent(void) - ?display@QEglContext@@QBEHXZ @ 12599 NONAME ABSENT ; int QEglContext::display(void) const - ?setPixelFormat@QEglProperties@@QAEXW4Format@QImage@@@Z @ 12600 NONAME ; void QEglProperties::setPixelFormat(enum QImage::Format) - ?currentContext@QEglContext@@CAPAV1@W4API@QEgl@@@Z @ 12601 NONAME ; class QEglContext * QEglContext::currentContext(enum QEgl::API) - ?errorString@QEglContext@@SA?AVQString@@H@Z @ 12602 NONAME ; class QString QEglContext::errorString(int) - ?display@QEglContext@@SAHXZ @ 12603 NONAME ; int QEglContext::display(void) + ?isSharing@QEglContext@@QBE_NXZ @ 12589 NONAME ; bool QEglContext::isSharing(void) const + ?isCurrent@QEglContext@@QBE_NXZ @ 12590 NONAME ; bool QEglContext::isCurrent(void) const + ??0QEglProperties@@QAE@XZ @ 12591 NONAME ; QEglProperties::QEglProperties(void) + ?extensions@QEglContext@@SA?AVQString@@XZ @ 12592 NONAME ; class QString QEglContext::extensions(void) + ?setCurrentContext@QEglContext@@CAXW4API@QEgl@@PAV1@@Z @ 12593 NONAME ; void QEglContext::setCurrentContext(enum QEgl::API, class QEglContext *) + ??1QEglProperties@@QAE@XZ @ 12594 NONAME ; QEglProperties::~QEglProperties(void) + ?createContext@QEglContext@@QAE_NPAV1@PBVQEglProperties@@@Z @ 12595 NONAME ; bool QEglContext::createContext(class QEglContext *, class QEglProperties const *) + ?setConfig@QEglContext@@QAEXH@Z @ 12596 NONAME ; void QEglContext::setConfig(int) + ?hasExtension@QEglContext@@SA_NPBD@Z @ 12597 NONAME ; bool QEglContext::hasExtension(char const *) + ?doneCurrent@QEglContext@@QAE_NXZ @ 12598 NONAME ; bool QEglContext::doneCurrent(void) + ?display@QEglContext@@SAHXZ @ 12599 NONAME ; int QEglContext::display(void) + ?setPixelFormat@QEglProperties@@QAEXW4Format@QImage@@@Z @ 12600 NONAME ; void QEglProperties::setPixelFormat(enum QImage::Format) + ?currentContext@QEglContext@@CAPAV1@W4API@QEgl@@@Z @ 12601 NONAME ; class QEglContext * QEglContext::currentContext(enum QEgl::API) + ?errorString@QEglContext@@SA?AVQString@@H@Z @ 12602 NONAME ; class QString QEglContext::errorString(int) + ?removeAllApplicationFonts@QFontDatabase@@SA_NXZ @ 12603 NONAME ; NONAME ; bool QFontDatabase::removeAllApplicationFonts() + ?setWidth@QGraphicsItemPrivate@@UAEXM@Z @ 12604 NONAME ; void QGraphicsItemPrivate::setWidth(float) + ?setHeight@QGraphicsItemPrivate@@UAEXM@Z @ 12605 NONAME ; void QGraphicsItemPrivate::setHeight(float) + ?height@QGraphicsItemPrivate@@UBEMXZ @ 12606 NONAME ; float QGraphicsItemPrivate::height(void) const + ?width@QGraphicsItemPrivate@@UBEMXZ @ 12607 NONAME ; float QGraphicsItemPrivate::width(void) const + ?resetHeight@QGraphicsItemPrivate@@UAEXXZ @ 12608 NONAME ; void QGraphicsItemPrivate::resetHeight(void) + ?resetWidth@QGraphicsItemPrivate@@UAEXXZ @ 12609 NONAME ; void QGraphicsItemPrivate::resetWidth(void) + diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/deviceconfiguration/bld.inf --- a/src/s60installs/deviceconfiguration/bld.inf Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/deviceconfiguration/bld.inf Mon May 03 13:17:34 2010 +0300 @@ -39,7 +39,7 @@ wrappers/uic /epoc32/tools/uic wrappers/qt.conf /epoc32/tools/qt/qt.conf wrappers/lrelease.bat /epoc32/tools/lrelease.bat -wrappers/lrelease /epoc32/tools/lrelease +wrappers/lrelease /epoc32/tools/lrelease /* export platform specific configuration */ @@ -53,6 +53,17 @@ ../../../content/apps/qt.sisx CRML_EXPORT_PATH(../content/sis/,uda_content) ../../../content/apps/qt_stub.sis /epoc32/data/z/system/install/qt_stub.sis +../../../confml/qtwebkit.confml CONFML_EXPORT_PATH(qtwebkit.confml,uda_content) +../../../implml/qtwebkit_copy.implml CRML_EXPORT_PATH(qtwebkit_copy.implml,uda_content) +../../../content/apps/qtwebkit.sisx CRML_EXPORT_PATH(../content/sis/,uda_content) +../../../content/apps/qtwebkit_stub.sis /epoc32/data/z/system/install/qtwebkit_stub.sis +//tools +../../../bin/createpackage.bat /epoc32/tools/createpackage.bat +../../../bin/createpackage.pl /epoc32/tools/createpackage.pl +../../../bin/patch_capabilities.bat /epoc32/tools/patch_capabilities.bat +../../../bin/patch_capabilities.pl /epoc32/tools/patch_capabilities.pl + + PRJ_MMPFILES diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/deviceconfiguration/environment.prf --- a/src/s60installs/deviceconfiguration/environment.prf Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/deviceconfiguration/environment.prf Mon May 03 13:17:34 2010 +0300 @@ -3,5 +3,3 @@ # STL autodetection in clean builds not working, specify it explicitly CONFIG *= stl - -CONFIG *= headerexport diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/deviceconfiguration/qtconfig.flm --- a/src/s60installs/deviceconfiguration/qtconfig.flm Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/deviceconfiguration/qtconfig.flm Mon May 03 13:17:34 2010 +0300 @@ -11,6 +11,7 @@ TARGETDIR:=$(EPOCROOT)/$(INSTALLPATH) SOURCEDIR:=$(EXTENSION_ROOT)/$(QT_ROOT)/bin TOOLSSRCDIR:=$(EXTENSION_ROOT)/$(QT_ROOT)/src/tools +LANGUAGETOOLSDIR:=$(EXTENSION_ROOT)/$(QT_ROOT)/tools/linguist CONFIGURE_APP:=configure$(DOTEXE) $(call makepath,$(TARGETDIR)) @@ -25,7 +26,7 @@ endif TARGET_TOOLS:=$(TARGETDIR)/qmake$(DOTEXE) $(TARGETDIR)/moc$(DOTEXE) $(TARGETDIR)/rcc$(DOTEXE) $(TARGETDIR)/uic$(DOTEXE) $(TARGETDIR)/lrelease$(DOTEXE) -QT_TOOLS:= $(TOOLSSRCDIR)/uic $(TOOLSSRCDIR)/moc $(TOOLSSRCDIR)/rcc +QT_TOOLS:= $(TOOLSSRCDIR)/uic $(TOOLSSRCDIR)/moc $(TOOLSSRCDIR)/rcc $(LANGUAGETOOLSDIR)/lrelease SOURCE_TOOLS:=$(SOURCEDIR)/qmake$(DOTEXE) $(SOURCEDIR)/moc$(DOTEXE) $(SOURCEDIR)/rcc$(DOTEXE) $(SOURCEDIR)/uic$(DOTEXE) $(SOURCEDIR)/lrelease$(DOTEXE) define QtConfiguration @@ -57,9 +58,12 @@ $(SOURCEDIR)/qmake$(DOTEXE): $(EXTENSION_ROOT)/$(QT_ROOT)/$(CONFIGURE_APP) $(call startrule,qtconf) \ - cd $(EXTENSION_ROOT)/$(QT_ROOT) && \ - $(EXTENSION_ROOT)/$(QT_ROOT)/$(CONFIGURE_APP) -platform $(PLATFORM) -xplatform $(XPLATFORM) $(OPTIONS) \ + cd $(EXTENSION_ROOT)/$(QT_ROOT) && unset INCLUDE && unset LIB && $(EXTENSION_ROOT)/$(QT_ROOT)/$(CONFIGURE_APP) -platform $(PLATFORM) -xplatform $(XPLATFORM) $(OPTIONS) \ $(call endrule,qtconf) + $(call startrule,syncqt) \ + cd $(EXTENSION_ROOT)/$(QT_ROOT)/bin/ && \ + perl syncqt -base-dir $(EXTENSION_ROOT)/$(QT_ROOT) -copy -oneway -outdir $(EPOCROOT)/epoc32/include/ -outsubdir mw + $(call endrule,syncqt) $(call startrule,mkspecexport) \ $(GNUCP) -R $(EXTENSION_ROOT)/$(QT_ROOT)/mkspecs $(TARGETDIR) $(call endrule,mkspecexport) diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/deviceconfiguration/qtconfig.mk --- a/src/s60installs/deviceconfiguration/qtconfig.mk Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/deviceconfiguration/qtconfig.mk Mon May 03 13:17:34 2010 +0300 @@ -23,8 +23,8 @@ TARGETDIR := $(EPOC_ROOT)$(INSTALLPATH) SOURCEDIR := $(QT_ROOT)bin/ -TARGET_TOOLS := $(TARGETDIR)qmake$(DOTEXE) $(TARGETDIR)moc$(DOTEXE) $(TARGETDIR)rcc$(DOTEXE) $(TARGETDIR)uic$(DOTEXE) -SOURCE_TOOLS := $(SOURCEDIR)qmake$(DOTEXE) $(SOURCEDIR)moc$(DOTEXE) $(SOURCEDIR)rcc$(DOTEXE) $(SOURCEDIR)uic$(DOTEXE) +TARGET_TOOLS := $(TARGETDIR)qmake$(DOTEXE) $(TARGETDIR)moc$(DOTEXE) $(TARGETDIR)rcc$(DOTEXE) $(TARGETDIR)uic$(DOTEXE) $(TARGETDIR)/lrelease$(DOTEXE) +SOURCE_TOOLS := $(SOURCEDIR)qmake$(DOTEXE) $(SOURCEDIR)moc$(DOTEXE) $(SOURCEDIR)rcc$(DOTEXE) $(SOURCEDIR)uic$(DOTEXE) $(SOURCEDIR)/lrelease$(DOTEXE) XPLATFORM:=symbian-abld @@ -33,7 +33,8 @@ $(SOURCEDIR)qmake$(DOTEXE): $(QT_ROOT)configure$(DOTEXE) echo Configuring Qt for build on $(CONF_PLATFORM) with $(XPLATFORM) as build setup - cd $(CONFIGURE_ROOT) && $(QT_ROOT)configure$(DOTEXE) -platform $(CONF_PLATFORM) -xplatform $(XPLATFORM) $(OPTIONS) + cd $(CONFIGURE_ROOT) && set INCLUDE= && set LIB= && $(QT_ROOT)configure$(DOTEXE) -platform $(CONF_PLATFORM) -xplatform $(XPLATFORM) $(OPTIONS) + perl $(QT_ROOT)/bin/syncqt -base-dir $(QT_ROOT) -copy -oneway -outdir $(EPOC_ROOT)epoc32/include/ -outsubdir mw $(COPY) $(EPOC_ROOT)epoc32/gcc_mingw/bin/mingwm10.dll $(EPOC_ROOT)$(INSTALLPATH)mingwm10.dll $(COPY) $(EPOC_ROOT)epoc32/gcc_mingw/bin/mingwm10.dll $(QT_ROOT)bin/mingwm10.dll perl $(EPOCROOT)epoc32/tools/emkdir.pl $(EPOC_ROOT)epoc32/tools/qt/mkspecs diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/eabi/QtCoreu.def --- a/src/s60installs/eabi/QtCoreu.def Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/eabi/QtCoreu.def Mon May 03 13:17:34 2010 +0300 @@ -3634,4 +3634,22 @@ _ZTVN13QStateMachine11SignalEventE @ 3633 NONAME _ZTVN13QStateMachine12WrappedEventE @ 3634 NONAME _ZN11QMetaObject13disconnectOneEPK7QObjectiS2_i @ 3635 NONAME + _Z33QBasicAtomicInt_testAndSetAcquirePViii @ 3636 NONAME + _Z33QBasicAtomicInt_testAndSetRelaxedPViii @ 3637 NONAME + _Z33QBasicAtomicInt_testAndSetReleasePViii @ 3638 NONAME + _Z34QBasicAtomicInt_fetchAndAddAcquirePVii @ 3639 NONAME + _Z34QBasicAtomicInt_fetchAndAddRelaxedPVii @ 3640 NONAME + _Z34QBasicAtomicInt_fetchAndAddReleasePVii @ 3641 NONAME + _Z36QBasicAtomicInt_fetchAndStoreAcquirePVii @ 3642 NONAME + _Z36QBasicAtomicInt_fetchAndStoreRelaxedPVii @ 3643 NONAME + _Z36QBasicAtomicInt_fetchAndStoreReleasePVii @ 3644 NONAME + _Z37QBasicAtomicPointer_testAndSetAcquirePVPvS_S_ @ 3645 NONAME + _Z37QBasicAtomicPointer_testAndSetRelaxedPVPvS_S_ @ 3646 NONAME + _Z37QBasicAtomicPointer_testAndSetReleasePVPvS_S_ @ 3647 NONAME + _Z38QBasicAtomicPointer_fetchAndAddAcquirePVPvi @ 3648 NONAME + _Z38QBasicAtomicPointer_fetchAndAddRelaxedPVPvi @ 3649 NONAME + _Z38QBasicAtomicPointer_fetchAndAddReleasePVPvi @ 3650 NONAME + _Z40QBasicAtomicPointer_fetchAndStoreAcquirePVPvS_ @ 3651 NONAME + _Z40QBasicAtomicPointer_fetchAndStoreRelaxedPVPvS_ @ 3652 NONAME + _Z40QBasicAtomicPointer_fetchAndStoreReleasePVPvS_ @ 3653 NONAME diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/eabi/QtGuiu.def --- a/src/s60installs/eabi/QtGuiu.def Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/eabi/QtGuiu.def Mon May 03 13:17:34 2010 +0300 @@ -1818,7 +1818,7 @@ _ZN12QLineControl17_q_deleteSelectedEv @ 1817 NONAME _ZN12QLineControl17processMouseEventEP11QMouseEvent @ 1818 NONAME _ZN12QLineControl17resetInputContextEv @ 1819 NONAME - _ZN12QLineControl17updateDisplayTextEv @ 1820 NONAME + _ZN12QLineControl17updateDisplayTextEv @ 1820 NONAME ABSENT _ZN12QLineControl18displayTextChangedERK7QString @ 1821 NONAME _ZN12QLineControl18removeSelectedTextEv @ 1822 NONAME _ZN12QLineControl19_q_clipboardChangedEv @ 1823 NONAME @@ -4663,7 +4663,7 @@ _ZN20QGraphicsItemPrivate12resolveDepthEv @ 4662 NONAME _ZN20QGraphicsItemPrivate12setPosHelperERK7QPointF @ 4663 NONAME _ZN20QGraphicsItemPrivate13clearSubFocusEP13QGraphicsItem @ 4664 NONAME - _ZN20QGraphicsItemPrivate14setFocusHelperEN2Qt11FocusReasonEb @ 4665 NONAME + _ZN20QGraphicsItemPrivate14setFocusHelperEN2Qt11FocusReasonEb @ 4665 NONAME ABSENT _ZN20QGraphicsItemPrivate15resetFocusProxyEv @ 4666 NONAME _ZN20QGraphicsItemPrivate16setEnabledHelperEbbb @ 4667 NONAME _ZN20QGraphicsItemPrivate16setVisibleHelperEbbb @ 4668 NONAME @@ -11805,4 +11805,11 @@ _ZN24QImagePixmapCleanupHooks34executePixmapDataModificationHooksEP11QPixmapData @ 11804 NONAME _ZN9QS60Style10timerEventEP11QTimerEvent @ 11805 NONAME _ZN9QS60Style11eventFilterEP7QObjectP6QEvent @ 11806 NONAME - _ZN11QEglContext7displayEv @ 11807 NONAME + _ZN13QFontDatabase25removeAllApplicationFontsEv @ 11807 NONAME + _ZN11QEglContext7displayEv @ 11808 NONAME + _ZN20QGraphicsItemPrivate10resetWidthEv @ 11809 NONAME + _ZN20QGraphicsItemPrivate11resetHeightEv @ 11810 NONAME + _ZN20QGraphicsItemPrivate8setWidthEf @ 11811 NONAME + _ZN20QGraphicsItemPrivate9setHeightEf @ 11812 NONAME + _ZNK20QGraphicsItemPrivate5widthEv @ 11813 NONAME + _ZNK20QGraphicsItemPrivate6heightEv @ 11814 NONAME diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/qt.iby --- a/src/s60installs/qt.iby Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/qt.iby Mon May 03 13:17:34 2010 +0300 @@ -3,56 +3,57 @@ #include -/* :QTP:QTPROD-65,EPSN-7XXGGZ:Removed dependencies */ - #warning("qt.iby: hack - BINARY_SELECTION_ORDER really needs to be at the baseport/device level as it depends on the device type"); BINARY_SELECTION_ORDER ARMV6,ARMV5 // hack - this really needs to be at the baseport/device level as it depends on the device type -file=ABI_DIR\BUILD_DIR\QtCore.dll SHARED_LIB_DIR\QtCore.dll -file=ABI_DIR\BUILD_DIR\QtGui.dll SHARED_LIB_DIR\QtGui.dll PAGED -file=ABI_DIR\BUILD_DIR\QtOpenVG.dll SHARED_LIB_DIR\QtOpenVG.dll PAGED -file=ABI_DIR\BUILD_DIR\QtSvg.dll SHARED_LIB_DIR\QtSvg.dll PAGED -file=ABI_DIR\BUILD_DIR\QtSql.dll SHARED_LIB_DIR\QtSql.dll PAGED -file=ABI_DIR\BUILD_DIR\QtXml.dll SHARED_LIB_DIR\QtXml.dll PAGED -file=ABI_DIR\BUILD_DIR\QtNetwork.dll SHARED_LIB_DIR\QtNetwork.dll PAGED -file=ABI_DIR\BUILD_DIR\QtScript.dll SHARED_LIB_DIR\QtScript.dll PAGED -file=ABI_DIR\BUILD_DIR\QtTest.dll SHARED_LIB_DIR\QtTest.dll PAGED -file=ABI_DIR\BUILD_DIR\QtWebKit.dll SHARED_LIB_DIR\QtWebKit.dll PAGED -file=ABI_DIR\BUILD_DIR\phonon.dll SHARED_LIB_DIR\phonon.dll PAGED -file=ABI_DIR\BUILD_DIR\QtMultimedia.dll SHARED_LIB_DIR\QtMultimedia.dll PAGED -file=ABI_DIR\BUILD_DIR\QtXmlPatterns.dll SHARED_LIB_DIR\QtXmlPatterns.dll PAGED -file=ABI_DIR\BUILD_DIR\QtDeclarative.dll SHARED_LIB_DIR\QtDeclarative.dll PAGED +file=ABI_DIR\BUILD_DIR\QtCore.dll SHARED_LIB_DIR\QtCore.dll +file=ABI_DIR\BUILD_DIR\QtGui.dll SHARED_LIB_DIR\QtGui.dll +file=ABI_DIR\BUILD_DIR\QtOpenVG.dll SHARED_LIB_DIR\QtOpenVG.dll +file=ABI_DIR\BUILD_DIR\QtSvg.dll SHARED_LIB_DIR\QtSvg.dll +file=ABI_DIR\BUILD_DIR\QtSql.dll SHARED_LIB_DIR\QtSql.dll +file=ABI_DIR\BUILD_DIR\QtXml.dll SHARED_LIB_DIR\QtXml.dll +file=ABI_DIR\BUILD_DIR\QtNetwork.dll SHARED_LIB_DIR\QtNetwork.dll +file=ABI_DIR\BUILD_DIR\QtScript.dll SHARED_LIB_DIR\QtScript.dll +file=ABI_DIR\BUILD_DIR\QtTest.dll SHARED_LIB_DIR\QtTest.dll +file=ABI_DIR\BUILD_DIR\QtWebKit.dll SHARED_LIB_DIR\QtWebKit.dll +file=ABI_DIR\BUILD_DIR\phonon.dll SHARED_LIB_DIR\phonon.dll +file=ABI_DIR\BUILD_DIR\QtMultimedia.dll SHARED_LIB_DIR\QtMultimedia.dll +file=ABI_DIR\BUILD_DIR\QtXmlPatterns.dll SHARED_LIB_DIR\QtXmlPatterns.dll +file=ABI_DIR\BUILD_DIR\QtDeclarative.dll SHARED_LIB_DIR\QtDeclarative.dll // imageformats -file=ABI_DIR\BUILD_DIR\qgif.dll SHARED_LIB_DIR\qgif.dll PAGED -file=ABI_DIR\BUILD_DIR\qico.dll SHARED_LIB_DIR\qico.dll PAGED -file=ABI_DIR\BUILD_DIR\qjpeg.dll SHARED_LIB_DIR\qjpeg.dll PAGED -file=ABI_DIR\BUILD_DIR\qmng.dll SHARED_LIB_DIR\qmng.dll PAGED -file=ABI_DIR\BUILD_DIR\qsvg.dll SHARED_LIB_DIR\qsvg.dll PAGED -file=ABI_DIR\BUILD_DIR\qtiff.dll SHARED_LIB_DIR\qtiff.dll PAGED +file=ABI_DIR\BUILD_DIR\qgif.dll SHARED_LIB_DIR\qgif.dll +file=ABI_DIR\BUILD_DIR\qico.dll SHARED_LIB_DIR\qico.dll +file=ABI_DIR\BUILD_DIR\qjpeg.dll SHARED_LIB_DIR\qjpeg.dll +file=ABI_DIR\BUILD_DIR\qmng.dll SHARED_LIB_DIR\qmng.dll +file=ABI_DIR\BUILD_DIR\qsvg.dll SHARED_LIB_DIR\qsvg.dll +file=ABI_DIR\BUILD_DIR\qtiff.dll SHARED_LIB_DIR\qtiff.dll // codecs -file=ABI_DIR\BUILD_DIR\qcncodecs.dll SHARED_LIB_DIR\qcncodecs.dll PAGED -file=ABI_DIR\BUILD_DIR\qjpcodecs.dll SHARED_LIB_DIR\qjpcodecs.dll PAGED -file=ABI_DIR\BUILD_DIR\qkrcodecs.dll SHARED_LIB_DIR\qkrcodecs.dll PAGED -file=ABI_DIR\BUILD_DIR\qtwcodecs.dll SHARED_LIB_DIR\qtwcodecs.dll PAGED +file=ABI_DIR\BUILD_DIR\qcncodecs.dll SHARED_LIB_DIR\qcncodecs.dll +file=ABI_DIR\BUILD_DIR\qjpcodecs.dll SHARED_LIB_DIR\qjpcodecs.dll +file=ABI_DIR\BUILD_DIR\qkrcodecs.dll SHARED_LIB_DIR\qkrcodecs.dll +file=ABI_DIR\BUILD_DIR\qtwcodecs.dll SHARED_LIB_DIR\qtwcodecs.dll // iconengines -file=ABI_DIR\BUILD_DIR\qsvgicon.dll SHARED_LIB_DIR\qsvgicon.dll PAGED +file=ABI_DIR\BUILD_DIR\qsvgicon.dll SHARED_LIB_DIR\qsvgicon.dll // Phonon MMF backend -// :QTP:disabled -// file=ABI_DIR\BUILD_DIR\phonon_mmf.dll SHARED_LIB_DIR\phonon_mmf.dll PAGED +// This is commented out by default, as normally Helix backend will be used. +// If the Helix backend is present, it will override MMF backend, so make sure to remove it from +// image creation in addition to uncommenting the following lines if you want to use MMF backend. +//file=ABI_DIR\BUILD_DIR\phonon_mmf.dll SHARED_LIB_DIR\phonon_mmf.dll +//data=\epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin // QtMultimedia audio backend -file=ABI_DIR\BUILD_DIR\qaudio.dll SHARED_LIB_DIR\qaudio.dll PAGED +file=ABI_DIR\BUILD_DIR\qaudio.dll SHARED_LIB_DIR\qaudio.dll // graphicssystems -file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll PAGED +file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll // S60 version compatibility plugins for 5.0 (3.1 and 3.2 devices are never likely to have this in ROM, // so don't bother including those plugins -file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll SHARED_LIB_DIR\qts60plugin_5_0.dll PAGED +file=ABI_DIR\BUILD_DIR\qts60plugin_5_0.dll SHARED_LIB_DIR\qts60plugin_5_0.dll S60_APP_RESOURCE(s60main) @@ -73,8 +74,6 @@ // iconengines stubs data=\epoc32\data\z\resource\qt\plugins\iconengines\qsvgicon.qtplugin resource\qt\plugins\iconengines\qsvgicon.qtplugin -// Phonon MMF backend -data=\epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin // QtMultimedia audio backend data=\epoc32\data\qt\qtlibspluginstubs\qaudio.qtplugin resource\qt\plugins\audio\qaudio.qtplugin diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/qt.pkg --- a/src/s60installs/qt.pkg Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/qt.pkg Mon May 03 13:17:34 2010 +0300 @@ -1,12 +1,8 @@ -; Qt_template.pkg generated by qmake at 2009-11-16T11:44:16 -; This file is generated by qmake and should not be modified by the user -; - ; Language &EN ; SIS header: name, uid, version -#{"Qt"},(0x2001E61C),4,6,0,TYPE=SA,RU +#{"Qt"},(0x2001E61C),4,6,3,TYPE=SA,RU,NR ; Manual PKG pre-rules from PRO files ; Default HW/platform dependencies @@ -32,12 +28,11 @@ "/epoc32/release/armv5/urel/QtTest.dll" - "!:\sys\bin\QtTest.dll" "/epoc32/release/armv5/urel/QtSql.dll" - "!:\sys\bin\QtSql.dll" "/epoc32/release/armv5/urel/QtSvg.dll" - "!:\sys\bin\QtSvg.dll" +"/epoc32/release/armv5/urel/phonon.dll" - "!:\sys\bin\phonon.dll" "/epoc32/release/armv5/urel/QtScript.dll" - "!:\sys\bin\QtScript.dll" -"/epoc32/release/armv5/urel/QtWebKit.dll" - "!:\sys\bin\QtWebKit.dll" +"/epoc32/release/armv5/urel/QtXmlPatterns.dll" - "!:\sys\bin\QtXmlPatterns.dll" "/epoc32/release/armv5/urel/QtOpenVG.dll" - "!:\sys\bin\QtOpenVG.dll" -"/epoc32/release/armv5/urel/phonon.dll" - "!:\sys\bin\phonon.dll" "/epoc32/release/armv5/urel/QtMultimedia.dll" - "!:\sys\bin\QtMultimedia.dll" -"/epoc32/release/armv5/urel/QtXmlPatterns.dll" - "!:\sys\bin\QtXmlPatterns.dll" "/epoc32/release/armv5/urel/qjpeg.dll" - "!:\sys\bin\qjpeg.dll" "/sf/mw/qt/src/s60installs/qmakepluginstubs/qjpeg.qtplugin" - "!:\resource\qt\plugins\imageformats\qjpeg.qtplugin" @@ -74,8 +69,3 @@ ELSE "/epoc32/release/armv5/urel/qts60plugin_5_0.dll" - "!:\sys\bin\qts60plugin_5_0.dll" ENDIF - -; EXISTS statement does not resolve !. Lets check the most common drives -IF NOT EXISTS("c:\sys\bin\sqlite3.dll") AND NOT EXISTS("e:\sys\bin\sqlite3.dll") AND NOT EXISTS("z:\sys\bin\sqlite3.dll") -"/epoc32/release/armv5/urel/sqlite3.dll" - "!:\sys\bin\sqlite3.dll" -ENDIF diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/qt_stub.pkg --- a/src/s60installs/qt_stub.pkg Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/qt_stub.pkg Mon May 03 13:17:34 2010 +0300 @@ -1,12 +1,8 @@ -; Qt_template.pkg generated by qmake at 2009-11-16T11:44:16 -; This file is generated by qmake and should not be modified by the user -; - ; Language &EN ; SIS header: name, uid, version -#{"Qt"},(0x2001E61C),4,6,0,TYPE=SA +#{"Qt"},(0x2001E61C),4,6,3,TYPE=SA,RU,NR ; Localised Vendor name %{"Nokia, Qt"} @@ -23,11 +19,13 @@ "" - "Z:\sys\bin\QtTest.dll" "" - "Z:\sys\bin\QtSql.dll" "" - "Z:\sys\bin\QtSvg.dll" +"" - "Z:\sys\bin\phonon.dll" "" - "Z:\sys\bin\QtScript.dll" -"" - "Z:\sys\bin\QtWebKit.dll" +"" - "Z:\sys\bin\QtXmlPatterns.dll" "" - "Z:\sys\bin\QtOpenVG.dll" +"" - "Z:\sys\bin\QtMultimedia.dll" + "" - "Z:\sys\bin\qjpeg.dll" -"" - "Z:\sys\bin\phonon.dll" "" - "Z:\resource\qt\plugins\imageformats\qjpeg.qtplugin" "" - "Z:\sys\bin\qgif.dll" @@ -59,7 +57,6 @@ "" - "Z:\sys\bin\qts60plugin_5_0.dll" "" - "Z:\sys\bin\qts60plugin_3_2.dll" "" - "Z:\sys\bin\qts60plugin_3_1.dll" -"" - "Z:\sys\bin\sqlite3.dll" diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/qtdemoapps.iby --- a/src/s60installs/qtdemoapps.iby Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/qtdemoapps.iby Mon May 03 13:17:34 2010 +0300 @@ -112,203 +112,5 @@ S60_APP_RESOURCE(anomaly) data=\epoc32\data\Z\private\10003a3f\import\Apps\anomaly_reg.rsc \private\10003a3f\import\apps\anomaly_reg.rsc -// Benchmark apps - -S60_APP_EXE(tst_bench_containers_associative) -S60_APP_RESOURCE(tst_bench_containers_associative) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_containers_associative_reg.rsc \private\10003a3f\import\apps\tst_bench_containers_associative_reg.rsc - -S60_APP_EXE(tst_bench_containers_sequential) -S60_APP_RESOURCE(tst_bench_containers_sequential) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_containers_sequential_reg.rsc \private\10003a3f\import\apps\tst_bench_containers_sequential_reg.rsc - -S60_APP_EXE(tst_bench_qanimation) -S60_APP_RESOURCE(tst_bench_qanimation) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qanimation_reg.rsc \private\10003a3f\import\apps\tst_bench_qanimation_reg.rsc - -S60_APP_EXE(tst_bench_qapplication) -S60_APP_RESOURCE(tst_bench_qapplication) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qapplication_reg.rsc \private\10003a3f\import\apps\tst_bench_qapplication_reg.rsc - -S60_APP_EXE(tst_bench_qbytearray) -S60_APP_RESOURCE(tst_bench_qbytearray) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qbytearray_reg.rsc \private\10003a3f\import\apps\tst_bench_qbytearray_reg.rsc - -S60_APP_EXE(tst_bench_qdir) -S60_APP_RESOURCE(tst_bench_qdir) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qdir_reg.rsc \private\10003a3f\import\apps\tst_bench_qdir_reg.rsc - -S60_APP_EXE(tst_bench_qdiriterator) -S60_APP_RESOURCE(tst_bench_qdiriterator) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qdiriterator_reg.rsc \private\10003a3f\import\apps\tst_bench_qdiriterator_reg.rsc - -S60_APP_EXE(tst_bench_qfile) -S60_APP_RESOURCE(tst_bench_qfile) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qfile_reg.rsc \private\10003a3f\import\apps\tst_bench_qfile_reg.rsc - -S60_APP_EXE(tst_bench_qfile_vs_qnetworkaccessmanager) -S60_APP_RESOURCE(tst_bench_qfile_vs_qnetworkaccessmanager) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qfile_vs_qnetworkaccessmanager_reg.rsc \private\10003a3f\import\apps\tst_bench_qfile_vs_qnetworkaccessmanager_reg.rsc - -S60_APP_EXE(tst_bench_qpainter) -S60_APP_RESOURCE(tst_bench_qpainter) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qpainter_reg.rsc \private\10003a3f\import\apps\tst_bench_qpainter_reg.rsc - -S60_APP_EXE(tst_bench_qtestlib_simple) -S60_APP_RESOURCE(tst_bench_qtestlib_simple) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qtestlib_simple_reg.rsc \private\10003a3f\import\apps\tst_bench_qtestlib_simple_reg.rsc - -S60_APP_EXE(tst_bench_events) -S60_APP_RESOURCE(tst_bench_events) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_events_reg.rsc \private\10003a3f\import\apps\tst_bench_events_reg.rsc - -S60_APP_EXE(tst_bench_qgraphicsanchorlayout) -S60_APP_RESOURCE(tst_bench_qgraphicsanchorlayout) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qgraphicsanchorlayout_reg.rsc \private\10003a3f\import\apps\tst_bench_qgraphicsanchorlayout_reg.rsc - -S60_APP_EXE(tst_bench_qgraphicsitem) -S60_APP_RESOURCE(tst_bench_qgraphicsitem) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qgraphicsitem_reg.rsc \private\10003a3f\import\apps\tst_bench_qgraphicsitem_reg.rsc - -S60_APP_EXE(tst_bench_qgraphicsscene) -S60_APP_RESOURCE(tst_bench_qgraphicsscene) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qgraphicsscene_reg.rsc \private\10003a3f\import\apps\tst_bench_qgraphicsscene_reg.rsc - -S60_APP_EXE(tst_bench_qgraphicsview) -S60_APP_RESOURCE(tst_bench_qgraphicsview) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qgraphicsview_reg.rsc \private\10003a3f\import\apps\tst_bench_qgraphicsview_reg.rsc - -S60_APP_EXE(tst_bench_qgraphicswidget) -S60_APP_RESOURCE(tst_bench_qgraphicswidget) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qgraphicswidget_reg.rsc \private\10003a3f\import\apps\tst_bench_qgraphicswidget_reg.rsc - -S60_APP_EXE(tst_bench_qimagereader) -S60_APP_RESOURCE(tst_bench_qimagereader) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qimagereader_reg.rsc \private\10003a3f\import\apps\tst_bench_qimagereader_reg.rsc - -S60_APP_EXE(tst_bench_qiodevice) -S60_APP_RESOURCE(tst_bench_qiodevice) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qiodevice_reg.rsc \private\10003a3f\import\apps\tst_bench_qiodevice_reg.rsc - -S60_APP_EXE(tst_bench_qpixmap) -S60_APP_RESOURCE(tst_bench_qpixmap) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qpixmap_reg.rsc \private\10003a3f\import\apps\tst_bench_qpixmap_reg.rsc - -S60_APP_EXE(tst_bench_blendbench) -S60_APP_RESOURCE(tst_bench_blendbench) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_blendbench_reg.rsc \private\10003a3f\import\apps\tst_bench_blendbench_reg.rsc - -S60_APP_EXE(tst_bench_qstringlist) -S60_APP_RESOURCE(tst_bench_qstringlist) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qstringlist_reg.rsc \private\10003a3f\import\apps\tst_bench_qstringlist_reg.rsc - -S60_APP_EXE(tst_bench_qmatrix4x4) -S60_APP_RESOURCE(tst_bench_qmatrix4x4) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qmatrix4x4_reg.rsc \private\10003a3f\import\apps\tst_bench_qmatrix4x4_reg.rsc - -S60_APP_EXE(tst_bench_qnetworkreply) -S60_APP_RESOURCE(tst_bench_qnetworkreply) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qnetworkreply_reg.rsc \private\10003a3f\import\apps\tst_bench_qnetworkreply_reg.rsc - -S60_APP_EXE(tst_bench_qobject) -S60_APP_RESOURCE(tst_bench_qobject) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qobject_reg.rsc \private\10003a3f\import\apps\tst_bench_qobject_reg.rsc - -S60_APP_EXE(tst_bench_qrect) -S60_APP_RESOURCE(tst_bench_qrect) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qrect_reg.rsc \private\10003a3f\import\apps\tst_bench_qrect_reg.rsc - -S60_APP_EXE(tst_bench_qregexp) -S60_APP_RESOURCE(tst_bench_qregexp) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qregexp_reg.rsc \private\10003a3f\import\apps\tst_bench_qregexp_reg.rsc - -S60_APP_EXE(tst_bench_qregion) -S60_APP_RESOURCE(tst_bench_qregion) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qregion_reg.rsc \private\10003a3f\import\apps\tst_bench_qregion_reg.rsc - -S60_APP_EXE(tst_bench_qvariant) -S60_APP_RESOURCE(tst_bench_qvariant) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qvariant_reg.rsc \private\10003a3f\import\apps\tst_bench_qvariant_reg.rsc - -S60_APP_EXE(tst_bench_qwidget) -S60_APP_RESOURCE(tst_bench_qwidget) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qwidget_reg.rsc \private\10003a3f\import\apps\tst_bench_qwidget_reg.rsc - -S60_APP_EXE(tst_bench_qtwidgets) -S60_APP_RESOURCE(tst_bench_qtwidgets) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qtwidgets_reg.rsc \private\10003a3f\import\apps\tst_bench_qtwidgets_reg.rsc - -S60_APP_EXE(tst_bench_qmetaobject) -S60_APP_RESOURCE(tst_bench_qmetaobject) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qmetaobject_reg.rsc \private\10003a3f\import\apps\tst_bench_qmetaobject_reg.rsc - -S60_APP_EXE(tst_bench_qquaternion) -S60_APP_RESOURCE(tst_bench_qquaternion) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qquaternion_reg.rsc \private\10003a3f\import\apps\tst_bench_qquaternion_reg.rsc - -S60_APP_EXE(tst_bench_qstringbuilder) -S60_APP_RESOURCE(tst_bench_qstringbuilder) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qstringbuilder_reg.rsc \private\10003a3f\import\apps\tst_bench_qstringbuilder_reg.rsc - -S60_APP_EXE(tst_bench_qstylesheetstyle) -S60_APP_RESOURCE(tst_bench_qstylesheetstyle) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qstylesheetstyle_reg.rsc \private\10003a3f\import\apps\tst_bench_qstylesheetstyle_reg.rsc - -S60_APP_EXE(tst_bench_qsvgrenderer) -S60_APP_RESOURCE(tst_bench_qsvgrenderer) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qsvgrenderer_reg.rsc \private\10003a3f\import\apps\tst_bench_qsvgrenderer_reg.rsc - -S60_APP_EXE(tst_bench_qtableview) -S60_APP_RESOURCE(tst_bench_qtableview) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qtableview_reg.rsc \private\10003a3f\import\apps\tst_bench_qtableview_reg.rsc - -S60_APP_EXE(tst_bench_qtemporaryfile) -S60_APP_RESOURCE(tst_bench_qtemporaryfile) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qtemporaryfile_reg.rsc \private\10003a3f\import\apps\tst_bench_qtemporaryfile_reg.rsc - -S60_APP_EXE(tst_bench_qtransform) -S60_APP_RESOURCE(tst_bench_qtransform) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qtransform_reg.rsc \private\10003a3f\import\apps\tst_bench_qtransform_reg.rsc - -S60_APP_EXE(tst_bench_qstring) -S60_APP_RESOURCE(tst_bench_qstring) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qstring_reg.rsc \private\10003a3f\import\apps\tst_bench_qstring_reg.rsc - -S60_APP_EXE(tst_bench_qpixmapcache) -S60_APP_RESOURCE(tst_bench_qpixmapcache) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qpixmapcache_reg.rsc \private\10003a3f\import\apps\tst_bench_qpixmapcache_reg.rsc - -S60_APP_EXE(tst_bench_qscriptclass) -S60_APP_RESOURCE(tst_bench_qscriptclass) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qscriptclass_reg.rsc \private\10003a3f\import\apps\tst_bench_qscriptclass_reg.rsc - -S60_APP_EXE(tst_bench_qscriptengine) -S60_APP_RESOURCE(tst_bench_qscriptengine) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qscriptengine_reg.rsc \private\10003a3f\import\apps\tst_bench_qscriptengine_reg.rsc - -S60_APP_EXE(tst_bench_qscriptvalue) -S60_APP_RESOURCE(tst_bench_qscriptvalue) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qscriptvalue_reg.rsc \private\10003a3f\import\apps\tst_bench_qscriptvalue_reg.rsc - -S60_APP_EXE(tst_bench_qtcpserver) -S60_APP_RESOURCE(tst_bench_qtcpserver) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qtcpserver_reg.rsc \private\10003a3f\import\apps\tst_bench_qtcpserver_reg.rsc - -S60_APP_EXE(tst_bench_qtext) -S60_APP_RESOURCE(tst_bench_qtext) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qtext_reg.rsc \private\10003a3f\import\apps\tst_bench_qtext_reg.rsc - -S60_APP_EXE(tst_bench_qthreadstorage) -S60_APP_RESOURCE(tst_bench_qthreadstorage) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_bench_qthreadstorage_reg.rsc \private\10003a3f\import\apps\tst_bench_qthreadstorage_reg.rsc - -S60_APP_EXE(graphicsviewbenchmark) -S60_APP_RESOURCE(graphicsviewbenchmark) -data=\epoc32\data\Z\private\10003a3f\import\Apps\graphicsviewbenchmark_reg.rsc \private\10003a3f\import\apps\graphicsviewbenchmark_reg.rsc - -S60_APP_EXE(tst_GraphicsViewBenchmark) -S60_APP_RESOURCE(tst_GraphicsViewBenchmark) -data=\epoc32\data\Z\private\10003a3f\import\Apps\tst_GraphicsViewBenchmark_reg.rsc \private\10003a3f\import\apps\tst_GraphicsViewBenchmark_reg.rsc - #endif // QTDEMOAPPS_IBY diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/qtwebkit.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/s60installs/qtwebkit.pkg Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,28 @@ +; Language +&EN + +; SIS header: name, uid, version +#{"QtWebKit"},(0x200267C2),4,6,3,TYPE=SA,RU,NR + + +; Manual PKG pre-rules from PRO files +; Default HW/platform dependencies +[0x101F7961],0,0,0,{"S60ProductID"} +[0x102032BE],0,0,0,{"S60ProductID"} +[0x102752AE],0,0,0,{"S60ProductID"} +[0x1028315F],0,0,0,{"S60ProductID"} + +; Default dependency to Qt libraries +(0x2001E61C), 4, 6, 3, {"Qt"} +; Localised Vendor name +%{"Nokia, Qt"} + +; Unique Vendor name +:"Nokia, Qt" + + +; DEPLOYMENT +"/epoc32/release/armv5/urel/QtWebKit.dll" - "!:\sys\bin\QtWebKit.dll" + +; Manual PKG post-rules from PRO files + diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/qtwebkit_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/s60installs/qtwebkit_stub.pkg Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,19 @@ +; Language +&EN + +; SIS header: name, uid, version +#{"QtWebKit"},(0x200267C2),4,6,3,TYPE=SA,RU,NR + +; Default dependency to Qt libraries +(0x2001E61C), 4, 6, 3, {"Qt"} +; Localised Vendor name +%{"Nokia, Qt"} + +; Unique Vendor name +:"Nokia, Qt" + +; DEPLOYMENT +"" - "Z:\sys\bin\QtWebKit.dll" + + + diff -r 2f34d5167611 -r fcece45ef507 src/s60installs/s60installs.pro --- a/src/s60installs/s60installs.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/src/s60installs/s60installs.pro Mon May 03 13:17:34 2010 +0300 @@ -7,37 +7,49 @@ SUBDIRS= # WARNING: Changing TARGET name will break Symbian SISX upgrade functionality # DO NOT TOUCH TARGET VARIABLE IF YOU ARE NOT SURE WHAT YOU ARE DOING - TARGET = "Qt" - TARGET.UID3 = 0x2001E61C + TARGET = "Qt$${QT_LIBINFIX}" + + isEmpty(QT_LIBINFIX) { + TARGET.UID3 = 0x2001E61C + + # sqlite3 is expected to be already found on phone if infixed configuration is built. + BLD_INF_RULES.prj_exports += \ + "sqlite3.sis $${EPOCROOT}epoc32/data/qt/sis/sqlite3.sis" \ + "sqlite3_selfsigned.sis $${EPOCROOT}epoc32/data/qt/sis/sqlite3_selfsigned.sis" + sqlitedeployment = \ + "; Deploy sqlite onto phone that does not have it already" \ + "@\"$${EPOCROOT}epoc32/data/qt/sis/sqlite3.sis\", (0x2002af5f)" + qtlibraries.pkg_postrules += sqlitedeployment + } else { + # Always use experimental UID for infixed configuration to avoid UID clash + TARGET.UID3 = 0xE001E61C + } VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION} - qtresources.sources = $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/s60main.rsc + qtresources.sources = $${EPOCROOT}$$HW_ZDIR$$APP_RESOURCE_DIR/s60main$${QT_LIBINFIX}.rsc qtresources.path = c:$$APP_RESOURCE_DIR + DEPLOYMENT += qtresources qtlibraries.sources = \ - QtCore.dll \ - QtXml.dll \ - QtGui.dll \ - QtNetwork.dll \ - QtTest.dll \ - QtSql.dll + QtCore$${QT_LIBINFIX}.dll \ + QtXml$${QT_LIBINFIX}.dll \ + QtGui$${QT_LIBINFIX}.dll \ + QtNetwork$${QT_LIBINFIX}.dll \ + QtTest$${QT_LIBINFIX}.dll \ + QtSql$${QT_LIBINFIX}.dll qts60plugindeployment = \ "IF package(0x1028315F)" \ - " \"$${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/qts60plugin_5_0.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0.dll\"" \ + " \"$${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x102752AE)" \ - " \"$${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/qts60plugin_3_2.dll\" - \"c:\\sys\\bin\\qts60plugin_3_2.dll\"" \ + " \"$${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/qts60plugin_3_2$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_2$${QT_LIBINFIX}.dll\"" \ "ELSEIF package(0x102032BE)" \ - " \"$${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/qts60plugin_3_1.dll\" - \"c:\\sys\\bin\\qts60plugin_3_1.dll\"" \ + " \"$${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/qts60plugin_3_1$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_3_1$${QT_LIBINFIX}.dll\"" \ "ELSE" \ - " \"$${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/qts60plugin_5_0.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0.dll\"" \ + " \"$${EPOCROOT}epoc32/release/$(PLATFORM)/$(TARGET)/qts60plugin_5_0$${QT_LIBINFIX}.dll\" - \"c:\\sys\\bin\\qts60plugin_5_0$${QT_LIBINFIX}.dll\"" \ "ENDIF" qtlibraries.pkg_postrules += qts60plugindeployment - sqlitedeployment = \ - "; Deploy sqlite onto phone that does not have it already" \ - "@\"$$PWD/sqlite3.sis\", (0x2002af5f)" - qtlibraries.pkg_postrules += sqlitedeployment qtlibraries.path = c:/sys/bin @@ -64,71 +76,63 @@ #} #qtlibraries.pkg_prerules += "(0x2002af5f), 0, 5, 0, {\"sqlite3\"}" - !contains(QT_CONFIG, no-jpeg): imageformats_plugins.sources += qjpeg.dll - !contains(QT_CONFIG, no-gif): imageformats_plugins.sources += qgif.dll - !contains(QT_CONFIG, no-mng): imageformats_plugins.sources += qmng.dll - !contains(QT_CONFIG, no-tiff): imageformats_plugins.sources += qtiff.dll - !contains(QT_CONFIG, no-ico): imageformats_plugins.sources += qico.dll + !contains(QT_CONFIG, no-jpeg): imageformats_plugins.sources += qjpeg$${QT_LIBINFIX}.dll + !contains(QT_CONFIG, no-gif): imageformats_plugins.sources += qgif$${QT_LIBINFIX}.dll + !contains(QT_CONFIG, no-mng): imageformats_plugins.sources += qmng$${QT_LIBINFIX}.dll + !contains(QT_CONFIG, no-tiff): imageformats_plugins.sources += qtiff$${QT_LIBINFIX}.dll + !contains(QT_CONFIG, no-ico): imageformats_plugins.sources += qico$${QT_LIBINFIX}.dll imageformats_plugins.path = c:$$QT_PLUGINS_BASE_DIR/imageformats - codecs_plugins.sources = qcncodecs.dll qjpcodecs.dll qtwcodecs.dll qkrcodecs.dll + codecs_plugins.sources = qcncodecs$${QT_LIBINFIX}.dll qjpcodecs$${QT_LIBINFIX}.dll qtwcodecs$${QT_LIBINFIX}.dll qkrcodecs$${QT_LIBINFIX}.dll codecs_plugins.path = c:$$QT_PLUGINS_BASE_DIR/codecs contains(QT_CONFIG, phonon-backend) { - phonon_backend_plugins.sources += phonon_mmf.dll + phonon_backend_plugins.sources += phonon_mmf$${QT_LIBINFIX}.dll phonon_backend_plugins.path = c:$$QT_PLUGINS_BASE_DIR/phonon_backend DEPLOYMENT += phonon_backend_plugins } - contains(QT_CONFIG, audio-backend) { - qaudio_backend_plugins.sources += qaudio.dll - qaudio_backend_plugins.path = c:$$QT_PLUGINS_BASE_DIR/audio - DEPLOYMENT += qaudio_backend_plugins - } - # Support backup & restore for Qt libraries qtbackup.sources = backup_registration.xml qtbackup.path = c:/private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,) - DEPLOYMENT += qtresources qtlibraries qtbackup imageformats_plugins codecs_plugins graphicssystems_plugins + DEPLOYMENT += qtlibraries qtbackup imageformats_plugins codecs_plugins graphicssystems_plugins contains(QT_CONFIG, svg): { - qtlibraries.sources += QtSvg.dll - imageformats_plugins.sources += qsvg.dll - iconengines_plugins.sources = qsvgicon.dll + qtlibraries.sources += QtSvg$${QT_LIBINFIX}.dll + imageformats_plugins.sources += qsvg$${QT_LIBINFIX}.dll + iconengines_plugins.sources = qsvgicon$${QT_LIBINFIX}.dll iconengines_plugins.path = c:$$QT_PLUGINS_BASE_DIR/iconengines DEPLOYMENT += iconengines_plugins } contains(QT_CONFIG, phonon): { - qtlibraries.sources += phonon.dll + qtlibraries.sources += phonon$${QT_LIBINFIX}.dll } contains(QT_CONFIG, script): { - qtlibraries.sources += QtScript.dll + qtlibraries.sources += QtScript$${QT_LIBINFIX}.dll } contains(QT_CONFIG, xmlpatterns): { - qtlibraries.sources += QtXmlPatterns.dll + qtlibraries.sources += QtXmlPatterns$${QT_LIBINFIX}.dll } contains(QT_CONFIG, declarative): { - qtlibraries.sources += QtDeclarative.dll + qtlibraries.sources += QtDeclarative$${QT_LIBINFIX}.dll } graphicssystems_plugins.path = c:$$QT_PLUGINS_BASE_DIR/graphicssystems contains(QT_CONFIG, openvg) { - qtlibraries.sources += QtOpenVG.dll - graphicssystems_plugins.sources += qvggraphicssystem.dll + qtlibraries.sources += QtOpenVG$${QT_LIBINFIX}.dll + graphicssystems_plugins.sources += qvggraphicssystem$${QT_LIBINFIX}.dll } contains(QT_CONFIG, multimedia) { - qtlibraries.sources += QtMultimedia.dll + qtlibraries.sources += QtMultimedia$${QT_LIBINFIX}.dll } BLD_INF_RULES.prj_exports += "qt.iby $$CORE_MW_LAYER_IBY_EXPORT_PATH(qt.iby)" - #:QTP:QTPROD-220: Qt Examples should be exported to ROFS3 BLD_INF_RULES.prj_exports += "qtdemoapps.iby $$CUSTOMER_VARIANT_APP_LAYER_IBY_EXPORT_PATH(qtdemoapps.iby)" } - diff -r 2f34d5167611 -r fcece45ef507 src/script/api/qscriptengine.cpp --- a/src/script/api/qscriptengine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/script/api/qscriptengine.cpp Mon May 03 13:17:34 2010 +0300 @@ -2921,7 +2921,7 @@ JSC::JSValue jscObject = d->scriptValueToJSCValue(object); JSC::JSGlobalObject *glob = d->originalGlobalObject(); if (!jscObject || !jscObject.isObject()) - jscObject = glob; + jscObject = d->globalObject(); // unsigned attribs = JSC::DontEnum; JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 5, JSC::Identifier(exec, "qsTranslate"), QScript::functionQsTranslate)); JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 2, JSC::Identifier(exec, "QT_TRANSLATE_NOOP"), QScript::functionQsTranslateNoOp)); diff -r 2f34d5167611 -r fcece45ef507 src/script/api/qscriptvalue.cpp --- a/src/script/api/qscriptvalue.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/script/api/qscriptvalue.cpp Mon May 03 13:17:34 2010 +0300 @@ -1946,7 +1946,7 @@ JSC::MarkedArgumentBuffer applyArgs; if (!array.isUndefinedOrNull()) { if (!array.isObject()) { - return d->engine->scriptValueFromJSCValue(JSC::throwError(exec, JSC::TypeError)); + return d->engine->scriptValueFromJSCValue(JSC::throwError(exec, JSC::TypeError, "Arguments must be an array")); } if (JSC::asObject(array)->classInfo() == &JSC::Arguments::info) JSC::asArguments(array)->fillArgList(exec, applyArgs); @@ -1957,8 +1957,7 @@ for (unsigned i = 0; i < length; ++i) applyArgs.append(JSC::asArray(array)->get(exec, i)); } else { - Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); -// return JSC::throwError(exec, JSC::TypeError); + return d->engine->scriptValueFromJSCValue(JSC::throwError(exec, JSC::TypeError, "Arguments must be an array")); } } diff -r 2f34d5167611 -r fcece45ef507 src/script/bridge/qscriptclassobject.cpp --- a/src/script/bridge/qscriptclassobject.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/script/bridge/qscriptclassobject.cpp Mon May 03 13:17:34 2010 +0300 @@ -226,7 +226,7 @@ QScriptClass *scriptClass = static_cast(delegate)->scriptClass(); QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec); - //JSC::ExecState *oldFrame = eng_p->currentFrame; + JSC::ExecState *oldFrame = eng_p->currentFrame; eng_p->pushContext(exec, JSC::JSValue(), args, callee, true); QScriptContext *ctx = eng_p->contextForFrame(eng_p->currentFrame); @@ -234,6 +234,8 @@ QScriptValue result = qvariant_cast(scriptClass->extension(QScriptClass::Callable, qVariantFromValue(ctx))); if (!result.isObject()) result = defaultObject; + eng_p->popContext(); + eng_p->currentFrame = oldFrame; return JSC::asObject(eng_p->scriptValueToJSCValue(result)); } diff -r 2f34d5167611 -r fcece45ef507 src/sql/drivers/drivers.pri --- a/src/sql/drivers/drivers.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/src/sql/drivers/drivers.pri Mon May 03 13:17:34 2010 +0300 @@ -49,6 +49,7 @@ mac:!contains( LIBS, .*odbc.* ):LIBS *= -liodbc unix:!contains( LIBS, .*odbc.* ):LIBS *= -lodbc + unix:DEFINES += UNICODE win32 { !win32-borland:LIBS *= -lodbc32 diff -r 2f34d5167611 -r fcece45ef507 src/sql/drivers/mysql/qsql_mysql.cpp --- a/src/sql/drivers/mysql/qsql_mysql.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/sql/drivers/mysql/qsql_mysql.cpp Mon May 03 13:17:34 2010 +0300 @@ -320,6 +320,16 @@ || t == MYSQL_TYPE_LONG_BLOB; } +static bool qIsInteger(int t) +{ + return t == MYSQL_TYPE_TINY + || t == MYSQL_TYPE_SHORT + || t == MYSQL_TYPE_LONG + || t == MYSQL_TYPE_LONGLONG + || t == MYSQL_TYPE_INT24; +} + + void QMYSQLResultPrivate::bindBlobs() { int i; @@ -368,6 +378,13 @@ fieldInfo->length = 0; hasBlobs = true; } else { + // fieldInfo->length specifies the display width, which may be too + // small to hold valid integer values (see + // http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html ), so + // always use the MAX_BIGINT_WIDTH for integer types + if (qIsInteger(fieldInfo->type)) { + fieldInfo->length = MAX_BIGINT_WIDTH; + } fieldInfo->type = MYSQL_TYPE_STRING; } bind = &inBinds[i]; diff -r 2f34d5167611 -r fcece45ef507 src/sql/drivers/oci/qsql_oci.cpp --- a/src/sql/drivers/oci/qsql_oci.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/sql/drivers/oci/qsql_oci.cpp Mon May 03 13:17:34 2010 +0300 @@ -517,7 +517,7 @@ } else if (ocitype == QLatin1String("LONG") || ocitype == QLatin1String("NCLOB") || ocitype == QLatin1String("CLOB")) - type = QVariant::String; + type = QVariant::ByteArray; else if (ocitype == QLatin1String("RAW") || ocitype == QLatin1String("LONG RAW") || ocitype == QLatin1String("ROWID") || ocitype == QLatin1String("BLOB") || ocitype == QLatin1String("CFILE") || ocitype == QLatin1String("BFILE")) @@ -543,7 +543,6 @@ case SQLT_AVC: case SQLT_RDD: case SQLT_LNG: - case SQLT_CLOB: #ifdef SQLT_INTERVAL_YM case SQLT_INTERVAL_YM: #endif @@ -581,6 +580,7 @@ case SQLT_LVC: case SQLT_LVB: case SQLT_BLOB: + case SQLT_CLOB: case SQLT_FILE: case SQLT_NTY: case SQLT_REF: diff -r 2f34d5167611 -r fcece45ef507 src/sql/drivers/odbc/qsql_odbc.cpp --- a/src/sql/drivers/odbc/qsql_odbc.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/sql/drivers/odbc/qsql_odbc.cpp Mon May 03 13:17:34 2010 +0300 @@ -66,7 +66,7 @@ //crude hack to get non-unicode capable driver managers to work # undef UNICODE # define SQLTCHAR SQLCHAR -# define SQL_C_WCHAR SQL_C_CHAR +# define SQL_C_TCHAR SQL_C_CHAR #endif // newer platform SDKs use SQLLEN instead of SQLINTEGER @@ -78,31 +78,74 @@ # define QSQLULEN SQLULEN #endif - static const int COLNAMESIZE = 256; //Map Qt parameter types to ODBC types static const SQLSMALLINT qParamType[4] = { SQL_PARAM_INPUT, SQL_PARAM_INPUT, SQL_PARAM_OUTPUT, SQL_PARAM_INPUT_OUTPUT }; +inline static QString fromSQLTCHAR(const QVarLengthArray& input, int size=-1) +{ + QString result; + + int realsize = qMin(size, input.size()); + if(realsize > 0 && input[realsize-1] == 0) + realsize--; + switch(sizeof(SQLTCHAR)) { + case 1: + result=QString::fromUtf8((const char *)input.constData(), realsize); + break; + case 2: + result=QString::fromUtf16((const ushort *)input.constData(), realsize); + break; + case 4: + result=QString::fromUcs4((const uint *)input.constData(), realsize); + break; + default: + qCritical() << "sizeof(SQLTCHAR) is " << sizeof(SQLTCHAR) << "Don't know how to handle this"; + } + return result; +} + +inline static QVarLengthArray toSQLTCHAR(const QString &input) +{ + QVarLengthArray result; + result.resize(input.size()); + switch(sizeof(SQLTCHAR)) { + case 1: + memcpy(result.data(), input.toUtf8().data(), input.size()); + break; + case 2: + memcpy(result.data(), input.unicode(), input.size() * 2); + break; + case 4: + memcpy(result.data(), input.toUcs4().data(), input.size() * 4); + break; + default: + qCritical() << "sizeof(SQLTCHAR) is " << sizeof(SQLTCHAR) << "Don't know how to handle this"; + } + result.append(0); // make sure it's null terminated, doesn't matter if it already is, it does if it isn't. + return result; +} + class QODBCDriverPrivate { public: enum DefaultCase{Lower, Mixed, Upper, Sensitive}; QODBCDriverPrivate() - : hEnv(0), hDbc(0), useSchema(false), disconnectCount(0), isMySqlServer(false), - isMSSqlServer(false), hasSQLFetchScroll(true), hasMultiResultSets(false), - isQuoteInitialized(false), quote(QLatin1Char('"')) + : hEnv(0), hDbc(0), unicode(false), useSchema(false), disconnectCount(0), isMySqlServer(false), + isMSSqlServer(false), isFreeTDSDriver(false), hasSQLFetchScroll(true), + hasMultiResultSets(false), isQuoteInitialized(false), quote(QLatin1Char('"')) { - unicode = false; } SQLHANDLE hEnv; SQLHANDLE hDbc; - uint unicode :1; - uint useSchema :1; + bool unicode; + bool useSchema; int disconnectCount; bool isMySqlServer; bool isMSSqlServer; + bool isFreeTDSDriver; bool hasSQLFetchScroll; bool hasMultiResultSets; @@ -129,7 +172,10 @@ QODBCPrivate(QODBCDriverPrivate *dpp) : hStmt(0), useSchema(false), hasSQLFetchScroll(true), driverPrivate(dpp), userForwardOnly(false) { - unicode = false; + unicode = dpp->unicode; + useSchema = dpp->useSchema; + disconnectCount = dpp->disconnectCount; + hasSQLFetchScroll = dpp->hasSQLFetchScroll; } inline void clearValues() @@ -139,8 +185,8 @@ SQLHANDLE dpDbc() const { return driverPrivate ? driverPrivate->hDbc : 0;} SQLHANDLE hStmt; - uint unicode :1; - uint useSchema :1; + bool unicode; + bool useSchema; QSqlRecord rInf; QVector fieldCache; @@ -177,19 +223,18 @@ int i = 1; description_[0] = 0; - r = SQLGetDiagRec(handleType, - handle, - i, - state_, - &nativeCode_, - 0, - NULL, - &msgLen); - if(r == SQL_NO_DATA) - return QString(); - description_.resize(msgLen+1); do { r = SQLGetDiagRec(handleType, + handle, + i, + state_, + &nativeCode_, + 0, + NULL, + &msgLen); + if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && msgLen > 0) + description_.resize(msgLen+1); + r = SQLGetDiagRec(handleType, handle, i, state_, @@ -202,9 +247,9 @@ *nativeCode = nativeCode_; QString tmpstore; #ifdef UNICODE - tmpstore = QString((const QChar*)description_.data(), msgLen); + tmpstore = fromSQLTCHAR(description_, msgLen); #else - tmpstore = QString::fromLocal8Bit((const char*)description_.data(), msgLen); + tmpstore = QString::fromUtf8((const char*)description_.constData(), msgLen); #endif if(result != tmpstore) { if(!result.isEmpty()) @@ -223,13 +268,13 @@ { return (qWarnODBCHandle(SQL_HANDLE_ENV, odbc->dpEnv()) + QLatin1Char(' ') + qWarnODBCHandle(SQL_HANDLE_DBC, odbc->dpDbc()) + QLatin1Char(' ') - + qWarnODBCHandle(SQL_HANDLE_STMT, odbc->hStmt, nativeCode)); + + qWarnODBCHandle(SQL_HANDLE_STMT, odbc->hStmt, nativeCode)).simplified(); } static QString qODBCWarn(const QODBCDriverPrivate* odbc, int *nativeCode = 0) { return (qWarnODBCHandle(SQL_HANDLE_ENV, odbc->hEnv) + QLatin1Char(' ') - + qWarnODBCHandle(SQL_HANDLE_DBC, odbc->hDbc, nativeCode)); + + qWarnODBCHandle(SQL_HANDLE_DBC, odbc->hDbc, nativeCode)).simplified(); } static void qSqlWarning(const QString& message, const QODBCPrivate* odbc) @@ -307,7 +352,9 @@ #endif case SQL_CHAR: case SQL_VARCHAR: +#if (ODBCVER >= 0x0350) case SQL_GUID: +#endif case SQL_LONGVARCHAR: type = QVariant::String; break; @@ -331,45 +378,89 @@ colSize = 65536; } else { colSize++; // make sure there is room for more than the 0 termination - if (unicode) { - colSize *= 2; // a tiny bit faster, since it saves a SQLGetData() call - } } - QVarLengthArray buf(colSize); - while (true) { + if(unicode) { r = SQLGetData(hStmt, column+1, - unicode ? SQL_C_WCHAR : SQL_C_CHAR, - (SQLPOINTER)buf.data(), - colSize, + SQL_C_TCHAR, + NULL, + 0, &lengthIndicator); - if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { - if (lengthIndicator == SQL_NULL_DATA || lengthIndicator == SQL_NO_TOTAL) { + if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && lengthIndicator > 0) + colSize = lengthIndicator/sizeof(SQLTCHAR) + 1; + QVarLengthArray buf(colSize); + memset(buf.data(), 0, colSize*sizeof(SQLTCHAR)); + while (true) { + r = SQLGetData(hStmt, + column+1, + SQL_C_TCHAR, + (SQLPOINTER)buf.data(), + colSize*sizeof(SQLTCHAR), + &lengthIndicator); + if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { + if (lengthIndicator == SQL_NULL_DATA || lengthIndicator == SQL_NO_TOTAL) { + fieldVal.clear(); + break; + } + // if SQL_SUCCESS_WITH_INFO is returned, indicating that + // more data can be fetched, the length indicator does NOT + // contain the number of bytes returned - it contains the + // total number of bytes that CAN be fetched + // colSize-1: remove 0 termination when there is more data to fetch + int rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : lengthIndicator/sizeof(SQLTCHAR); + fieldVal += fromSQLTCHAR(buf, rSize); + if (lengthIndicator < (unsigned int)colSize*sizeof(SQLTCHAR)) { + // workaround for Drivermanagers that don't return SQL_NO_DATA + break; + } + } else if (r == SQL_NO_DATA) { + break; + } else { + qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')'; fieldVal.clear(); break; } - // if SQL_SUCCESS_WITH_INFO is returned, indicating that - // more data can be fetched, the length indicator does NOT - // contain the number of bytes returned - it contains the - // total number of bytes that CAN be fetched - // colSize-1: remove 0 termination when there is more data to fetch - int rSize = (r == SQL_SUCCESS_WITH_INFO) ? (unicode ? colSize-2 : colSize-1) : lengthIndicator; - if (unicode) { - fieldVal += QString((const QChar*) buf.constData(), rSize / 2); + } + } else { + r = SQLGetData(hStmt, + column+1, + SQL_C_CHAR, + NULL, + 0, + &lengthIndicator); + if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && lengthIndicator > 0) + colSize = lengthIndicator + 1; + QVarLengthArray buf(colSize); + while (true) { + r = SQLGetData(hStmt, + column+1, + SQL_C_CHAR, + (SQLPOINTER)buf.data(), + colSize, + &lengthIndicator); + if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { + if (lengthIndicator == SQL_NULL_DATA || lengthIndicator == SQL_NO_TOTAL) { + fieldVal.clear(); + break; + } + // if SQL_SUCCESS_WITH_INFO is returned, indicating that + // more data can be fetched, the length indicator does NOT + // contain the number of bytes returned - it contains the + // total number of bytes that CAN be fetched + // colSize-1: remove 0 termination when there is more data to fetch + int rSize = (r == SQL_SUCCESS_WITH_INFO) ? colSize : lengthIndicator; + fieldVal += QString::fromUtf8((const char *)buf.constData(), rSize); + if (lengthIndicator < (unsigned int)colSize) { + // workaround for Drivermanagers that don't return SQL_NO_DATA + break; + } + } else if (r == SQL_NO_DATA) { + break; } else { - fieldVal += QString::fromAscii(buf.constData(), rSize); - } - memset(buf.data(), 0, colSize); - if (lengthIndicator < colSize) { - // workaround for Drivermanagers that don't return SQL_NO_DATA + qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')'; + fieldVal.clear(); break; } - } else if (r == SQL_NO_DATA) { - break; - } else { - qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')'; - fieldVal.clear(); - break; } } return fieldVal; @@ -386,10 +477,11 @@ QSQLLEN lengthIndicator = 0; SQLRETURN r = SQL_ERROR; - SQLTCHAR colName[COLNAMESIZE]; + QVarLengthArray colName(COLNAMESIZE); + r = SQLDescribeCol(hStmt, column + 1, - colName, + colName.data(), COLNAMESIZE, &colNameLen, &colType, @@ -522,10 +614,10 @@ SQLSMALLINT colScale; SQLSMALLINT nullable; SQLRETURN r = SQL_ERROR; - SQLTCHAR colName[COLNAMESIZE]; + QVarLengthArray colName(COLNAMESIZE); r = SQLDescribeCol(p->hStmt, i+1, - colName, + colName.data(), (SQLSMALLINT)COLNAMESIZE, &colNameLen, &colType, @@ -551,9 +643,9 @@ } #ifdef UNICODE - QString qColName((const QChar*)colName, colNameLen); + QString qColName(fromSQLTCHAR(colName, colNameLen)); #else - QString qColName = QString::fromLocal8Bit((const char*)colName); + QString qColName = QString::fromUtf8((const char *)colName.constData()); #endif // nullable can be SQL_NO_NULLS, SQL_NULLABLE or SQL_NULLABLE_UNKNOWN int required = -1; @@ -581,24 +673,33 @@ if (connOpts.contains(QLatin1String("SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3"), Qt::CaseInsensitive)) return SQL_OV_ODBC3; #endif + if (connOpts.contains(QLatin1String("SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC2"), Qt::CaseInsensitive)) + return SQL_OV_ODBC2; +#ifdef _IODBCUNIX_H + return SQL_OV_ODBC3; +#else return SQL_OV_ODBC2; +#endif } QChar QODBCDriverPrivate::quoteChar() { if (!isQuoteInitialized) { - char driverResponse[4]; + SQLTCHAR driverResponse[4]; SQLSMALLINT length; int r = SQLGetInfo(hDbc, SQL_IDENTIFIER_QUOTE_CHAR, &driverResponse, sizeof(driverResponse), &length); - if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { + if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) +#ifdef UNICODE + quote = QChar(driverResponse[0]); +#else quote = QLatin1Char(driverResponse[0]); - } else { +#endif + else quote = QLatin1Char('"'); - } isQuoteInitialized = true; } return quote; @@ -642,11 +743,11 @@ val.utf16(); // 0 terminate r = SQLSetConnectAttr(hDbc, SQL_ATTR_CURRENT_CATALOG, #ifdef UNICODE - (SQLWCHAR*) val.unicode(), + toSQLTCHAR(val).data(), #else - (SQLCHAR*) val.toLatin1().constData(), + (SQLCHAR*) val.toUtf8().data(), #endif - SQL_NTS); + val.length()*sizeof(SQLTCHAR)); } else if (opt.toUpper() == QLatin1String("SQL_ATTR_METADATA_ID")) { if (val.toUpper() == QLatin1String("SQL_TRUE")) { v = SQL_TRUE; @@ -664,11 +765,11 @@ val.utf16(); // 0 terminate r = SQLSetConnectAttr(hDbc, SQL_ATTR_TRACEFILE, #ifdef UNICODE - (SQLWCHAR*) val.unicode(), + toSQLTCHAR(val).data(), #else - (SQLCHAR*) val.toLatin1().constData(), + (SQLCHAR*) val.toUtf8().data(), #endif - SQL_NTS); + val.length()*sizeof(SQLTCHAR)); } else if (opt.toUpper() == QLatin1String("SQL_ATTR_TRACE")) { if (val.toUpper() == QLatin1String("SQL_OPT_TRACE_OFF")) { v = SQL_OPT_TRACE_OFF; @@ -814,10 +915,6 @@ : QSqlResult(db) { d = new QODBCPrivate(p); - d->unicode = p->unicode; - d->useSchema = p->useSchema; - d->disconnectCount = p->disconnectCount; - d->hasSQLFetchScroll = p->hasSQLFetchScroll; } QODBCResult::~QODBCResult() @@ -880,12 +977,12 @@ #ifdef UNICODE r = SQLExecDirect(d->hStmt, - (SQLWCHAR*) query.unicode(), + toSQLTCHAR(query).data(), (SQLINTEGER) query.length()); #else - QByteArray query8 = query.toLocal8Bit(); + QByteArray query8 = query.toUtf8(); r = SQLExecDirect(d->hStmt, - (SQLCHAR*) query8.constData(), + (SQLCHAR*) query8.data(), (SQLINTEGER) query8.length()); #endif if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO && r!= SQL_NO_DATA) { @@ -1231,12 +1328,12 @@ #ifdef UNICODE r = SQLPrepare(d->hStmt, - (SQLWCHAR*) query.unicode(), + toSQLTCHAR(query).data(), (SQLINTEGER) query.length()); #else - QByteArray query8 = query.toLocal8Bit(); + QByteArray query8 = query.toUtf8(); r = SQLPrepare(d->hStmt, - (SQLCHAR*) query8.constData(), + (SQLCHAR*) query8.data(), (SQLINTEGER) query8.length()); #endif @@ -1435,43 +1532,44 @@ #ifndef Q_ODBC_VERSION_2 if (d->unicode) { QString str = val.toString(); - str.utf16(); if (*ind != SQL_NULL_DATA) - *ind = str.length() * sizeof(QChar); - int strSize = str.length() * sizeof(QChar); + *ind = str.length() * sizeof(SQLTCHAR); + int strSize = str.length() * sizeof(SQLTCHAR); if (bindValueType(i) & QSql::Out) { - QByteArray ba((char*)str.constData(), str.capacity() * sizeof(QChar)); + QVarLengthArray ba(toSQLTCHAR(str)); + ba.reserve(str.capacity()); r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], - SQL_C_WCHAR, + SQL_C_TCHAR, strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, 0, // god knows... don't change this! 0, (void *)ba.constData(), ba.size(), ind); - tmpStorage.append(ba); + tmpStorage.append(QByteArray((const char *)ba.constData(), ba.size()*sizeof(SQLTCHAR))); break; } - + QByteArray strba((const char *)toSQLTCHAR(str).constData(), str.size()*sizeof(SQLTCHAR)); r = SQLBindParameter(d->hStmt, i + 1, qParamType[(QFlag)(bindValueType(i)) & QSql::InOut], - SQL_C_WCHAR, + SQL_C_TCHAR, strSize > 254 ? SQL_WLONGVARCHAR : SQL_WVARCHAR, strSize, 0, - (void *)str.constData(), - strSize, + (SQLPOINTER)strba.constData(), + strba.size(), ind); + tmpStorage.append(strba); break; } else #endif { - QByteArray str = val.toString().toAscii(); + QByteArray str = val.toString().toUtf8(); if (*ind != SQL_NULL_DATA) *ind = str.length(); int strSize = str.length(); @@ -1572,15 +1670,18 @@ break; case QVariant::String: if (d->unicode) { - if (bindValueType(i) & QSql::Out) - values[i] = QString::fromUtf16((ushort*)tmpStorage.takeFirst().constData()); + if (bindValueType(i) & QSql::Out) { + QByteArray first = tmpStorage.takeFirst(); + QVarLengthArray array; + array.append((SQLTCHAR *)first.constData(), first.size()); + values[i] = fromSQLTCHAR(array, first.size()/sizeof(SQLTCHAR*)); + } break; } // fall through default: { - QByteArray ba = tmpStorage.takeFirst(); if (bindValueType(i) & QSql::Out) - values[i] = QString::fromAscii(ba.constData()); + values[i] = tmpStorage.takeFirst(); break; } } if (indicators[i] == SQL_NULL_DATA) @@ -1789,19 +1890,21 @@ connQStr += QLatin1String(";PWD=") + password; SQLSMALLINT cb; - SQLTCHAR connOut[1024]; + QVarLengthArray connOut(1024); + memset(connOut.data(), 0, connOut.size() * sizeof(SQLTCHAR)); r = SQLDriverConnect(d->hDbc, NULL, #ifdef UNICODE - (SQLWCHAR*)connQStr.unicode(), + toSQLTCHAR(connQStr).data(), #else - (SQLCHAR*)connQStr.toLatin1().constData(), + (SQLCHAR*)connQStr.toUtf8().data(), #endif (SQLSMALLINT)connQStr.length(), - connOut, + connOut.data(), 1024, &cb, - SQL_DRIVER_NOPROMPT); + /*SQL_DRIVER_NOPROMPT*/0); + if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO) { setLastError(qMakeError(tr("Unable to connect"), QSqlError::ConnectionError, d)); setOpenError(true); @@ -1886,6 +1989,7 @@ NULL); if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && (fFunc & SQL_CVT_WCHAR)) { unicode = true; + return; } r = SQLGetInfo(hDbc, @@ -1895,6 +1999,7 @@ NULL); if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && (fFunc & SQL_CVT_WVARCHAR)) { unicode = true; + return; } r = SQLGetInfo(hDbc, @@ -1904,7 +2009,25 @@ NULL); if ((r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) && (fFunc & SQL_CVT_WLONGVARCHAR)) { unicode = true; + return; } + SQLHANDLE hStmt; + r = SQLAllocHandle(SQL_HANDLE_STMT, + hDbc, + &hStmt); + + r = SQLExecDirect(hStmt, toSQLTCHAR(QLatin1String("select 'test'")).data(), SQL_NTS); + if(r == SQL_SUCCESS) { + r = SQLFetch(hStmt); + if(r == SQL_SUCCESS) { + QVarLengthArray buffer(10); + r = SQLGetData(hStmt, 1, SQL_C_WCHAR, buffer.data(), buffer.size() * sizeof(SQLWCHAR), NULL); + if(r == SQL_SUCCESS && fromSQLTCHAR(buffer) == QLatin1String("test")) { + unicode = true; + } + } + } + r = SQLFreeHandle(SQL_HANDLE_STMT, hStmt); } bool QODBCDriverPrivate::checkDriver() const @@ -1977,24 +2100,40 @@ void QODBCDriverPrivate::checkSqlServer() { SQLRETURN r; - char serverString[200]; + QVarLengthArray serverString(200); SQLSMALLINT t; + memset(serverString.data(), 0, serverString.size() * sizeof(SQLTCHAR)); r = SQLGetInfo(hDbc, SQL_DBMS_NAME, - serverString, - sizeof(serverString), + serverString.data(), + serverString.size() * sizeof(SQLTCHAR), &t); if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { QString serverType; #ifdef UNICODE - serverType = QString(reinterpret_cast(serverString), t/sizeof(QChar)); + serverType = fromSQLTCHAR(serverString, t/sizeof(SQLTCHAR)); #else - serverType = QString::fromLocal8Bit(serverString, t); + serverType = QString::fromUtf8((const char *)serverString.constData(), t); #endif isMySqlServer = serverType.contains(QLatin1String("mysql"), Qt::CaseInsensitive); isMSSqlServer = serverType.contains(QLatin1String("Microsoft SQL Server"), Qt::CaseInsensitive); } + r = SQLGetInfo(hDbc, + SQL_DRIVER_NAME, + serverString.data(), + serverString.size() * sizeof(SQLTCHAR), + &t); + if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { + QString serverType; +#ifdef UNICODE + serverType = fromSQLTCHAR(serverString, t/sizeof(SQLTCHAR)); +#else + serverType = QString::fromUtf8((const char *)serverString.constData(), t); +#endif + isFreeTDSDriver = serverType.contains(QLatin1String("tdsodbc"), Qt::CaseInsensitive); + unicode = isFreeTDSDriver == false; + } } void QODBCDriverPrivate::checkHasSQLFetchScroll() @@ -2009,18 +2148,18 @@ void QODBCDriverPrivate::checkHasMultiResults() { - char driverResponse[4]; + QVarLengthArray driverResponse(2); SQLSMALLINT length; SQLRETURN r = SQLGetInfo(hDbc, SQL_MULT_RESULT_SETS, - driverResponse, - sizeof(driverResponse), + driverResponse.data(), + driverResponse.size() * sizeof(SQLTCHAR), &length); if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) #ifdef UNICODE - hasMultiResultSets = QString(reinterpret_cast(driverResponse), length/sizeof(QChar)).startsWith(QLatin1Char('Y')); + hasMultiResultSets = fromSQLTCHAR(driverResponse, length/sizeof(SQLTCHAR)).startsWith(QLatin1Char('Y')); #else - hasMultiResultSets = QString::fromLocal8Bit(driverResponse, length).startsWith(QLatin1Char('Y')); + hasMultiResultSets = QString::fromUtf8((const char *)driverResponse.constData(), length).startsWith(QLatin1Char('Y')); #endif } @@ -2134,9 +2273,9 @@ NULL, 0, #ifdef UNICODE - (SQLWCHAR*)joinedTableTypeString.unicode(), + toSQLTCHAR(joinedTableTypeString).data(), #else - (SQLCHAR*)joinedTableTypeString.toLatin1().constData(), + (SQLCHAR*)joinedTableTypeString.toUtf8().data(), #endif joinedTableTypeString.length() /* characters, not bytes */); @@ -2150,6 +2289,11 @@ else r = SQLFetch(hStmt); + if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO && r != SQL_NO_DATA) { + qWarning() << "QODBCDriver::tables failed to retrieve table/view list: (" << r << "," << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ")"; + return QStringList(); + } + while (r == SQL_SUCCESS) { QString fieldVal = qGetStringData(hStmt, 2, -1, false); tl.append(fieldVal); @@ -2208,21 +2352,21 @@ SQL_IS_UINTEGER); r = SQLPrimaryKeys(hStmt, #ifdef UNICODE - catalog.length() == 0 ? NULL : (SQLWCHAR*)catalog.unicode(), + catalog.length() == 0 ? NULL : toSQLTCHAR(catalog).data(), #else - catalog.length() == 0 ? NULL : (SQLCHAR*)catalog.toLatin1().constData(), + catalog.length() == 0 ? NULL : (SQLCHAR*)catalog.toUtf8().data(), #endif catalog.length(), #ifdef UNICODE - schema.length() == 0 ? NULL : (SQLWCHAR*)schema.unicode(), + schema.length() == 0 ? NULL : toSQLTCHAR(schema).data(), #else - schema.length() == 0 ? NULL : (SQLCHAR*)schema.toLatin1().constData(), + schema.length() == 0 ? NULL : (SQLCHAR*)schema.toUtf8().data(), #endif schema.length(), #ifdef UNICODE - (SQLWCHAR*)table.unicode(), + toSQLTCHAR(table).data(), #else - (SQLCHAR*)table.toLatin1().constData(), + (SQLCHAR*)table.toUtf8().data(), #endif table.length() /* in characters, not in bytes */); @@ -2233,21 +2377,21 @@ r = SQLSpecialColumns(hStmt, SQL_BEST_ROWID, #ifdef UNICODE - catalog.length() == 0 ? NULL : (SQLWCHAR*)catalog.unicode(), + catalog.length() == 0 ? NULL : toSQLTCHAR(catalog).data(), #else - catalog.length() == 0 ? NULL : (SQLCHAR*)catalog.toLatin1().constData(), + catalog.length() == 0 ? NULL : (SQLCHAR*)catalog.toUtf8().data(), #endif catalog.length(), #ifdef UNICODE - schema.length() == 0 ? NULL : (SQLWCHAR*)schema.unicode(), + schema.length() == 0 ? NULL : toSQLTCHAR(schema).data(), #else - schema.length() == 0 ? NULL : (SQLCHAR*)schema.toLatin1().constData(), + schema.length() == 0 ? NULL : (SQLCHAR*)schema.toUtf8().data(), #endif schema.length(), #ifdef UNICODE - (SQLWCHAR*)table.unicode(), + toSQLTCHAR(table).data(), #else - (SQLCHAR*)table.toLatin1().constData(), + (SQLCHAR*)table.toUtf8().data(), #endif table.length(), SQL_SCOPE_CURROW, @@ -2333,21 +2477,21 @@ SQL_IS_UINTEGER); r = SQLColumns(hStmt, #ifdef UNICODE - catalog.length() == 0 ? NULL : (SQLWCHAR*)catalog.unicode(), + catalog.length() == 0 ? NULL : toSQLTCHAR(catalog).data(), #else - catalog.length() == 0 ? NULL : (SQLCHAR*)catalog.toLatin1().constData(), + catalog.length() == 0 ? NULL : (SQLCHAR*)catalog.toUtf8().data(), #endif catalog.length(), #ifdef UNICODE - schema.length() == 0 ? NULL : (SQLWCHAR*)schema.unicode(), + schema.length() == 0 ? NULL : toSQLTCHAR(schema).data(), #else - schema.length() == 0 ? NULL : (SQLCHAR*)schema.toLatin1().constData(), + schema.length() == 0 ? NULL : (SQLCHAR*)schema.toUtf8().data(), #endif schema.length(), #ifdef UNICODE - (SQLWCHAR*)table.unicode(), + toSQLTCHAR(table).data(), #else - (SQLCHAR*)table.toLatin1().constData(), + (SQLCHAR*)table.toUtf8().data(), #endif table.length(), NULL, diff -r 2f34d5167611 -r fcece45ef507 src/sql/drivers/odbc/qsql_odbc.h --- a/src/sql/drivers/odbc/qsql_odbc.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/sql/drivers/odbc/qsql_odbc.h Mon May 03 13:17:34 2010 +0300 @@ -75,10 +75,6 @@ # undef _MSC_VER #endif -#ifndef Q_ODBC_VERSION_2 -#include -#endif - #include QT_BEGIN_HEADER diff -r 2f34d5167611 -r fcece45ef507 src/sql/kernel/qsqlquery.cpp --- a/src/sql/kernel/qsqlquery.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/sql/kernel/qsqlquery.cpp Mon May 03 13:17:34 2010 +0300 @@ -822,6 +822,9 @@ scrollable. isForwardOnly() will always return the correct status of the result set. + \note Calling setForwardOnly after execution of the query will result + in unexpected results at best, and crashes at worst. + \sa isForwardOnly(), next(), seek(), QSqlResult::setForwardOnly() */ void QSqlQuery::setForwardOnly(bool forward) @@ -999,10 +1002,18 @@ must be included when specifying the placeholder name. If \a paramType is QSql::Out or QSql::InOut, the placeholder will be overwritten with data from the database after the exec() call. + In this case, sufficient space must be pre-allocated to store + the result into. To bind a NULL value, use a null QVariant; for example, use \c {QVariant(QVariant::String)} if you are binding a string. + Values cannot be bound to multiple locations in the query, eg: + \code + INSERT INTO testtable (id, name, samename) VALUES (:id, :name, :name) + \endcode + Binding to name will bind to the first :name, but not the second. + \sa addBindValue(), prepare(), exec(), boundValue() boundValues() */ void QSqlQuery::bindValue(const QString& placeholder, const QVariant& val, diff -r 2f34d5167611 -r fcece45ef507 src/sql/kernel/qsqlresult.cpp --- a/src/sql/kernel/qsqlresult.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/sql/kernel/qsqlresult.cpp Mon May 03 13:17:34 2010 +0300 @@ -564,6 +564,9 @@ scrollable. isForwardOnly() will always return the correct status of the result set. + \note Calling setForwardOnly after execution of the query will result + in unexpected results at best, and crashes at worst. + \sa isForwardOnly(), fetchNext(), QSqlQuery::setForwardOnly() */ void QSqlResult::setForwardOnly(bool forward) @@ -707,7 +710,15 @@ Binds the value \a val of parameter type \a paramType to the \a placeholder name in the current record (row). - Note that binding an undefined placeholder will result in undefined behavior. + Values cannot be bound to multiple locations in the query, eg: + \code + INSERT INTO testtable (id, name, samename) VALUES (:id, :name, :name) + \endcode + Binding to name will bind to the first :name, but not the second. + + \note Binding an undefined placeholder will result in undefined behavior. + + \sa QSqlQuery::bindValue() */ void QSqlResult::bindValue(const QString& placeholder, const QVariant& val, QSql::ParamType paramType) diff -r 2f34d5167611 -r fcece45ef507 src/svg/qgraphicssvgitem.cpp --- a/src/svg/qgraphicssvgitem.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/svg/qgraphicssvgitem.cpp Mon May 03 13:17:34 2010 +0300 @@ -267,6 +267,7 @@ /*! \property QGraphicsSvgItem::maximumCacheSize + \since 4.6 This property holds the maximum size of the device coordinate cache for this item. @@ -312,7 +313,8 @@ /*! \property QGraphicsSvgItem::elementId - + \since 4.6 + This property holds the element's XML ID. */ diff -r 2f34d5167611 -r fcece45ef507 src/testlib/qtestcase.cpp --- a/src/testlib/qtestcase.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/testlib/qtestcase.cpp Mon May 03 13:17:34 2010 +0300 @@ -964,7 +964,7 @@ " -xunitxml : Outputs results as XML XUnit document\n" " -xml : Outputs results as XML document\n" " -lightxml : Outputs results as stream of XML tags\n" - " -flush : Flushes the resutls\n" + " -flush : Flushes the results\n" " -o filename: Writes all output into a file\n" " -silent : Only outputs warnings and failures\n" " -v1 : Print enter messages for each testfunction\n" diff -r 2f34d5167611 -r fcece45ef507 src/tools/moc/generator.cpp --- a/src/tools/moc/generator.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/tools/moc/generator.cpp Mon May 03 13:17:34 2010 +0300 @@ -738,18 +738,23 @@ const PropertyDef &p = cdef->propertyList.at(propindex); if (p.read.isEmpty()) continue; + QByteArray prefix; + if (p.inPrivateClass.size()) { + prefix = p.inPrivateClass; + prefix.append("->"); + } if (p.gspec == PropertyDef::PointerSpec) - fprintf(out, " case %d: _a[0] = const_cast(reinterpret_cast(%s())); break;\n", - propindex, p.read.constData()); + fprintf(out, " case %d: _a[0] = const_cast(reinterpret_cast(%s%s())); break;\n", + propindex, prefix.constData(), p.read.constData()); else if (p.gspec == PropertyDef::ReferenceSpec) - fprintf(out, " case %d: _a[0] = const_cast(reinterpret_cast(&%s())); break;\n", - propindex, p.read.constData()); + fprintf(out, " case %d: _a[0] = const_cast(reinterpret_cast(&%s%s())); break;\n", + propindex, prefix.constData(), p.read.constData()); else if (cdef->enumDeclarations.value(p.type, false)) - fprintf(out, " case %d: *reinterpret_cast(_v) = QFlag(%s()); break;\n", - propindex, p.read.constData()); + fprintf(out, " case %d: *reinterpret_cast(_v) = QFlag(%s%s()); break;\n", + propindex, prefix.constData(), p.read.constData()); else - fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s(); break;\n", - propindex, p.type.constData(), p.read.constData()); + fprintf(out, " case %d: *reinterpret_cast< %s*>(_v) = %s%s(); break;\n", + propindex, p.type.constData(), prefix.constData(), p.read.constData()); } fprintf(out, " }\n"); } @@ -768,12 +773,17 @@ const PropertyDef &p = cdef->propertyList.at(propindex); if (p.write.isEmpty()) continue; + QByteArray prefix; + if (p.inPrivateClass.size()) { + prefix = p.inPrivateClass; + prefix.append("->"); + } if (cdef->enumDeclarations.value(p.type, false)) { - fprintf(out, " case %d: %s(QFlag(*reinterpret_cast(_v))); break;\n", - propindex, p.write.constData()); + fprintf(out, " case %d: %s%s(QFlag(*reinterpret_cast(_v))); break;\n", + propindex, prefix.constData(), p.write.constData()); } else { - fprintf(out, " case %d: %s(*reinterpret_cast< %s*>(_v)); break;\n", - propindex, p.write.constData(), p.type.constData()); + fprintf(out, " case %d: %s%s(*reinterpret_cast< %s*>(_v)); break;\n", + propindex, prefix.constData(), p.write.constData(), p.type.constData()); } } fprintf(out, " }\n"); @@ -791,8 +801,13 @@ const PropertyDef &p = cdef->propertyList.at(propindex); if (!p.reset.endsWith(')')) continue; - fprintf(out, " case %d: %s; break;\n", - propindex, p.reset.constData()); + QByteArray prefix; + if (p.inPrivateClass.size()) { + prefix = p.inPrivateClass; + prefix.append("->"); + } + fprintf(out, " case %d: %s%s; break;\n", + propindex, prefix.constData(), p.reset.constData()); } fprintf(out, " }\n"); } diff -r 2f34d5167611 -r fcece45ef507 src/tools/moc/keywords.cpp --- a/src/tools/moc/keywords.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/tools/moc/keywords.cpp Mon May 03 13:17:34 2010 +0300 @@ -43,12 +43,12 @@ // DO NOT EDIT. static const short keyword_trans[][128] = { - {0,0,0,0,0,0,0,0,0,525,522,0,0,0,0,0, + {0,0,0,0,0,0,0,0,0,533,530,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 525,252,523,526,0,38,239,524,25,26,236,234,30,235,27,237, + 533,252,531,534,0,38,239,532,25,26,236,234,30,235,27,237, 22,22,22,22,22,22,22,22,22,22,34,41,23,39,24,43, 0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,21,8,8,8,8,8,8,8,8,8,31,527,32,238,8, + 8,21,8,8,8,8,8,8,8,8,8,31,535,32,238,8, 0,1,2,3,4,5,6,7,8,9,8,8,10,11,12,13, 14,8,15,16,17,18,19,20,8,8,8,36,245,37,248,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -190,7 +190,7 @@ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,42,0,0,0,28,0, - 530,530,530,530,530,530,530,530,530,530,0,0,0,0,0,0, + 538,538,538,538,538,538,538,538,538,538,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -349,7 +349,7 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,529,0,0,0,0,528, + 0,0,0,0,0,0,0,0,0,0,537,0,0,0,0,536, 0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -430,6 +430,14 @@ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 522,0,0,481,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,497,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486, @@ -925,12 +933,12 @@ {CHARACTER, 0, 84, 478, CHARACTER}, {CHARACTER, 0, 69, 479, CHARACTER}, {CHARACTER, 0, 95, 480, CHARACTER}, - {CHARACTER, 0, 83, 481, CHARACTER}, + {CHARACTER, 48, 0, 0, CHARACTER}, {CHARACTER, 0, 76, 482, CHARACTER}, {CHARACTER, 0, 79, 483, CHARACTER}, {CHARACTER, 0, 84, 484, CHARACTER}, {Q_PRIVATE_SLOT_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 48, 0, 0, CHARACTER}, + {CHARACTER, 49, 0, 0, CHARACTER}, {CHARACTER, 0, 77, 487, CHARACTER}, {CHARACTER, 0, 79, 488, CHARACTER}, {CHARACTER, 0, 67, 489, CHARACTER}, @@ -967,6 +975,14 @@ {CHARACTER, 0, 76, 520, CHARACTER}, {CHARACTER, 0, 69, 521, CHARACTER}, {Q_SCRIPTABLE_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 82, 523, CHARACTER}, + {CHARACTER, 0, 79, 524, CHARACTER}, + {CHARACTER, 0, 80, 525, CHARACTER}, + {CHARACTER, 0, 69, 526, CHARACTER}, + {CHARACTER, 0, 82, 527, CHARACTER}, + {CHARACTER, 0, 84, 528, CHARACTER}, + {CHARACTER, 0, 89, 529, CHARACTER}, + {Q_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER}, {NEWLINE, 0, 0, 0, NOTOKEN}, {QUOTE, 0, 0, 0, NOTOKEN}, {SINGLEQUOTE, 0, 0, 0, NOTOKEN}, diff -r 2f34d5167611 -r fcece45ef507 src/tools/moc/moc.cpp --- a/src/tools/moc/moc.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/tools/moc/moc.cpp Mon May 03 13:17:34 2010 +0300 @@ -658,6 +658,9 @@ case Q_PRIVATE_SLOT_TOKEN: parseSlotInPrivate(&def, access); break; + case Q_PRIVATE_PROPERTY_TOKEN: + parsePrivateProperty(&def); + break; case ENUM: { EnumDef enumDef; if (parseEnum(&enumDef)) @@ -872,11 +875,8 @@ } } - -void Moc::parseProperty(ClassDef *def) +void Moc::createPropertyDef(PropertyDef &propDef) { - next(LPAREN); - PropertyDef propDef; QByteArray type = parseType().name; if (type.isEmpty()) error(); @@ -964,7 +964,6 @@ error(2); } } - next(RPAREN); if (propDef.read.isNull()) { QByteArray msg; msg += "Property declaration "; @@ -988,6 +987,41 @@ propDef.constant = false; warning(msg.constData()); } +} + +void Moc::parseProperty(ClassDef *def) +{ + next(LPAREN); + PropertyDef propDef; + createPropertyDef(propDef); + next(RPAREN); + + + if(!propDef.notify.isEmpty()) + def->notifyableProperties++; + def->propertyList += propDef; +} + +void Moc::parsePrivateProperty(ClassDef *def) +{ + next(LPAREN); + PropertyDef propDef; + next(IDENTIFIER); + propDef.inPrivateClass = lexem(); + while (test(SCOPE)) { + propDef.inPrivateClass += lexem(); + next(IDENTIFIER); + propDef.inPrivateClass += lexem(); + } + // also allow void functions + if (test(LPAREN)) { + next(RPAREN); + propDef.inPrivateClass += "()"; + } + + next(COMMA); + + createPropertyDef(propDef); if(!propDef.notify.isEmpty()) def->notifyableProperties++; diff -r 2f34d5167611 -r fcece45ef507 src/tools/moc/moc.h --- a/src/tools/moc/moc.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/tools/moc/moc.h Mon May 03 13:17:34 2010 +0300 @@ -116,7 +116,7 @@ struct PropertyDef { PropertyDef():notifyId(-1), constant(false), final(false), gspec(ValueSpec){} - QByteArray name, type, read, write, reset, designable, scriptable, editable, stored, user, notify; + QByteArray name, type, read, write, reset, designable, scriptable, editable, stored, user, notify, inPrivateClass; int notifyId; bool constant; bool final; @@ -217,6 +217,7 @@ void parseSlots(ClassDef *def, FunctionDef::Access access); void parseSignals(ClassDef *def); void parseProperty(ClassDef *def); + void createPropertyDef(PropertyDef &def); void parseEnumOrFlag(ClassDef *def, bool isFlag); void parseFlag(ClassDef *def); void parseClassInfo(ClassDef *def); @@ -224,6 +225,7 @@ void parseDeclareInterface(); void parseDeclareMetatype(); void parseSlotInPrivate(ClassDef *def, FunctionDef::Access access); + void parsePrivateProperty(ClassDef *def); void parseFunctionArguments(FunctionDef *def); diff -r 2f34d5167611 -r fcece45ef507 src/tools/moc/token.cpp --- a/src/tools/moc/token.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/tools/moc/token.cpp Mon May 03 13:17:34 2010 +0300 @@ -179,6 +179,7 @@ case Q_SIGNAL_TOKEN: return "Q_SIGNAL_TOKEN"; case Q_SLOT_TOKEN: return "Q_SLOT_TOKEN"; case Q_PRIVATE_SLOT_TOKEN: return "Q_PRIVATE_SLOT_TOKEN"; + case Q_PRIVATE_PROPERTY_TOKEN: return "Q_PRIVATE_PROPERTY_TOKEN"; case SPECIAL_TREATMENT_MARK: return "SPECIAL_TREATMENT_MARK"; case MOC_INCLUDE_BEGIN: return "MOC_INCLUDE_BEGIN"; case MOC_INCLUDE_END: return "MOC_INCLUDE_END"; diff -r 2f34d5167611 -r fcece45ef507 src/tools/moc/token.h --- a/src/tools/moc/token.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/tools/moc/token.h Mon May 03 13:17:34 2010 +0300 @@ -185,6 +185,7 @@ Q_QT3_SUPPORT_TOKEN, Q_INVOKABLE_TOKEN, Q_SCRIPTABLE_TOKEN, + Q_PRIVATE_PROPERTY_TOKEN, Q_META_TOKEN_END, SPECIAL_TREATMENT_MARK = Q_META_TOKEN_END, MOC_INCLUDE_BEGIN, diff -r 2f34d5167611 -r fcece45ef507 src/tools/moc/util/generate_keywords.cpp --- a/src/tools/moc/util/generate_keywords.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/tools/moc/util/generate_keywords.cpp Mon May 03 13:17:34 2010 +0300 @@ -248,7 +248,7 @@ { "Q_SIGNAL", "Q_SIGNAL_TOKEN" }, { "Q_SLOT", "Q_SLOT_TOKEN" }, { "Q_SCRIPTABLE", "Q_SCRIPTABLE_TOKEN" }, - + { "Q_PRIVATE_PROPERTY", "Q_PRIVATE_PROPERTY_TOKEN" }, { "\n", "NEWLINE" }, { "\"", "QUOTE" }, { "\'", "SINGLEQUOTE" }, diff -r 2f34d5167611 -r fcece45ef507 src/xml/dom/qdom.cpp --- a/src/xml/dom/qdom.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/xml/dom/qdom.cpp Mon May 03 13:17:34 2010 +0300 @@ -3487,6 +3487,7 @@ if (p->isNotation()) // Dont use normal insert function since we would create infinite recursion notations->map.insertMulti(p->nodeName(), p); + p = p->next; } } diff -r 2f34d5167611 -r fcece45ef507 src/xmlpatterns/schema/qxsdschemaparser.cpp --- a/src/xmlpatterns/schema/qxsdschemaparser.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/src/xmlpatterns/schema/qxsdschemaparser.cpp Mon May 03 13:17:34 2010 +0300 @@ -264,16 +264,31 @@ setupBuiltinTypeNames(); } +void XsdSchemaParser::addIncludedSchemas(const NamespaceSet &schemas) +{ + m_includedSchemas += schemas; +} + void XsdSchemaParser::setIncludedSchemas(const NamespaceSet &schemas) { m_includedSchemas = schemas; } +void XsdSchemaParser::addImportedSchemas(const NamespaceSet &schemas) +{ + m_importedSchemas += schemas; +} + void XsdSchemaParser::setImportedSchemas(const NamespaceSet &schemas) { m_importedSchemas = schemas; } +void XsdSchemaParser::addRedefinedSchemas(const NamespaceSet &schemas) +{ + m_redefinedSchemas += schemas; +} + void XsdSchemaParser::setRedefinedSchemas(const NamespaceSet &schemas) { m_redefinedSchemas = schemas; @@ -297,6 +312,7 @@ // prevent to get included/imported/redefined twice m_includedSchemas.insert(uri); m_importedSchemas.insert(uri); + m_redefinedSchemas.insert(uri); } QUrl XsdSchemaParser::documentURI() const @@ -594,8 +610,14 @@ parser.setIncludedSchemas(m_includedSchemas); parser.setImportedSchemas(m_importedSchemas); parser.setRedefinedSchemas(m_redefinedSchemas); - if (!parser.parse(XsdSchemaParser::IncludeParser)) + if (!parser.parse(XsdSchemaParser::IncludeParser)) { return; + } else { + // add indirectly loaded schemas to the list of already loaded ones + addIncludedSchemas(parser.m_includedSchemas); + addImportedSchemas(parser.m_importedSchemas); + addRedefinedSchemas(parser.m_redefinedSchemas); + } } } @@ -684,8 +706,14 @@ parser.setIncludedSchemas(m_includedSchemas); parser.setImportedSchemas(m_importedSchemas); parser.setRedefinedSchemas(m_redefinedSchemas); - if (!parser.parse(XsdSchemaParser::ImportParser)) + if (!parser.parse(XsdSchemaParser::ImportParser)) { return; + } else { + // add indirectly loaded schemas to the list of already loaded ones + addIncludedSchemas(parser.m_includedSchemas); + addImportedSchemas(parser.m_importedSchemas); + addRedefinedSchemas(parser.m_redefinedSchemas); + } } } } else { @@ -702,8 +730,14 @@ parser.setIncludedSchemas(m_includedSchemas); parser.setImportedSchemas(m_importedSchemas); parser.setRedefinedSchemas(m_redefinedSchemas); - if (!parser.parse(XsdSchemaParser::ImportParser)) + if (!parser.parse(XsdSchemaParser::ImportParser)) { return; + } else { + // add indirectly loaded schemas to the list of already loaded ones + addIncludedSchemas(parser.m_includedSchemas); + addImportedSchemas(parser.m_importedSchemas); + addRedefinedSchemas(parser.m_redefinedSchemas); + } } } } else { @@ -839,8 +873,14 @@ parser.setIncludedSchemas(m_includedSchemas); parser.setImportedSchemas(m_importedSchemas); parser.setRedefinedSchemas(m_redefinedSchemas); - if (!parser.parse(XsdSchemaParser::RedefineParser)) + if (!parser.parse(XsdSchemaParser::RedefineParser)) { return; + } else { + // add indirectly loaded schemas to the list of already loaded ones + addIncludedSchemas(parser.m_includedSchemas); + addImportedSchemas(parser.m_importedSchemas); + addRedefinedSchemas(parser.m_redefinedSchemas); + } delete reply; } diff -r 2f34d5167611 -r fcece45ef507 src/xmlpatterns/schema/qxsdschemaparser_p.h --- a/src/xmlpatterns/schema/qxsdschemaparser_p.h Fri Apr 16 15:50:13 2010 +0300 +++ b/src/xmlpatterns/schema/qxsdschemaparser_p.h Mon May 03 13:17:34 2010 +0300 @@ -120,20 +120,38 @@ typedef QSet NamespaceSet; /** + * Adds @p schemas to the list of already included schemas, so the parser + * can detect multiple includes of the same schema. + */ + void addIncludedSchemas(const NamespaceSet &schemas); + + /** * Sets which @p schemas have been included already, so the parser - * can detect circular includes. + * can detect multiple includes of the same schema. */ void setIncludedSchemas(const NamespaceSet &schemas); /** + * Adds @p schemas to the list of already imported schemas, so the parser + * can detect multiple imports of the same schema. + */ + void addImportedSchemas(const NamespaceSet &schemas); + + /** * Sets which @p schemas have been imported already, so the parser * can detect circular imports. */ void setImportedSchemas(const NamespaceSet &schemas); /** + * Adds @p schemas to the list of already redefined schemas, so the parser + * can detect multiple redefines of the same schema. + */ + void addRedefinedSchemas(const NamespaceSet &schemas); + + /** * Sets which @p schemas have been redefined already, so the parser - * can detect circular redefines. + * can detect multiple redefines of the same schema. */ void setRedefinedSchemas(const NamespaceSet &schemas); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/auto.pro --- a/tests/auto/auto.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/auto.pro Mon May 03 13:17:34 2010 +0300 @@ -1,599 +1,22 @@ -QT = core TEMPLATE = subdirs -# These tests use host tools and therefore can't work for cross-compiled Qt. -!cross_compile:SUBDIRS += \ - headers \ - bic \ - compiler \ - compilerwarnings \ - linguist \ - maketestselftest \ - moc \ - uic \ - guiapplauncher \ - #atwrapper \ # These tests need significant updating, - #uiloader \ # they have hardcoded machine names etc. - -Q3SUBDIRS += \ - q3accel \ - q3action \ - q3actiongroup \ - q3buttongroup \ - q3canvas \ - q3checklistitem \ - q3cstring \ - q3databrowser \ - q3dateedit \ - q3datetimeedit \ - q3deepcopy \ - q3dict \ - q3dns \ - q3dockwindow \ - q3filedialog \ - q3groupbox \ - q3hbox \ - q3header \ - q3iconview \ - q3listbox \ - q3listview \ - q3listviewitemiterator \ - q3mainwindow \ - q3popupmenu \ - q3process \ - q3progressbar \ - q3progressdialog \ - q3ptrlist \ - q3richtext \ - q3scrollview \ - q3semaphore \ - q3serversocket \ - q3socket \ - q3socketdevice \ - q3sqlcursor \ - q3sqlselectcursor \ - q3stylesheet \ - q3tabdialog \ - q3table \ - q3textbrowser \ - q3textedit \ - q3textstream \ - q3timeedit \ - q3toolbar \ - q3urloperator \ - q3valuelist \ - q3valuevector \ - q3combobox \ - q3frame \ - q3uridrag \ - q3widgetstack - -!cross_compile:Q3SUBDIRS += \ - uic3 - SUBDIRS += \ -# exceptionsafety_objects \ shouldn't enable it - languagechange \ - collections \ - exceptionsafety \ - mediaobject \ -# mediaobject_wince_ds9 \ This is Windows CE only (we test the second phonon backend ds9 here) - modeltest \ - networkselftest \ - qabstractbutton \ - qabstractitemmodel \ - qabstractitemview \ - qabstractprintdialog \ - qabstractscrollarea \ - qabstractslider \ - qabstractsocket \ - qabstractspinbox \ - qabstracttextdocumentlayout \ - qabstractvideobuffer \ - qabstractvideosurface \ - qaccessibility \ - qaction \ - qactiongroup \ - qalgorithms \ - qanimationgroup \ - qapplication \ - qatomicint \ - qatomicpointer \ - qbitarray \ - qboxlayout \ - qbrush \ - qbuffer \ - qbuttongroup \ - qbytearray \ - qcache \ - qchar \ - qcheckbox \ - qclipboard \ - qcolor \ - qcolordialog \ - qcombobox \ - qcompleter \ - qcomplextext \ - qcoreapplication \ - qcryptographichash \ - qcssparser \ - qdatastream \ - qdatawidgetmapper \ - qdate \ - qdatetime \ - qdatetimeedit \ - qdebug \ - qdesktopservices \ - qdesktopwidget \ - qdial \ - qdialog \ - qdialogbuttonbox \ - qdir \ - qdirmodel \ - qdockwidget \ - qdom \ - qdoublespinbox \ - qdoublevalidator \ - qdrag \ - qerrormessage \ - qevent \ - qeventloop \ - qexplicitlyshareddatapointer \ - qfile \ - qfiledialog \ - qfiledialog2 \ - qfileinfo \ - qfilesystemwatcher \ - qfilesystemmodel \ - qflags \ - qfocusevent \ - qfocusframe \ - qfont \ - qfontcombobox \ - qfontdatabase \ - qfontdialog \ - qfontmetrics \ - qftp \ - qgetputenv \ - qglobal \ - qgraphicseffect \ - qgraphicseffectsource \ - qgraphicsgridlayout \ - qgraphicsitem \ - qgraphicsitemanimation \ - qgraphicsanchorlayout \ - qgraphicsanchorlayout1 \ - qgraphicslayout \ - qgraphicslayoutitem \ - qgraphicslinearlayout \ - qgraphicsobject \ - qgraphicspixmapitem \ - qgraphicspolygonitem \ - qgraphicsproxywidget \ - qgraphicsscene \ - qgraphicssceneindex \ - qgraphicstransform \ - qgraphicsview \ - qgraphicswidget \ - qgridlayout \ - qgroupbox \ - qguivariant \ - qhash \ - qheaderview \ - qhelpcontentmodel \ - qhelpenginecore \ - qhelpgenerator \ - qhelpindexmodel \ - qhelpprojectdata \ - qhostaddress \ - qhostinfo \ - qhttp \ - qhttpnetworkreply \ - qhttpnetworkconnection \ - qicon \ - qicoimageformat \ - qimage \ - qimageiohandler \ - qimagereader \ - qimagewriter \ - qinputdialog \ - qintvalidator \ - qiodevice \ - qitemdelegate \ - qitemeditorfactory \ - qitemmodel \ - qitemselectionmodel \ - qitemview \ - qkeysequence \ - qlabel \ - qlayout \ - qlcdnumber \ - qlibrary \ - qline \ - qlineedit \ - qlist \ - qlistview \ - qlistwidget \ - qlocale \ - qmainwindow \ - qmake \ - qmap \ - qmath \ - qmatrixnxn \ - qmdiarea \ - qmdisubwindow \ - qmenu \ - qmenubar \ - qmessagebox \ - qmetaobject \ - qmetatype \ - qmouseevent \ - qmouseevent_modal \ - qmovie \ - qmutex \ - qmutexlocker \ - qnativesocketengine \ - qnetworkcookie \ - qnetworkcookiejar \ - qnetworkinterface \ - qnetworkproxy \ - qnetworkrequest \ - qnetworkreply \ - qnetworkaccessmanager_and_qprogressdialog \ - qnumeric \ - qobject \ - qobjectrace \ - qcontiguouscache \ - qpaintengine \ - qpainter \ - qpainterpath \ - qpalette \ - qparallelanimationgroup \ - qpauseanimation \ - qpathclipper \ - qpen \ - qpicture \ - qpixmap \ - qpixmapcache \ - qpixmapfilter \ - qplaintextedit \ - qpoint \ - qpointer \ - qpolygon \ - qprinter \ - qprinterinfo \ - qprocess \ - qprocessenvironment \ - qprogressbar \ - qprogressdialog \ - qpropertyanimation \ - qpushbutton \ - qquaternion \ - qqueue \ - qradiobutton \ - qreadlocker \ - qreadwritelock \ - qrect \ - qregexp \ - qregexpvalidator \ - qregion \ - qresourceengine \ - qringbuffer \ - qscopedpointer \ - qscrollarea \ - qsemaphore \ - qsharedpointer \ - qsharedpointer_and_qwidget \ - qsequentialanimationgroup \ - qset \ - qsettings \ - qshortcut \ - qsignalmapper \ - qsignalspy \ - qsize \ - qsizef \ - qslider \ - qsocketnotifier \ - qsocks5socketengine \ - qsortfilterproxymodel \ - qsound \ - qaudiodeviceinfo \ - qaudioformat \ - qaudiooutput \ - qaudioinput \ - qspinbox \ - qsplitter \ - qsql \ - qsqldatabase \ - qsqlerror \ - qsqlfield \ - qsqlquery \ - qsqlquerymodel \ - qsqlrecord \ - qsqlrelationaltablemodel \ - qsqltablemodel \ - qsqlthread \ - qsslcertificate \ - qsslcipher \ - qsslerror \ - qsslkey \ - qsslsocket \ - qstackedlayout \ - qstackedwidget \ - qstandarditem \ - qstandarditemmodel \ - qstate \ - qstatemachine \ - qstatusbar \ - qstl \ - qstring \ - qstringbuilder1 \ - qstringbuilder2 \ - qstringbuilder3 \ - qstringbuilder4 \ - qstringmatcher \ - qstringlist \ - qstringlistmodel \ - qstyle \ - qstyleoption \ - qstylesheetstyle \ - qsvgdevice \ - qsvggenerator \ - qsvgrenderer \ - qsyntaxhighlighter \ - qsystemtrayicon \ - qtabbar \ - qtableview \ - qtablewidget \ - qtabwidget \ - qtcpserver \ - qtcpsocket \ - qtemporaryfile \ - qtessellator \ - qtextblock \ - qtextboundaryfinder \ - qtextbrowser \ - #qtextcodec \ - qtextcursor \ - qtextdocument \ - qtextdocumentfragment \ - qtextdocumentlayout \ - qtextedit \ - qtextformat \ - qtextlayout \ - qtextlist \ - qtextobject \ - qtextscriptengine \ - qtextstream \ - qtexttable \ - qthread \ - qthreadonce \ - qthreadstorage \ - qtime \ - qtimeline \ - qtimer \ - qtmd5 \ - qtoolbar \ - qtoolbox \ - qtoolbutton \ - qtooltip \ - qtranslator \ - qtransform \ - qtransformedscreen \ - qtreeview \ - qtreewidget \ - qtreewidgetitemiterator \ - qtwidgets \ - qudpsocket \ - qundogroup \ - qundostack \ - qurl \ - quuid \ - qvariant \ - qvarlengtharray \ - qvector \ - qvideoframe \ - qvideosurfaceformat \ - qvectornd \ - qwaitcondition \ - qwidget \ - qwidgetaction \ - qwindowsurface \ - qwineventnotifier \ - qwizard \ - qwmatrix \ - qworkspace \ - qwritelocker \ - qwsembedwidget \ - qwsinputmethod \ - qwswindowsystem \ - qx11info \ - qxml \ - qxmlinputsource \ - qxmlsimplereader \ - qxmlstream \ - selftests \ - symbols \ - qrand \ - utf8 \ - gestures \ - qabstractnetworkcache \ - qabstractproxymodel \ - qbytearraymatcher \ - qcalendarwidget \ - qcolumnview \ - qcommandlinkbutton \ - qdbuscontext \ - qdbusserver \ - qdbusservicewatcher \ - qdiriterator \ - qeasingcurve \ - qfileiconprovider \ - qformlayout \ - q_func_info \ - qfuture \ - qfuturewatcher \ - qguard \ - qhttpsocketengine \ - qinputcontext \ - qlocalsocket \ - qmacstyle \ - qmargins \ - qnetworkaddressentry \ - qnetworkcachemetadata \ - qnetworkdiskcache \ - qobjectperformance \ - qpainterpathstroker \ - qplugin \ - qpluginloader \ - qscrollbar \ - qsidebar \ - qsizegrip \ - qsqldriver \ - qtconcurrentfilter \ - qtconcurrentiteratekernel \ - qtconcurrentmap \ - qtconcurrentrun \ - qtconcurrentthreadengine \ - qthreadpool \ - qtipc \ - qtokenautomaton \ - qtouchevent \ - qwidget_window \ - rcc \ - windowsmobile + corelib.pro \ + gui.pro \ + network.pro \ + sql.pro \ + xml.pro \ + other.pro -contains(QT_CONFIG,opengl):SUBDIRS += qgl - -contains(QT_CONFIG,qt3support):!wince*:SUBDIRS += $$Q3SUBDIRS - -contains(QT_CONFIG, OdfWriter):SUBDIRS += qzip qtextodfwriter -mac: { - SUBDIRS += macgui \ - macplist \ - qaccessibility_mac -} - -embedded:!wince* { - SUBDIRS += qcopchannel \ - qdirectpainter \ - qmultiscreen -} -!win32: { - SUBDIRS += qtextpiecetable -} - -symbian { - SUBDIRS += qsoftkeymanager \ - qs60mainapplication -} - -# Enable the tests specific to QtXmlPatterns. If you add a test, remember to -# update runQtXmlPatternsTests.sh too. Remember that this file, auto.pro, is -# not respected by some test system, they just have a script which loop over -# the folders. -contains(QT_CONFIG, xmlpatterns) { -SUBDIRS += checkxmlfiles \ - patternistexamplefiletree \ - patternistexamples \ - patternistheaders \ - qabstractmessagehandler \ - qabstracturiresolver \ - qabstractxmlforwarditerator \ - qabstractxmlnodemodel \ - qabstractxmlreceiver \ - qapplicationargumentparser \ - qautoptr \ - qsimplexmlnodemodel \ - qsourcelocation \ - qxmlformatter \ - qxmlitem \ - qxmlname \ - qxmlnamepool \ - qxmlnodemodelindex \ - qxmlquery \ - qxmlresultitems \ - qxmlschema \ - qxmlschemavalidator \ - qxmlserializer \ - xmlpatterns \ - xmlpatternsdiagnosticsts \ - xmlpatternsschema \ - xmlpatternsschemats \ - xmlpatternssdk \ - xmlpatternsvalidator \ - xmlpatternsview \ - xmlpatternsxqts \ - xmlpatternsxslts - -xmlpatternsdiagnosticsts.depends = xmlpatternssdk -xmlpatternsview.depends = xmlpatternssdk -xmlpatternsxslts.depends = xmlpatternssdk -xmlpatternsschemats.depends = xmlpatternssdk -} - -unix:!embedded:contains(QT_CONFIG, dbus):SUBDIRS += \ - qdbusabstractadaptor \ - qdbusabstractinterface \ - qdbusconnection \ - qdbusinterface \ - qdbuslocalcalls \ - qdbusmarshall \ - qdbusmetaobject \ - qdbusmetatype \ - qdbuspendingcall \ - qdbuspendingreply \ - qdbusperformance \ - qdbusreply \ - qdbusthreading \ - qdbusxmlparser - -contains(QT_CONFIG, script): SUBDIRS += \ - qscriptable \ - qscriptclass \ - qscriptcontext \ - qscriptcontextinfo \ - qscriptengine \ - qscriptengineagent \ - qscriptextqobject \ - qscriptjstestsuite \ - qscriptv8testsuite \ - qscriptstring \ - qscriptvalue \ - qscriptvalueiterator \ - qscriptenginedebugger - -contains(QT_CONFIG, webkit): SUBDIRS += \ - qwebframe \ - qwebpage \ - qwebhistoryinterface \ - qwebelement \ - qwebhistory - -contains(QT_CONFIG, declarative): SUBDIRS += declarative - -# Following tests depends on private API -!contains(QT_CONFIG, private_tests): SUBDIRS -= \ - qcssparser \ - qgraphicssceneindex \ - qhttpnetworkconnection \ - qhttpnetworkreply \ - qnativesocketengine \ - qnetworkreply \ - qpathclipper \ - qsocketnotifier \ - qsocks5socketengine \ - qstylesheetstyle \ - qtextpiecetable \ - xmlpatternsdiagnosticsts \ - xmlpatternsview \ - xmlpatternsxqts \ - xmlpatternsxslts +!cross_compile: SUBDIRS += host.pro +contains(QT_CONFIG, qt3support):!wince*: SUBDIRS += qt3support.pro +contains(QT_CONFIG, opengl): SUBDIRS += opengl.pro +contains(QT_CONFIG, xmlpatterns): SUBDIRS += xmlpatterns.pro +unix:!embedded:contains(QT_CONFIG, dbus): SUBDIRS += dbus.pro +contains(QT_CONFIG, script): SUBDIRS += script.pro +contains(QT_CONFIG, webkit): SUBDIRS += webkit.pro +contains(QT_CONFIG, multimedia): SUBDIRS += multimedia.pro +contains(QT_CONFIG, phonon): SUBDIRS += phonon.pro +contains(QT_CONFIG, svg): SUBDIRS += svg.pro -############### make check recursively for testcases ################## -check.CONFIG = recursive -check.recurse = $$SUBDIRS -check.recurse_target = check -QMAKE_EXTRA_TARGETS += check -########################################################### diff -r 2f34d5167611 -r fcece45ef507 tests/auto/corelib.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/corelib.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,102 @@ +# The tests in this .pro file _MUST_ use QtCore only (i.e. QT=core). +# The test system is allowed to run these tests before the test of Qt has +# been compiled. + +TEMPLATE=subdirs +SUBDIRS=\ + collections \ + exceptionsafety \ + q_func_info \ + qanimationgroup \ + qatomicint \ + qatomicpointer \ + qbitarray \ + qbuffer \ + qbytearray \ + qbytearraymatcher \ + qcache \ + qchar \ + qcontiguouscache \ + qcoreapplication \ + qcryptographichash \ + qdate \ + qdatetime \ + qdebug \ + qdiriterator \ + qeasingcurve \ + qevent \ + qexplicitlyshareddatapointer \ + qfileinfo \ + qfilesystemwatcher \ + qflags \ + qfuture \ + qfuturewatcher \ + qgetputenv \ + qglobal \ + qhash \ + qlibrary \ + qline \ + qmap \ + qmargins \ + qmath \ + qmetatype \ + qmutex \ + qmutexlocker \ + qnumeric \ + qobject \ + qobjectrace \ + qplugin \ + qpluginloader \ + qpoint \ + qprocessenvironment \ + qqueue \ + qrand \ + qreadlocker \ + qreadwritelock \ + qrect \ + qregexp \ + qresourceengine \ + qringbuffer \ + qscopedpointer \ + qsemaphore \ + qsequentialanimationgroup \ + qset \ + qsharedpointer \ + qsignalspy \ + qsize \ + qsizef \ + qstate \ + qstl \ + qstring \ + qstringbuilder1 \ + qstringbuilder2 \ + qstringbuilder3 \ + qstringbuilder4 \ + qstringlist \ + qstringmatcher \ + qtconcurrentfilter \ + qtconcurrentiteratekernel \ + qtconcurrentmap \ + qtconcurrentrun \ + qtconcurrentthreadengine \ + qtemporaryfile \ + qtextboundaryfinder \ + qthread \ + qthreadonce \ + qthreadpool \ + qthreadstorage \ + qtime \ + qtimeline \ + qtimer \ + qtmd5 \ + qtokenautomaton \ + qurl \ + quuid \ + qvarlengtharray \ + qvector \ + qwaitcondition \ + qwineventnotifier \ + qwritelocker \ + selftests \ + utf8 \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/dbus.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/dbus.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,20 @@ +TEMPLATE=subdirs +SUBDIRS=\ + qdbusabstractadaptor \ + qdbusabstractinterface \ + qdbusconnection \ + qdbuscontext \ + qdbusinterface \ + qdbuslocalcalls \ + qdbusmarshall \ + qdbusmetaobject \ + qdbusmetatype \ + qdbuspendingcall \ + qdbuspendingreply \ + qdbusperformance \ + qdbusreply \ + qdbusserver \ + qdbusservicewatcher \ + qdbusthreading \ + qdbusxmlparser \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/gui.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/gui.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,222 @@ +# The tests in this .pro file _MUST_ use QtCore, QtNetwork and QtGui only +# (i.e. QT=core gui network). +# The test system is allowed to run these tests before the rest of Qt has +# been compiled. +# +TEMPLATE=subdirs +SUBDIRS=\ + gestures \ + languagechange \ + modeltest \ + qabstractbutton \ + qabstractitemmodel \ + qabstractitemview \ + qabstractprintdialog \ + qabstractproxymodel \ + qabstractscrollarea \ + qabstractslider \ + qabstractspinbox \ + qabstracttextdocumentlayout \ + qaction \ + qactiongroup \ + qapplication \ + qboxlayout \ + qbrush \ + qbuttongroup \ + qcalendarwidget \ + qcheckbox \ + qclipboard \ + qcolor \ + qcolordialog \ + qcolumnview \ + qcommandlinkbutton \ + qcompleter \ + qcomplextext \ + qdatawidgetmapper \ + qdatetimeedit \ + qdesktopservices \ + qdesktopwidget \ + qdial \ + qdialog \ + qdialogbuttonbox \ + qdirmodel \ + qdockwidget \ + qdoublespinbox \ + qdoublevalidator \ + qdrag \ + qerrormessage \ + qfile \ + qfiledialog \ + qfiledialog2 \ + qfileiconprovider \ + qfilesystemmodel \ + qfocusframe \ + qfont \ + qfontcombobox \ + qfontdatabase \ + qfontdialog \ + qfontmetrics \ + qformlayout \ + qgraphicsanchorlayout \ + qgraphicsanchorlayout1 \ + qgraphicseffect \ + qgraphicseffectsource \ + qgraphicsgridlayout \ + qgraphicsitem \ + qgraphicsitemanimation \ + qgraphicslayout \ + qgraphicslayoutitem \ + qgraphicslinearlayout \ + qgraphicsobject \ + qgraphicspixmapitem \ + qgraphicspolygonitem \ + qgraphicsproxywidget \ + qgraphicsscene \ + qgraphicssceneindex \ + qgraphicstransform \ + qgraphicsview \ + qgraphicswidget \ + qgridlayout \ + qgroupbox \ + qguard \ + qguivariant \ + qheaderview \ + qhelpcontentmodel \ + qhelpenginecore \ + qhelpgenerator \ + qhelpindexmodel \ + qhelpprojectdata \ + qicoimageformat \ + qicon \ + qimageiohandler \ + qimagereader \ + qimagewriter \ + qinputcontext \ + qinputdialog \ + qintvalidator \ + qitemdelegate \ + qitemeditorfactory \ + qitemselectionmodel \ + qitemview \ + qkeysequence \ + qlabel \ + qlcdnumber \ + qlineedit \ + qlist \ + qlistview \ + qlistwidget \ + qlocale \ + qlocalsocket \ + qmacstyle \ + qmainwindow \ + qmatrixnxn \ + qmdisubwindow \ + qmessagebox \ + qmetaobject \ + qmouseevent_modal \ + qmovie \ + qnetworkaccessmanager_and_qprogressdialog \ + qnetworkcachemetadata \ + qnetworkdiskcache \ + qnetworkreply \ + qpaintengine \ + qpainterpath \ + qpainterpathstroker \ + qpalette \ + qparallelanimationgroup \ + qpathclipper \ + qpauseanimation \ + qpen \ + qpicture \ + qpixmapcache \ + qpixmapfilter \ + qplaintextedit \ + qpointer \ + qpolygon \ + qprinterinfo \ + qprocess \ + qprogressbar \ + qprogressdialog \ + qpropertyanimation \ + qpushbutton \ + qquaternion \ + qradiobutton \ + qregexpvalidator \ + qregion \ + qscrollarea \ + qscrollbar \ + qsharedpointer_and_qwidget \ + qshortcut \ + qsidebar \ + qsignalmapper \ + qsizegrip \ + qslider \ + qsortfilterproxymodel \ + qsound \ + qspinbox \ + qstackedlayout \ + qstackedwidget \ + qstandarditem \ + qstandarditemmodel \ + qstatemachine \ + qstatusbar \ + qstringlistmodel \ + qstyle \ + qstyleoption \ + qstylesheetstyle \ + qsyntaxhighlighter \ + qsystemtrayicon \ + qtabbar \ + qtableview \ + qtablewidget \ + qtcpserver \ + qtcpsocket \ + qtessellator \ + qtextblock \ + qtextcodec \ + qtextcursor \ + qtextdocumentfragment \ + qtextdocumentlayout \ + qtextformat \ + qtextlayout \ + qtextlist \ + qtextobject \ + qtextpiecetable \ + qtextscriptengine \ + qtextstream \ + qtexttable \ + qtipc \ + qtoolbar \ + qtoolbox \ + qtooltip \ + qtouchevent \ + qtransform \ + qtransformedscreen \ + qtranslator \ + qtreeview \ + qtreewidget \ + qtreewidgetitemiterator \ + qtwidgets \ + qudpsocket \ + qundogroup \ + qundostack \ + qvectornd \ + qwidget_window \ + qwidgetaction \ + qwindowsurface \ + qwizard \ + qwmatrix \ + qwsembedwidget \ + qwsinputmethod \ + qwswindowsystem \ + qx11info \ + +win32:SUBDIRS -= qtextpiecetable + +!contains(QT_CONFIG, private_tests): SUBDIRS -= \ + qgraphicssceneindex \ + qnetworkreply \ + qpathclipper \ + qstylesheetstyle \ + qtextpiecetable \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/host.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/host.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,19 @@ +TEMPLATE=subdirs +SUBDIRS=\ + headers \ + bic \ + compiler \ + compilerwarnings \ + linguist \ + maketestselftest \ + moc \ + uic \ + guiapplauncher \ + qmake \ + rcc \ + symbols \ + #atwrapper \ # These tests need significant updating, + #uiloader \ # they have hardcoded machine names etc. + +contains(QT_CONFIG,qt3support):SUBDIRS+=uic3 + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/linguist/lupdate/testdata/good/namespaces/main.cpp --- a/tests/auto/linguist/lupdate/testdata/good/namespaces/main.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/linguist/lupdate/testdata/good/namespaces/main.cpp Mon May 03 13:17:34 2010 +0300 @@ -135,4 +135,64 @@ } }; +// QTBUG-8360 +namespace A { + +void foo() +{ + using namespace A; +} + +void goo() +{ + return QObject::tr("Bla"); +} + +} + + +namespace AA { +namespace B { + +using namespace AA; + +namespace C { + +class Test : public QObject { + Q_OBJECT +}; + +} + +} + +using namespace B; +using namespace C; + +void goo() +{ + AA::Test::tr("howdy?"); +} + +} + + +namespace A1 { +namespace B { + +class Test : public QObject { + Q_OBJECT +}; + +using namespace A1; + +void foo() +{ + B::B::B::Test::tr("yeeee-ha!"); +} + +} +} + + #include "main.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/linguist/lupdate/testdata/good/namespaces/project.ts.result --- a/tests/auto/linguist/lupdate/testdata/good/namespaces/project.ts.result Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/linguist/lupdate/testdata/good/namespaces/project.ts.result Mon May 03 13:17:34 2010 +0300 @@ -2,6 +2,22 @@ + A1::B::Test + + + yeeee-ha! + + + + + AA::B::C::Test + + + howdy? + + + + Class @@ -79,4 +95,12 @@ + + QObject + + + Bla + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/maketestselftest/tst_maketestselftest.cpp --- a/tests/auto/maketestselftest/tst_maketestselftest.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/maketestselftest/tst_maketestselftest.cpp Mon May 03 13:17:34 2010 +0300 @@ -50,23 +50,27 @@ Q_OBJECT private slots: - void auto_dot_pro(); - void auto_dot_pro_data(); + void tests_pro_files(); + void tests_pro_files_data(); }; -/* Verify that all tests are listed somewhere in auto.pro */ -void tst_MakeTestSelfTest::auto_dot_pro() +/* Verify that all tests are listed somewhere in one of the autotest .pro files */ +void tst_MakeTestSelfTest::tests_pro_files() { static QStringList lines; if (lines.isEmpty()) { - QString filename = QString::fromLatin1(SRCDIR "/../auto.pro"); - QFile file(filename); - if (!file.open(QIODevice::ReadOnly)) { - QFAIL(qPrintable(QString("open %1: %2").arg(filename).arg(file.errorString()))); - } - while (!file.atEnd()) { - lines << file.readLine().trimmed(); + QDir dir(SRCDIR "/.."); + QStringList proFiles = dir.entryList(QStringList() << "*.pro"); + foreach (QString const& proFile, proFiles) { + QString filename = QString("%1/../%2").arg(SRCDIR).arg(proFile); + QFile file(filename); + if (!file.open(QIODevice::ReadOnly)) { + QFAIL(qPrintable(QString("open %1: %2").arg(filename).arg(file.errorString()))); + } + while (!file.atEnd()) { + lines << file.readLine().trimmed(); + } } } @@ -79,13 +83,14 @@ } QFAIL(qPrintable(QString( - "Subdir `%1' is missing from tests/auto/auto.pro\n" + "Subdir `%1' is missing from tests/auto/*.pro\n" "This means the test won't be compiled or run on any platform.\n" - "If this is intentional, please put the test name in a comment in auto.pro.").arg(subdir)) + "If this is intentional, please put the test name in a comment in one of the .pro files.").arg(subdir)) ); + } -void tst_MakeTestSelfTest::auto_dot_pro_data() +void tst_MakeTestSelfTest::tests_pro_files_data() { QTest::addColumn("subdir"); QDir dir(SRCDIR "/.."); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/mediaobject/media/test.sdp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/mediaobject/media/test.sdp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,32 @@ +v=0 +o=- 3476526279 2351211129 IN IP4 XXX.XXX.XXX.XXX +s=SOME STRING +e=support@localhost +c=IN IP4 XXX.XXX.XXX.XXX +t=0 0 +a=range:npt=now- +a=random_access_denied +a=control:rtsp://link +m=video 0 RTP/AVP 96 +b=AS:100 +b=RR:2500 +b=RS:2500 +a=control:rtsp://link +a=rtpmap:96 MP4V-ES/90000 +a=3GPP-Adaptation-Support:1 +a=cliprect:0,0,144,176 +a=mpeg4-esid:201 +a=x-envivio-verid:00022B15 +a=fmtp:96 profile-level-id=2;config=000001b002000001b50ea020202f000001000000012000c788ba9850584121463f +a=framerate:15.0 +m=audio 0 RTP/AVP 97 +b=AS:14 +b=RR:350 +b=RS:350 +a=control:rtsp://link +a=rtpmap:97 AMR/8000 +a=3GPP-Adaptation-Support:1 +a=mpeg4-esid:101 +a=x-envivio-verid:00022B15 +a=fmtp:97 octet-align=1 +a=maxptime:200 diff -r 2f34d5167611 -r fcece45ef507 tests/auto/mediaobject/mediaobject.pro --- a/tests/auto/mediaobject/mediaobject.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/mediaobject/mediaobject.pro Mon May 03 13:17:34 2010 +0300 @@ -14,3 +14,9 @@ DEFINES += tst_MediaObject=tst_MediaObject_waveout } +symbian*:{ + addFiles.sources = media/test.sdp + addFiles.path = media + DEPLOYMENT += addFiles +} + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/mediaobject/mediaobject.qrc --- a/tests/auto/mediaobject/mediaobject.qrc Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/mediaobject/mediaobject.qrc Mon May 03 13:17:34 2010 +0300 @@ -3,5 +3,6 @@ media/sax.wav media/sax.ogg media/sax.mp3 +media/test.sdp diff -r 2f34d5167611 -r fcece45ef507 tests/auto/mediaobject/tst_mediaobject.cpp --- a/tests/auto/mediaobject/tst_mediaobject.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/mediaobject/tst_mediaobject.cpp Mon May 03 13:17:34 2010 +0300 @@ -139,6 +139,7 @@ void pauseToPause(); void pauseToPlay(); void pauseToStop(); + void playSDP(); void testPrefinishMark(); void testSeek(); @@ -160,6 +161,11 @@ Phonon::MediaObject *m_media; QSignalSpy *m_stateChangedSignalSpy; QString m_tmpFileName; + + static void copyMediaFile(const QString &original, + const QString &name, + QString &resultFilePath, + QUrl *const asURL = 0); #endif //QT_NO_PHONON bool m_success; }; @@ -352,6 +358,24 @@ m_success = true; } +/*! + Copies the file \a name to the testing area. The resulting file name path is + returned in resultFilePath, and also set as a URL in \a asURL. + */ +void tst_MediaObject::copyMediaFile(const QString &original, + const QString &name, + QString &resultFilePath, + QUrl *const asURL) +{ + resultFilePath = QDir::toNativeSeparators(QDir::tempPath() + name); + if (asURL) + *asURL = QUrl::fromLocalFile(resultFilePath); + + QFile::remove(resultFilePath); + QVERIFY(QFile::copy(original, resultFilePath)); + QFile::setPermissions(resultFilePath, QFile::permissions(resultFilePath) | QFile::WriteOther); +} + void tst_MediaObject::initTestCase() { QCoreApplication::setApplicationName("tst_MediaObject"); @@ -375,14 +399,8 @@ QVERIFY(m_stateChangedSignalSpy->isValid()); m_stateChangedSignalSpy->clear(); - if (m_url.isEmpty()) { - m_tmpFileName = QDir::toNativeSeparators(QDir::tempPath() + MEDIA_FILE); - QFile::remove(m_tmpFileName); - QVERIFY(QFile::copy(MEDIA_FILEPATH, m_tmpFileName)); - QFile::Permissions p = QFile::permissions(m_tmpFileName); - QFile::setPermissions(m_tmpFileName, p | QFile::WriteOther); - m_url = QUrl::fromLocalFile(m_tmpFileName); - } + if (m_url.isEmpty()) + copyMediaFile(MEDIA_FILEPATH, MEDIA_FILE, m_tmpFileName, &m_url); qDebug() << "Using url:" << m_url.toString(); @@ -533,6 +551,47 @@ stopPlayback(Phonon::PausedState); } +/*! + + We attempt to play a SDP file. An SDP file essentially describes different + media streams and is hence a layer in front of the actual media(s). + Sometimes the backend handles the SDP file, in other cases not. + + Some Phonon backends doesn't support SDP at all, ifdef appropriately. Real + Player and Helix, the two backends for Symbian, are known to support SDP. + */ +void tst_MediaObject::playSDP() +{ +#ifdef Q_OS_SYMBIAN + QString sdpFile; + copyMediaFile(QLatin1String(":/media/test.sdp"), QLatin1String("test.sdp"), sdpFile); + + // Let's verify our test setup. + QVERIFY(QFileInfo(sdpFile).isReadable()); + + // We need a window in order to setup the video. + QWidget widget; + widget.show(); + + const MediaSource oldSource(m_media->currentSource()); + const MediaSource sdpSource(sdpFile); + m_media->setCurrentSource(sdpSource); + if (m_media->state() != Phonon::StoppedState) + QTest::waitForSignal(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), 10000); + + // At this point we're in error state due to absent media, but it has now loaded the SDP: + QCOMPARE(m_media->errorString(), QString::fromLatin1("Buffering clip failed: Unknown error (-39)")); + + // We cannot play the SDP, we can neither attempt to play it, because we + // won't get a state change from ErrorState to ErrorState, and hence block + // on a never occuring signal. + m_media->setCurrentSource(oldSource); + +#else + QSKIP("Unsupported on this platform.", SkipAll); +#endif +} + void tst_MediaObject::testPrefinishMark() { const qint32 requestedPrefinishMarkTime = 2000; diff -r 2f34d5167611 -r fcece45ef507 tests/auto/moc/tst_moc.cpp --- a/tests/auto/moc/tst_moc.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/moc/tst_moc.cpp Mon May 03 13:17:34 2010 +0300 @@ -484,6 +484,7 @@ void singleFunctionKeywordSignalAndSlot(); void templateGtGt(); void qprivateslots(); + void qprivateproperties(); void inlineSlotsWithThrowDeclaration(); void warnOnPropertyWithoutREAD(); void constructors(); @@ -1071,6 +1072,56 @@ QVERIFY(mobj->indexOfMethod("method1()") != -1); //tast204730 } +class PrivatePropertyTest : public QObject +{ + Q_OBJECT + Q_PROPERTY(int foo READ foo WRITE setFoo); + Q_PRIVATE_PROPERTY(d, int bar READ bar WRITE setBar); + Q_PRIVATE_PROPERTY(PrivatePropertyTest::d, int plop READ plop WRITE setPlop); + Q_PRIVATE_PROPERTY(PrivatePropertyTest::d_func(), int baz READ baz WRITE setBaz); + class MyDPointer { + public: + MyDPointer() : mBar(0), mPlop(0) {} + int bar() { return mBar ; } + void setBar(int value) { mBar = value; } + int plop() { return mPlop ; } + void setPlop(int value) { mPlop = value; } + int baz() { return mBaz ; } + void setBaz(int value) { mBaz = value; } + private: + int mBar; + int mPlop; + int mBaz; + }; +public: + PrivatePropertyTest() : mFoo(0), d (new MyDPointer) {} + int foo() { return mFoo ; } + void setFoo(int value) { mFoo = value; } + MyDPointer *d_func() {return d;} +private: + int mFoo; + MyDPointer *d; +}; + + +void tst_Moc::qprivateproperties() +{ + PrivatePropertyTest test; + + test.setProperty("foo", 1); + QCOMPARE(test.property("foo"), qVariantFromValue(1)); + + test.setProperty("bar", 2); + QCOMPARE(test.property("bar"), qVariantFromValue(2)); + + test.setProperty("plop", 3); + QCOMPARE(test.property("plop"), qVariantFromValue(3)); + + test.setProperty("baz", 4); + QCOMPARE(test.property("baz"), qVariantFromValue(4)); + +} + #include "task189996.h" void InlineSlotsWithThrowDeclaration::c() throw() {} diff -r 2f34d5167611 -r fcece45ef507 tests/auto/multimedia.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/multimedia.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,11 @@ +TEMPLATE=subdirs +SUBDIRS=\ + qabstractvideobuffer \ + qabstractvideosurface \ + qaudiodeviceinfo \ + qaudioformat \ + qaudioinput \ + qaudiooutput \ + qvideoframe \ + qvideosurfaceformat \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/network.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/network.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,40 @@ +# The tests in this .pro file _MUST_ use QtCore and QtNetwork only +# (i.e. QT=core network). +# The test system is allowed to run these tests before the rest of Qt has +# been compiled. +TEMPLATE=subdirs +SUBDIRS=\ + networkselftest \ + qabstractnetworkcache \ + qabstractsocket \ + qeventloop \ + qftp \ + qhostaddress \ + qhostinfo \ + qhttp \ + qhttpnetworkconnection \ + qhttpnetworkreply \ + qhttpsocketengine \ + qnativesocketengine \ + qnetworkaddressentry \ + qnetworkcookie \ + qnetworkcookiejar \ + qnetworkinterface \ + qnetworkproxy \ + qnetworkrequest \ + qobjectperformance \ + qsocketnotifier \ + qsocks5socketengine \ + qsslcertificate \ + qsslcipher \ + qsslerror \ + qsslkey \ + qsslsocket \ + +contains(QT_CONFIG, private_tests): SUBDIRS -= \ + qhttpnetworkconnection \ + qhttpnetworkreply \ + qnativesocketengine \ + qsocketnotifier \ + qsocks5socketengine \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/opengl.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/opengl.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,4 @@ +TEMPLATE=subdirs +SUBDIRS=\ + qgl \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/other.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/other.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,58 @@ +# These tests don't nicely fit into one of the other .pro files. +# They are testing too many Qt modules at the same time. + +TEMPLATE=subdirs +SUBDIRS=\ +# exceptionsafety_objects \ shouldn't enable it + qaccessibility \ + qalgorithms \ + qcombobox \ + qcssparser \ + qdatastream \ + qdir \ + qfocusevent \ + qimage \ + qiodevice \ + qitemmodel \ + qlayout \ + qmdiarea \ + qmenu \ + qmenubar \ + qmouseevent \ + qpainter \ + qpixmap \ + qprinter \ + qsettings \ + qsplitter \ + qtabwidget \ + qtextbrowser \ + qtextdocument \ + qtextedit \ + qtoolbutton \ + qvariant \ + qwidget \ + qworkspace \ + windowsmobile + +contains(QT_CONFIG, OdfWriter):SUBDIRS += qzip qtextodfwriter +mac: { + SUBDIRS += macgui \ + macplist \ + qaccessibility_mac +} + +embedded:!wince* { + SUBDIRS += qcopchannel \ + qdirectpainter \ + qmultiscreen +} + +symbian { + SUBDIRS += qsoftkeymanager \ + qs60mainapplication +} + +# Following tests depends on private API +!contains(QT_CONFIG, private_tests): SUBDIRS -= \ + qcssparser \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/phonon.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/phonon.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,5 @@ +TEMPLATE=subdirs +SUBDIRS=\ + mediaobject \ +# mediaobject_wince_ds9 \ This is Windows CE only (we test the second phonon backend ds9 here) + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp --- a/tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/q3sqlcursor/tst_q3sqlcursor.cpp Mon May 03 13:17:34 2010 +0300 @@ -44,10 +44,11 @@ #include #include #include - +#include #include "../qsqldatabase/tst_databases.h" +const QString qtest(qTableName( "qtest", __FILE__ )); //TESTED_FILES= @@ -121,7 +122,7 @@ { if ( dbs.fillTestTable(engine) == 0 ) { if(engine.isEmpty()) - QSKIP( "No database drivers are available in this Qt configuration", SkipAll ); + QSKIP( "No database drivers are available in this Qt configuration", SkipAll ); else QSKIP( (QString("No database drivers of type %1 are available in this Qt configuration").arg(engine)).toLocal8Bit(), SkipAll ); } @@ -130,7 +131,7 @@ void tst_Q3SqlCursor::createTestTables( QSqlDatabase db ) { if ( !db.isValid() ) - return; + return; QSqlQuery q( db ); if (tst_Databases::isSqlServer(db)) { @@ -142,51 +143,51 @@ // please never ever change this table; otherwise fix all tests ;) if ( tst_Databases::isMSAccess( db ) ) { - QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest" ) + " ( id int not null, t_varchar varchar(40) not null," - "t_char char(40), t_numeric number, primary key (id, t_varchar) )" )); + QVERIFY_SQL(q, exec( "create table " + qtest + " ( id int not null, t_varchar varchar(40) not null," + "t_char char(40), t_numeric number, primary key (id, t_varchar) )" )); } else { - QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest" ) + " ( id int not null, t_varchar varchar(40) not null," - "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar) )" )); + QVERIFY_SQL(q, exec( "create table " + qtest + " ( id int not null, t_varchar varchar(40) not null," + "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar) )" )); } if ( tst_Databases::isSqlServer( db ) ) { - //workaround for SQL SERVER since he can store unicode only in nvarchar fields - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_unicode") + " (id int not null, " - "t_varchar nvarchar(80) not null, t_char nchar(80) )" )); + //workaround for SQL SERVER since he can store unicode only in nvarchar fields + QVERIFY_SQL(q, exec("create table " + qTableName("qtest_unicode", __FILE__) + " (id int not null, " + "t_varchar nvarchar(80) not null, t_char nchar(80) )" )); } else { - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_unicode") + " (id int not null, " - "t_varchar varchar(100) not null," "t_char char(100))" )); + QVERIFY_SQL(q, exec("create table " + qTableName("qtest_unicode", __FILE__) + " (id int not null, " + "t_varchar varchar(100) not null," "t_char char(100))" )); } if (tst_Databases::isMSAccess(db)) { - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_precision") + " (col1 number)")); + QVERIFY_SQL(q, exec("create table " + qTableName("qtest_precision", __FILE__) + " (col1 number)")); } else { - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_precision") + " (col1 numeric(15, 14))")); + QVERIFY_SQL(q, exec("create table " + qTableName("qtest_precision", __FILE__) + " (col1 numeric(15, 14))")); } } void tst_Q3SqlCursor::dropTestTables( QSqlDatabase db ) { if ( !db.isValid() ) - return; + return; QStringList tableNames; - tableNames << qTableName( "qtest" ) - << qTableName( "qtest_unicode" ) - << qTableName( "qtest_precision" ) - << qTableName( "qtest_ovchar" ) - << qTableName( "qtest_onvchar" ) - << qTableName( "qtestPK" ); + tableNames << qtest + << qTableName( "qtest_unicode", __FILE__ ) + << qTableName( "qtest_precision", __FILE__ ) + << qTableName( "qtest_ovchar", __FILE__ ) + << qTableName( "qtest_onvchar", __FILE__ ) + << qTableName( "qtestPK", __FILE__ ); tst_Databases::safeDropTables( db, tableNames ); } void tst_Q3SqlCursor::populateTestTables( QSqlDatabase db ) { if (!db.isValid()) - return; + return; QSqlQuery q( db ); - q.exec( "delete from " + qTableName( "qtest" ) ); //not fatal - QVERIFY_SQL(q, prepare("insert into " + qTableName( "qtest" ) + " (id, t_varchar, t_char, t_numeric) values (?, ?, ?, ?)")); + q.exec( "delete from " + qtest ); //not fatal + QVERIFY_SQL(q, prepare("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (?, ?, ?, ?)")); q.addBindValue(QVariantList() << 0 << 1 << 2 << 3); q.addBindValue(QVariantList() << "VarChar0" << "VarChar1" << "VarChar2" << "VarChar3"); q.addBindValue(QVariantList() << "Char0" << "Char1" << "Char2" << "Char3"); @@ -199,21 +200,21 @@ dbs.open(); for ( QStringList::ConstIterator it = dbs.dbNames.begin(); it != dbs.dbNames.end(); ++it ) { - QSqlDatabase db = QSqlDatabase::database( (*it) ); - CHECK_DATABASE( db ); + QSqlDatabase db = QSqlDatabase::database( (*it) ); + CHECK_DATABASE( db ); - dropTestTables( db ); //in case of leftovers - createTestTables( db ); - populateTestTables( db ); + dropTestTables( db ); //in case of leftovers + createTestTables( db ); + populateTestTables( db ); } } void tst_Q3SqlCursor::cleanupTestCase() { for ( QStringList::ConstIterator it = dbs.dbNames.begin(); it != dbs.dbNames.end(); ++it ) { - QSqlDatabase db = QSqlDatabase::database( (*it) ); - CHECK_DATABASE( db ); - dropTestTables( db ); + QSqlDatabase db = QSqlDatabase::database( (*it) ); + CHECK_DATABASE( db ); + dropTestTables( db ); } dbs.close(); @@ -229,9 +230,9 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); if ( QTest::currentTestFailed() ) { - //since Oracle ODBC totally craps out on error, we init again - db.close(); - db.open(); + //since Oracle ODBC totally craps out on error, we init again + db.close(); + db.open(); } } @@ -243,10 +244,10 @@ Q3SqlCursor cur2; { - Q3SqlCursor cur( qTableName( "qtest" ), true, db ); - QVERIFY_SQL(cur, select( cur.index( QString("id") ) )); - cur2 = Q3SqlCursor( cur ); - // let "cur" run out of scope... + Q3SqlCursor cur( qtest, true, db ); + QVERIFY_SQL(cur, select( cur.index( QString("id") ) )); + cur2 = Q3SqlCursor( cur ); + // let "cur" run out of scope... } QSqlRecord* rec = cur2.primeUpdate(); @@ -255,8 +256,8 @@ int i = 0; while ( cur2.next() ) { - QVERIFY( cur2.value("id").toInt() == i ); - i++; + QVERIFY( cur2.value("id").toInt() == i ); + i++; } } @@ -266,12 +267,12 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - Q3SqlCursor cur( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur( qtest, true, db ); QVERIFY_SQL(cur, select( cur.index( QString("id") ) )); int i = 0; while ( cur.next() ) { - QCOMPARE(cur.value("id").toInt(), i); - i++; + QCOMPARE(cur.value("id").toInt(), i); + i++; } } @@ -281,14 +282,14 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - Q3SqlCursor cur( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur( qtest, true, db ); QSqlIndex index = cur.primaryIndex(); if ( tst_Databases::isMSAccess( db ) ) { - QCOMPARE( index.fieldName(1).upper(), QString( "ID" ) ); - QCOMPARE( index.fieldName(0).upper(), QString( "T_VARCHAR" ) ); + QCOMPARE( index.fieldName(1).upper(), QString( "ID" ) ); + QCOMPARE( index.fieldName(0).upper(), QString( "T_VARCHAR" ) ); } else { - QCOMPARE( index.fieldName(0).upper(), QString( "ID" ) ); - QCOMPARE( index.fieldName(1).upper(), QString( "T_VARCHAR" ) ); + QCOMPARE( index.fieldName(0).upper(), QString( "ID" ) ); + QCOMPARE( index.fieldName(1).upper(), QString( "T_VARCHAR" ) ); } QVERIFY(!index.isDescending(0)); QVERIFY(!index.isDescending(1)); @@ -300,17 +301,17 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - Q3SqlCursor cur( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur( qtest, true, db ); QSqlRecord* irec = cur.primeInsert(); QVERIFY( irec != 0 ); // check that primeInsert returns a valid QSqlRecord QCOMPARE( (int)irec->count(), 4 ); if ( ( irec->field( 0 ).type() != QVariant::Int ) && - ( irec->field( 0 ).type() != QVariant::String ) && + ( irec->field( 0 ).type() != QVariant::String ) && ( irec->field( 0 ).type() != QVariant::Double ) ) { - QFAIL( QString( "Wrong datatype %1 for field 'ID'" - " (expected Int or String)" ).arg( QVariant::typeToName( irec->field( 0 ).type() ) ) ); + QFAIL( QString( "Wrong datatype %1 for field 'ID'" + " (expected Int or String)" ).arg( QVariant::typeToName( irec->field( 0 ).type() ) ) ); } QCOMPARE( QVariant::typeToName( irec->field( 1 ).type() ), QVariant::typeToName( QVariant::String ) ); QCOMPARE( QVariant::typeToName( irec->field( 2 ).type() ), QVariant::typeToName( QVariant::String ) ); @@ -326,7 +327,9 @@ irec->setValue( "t_char", "SomeChar" ); irec->setValue( "t_numeric", 400.400 ); - QCOMPARE( cur.insert(), 1 ); + QSet validReturns(QSet() << -1 << 1); + + QVERIFY( validReturns.contains(cur.insert()) ); // restore old test-tables populateTestTables( db ); @@ -337,8 +340,9 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + QSet validReturns(QSet() << -1 << 1); - Q3SqlCursor cur( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur( qtest, true, db ); QSqlRecord* irec = cur.primeInsert(); QVERIFY( irec != 0 ); @@ -354,25 +358,25 @@ // INSERT the strings QStringList::Iterator it; for ( it = strings.begin(); it != strings.end(); ++it ) { - QSqlRecord* irec = cur.primeInsert(); - QVERIFY( irec != 0 ); - irec->setValue( "id", i ); - irec->setValue( "t_varchar", (*it) ); - irec->setValue( "t_char", (*it) ); - irec->setValue( "t_numeric", (double)i ); - ++i; - QCOMPARE( cur.insert(), 1 ); + QSqlRecord* irec = cur.primeInsert(); + QVERIFY( irec != 0 ); + irec->setValue( "id", i ); + irec->setValue( "t_varchar", (*it) ); + irec->setValue( "t_char", (*it) ); + irec->setValue( "t_numeric", (double)i ); + ++i; + QVERIFY( validReturns.contains(cur.insert()) ); } QVERIFY( cur.select( "id >= 800 and id < 900" ) ); int i2 = 800; while( cur.next() ) { - QCOMPARE( cur.value( "id" ).toInt(), i2 ); - QCOMPARE( cur.value( "t_varchar" ).toString().stripWhiteSpace(), strings.at( i2 - 800 ) ); - QCOMPARE( cur.value( "t_char" ).toString().stripWhiteSpace(), strings.at( i2 - 800 ) ); - QCOMPARE( cur.value( "t_numeric" ).toDouble(), (double)i2 ); - ++i2; + QCOMPARE( cur.value( "id" ).toInt(), i2 ); + QCOMPARE( cur.value( "t_varchar" ).toString().stripWhiteSpace(), strings.at( i2 - 800 ) ); + QCOMPARE( cur.value( "t_char" ).toString().stripWhiteSpace(), strings.at( i2 - 800 ) ); + QCOMPARE( cur.value( "t_numeric" ).toDouble(), (double)i2 ); + ++i2; } QCOMPARE( i, i2 ); @@ -384,24 +388,25 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + QSet validReturns(QSet() << -1 << 1); QSqlQuery q( db ); - q.exec( "delete from " + qTableName( "qtest" ) ); + q.exec( "delete from " + qtest ); - Q3SqlCursor cur( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur( qtest, true, db ); int i = 0; for ( ; i < 100; ++i ) { - QSqlRecord* irec = cur.primeInsert(); - Q_ASSERT( irec ); - irec->setValue( "id", i ); - irec->setValue( "t_varchar", "blah" ); - irec->setValue( "t_char", "blah" ); - irec->setValue( "t_numeric", 1.1 ); - if ( db.driverName().startsWith( "QSQLITE" ) ) { - QVERIFY( cur.insert( true ) ); - } else { - QCOMPARE( cur.insert( true ), 1 ); + QSqlRecord* irec = cur.primeInsert(); + Q_ASSERT( irec ); + irec->setValue( "id", i ); + irec->setValue( "t_varchar", "blah" ); + irec->setValue( "t_char", "blah" ); + irec->setValue( "t_numeric", 1.1 ); + if ( db.driverName().startsWith( "QSQLITE" ) ) { + QVERIFY( cur.insert( true ) ); + } else { + QVERIFY( validReturns.contains(cur.insert( true )) ); } } @@ -412,18 +417,18 @@ irec->setValue( "t_varchar", "blah" ); irec->setValue( "t_char", "blah" ); irec->setValue( "t_numeric", 1.1 ); - if ( db.driverName().startsWith( "QSQLITE" ) ) { - QVERIFY( cur.insert( false ) ); - } else { - QCOMPARE( cur.insert( false ), 1 ); + if ( db.driverName().startsWith( "QSQLITE" ) ) { + QVERIFY( cur.insert( false ) ); + } else { + QVERIFY( validReturns.contains(cur.insert( false )) ); } } i = 0; - QVERIFY_SQL(q, exec( "select * from " + qTableName( "qtest" ) + " order by id" )); + QVERIFY_SQL(q, exec( "select * from " + qtest + " order by id" )); while ( q.next() ) { - QCOMPARE( q.value( 0 ).toInt(), i ); - i++; + QCOMPARE( q.value( 0 ).toInt(), i ); + i++; } QCOMPARE( i, 200 ); @@ -435,7 +440,7 @@ { QString res; for ( int i = 0; i < (int)str.length(); ++i ) { - res += "0x" + QString::number( str[ i ].unicode(), 16 ) + ' '; + res += "0x" + QString::number( str[ i ].unicode(), 16 ) + ' '; } return res; } @@ -447,16 +452,16 @@ CHECK_DATABASE( db ); if (tst_Databases::getOraVersion(db) < 9) - QSKIP("Need Oracle >= 9", SkipSingle); + QSKIP("Need Oracle >= 9", SkipSingle); /****** CHARSET TEST ******/ QSqlQuery q( db ); - QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest_ovchar" ) + " ( id int primary key, t_char varchar(40) )" )); + QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest_ovchar", __FILE__ ) + " ( id int primary key, t_char varchar(40) )" )); static const QString val1( "blah1" ); - Q3SqlCursor cur ( qTableName( "qtest_ovchar" ), true, db ); + Q3SqlCursor cur ( qTableName( "qtest_ovchar", __FILE__ ), true, db ); QSqlRecord* irec = cur.primeInsert(); irec->setValue( "id", 1 ); irec->setValue( "t_char", val1 ); @@ -465,8 +470,8 @@ QVERIFY_SQL(cur, select()); QVERIFY( cur.next() ); if ( cur.value( "t_char" ).toString() != val1 ) - qDebug( QString( "Wrong value for t_char: expected '%1', got '%2'" ).arg( val1 ).arg( - cur.value( "t_char" ).toString() ) ); + qDebug( QString( "Wrong value for t_char: expected '%1', got '%2'" ).arg( val1 ).arg( + cur.value( "t_char" ).toString() ) ); static const unsigned short utf8arr[] = { 0xd792,0xd79c,0xd792,0xd79c,0xd799,0x00 }; static const QString utf8str = QString::fromUcs2( utf8arr ); @@ -486,9 +491,9 @@ /****** NCHARSET TEST ********/ - QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest_onvchar" ) + " ( id int primary key, t_nchar nvarchar2(40) )" )); + QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest_onvchar", __FILE__ ) + " ( id int primary key, t_nchar nvarchar2(40) )" )); - Q3SqlCursor cur2 ( qTableName( "qtest_onvchar" ), true, db ); + Q3SqlCursor cur2 ( qTableName( "qtest_onvchar", __FILE__ ), true, db ); irec = cur2.primeInsert(); irec->setValue( "id", 1 ); irec->setValue( "t_nchar", val1 ); @@ -523,13 +528,13 @@ static const QString utf8str = QString::fromUtf8( "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει." ); if ( !db.driver()->hasFeature( QSqlDriver::Unicode ) ) { - QSKIP( "DBMS not Unicode capable", SkipSingle ); + QSKIP( "DBMS not Unicode capable", SkipSingle ); } // ascii in the data storage, can't transliterate properly. invalid test. if(db.driverName().startsWith("QIBASE") && (db.databaseName() == "silence.nokia.troll.no:c:\\ibase\\testdb_ascii" || db.databaseName() == "/opt/interbase/qttest.gdb")) QSKIP("Can't transliterate extended unicode to ascii", SkipSingle); - Q3SqlCursor cur( qTableName( "qtest_unicode" ), true, db ); + Q3SqlCursor cur( qTableName( "qtest_unicode", __FILE__ ), true, db ); QSqlRecord* irec = cur.primeInsert(); irec->setValue( 0, 500 ); irec->setValue( 1, utf8str ); @@ -566,7 +571,7 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - Q3SqlCursor cur( qTableName( "qtest_precision" ), true, db ); + Q3SqlCursor cur( qTableName( "qtest_precision", __FILE__ ), true, db ); cur.setTrimmed( "col1", true ); QSqlRecord* irec = cur.primeInsert(); irec->setValue( 0, precStr ); @@ -589,7 +594,7 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - Q3SqlCursor cur( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur( qtest, true, db ); cur.setFilter( "id = 2" ); QVERIFY_SQL(cur, select()); @@ -619,31 +624,31 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - Q3SqlCursor cur( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur( qtest, true, db ); QVERIFY_SQL(cur, select()); QVERIFY( cur.next() ); QVERIFY( cur.next() ); - Q3SqlCursor cur2( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur2( qtest, true, db ); QVERIFY_SQL(cur2, select( "id = 1" )); QVERIFY( cur2.next() ); QCOMPARE( cur2.value( 0 ).toInt(), 1 ); - Q3SqlCursor cur3( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur3( qtest, true, db ); QVERIFY_SQL(cur3, select( cur3.primaryIndex( false ) )); QVERIFY( cur3.next() ); QVERIFY( cur3.next() ); QCOMPARE( cur3.value( 0 ).toInt(), 1 ); - Q3SqlCursor cur4( qTableName( "qtest" ), true, db ); + Q3SqlCursor cur4( qtest, true, db ); QSqlIndex idx = cur4.primaryIndex( false ); QCOMPARE( (int)idx.count(), 2 ); if ( tst_Databases::isMSAccess( db ) ) { - QCOMPARE( idx.field( 1 ).name().upper(), QString("ID") ); - QCOMPARE( idx.field( 0 ).name().upper(), QString("T_VARCHAR") ); + QCOMPARE( idx.field( 1 ).name().upper(), QString("ID") ); + QCOMPARE( idx.field( 0 ).name().upper(), QString("T_VARCHAR") ); } else { - QCOMPARE( idx.field( 0 ).name().upper(), QString("ID") ); - QCOMPARE( idx.field( 1 ).name().upper(), QString("T_VARCHAR") ); + QCOMPARE( idx.field( 0 ).name().upper(), QString("ID") ); + QCOMPARE( idx.field( 1 ).name().upper(), QString("T_VARCHAR") ); } #ifdef QT_DEBUG @@ -667,17 +672,17 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - Q3SqlCursor c2( qTableName( "qtest" ), true, db ); - QCOMPARE( c2.name(), qTableName( "qtest" ) ); + Q3SqlCursor c2( qtest, true, db ); + QCOMPARE( c2.name(), qtest ); QCOMPARE( c2.fieldName( 0 ).lower(), QString( "id" ) ); Q3SqlCursor c( QString(), true, db ); - c.setName( qTableName( "qtest" ) ); - QCOMPARE( c.name(), qTableName( "qtest" ) ); + c.setName( qtest ); + QCOMPARE( c.name(), qtest ); QCOMPARE( c.fieldName( 0 ).lower(), QString( "id" ) ); - c.setName( qTableName( "qtest_precision" ) ); - QCOMPARE( c.name(), qTableName( "qtest_precision" ) ); + c.setName( qTableName( "qtest_precision", __FILE__ ) ); + QCOMPARE( c.name(), qTableName( "qtest_precision", __FILE__ ) ); QCOMPARE( c.fieldName( 0 ).lower(), QString( "col1" ) ); } @@ -687,17 +692,18 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - + QSet validReturns(QSet() << -1 << 1); + QSqlQuery q(db); - QVERIFY_SQL(q, exec("create table " + qTableName( "qtestPK" ) + " (id int, name varchar(20), num numeric)")); - - Q3SqlCursor cur(qTableName("qtestPK"), true, db); + QVERIFY_SQL(q, exec("create table " + qTableName( "qtestPK", __FILE__ ) + " (id int, name varchar(20), num numeric)")); + + Q3SqlCursor cur(qTableName("qtestPK", __FILE__), true, db); QSqlRecord* rec = cur.primeInsert(); Q_ASSERT(rec); rec->setNull(0); rec->setNull(1); rec->setNull(2); - QVERIFY_SQL(cur, insert() == 1); + QVERIFY(validReturns.contains(cur.insert())); if (!db.driver()->hasFeature(QSqlDriver::PreparedQueries)) { // Only QPSQL, QMYSQL, QODBC and QOCI drivers currently use escape identifiers for column names @@ -705,15 +711,15 @@ db.driverName().startsWith("QMYSQL") || db.driverName().startsWith("QODBC") || db.driverName().startsWith("QOCI")) { - QString query = QString::fromLatin1("insert into " + qTableName("qtestPK") + + QString query = QString::fromLatin1("insert into " + qTableName("qtestPK", __FILE__) + " (" + db.driver()->escapeIdentifier("id", QSqlDriver::FieldName) + ',' + db.driver()->escapeIdentifier("name", QSqlDriver::FieldName) + ',' + db.driver()->escapeIdentifier("num", QSqlDriver::FieldName) + ')' + " values (NULL,NULL,NULL)"); QCOMPARE(cur.lastQuery(), query); } else { - QCOMPARE(cur.lastQuery(), QString::fromLatin1("insert into " + qTableName("qtestPK") + - " (\"id\",\"name\",\"num\") values (NULL,NULL,NULL)")); + QCOMPARE(cur.lastQuery(), QString::fromLatin1("insert into " + qTableName("qtestPK", __FILE__) + + " (\"id\",\"name\",\"num\") values (NULL,NULL,NULL)")); } } @@ -724,15 +730,15 @@ rec->setNull(2); // Sqlite returns 2, don't ask why. QVERIFY(cur.update() != 0); - QString expect = "update " + qTableName("qtestPK") + + QString expect = "update " + qTableName("qtestPK", __FILE__) + " set "+db.driver()->escapeIdentifier("id", QSqlDriver::FieldName)+" = 1 , " +db.driver()->escapeIdentifier("name", QSqlDriver::FieldName)+" = NULL , " - +db.driver()->escapeIdentifier("num", QSqlDriver::FieldName)+" = NULL where " + qTableName("qtestPK") + ".id" - " IS NULL and " + qTableName("qtestPK") + ".name IS NULL and " + - qTableName("qtestPK") + ".num IS NULL"; + +db.driver()->escapeIdentifier("num", QSqlDriver::FieldName)+" = NULL where " + qTableName("qtestPK", __FILE__) + ".id" + " IS NULL and " + qTableName("qtestPK", __FILE__) + ".name IS NULL and " + + qTableName("qtestPK", __FILE__) + ".num IS NULL"; if (!db.driver()->hasFeature(QSqlDriver::PreparedQueries)) { if (!db.driverName().startsWith("QSQLITE")) { - QCOMPARE(cur.lastQuery(), expect); + QCOMPARE(cur.lastQuery(), expect); } } QVERIFY(cur.select(cur.index(QString("id")))); @@ -749,6 +755,7 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + QSet validReturns(QSet() << -1 << 1); // The bugfix (and this test) depends on QSqlDriver::escapeIdentifier(...) // to be implemented, which is currently only the case for the @@ -760,7 +767,7 @@ return; } - QString tableName = qTableName("qtestws"); + QString tableName = qTableName("qtestws", __FILE__); QSqlQuery q(db); tst_Databases::safeDropTable(db, tableName); @@ -777,7 +784,7 @@ r->setValue("firsT NaMe", "Kong"); r->setValue("lastNaMe", "Harald"); - QVERIFY(cur.insert() == 1); + QVERIFY(validReturns.contains(cur.insert())); cur.select(); cur.next(); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp --- a/tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/q3sqlselectcursor/tst_q3sqlselectcursor.cpp Mon May 03 13:17:34 2010 +0300 @@ -111,16 +111,16 @@ QVERIFY_SQL( q, exec("set client_min_messages='warning'")); // please never ever change this table; otherwise fix all tests ;) if (tst_Databases::isMSAccess(db)) - QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest" ) + " ( id int not null, t_varchar varchar(40) not null," + QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest", __FILE__ ) + " ( id int not null, t_varchar varchar(40) not null," "t_char char(40), t_numeric number, primary key (id, t_varchar) )" )); else - QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest" ) + " ( id int not null, t_varchar varchar(40) not null," + QVERIFY_SQL(q, exec( "create table " + qTableName( "qtest", __FILE__ ) + " ( id int not null, t_varchar varchar(40) not null," "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar) )" )); } void tst_Q3SqlSelectCursor::dropTestTables( QSqlDatabase db ) { - tst_Databases::safeDropTable( db, qTableName( "qtest" ) ); + tst_Databases::safeDropTable( db, qTableName( "qtest", __FILE__ ) ); } void tst_Q3SqlSelectCursor::populateTestTables( QSqlDatabase db ) @@ -129,11 +129,11 @@ return; QSqlQuery q( db ); - q.exec( "delete from " + qTableName( "qtest" ) ); //non-fatal - QVERIFY_SQL(q, exec( "insert into " + qTableName( "qtest" ) + " (id, t_varchar, t_char, t_numeric) values ( 0, 'VarChar0', 'Char0', 1.1 )" )); - QVERIFY_SQL(q, exec( "insert into " + qTableName( "qtest" ) + " (id, t_varchar, t_char, t_numeric) values ( 1, 'VarChar1', 'Char1', 2.2 )" )); - QVERIFY_SQL(q, exec( "insert into " + qTableName( "qtest" ) + " (id, t_varchar, t_char, t_numeric) values ( 2, 'VarChar2', 'Char2', 3.3 )" )); - QVERIFY_SQL(q, exec( "insert into " + qTableName( "qtest" ) + " (id, t_varchar, t_char, t_numeric) values ( 3, 'VarChar3', 'Char3', 4.4 )" )); + q.exec( "delete from " + qTableName( "qtest", __FILE__ ) ); //non-fatal + QVERIFY_SQL(q, exec( "insert into " + qTableName( "qtest", __FILE__ ) + " (id, t_varchar, t_char, t_numeric) values ( 0, 'VarChar0', 'Char0', 1.1 )" )); + QVERIFY_SQL(q, exec( "insert into " + qTableName( "qtest", __FILE__ ) + " (id, t_varchar, t_char, t_numeric) values ( 1, 'VarChar1', 'Char1', 2.2 )" )); + QVERIFY_SQL(q, exec( "insert into " + qTableName( "qtest", __FILE__ ) + " (id, t_varchar, t_char, t_numeric) values ( 2, 'VarChar2', 'Char2', 3.3 )" )); + QVERIFY_SQL(q, exec( "insert into " + qTableName( "qtest", __FILE__ ) + " (id, t_varchar, t_char, t_numeric) values ( 3, 'VarChar3', 'Char3', 4.4 )" )); } void tst_Q3SqlSelectCursor::initTestCase() @@ -184,7 +184,7 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); - Q3SqlSelectCursor cur( "select * from " + qTableName( "qtest" ) + " order by id", db ); + Q3SqlSelectCursor cur( "select * from " + qTableName( "qtest", __FILE__ ) + " order by id", db ); QVERIFY( cur.select() ); QVERIFY_SQL(cur, isActive()); int i = 0; @@ -203,7 +203,7 @@ Q3SqlSelectCursor cur( QString(), db ); QVERIFY_SQL(cur, isActive() == false); - cur.exec( "select * from " + qTableName( "qtest" ) ); //nothing should happen + cur.exec( "select * from " + qTableName( "qtest", __FILE__ ) ); //nothing should happen QVERIFY_SQL(cur, isActive()); int i = 0; while ( cur.next() ) { diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qabstractproxymodel/tst_qabstractproxymodel.cpp --- a/tests/auto/qabstractproxymodel/tst_qabstractproxymodel.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qabstractproxymodel/tst_qabstractproxymodel.cpp Mon May 03 13:17:34 2010 +0300 @@ -80,6 +80,7 @@ void setSourceModel(); void submit_data(); void submit(); + void testRoleNames(); }; // Subclass that exposes the protected functions. @@ -362,6 +363,87 @@ QCOMPARE(model.submit(), submit); } +class StandardItemModelWithCustomRoleNames : public QStandardItemModel +{ +public: + enum CustomRole { + CustomRole1 = Qt::UserRole, + CustomRole2 + }; + + StandardItemModelWithCustomRoleNames() { + QHash _roleNames = roleNames(); + _roleNames.insert(CustomRole1, "custom1"); + _roleNames.insert(CustomRole2, "custom2"); + setRoleNames(_roleNames); + } +}; + +class AnotherStandardItemModelWithCustomRoleNames : public QStandardItemModel +{ + public: + enum CustomRole { + AnotherCustomRole1 = Qt::UserRole + 10, // Different to StandardItemModelWithCustomRoleNames::CustomRole1 + AnotherCustomRole2 + }; + + AnotherStandardItemModelWithCustomRoleNames() { + QHash _roleNames = roleNames(); + _roleNames.insert(AnotherCustomRole1, "another_custom1"); + _roleNames.insert(AnotherCustomRole2, "another_custom2"); + setRoleNames(_roleNames); + } +}; + +/** + Verifies that @p subSet is a subset of @p superSet. That is, all keys in @p subSet exist in @p superSet and have the same values. +*/ +static void verifySubSetOf(const QHash &superSet, const QHash &subSet) +{ + QHash::const_iterator it = subSet.constBegin(); + const QHash::const_iterator end = subSet.constEnd(); + for ( ; it != end; ++it ) { + QVERIFY(superSet.contains(it.key())); + QVERIFY(it.value() == superSet.value(it.key())); + } +} + +void tst_QAbstractProxyModel::testRoleNames() +{ + QStandardItemModel defaultModel; + StandardItemModelWithCustomRoleNames model; + QHash rootModelRoleNames = model.roleNames(); + QHash defaultModelRoleNames = defaultModel.roleNames(); + + verifySubSetOf( rootModelRoleNames, defaultModelRoleNames); + QVERIFY( rootModelRoleNames.size() == defaultModelRoleNames.size() + 2 ); + QVERIFY( rootModelRoleNames.contains(StandardItemModelWithCustomRoleNames::CustomRole1)); + QVERIFY( rootModelRoleNames.contains(StandardItemModelWithCustomRoleNames::CustomRole2)); + QVERIFY( rootModelRoleNames.value(StandardItemModelWithCustomRoleNames::CustomRole1) == "custom1" ); + QVERIFY( rootModelRoleNames.value(StandardItemModelWithCustomRoleNames::CustomRole2) == "custom2" ); + + SubQAbstractProxyModel proxy1; + proxy1.setSourceModel(&model); + QHash proxy1RoleNames = proxy1.roleNames(); + verifySubSetOf( proxy1RoleNames, defaultModelRoleNames ); + QVERIFY( proxy1RoleNames.size() == defaultModelRoleNames.size() + 2 ); + QVERIFY( proxy1RoleNames.contains(StandardItemModelWithCustomRoleNames::CustomRole1)); + QVERIFY( proxy1RoleNames.contains(StandardItemModelWithCustomRoleNames::CustomRole2)); + QVERIFY( proxy1RoleNames.value(StandardItemModelWithCustomRoleNames::CustomRole1) == "custom1" ); + QVERIFY( proxy1RoleNames.value(StandardItemModelWithCustomRoleNames::CustomRole2) == "custom2" ); + + SubQAbstractProxyModel proxy2; + proxy2.setSourceModel(&proxy1); + QHash proxy2RoleNames = proxy2.roleNames(); + verifySubSetOf( proxy2RoleNames, defaultModelRoleNames ); + QVERIFY( proxy2RoleNames.size() == defaultModelRoleNames.size() + 2 ); + QVERIFY( proxy2RoleNames.contains(StandardItemModelWithCustomRoleNames::CustomRole1)); + QVERIFY( proxy2RoleNames.contains(StandardItemModelWithCustomRoleNames::CustomRole2)); + QVERIFY( proxy2RoleNames.value(StandardItemModelWithCustomRoleNames::CustomRole1) == "custom1" ); + QVERIFY( proxy2RoleNames.value(StandardItemModelWithCustomRoleNames::CustomRole2) == "custom2" ); + +} + QTEST_MAIN(tst_QAbstractProxyModel) #include "tst_qabstractproxymodel.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qaccessibility/tst_qaccessibility.cpp --- a/tests/auto/qaccessibility/tst_qaccessibility.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qaccessibility/tst_qaccessibility.cpp Mon May 03 13:17:34 2010 +0300 @@ -3923,9 +3923,8 @@ acc = QAccessible::queryAccessibleInterface(cb); - QRect accRect = acc->rect(0); for (int i = 1; i < acc->childCount(); ++i) { - QVERIFY(accRect.contains(acc->rect(i))); + QTRY_VERIFY(acc->rect(0).contains(acc->rect(i))); } QCOMPARE(acc->doAction(QAccessible::Press, 2), true); QTest::qWait(400); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qdialog/tst_qdialog.cpp --- a/tests/auto/qdialog/tst_qdialog.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qdialog/tst_qdialog.cpp Mon May 03 13:17:34 2010 +0300 @@ -464,8 +464,8 @@ void tst_QDialog::throwInExec() { -#ifdef Q_WS_MAC - QSKIP("Qt/Mac: Throwing exceptions in exec() is not supported.", SkipAll); +#if defined(Q_WS_MAC) || (defined(Q_WS_WINCE) && defined(_ARM_)) + QSKIP("Throwing exceptions in exec() is not supported on this platform.", SkipAll); #endif int caughtExceptions = 0; try { diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qdom/tst_qdom.cpp --- a/tests/auto/qdom/tst_qdom.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qdom/tst_qdom.cpp Mon May 03 13:17:34 2010 +0300 @@ -131,6 +131,7 @@ void setContentWhitespace_data() const; void taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() const; + void cloneDTD_QTBUG8398() const; void cleanupTestCase() const; @@ -1912,5 +1913,29 @@ QVERIFY(true); } +void tst_QDom::cloneDTD_QTBUG8398() const +{ + QString dtd("\n" + "\n" + "\n" + "]>\n" + "\n"); + QDomDocument domDocument; + QVERIFY(domDocument.setContent(dtd)); + QDomDocument domDocument2 = domDocument.cloneNode(true).toDocument(); + + // for some reason, our DOM implementation reverts the order of entities + QString expected("\n" + "\n" + "\n" + "]>\n" + "\n"); + QString output; + QTextStream stream(&output); + domDocument2.save(stream, 0); + QCOMPARE(output, expected); +} QTEST_MAIN(tst_QDom) #include "tst_qdom.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qfiledialog/tst_qfiledialog.cpp --- a/tests/auto/qfiledialog/tst_qfiledialog.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qfiledialog/tst_qfiledialog.cpp Mon May 03 13:17:34 2010 +0300 @@ -547,6 +547,9 @@ // ### FIXME: This will fail on Symbian on some tests and some environments until the file engine and QFileSystemModel // are fixed to properly capitalize paths, so that some folders are not duplicated in QFileSystemModel. +#if defined(Q_OS_SYMBIAN) + QSKIP("This will fail on Symbian on some tests and some environments until the file engine and QFileSystemModel are fixed to properly capitalize paths") +#endif QTRY_COMPARE(cModel->rowCount(), expected); } QT_CATCH(...) { qDeleteAll(files); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qfiledialog2/tst_qfiledialog2.cpp --- a/tests/auto/qfiledialog2/tst_qfiledialog2.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qfiledialog2/tst_qfiledialog2.cpp Mon May 03 13:17:34 2010 +0300 @@ -87,13 +87,13 @@ } }; -class tst_QFiledialog : public QObject +class tst_QFileDialog2 : public QObject { Q_OBJECT public: - tst_QFiledialog(); - virtual ~tst_QFiledialog(); + tst_QFileDialog2(); + virtual ~tst_QFileDialog2(); public slots: void init(); @@ -138,18 +138,18 @@ QByteArray userSettings; }; -tst_QFiledialog::tst_QFiledialog() +tst_QFileDialog2::tst_QFileDialog2() { #if defined(Q_OS_WINCE) qApp->setAutoMaximizeThreshold(-1); #endif } -tst_QFiledialog::~tst_QFiledialog() +tst_QFileDialog2::~tst_QFileDialog2() { } -void tst_QFiledialog::init() +void tst_QFileDialog2::init() { // Save the developers settings so they don't get mad when their sidebar folders are gone. QSettings settings(QSettings::UserScope, QLatin1String("Trolltech")); @@ -164,14 +164,14 @@ #endif } -void tst_QFiledialog::cleanup() +void tst_QFileDialog2::cleanup() { QSettings settings(QSettings::UserScope, QLatin1String("Trolltech")); settings.beginGroup(QLatin1String("Qt")); settings.setValue(QLatin1String("filedialog"), userSettings); } -void tst_QFiledialog::listRoot() +void tst_QFileDialog2::listRoot() { #if defined QT_BUILD_INTERNAL QFileInfoGatherer fileInfoGatherer; @@ -193,7 +193,7 @@ #endif } -void tst_QFiledialog::heapCorruption() +void tst_QFileDialog2::heapCorruption() { QVector dialogs; for (int i=0; i < 10; i++) { @@ -205,12 +205,12 @@ struct FriendlyQFileDialog : public QNonNativeFileDialog { - friend class tst_QFileDialog; + friend class tst_QFileDialog2; Q_DECLARE_PRIVATE(QFileDialog) }; -void tst_QFiledialog::deleteDirAndFiles() +void tst_QFileDialog2::deleteDirAndFiles() { #if defined QT_BUILD_INTERNAL QString tempPath = QDir::tempPath() + '/' + "QFileDialogTestDir4FullDelete"; @@ -242,7 +242,7 @@ #endif } -void tst_QFiledialog::filter() +void tst_QFileDialog2::filter() { QNonNativeFileDialog fd; QAction *hiddenAction = qFindChild(&fd, "qt_show_hidden_action"); @@ -255,7 +255,7 @@ QVERIFY(hiddenAction->isChecked()); } -void tst_QFiledialog::showNameFilterDetails() +void tst_QFileDialog2::showNameFilterDetails() { QNonNativeFileDialog fd; QComboBox *filters = qFindChild(&fd, "fileTypeCombo"); @@ -280,7 +280,7 @@ QCOMPARE(filters->itemText(2), filterChoices.at(2)); } -void tst_QFiledialog::unc() +void tst_QFileDialog2::unc() { #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) // Only test UNC on Windows./ @@ -295,7 +295,7 @@ QCOMPARE(model->index(fd.directory().absolutePath()), model->index(dir)); } -void tst_QFiledialog::emptyUncPath() +void tst_QFileDialog2::emptyUncPath() { QNonNativeFileDialog fd; fd.show(); @@ -308,7 +308,7 @@ QVERIFY(model); } -void tst_QFiledialog::task178897_minimumSize() +void tst_QFileDialog2::task178897_minimumSize() { QNonNativeFileDialog fd; QSize oldMs = fd.layout()->minimumSize(); @@ -322,7 +322,7 @@ QVERIFY(ms.width() <= oldMs.width()); } -void tst_QFiledialog::task180459_lastDirectory_data() +void tst_QFileDialog2::task180459_lastDirectory_data() { QTest::addColumn("path"); QTest::addColumn("directory"); @@ -345,7 +345,7 @@ } -void tst_QFiledialog::task180459_lastDirectory() +void tst_QFileDialog2::task180459_lastDirectory() { //first visit the temp directory and close the dialog QNonNativeFileDialog *dlg = new QNonNativeFileDialog(0, "", QDir::tempPath()); @@ -449,7 +449,7 @@ } }; -void tst_QFiledialog::task227304_proxyOnFileDialog() +void tst_QFileDialog2::task227304_proxyOnFileDialog() { #if defined QT_BUILD_INTERNAL QNonNativeFileDialog fd(0, "", QDir::currentPath(), 0); @@ -488,7 +488,7 @@ #endif } -void tst_QFiledialog::task227930_correctNavigationKeyboardBehavior() +void tst_QFileDialog2::task227930_correctNavigationKeyboardBehavior() { QDir current = QDir::currentPath(); current.mkdir("test"); @@ -527,7 +527,7 @@ } #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) -void tst_QFiledialog::task226366_lowerCaseHardDriveWindows() +void tst_QFileDialog2::task226366_lowerCaseHardDriveWindows() { QNonNativeFileDialog fd; fd.setDirectory(QDir::root().path()); @@ -553,7 +553,7 @@ } #endif -void tst_QFiledialog::completionOnLevelAfterRoot() +void tst_QFileDialog2::completionOnLevelAfterRoot() { QNonNativeFileDialog fd; #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) @@ -592,7 +592,7 @@ #endif } -void tst_QFiledialog::task233037_selectingDirectory() +void tst_QFileDialog2::task233037_selectingDirectory() { QDir current = QDir::currentPath(); current.mkdir("test"); @@ -615,7 +615,7 @@ current.rmdir("test"); } -void tst_QFiledialog::task235069_hideOnEscape() +void tst_QFileDialog2::task235069_hideOnEscape() { QDir current = QDir::currentPath(); QNonNativeFileDialog fd; @@ -637,7 +637,7 @@ QCOMPARE(fd2.isVisible(), false); } -void tst_QFiledialog::task236402_dontWatchDeletedDir() +void tst_QFileDialog2::task236402_dontWatchDeletedDir() { #if defined QT_BUILD_INTERNAL //THIS TEST SHOULD NOT DISPLAY WARNINGS @@ -662,7 +662,7 @@ #endif } -void tst_QFiledialog::task203703_returnProperSeparator() +void tst_QFileDialog2::task203703_returnProperSeparator() { QDir current = QDir::currentPath(); current.mkdir("aaaaaaaaaaaaaaaaaa"); @@ -687,7 +687,7 @@ current.rmdir("aaaaaaaaaaaaaaaaaa"); } -void tst_QFiledialog::task228844_ensurePreviousSorting() +void tst_QFileDialog2::task228844_ensurePreviousSorting() { QDir current = QDir::currentPath(); current.mkdir("aaaaaaaaaaaaaaaaaa"); @@ -789,7 +789,7 @@ } -void tst_QFiledialog::task239706_editableFilterCombo() +void tst_QFileDialog2::task239706_editableFilterCombo() { QNonNativeFileDialog d; d.setNameFilter("*.cpp *.h"); @@ -812,7 +812,7 @@ QTest::keyPress(filterCombo, Qt::Key_Enter); // should not trigger assertion failure } -void tst_QFiledialog::task218353_relativePaths() +void tst_QFileDialog2::task218353_relativePaths() { QDir appDir = QDir::current(); QVERIFY(appDir.cdUp() != false); @@ -829,7 +829,7 @@ appDir.rmdir("test"); } -void tst_QFiledialog::task251321_sideBarHiddenEntries() +void tst_QFileDialog2::task251321_sideBarHiddenEntries() { #if defined QT_BUILD_INTERNAL QNonNativeFileDialog fd; @@ -889,7 +889,7 @@ }; #endif -void tst_QFiledialog::task251341_sideBarRemoveEntries() +void tst_QFileDialog2::task251341_sideBarRemoveEntries() { #if defined QT_BUILD_INTERNAL QNonNativeFileDialog fd; @@ -954,7 +954,7 @@ #endif } -void tst_QFiledialog::task254490_selectFileMultipleTimes() +void tst_QFileDialog2::task254490_selectFileMultipleTimes() { QString tempPath = QDir::tempPath(); QTemporaryFile *t; @@ -986,7 +986,7 @@ t->deleteLater(); } -void tst_QFiledialog::task257579_sideBarWithNonCleanUrls() +void tst_QFileDialog2::task257579_sideBarWithNonCleanUrls() { #if defined QT_BUILD_INTERNAL QDir tempDir = QDir::temp(); @@ -1012,7 +1012,7 @@ #endif } -void tst_QFiledialog::task259105_filtersCornerCases() +void tst_QFileDialog2::task259105_filtersCornerCases() { QNonNativeFileDialog fd(0, "TestFileDialog"); fd.setNameFilter(QLatin1String("All Files! (*);;Text Files (*.txt)")); @@ -1056,7 +1056,7 @@ QCOMPARE(filters->currentText(), QLatin1String("Text Files")); } -void tst_QFiledialog::QTBUG4419_lineEditSelectAll() +void tst_QFileDialog2::QTBUG4419_lineEditSelectAll() { QString tempPath = QDir::tempPath(); QTemporaryFile *t; @@ -1082,7 +1082,7 @@ QCOMPARE(tempPath + QChar('/') + lineEdit->selectedText(), t->fileName()); } -void tst_QFiledialog::QTBUG6558_showDirsOnly() +void tst_QFileDialog2::QTBUG6558_showDirsOnly() { const QString tempPath = QDir::tempPath(); QDir dirTemp(tempPath); @@ -1148,7 +1148,7 @@ dirTemp.rmdir(tempName); } -void tst_QFiledialog::QTBUG4842_selectFilterWithHideNameFilterDetails() +void tst_QFileDialog2::QTBUG4842_selectFilterWithHideNameFilterDetails() { QStringList filtersStr; filtersStr << "Images (*.png *.xpm *.jpg)" << "Text files (*.txt)" << "XML files (*.xml)"; @@ -1188,5 +1188,5 @@ } -QTEST_MAIN(tst_QFiledialog) +QTEST_MAIN(tst_QFileDialog2) #include "tst_qfiledialog2.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qftp/tst_qftp.cpp --- a/tests/auto/qftp/tst_qftp.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qftp/tst_qftp.cpp Mon May 03 13:17:34 2010 +0300 @@ -308,7 +308,7 @@ if (setProxy) QSKIP( "This test takes too long if we test with proxies too", SkipSingle ); - QString host = "1.2.3.4"; + QString host = "192.0.2.42"; // IP out of TEST-NET, should be unreachable uint port = 21; ftp = newFtp(); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qgl/qgl.pro --- a/tests/auto/qgl/qgl.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qgl/qgl.pro Mon May 03 13:17:34 2010 +0300 @@ -6,6 +6,8 @@ requires(contains(QT_CONFIG,opengl)) QT += opengl +contains(QT_CONFIG,egl):DEFINES += QGL_EGL + SOURCES += tst_qgl.cpp RESOURCES = qgl.qrc diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qgl/tst_qgl.cpp --- a/tests/auto/qgl/tst_qgl.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qgl/tst_qgl.cpp Mon May 03 13:17:34 2010 +0300 @@ -998,8 +998,7 @@ QGLFramebufferObjectFormat fboFormat; fboFormat.setAttachment(QGLFramebufferObject::NoAttachment); - // Don't complicate things by using NPOT: - QGLFramebufferObject *fbo = new QGLFramebufferObject(256, 128, fboFormat); + QGLFramebufferObject *fbo = new QGLFramebufferObject(200, 100, fboFormat); fbo->bind(); @@ -1036,6 +1035,11 @@ // Don't complicate things by using NPOT: QGLFramebufferObject *fbo = new QGLFramebufferObject(256, 128, fboFormat); + if (fbo->attachment() != QGLFramebufferObject::CombinedDepthStencil) { + delete fbo; + QSKIP("FBOs missing combined depth~stencil support", SkipSingle); + } + QPainter fboPainter; bool painterBegun = fboPainter.begin(fbo); QVERIFY(painterBegun); @@ -1098,6 +1102,16 @@ QGLFramebufferObject *fbo2 = new QGLFramebufferObject(256, 128, fboFormat); QGLFramebufferObject *fbo3 = new QGLFramebufferObject(256, 128, fboFormat); + if ( (fbo1->attachment() != QGLFramebufferObject::CombinedDepthStencil) || + (fbo2->attachment() != QGLFramebufferObject::CombinedDepthStencil) || + (fbo3->attachment() != QGLFramebufferObject::CombinedDepthStencil) ) + { + delete fbo1; + delete fbo2; + delete fbo3; + QSKIP("FBOs missing combined depth~stencil support", SkipSingle); + } + QPainter fbo1Painter; QPainter fbo2Painter; QPainter fbo3Painter; @@ -1203,8 +1217,8 @@ QPainter widgetPainter; widgetPainterBeginOk = widgetPainter.begin(this); QGLFramebufferObjectFormat fboFormat; - fboFormat.setAttachment(QGLFramebufferObject::CombinedDepthStencil); - QGLFramebufferObject *fbo = new QGLFramebufferObject(128, 128, fboFormat); + fboFormat.setAttachment(QGLFramebufferObject::NoAttachment); + QGLFramebufferObject *fbo = new QGLFramebufferObject(100, 100, fboFormat); QPainter fboPainter; fboPainterBeginOk = fboPainter.begin(fbo); @@ -1228,7 +1242,7 @@ #ifdef Q_WS_QWS w.setWindowFlags(Qt::FramelessWindowHint); #endif - w.resize(128, 128); + w.resize(100, 100); w.show(); #ifdef Q_WS_X11 @@ -1340,6 +1354,10 @@ QImage reference(fb.size(), QImage::Format_RGB32); reference.fill(0xffff0000); +#ifdef QGL_EGL + QSKIP("renderPixmap() not yet supported under EGL", SkipAll); +#endif + QFUZZY_COMPARE_IMAGES(fb, reference); } diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp --- a/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qgraphicseffect/tst_qgraphicseffect.cpp Mon May 03 13:17:34 2010 +0300 @@ -46,6 +46,7 @@ #include #include #include +#include #include #include "../../shared/util.h" @@ -72,6 +73,8 @@ void drawPixmapItem(); void deviceCoordinateTranslateCaching(); void inheritOpacity(); + void dropShadowClipping(); + void childrenVisibilityShouldInvalidateCache(); }; void tst_QGraphicsEffect::initTestCase() @@ -509,6 +512,7 @@ QGraphicsView view(&scene); view.show(); QTest::qWaitForWindowShown(&view); + QTRY_VERIFY(effect->repaints >= 1); item->rotate(180); QTest::qWait(50); @@ -590,6 +594,69 @@ QTRY_VERIFY(item->numRepaints > numRepaints); } +void tst_QGraphicsEffect::dropShadowClipping() +{ + QImage img(128, 128, QImage::Format_ARGB32_Premultiplied); + img.fill(0xffffffff); + + QGraphicsScene scene; + QGraphicsRectItem *item = new QGraphicsRectItem(-5, -500, 10, 1000); + item->setGraphicsEffect(new QGraphicsDropShadowEffect); + item->setPen(Qt::NoPen); + item->setBrush(Qt::red); + + scene.addItem(item); + + QPainter p(&img); + scene.render(&p, img.rect(), QRect(-64, -64, 128, 128)); + p.end(); + + for (int y = 1; y < img.height(); ++y) + for (int x = 0; x < img.width(); ++x) + QCOMPARE(img.pixel(x, y), img.pixel(x, y-1)); +} + +class MyGraphicsItem : public QGraphicsWidget +{ +public: + MyGraphicsItem(QGraphicsItem *parent = 0) : + QGraphicsWidget(parent), nbPaint(0) + {} + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) + { + nbPaint++; + QGraphicsWidget::paint(painter, option, widget); + } + int nbPaint; +}; + +void tst_QGraphicsEffect::childrenVisibilityShouldInvalidateCache() +{ + QGraphicsScene scene; + MyGraphicsItem parent; + parent.resize(200, 200); + QGraphicsWidget child(&parent); + child.resize(200, 200); + child.setVisible(false); + scene.addItem(&parent); + QGraphicsView view(&scene); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(parent.nbPaint, 1); + //we set an effect on the parent + parent.setGraphicsEffect(new QGraphicsDropShadowEffect(&parent)); + //flush the events + QApplication::processEvents(); + //new effect applied->repaint + QCOMPARE(parent.nbPaint, 2); + child.setVisible(true); + //flush the events + QApplication::processEvents(); + //a new child appears we need to redraw the effect. + QCOMPARE(parent.nbPaint, 3); +} + QTEST_MAIN(tst_QGraphicsEffect) #include "tst_qgraphicseffect.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp --- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp Mon May 03 13:17:34 2010 +0300 @@ -384,6 +384,7 @@ void tabChangesFocus(); void tabChangesFocus_data(); void cacheMode(); + void cacheMode2(); void updateCachedItemAfterMove(); void deviceTransform_data(); void deviceTransform(); @@ -438,6 +439,8 @@ void QTBUG_6738_missingUpdateWithSetParent(); void QTBUG_7714_fullUpdateDiscardingOpacityUpdate2(); void QT_2653_fullUpdateDiscardingOpacityUpdate(); + void QT_2649_focusScope(); + void sortItemsWhileAdding(); private: QList paintedItems; @@ -6822,6 +6825,9 @@ QTRY_COMPARE(tester->repaints, 4); QCOMPARE(testerChild->repaints, 4); QCOMPARE(testerChild2->repaints, 3); + tester->resetTransform(); + testerChild->resetTransform(); + testerChild2->resetTransform(); // Explicit update causes a repaint. tester->update(0, 0, 5, 5); @@ -6895,23 +6901,24 @@ // because the parent is rotated with a perspective. testerChild->setPos(1, 1); QTest::qWait(25); - QTRY_COMPARE(tester->repaints, 10); + QTRY_COMPARE(tester->repaints, 11); QCOMPARE(testerChild->repaints, 10); QCOMPARE(testerChild2->repaints, 5); + tester->resetTransform(); // Make a huge item tester->setGeometry(QRectF(-4000, -4000, 8000, 8000)); QTest::qWait(25); - QTRY_COMPARE(tester->repaints, 11); - QCOMPARE(testerChild->repaints, 10); + QTRY_COMPARE(tester->repaints, 12); + QCOMPARE(testerChild->repaints, 11); QCOMPARE(testerChild2->repaints, 5); // Move the large item - will cause a repaint as the // cache is clipped. tester->setPos(5, 0); QTest::qWait(25); - QTRY_COMPARE(tester->repaints, 12); - QCOMPARE(testerChild->repaints, 10); + QTRY_COMPARE(tester->repaints, 13); + QCOMPARE(testerChild->repaints, 11); QCOMPARE(testerChild2->repaints, 5); // Hiding and showing should invalidate the cache @@ -6919,11 +6926,83 @@ QTest::qWait(25); tester->show(); QTest::qWait(25); - QTRY_COMPARE(tester->repaints, 13); - QCOMPARE(testerChild->repaints, 11); + QTRY_COMPARE(tester->repaints, 14); + QCOMPARE(testerChild->repaints, 12); QCOMPARE(testerChild2->repaints, 6); } +void tst_QGraphicsItem::cacheMode2() +{ + QGraphicsScene scene(0, 0, 100, 100); + QGraphicsView view(&scene); + view.resize(150, 150); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + + // Increase the probability of window activation + // not causing another repaint of test items. + QTest::qWait(50); + + EventTester *tester = new EventTester; + scene.addItem(tester); + QTest::qWait(10); + QTRY_COMPARE(tester->repaints, 1); + + // Switching from NoCache to NoCache (no repaint) + tester->setCacheMode(QGraphicsItem::NoCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 1); + + // Switching from NoCache to DeviceCoordinateCache (no repaint) + tester->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 1); + + // Switching from DeviceCoordinateCache to DeviceCoordinateCache (no repaint) + tester->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 1); + + // Switching from DeviceCoordinateCache to NoCache (no repaint) + tester->setCacheMode(QGraphicsItem::NoCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 1); + + // Switching from NoCache to ItemCoordinateCache (repaint) + tester->setCacheMode(QGraphicsItem::ItemCoordinateCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 2); + + // Switching from ItemCoordinateCache to ItemCoordinateCache (no repaint) + tester->setCacheMode(QGraphicsItem::ItemCoordinateCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 2); + + // Switching from ItemCoordinateCache to ItemCoordinateCache with different size (repaint) + tester->setCacheMode(QGraphicsItem::ItemCoordinateCache, QSize(100, 100)); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 3); + + // Switching from ItemCoordinateCache to NoCache (repaint) + tester->setCacheMode(QGraphicsItem::NoCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 4); + + // Switching from DeviceCoordinateCache to ItemCoordinateCache (repaint) + tester->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 4); + tester->setCacheMode(QGraphicsItem::ItemCoordinateCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 5); + + // Switching from ItemCoordinateCache to DeviceCoordinateCache (repaint) + tester->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + QTest::qWait(50); + QTRY_COMPARE(tester->repaints, 6); +} + void tst_QGraphicsItem::updateCachedItemAfterMove() { // A simple item that uses ItemCoordinateCache @@ -10002,5 +10081,105 @@ QTRY_COMPARE(view.repaints, 1); } +void tst_QGraphicsItem::QT_2649_focusScope() +{ + QGraphicsScene *scene = new QGraphicsScene; + + QGraphicsRectItem *subFocusItem = new QGraphicsRectItem; + subFocusItem->setFlags(QGraphicsItem::ItemIsFocusable); + subFocusItem->setFocus(); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + + QGraphicsRectItem *scope = new QGraphicsRectItem; + scope->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsFocusScope); + scope->setFocus(); + subFocusItem->setParentItem(scope); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + + QGraphicsRectItem *rootItem = new QGraphicsRectItem; + rootItem->setFlags(QGraphicsItem::ItemIsFocusable); + scope->setParentItem(rootItem); + QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + + scene->addItem(rootItem); + + QEvent windowActivate(QEvent::WindowActivate); + qApp->sendEvent(scene, &windowActivate); + scene->setFocus(); + + QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QVERIFY(subFocusItem->hasFocus()); + + scope->hide(); + + QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)0); + QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QVERIFY(!subFocusItem->hasFocus()); + + scope->show(); + + QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QVERIFY(subFocusItem->hasFocus()); + + // This should not crash + scope->hide(); + delete scene; +} + +class MyGraphicsItemWithItemChange : public QGraphicsWidget +{ +public: + MyGraphicsItemWithItemChange(QGraphicsItem *parent = 0) : QGraphicsWidget(parent) + {} + + QVariant itemChange(GraphicsItemChange change, const QVariant &value) + { + if (change == QGraphicsItem::ItemSceneHasChanged) { + foreach (QGraphicsView *view, scene()->views()) { + //We trigger a sort of unindexed items in the BSP + view->sceneRect(); + } + } + return QGraphicsWidget::itemChange(change, value); + } +}; + +void tst_QGraphicsItem::sortItemsWhileAdding() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + QGraphicsWidget grandGrandParent; + grandGrandParent.resize(200, 200); + scene.addItem(&grandGrandParent); + QGraphicsWidget grandParent; + grandParent.resize(200, 200); + QGraphicsWidget parent(&grandParent); + parent.resize(200, 200); + MyGraphicsItemWithItemChange item(&parent); + grandParent.setParentItem(&grandGrandParent); +} + QTEST_MAIN(tst_QGraphicsItem) #include "tst_qgraphicsitem.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp --- a/tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -3426,85 +3426,106 @@ scene.setItemIndexMethod(QGraphicsScene::NoIndex); QGraphicsProxyWidget *proxy = scene.addWidget(new QLineEdit); - EventSpy proxySpy(proxy); - EventSpy widgetSpy(proxy->widget()); - QGraphicsView view(&scene); - view.setFrameStyle(0); - view.resize(300, 300); - view.show(); + + { + EventSpy proxySpy(proxy); + EventSpy widgetSpy(proxy->widget()); + + view.setFrameStyle(0); + view.resize(300, 300); + view.show(); #ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&view); + qt_x11_wait_for_window_manager(&view); #endif - QApplication::setActiveWindow(&view); - QTest::qWait(25); - QTRY_COMPARE(QApplication::activeWindow(), &view); - - QVERIFY(!proxy->hasFocus()); - QVERIFY(!proxy->widget()->hasFocus()); - - QCOMPARE(proxySpy.counts[QEvent::FocusIn], 0); - QCOMPARE(proxySpy.counts[QEvent::FocusOut], 0); - QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 0); - QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 0); - - QPointF lineEditCenter = proxy->mapToScene(proxy->boundingRect().center()); - // Spontaneous mouse click sets focus on a clickable widget. - for (int retry = 0; retry < 50 && !proxy->hasFocus(); retry++) - QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter)); - QVERIFY(proxy->hasFocus()); - QVERIFY(proxy->widget()->hasFocus()); - QCOMPARE(proxySpy.counts[QEvent::FocusIn], 1); - QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 1); - - scene.setFocusItem(0); - QVERIFY(!proxy->hasFocus()); - QVERIFY(!proxy->widget()->hasFocus()); - QCOMPARE(proxySpy.counts[QEvent::FocusOut], 1); - QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 1); - - // Non-spontaneous mouse click sets focus if the widget has been clicked before - { - QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); - event.setScenePos(lineEditCenter); - event.setButton(Qt::LeftButton); - qApp->sendEvent(&scene, &event); + QApplication::setActiveWindow(&view); + QTest::qWait(25); + QTRY_COMPARE(QApplication::activeWindow(), &view); + + QVERIFY(!proxy->hasFocus()); + QVERIFY(!proxy->widget()->hasFocus()); + + QCOMPARE(proxySpy.counts[QEvent::FocusIn], 0); + QCOMPARE(proxySpy.counts[QEvent::FocusOut], 0); + QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 0); + QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 0); + + QPointF lineEditCenter = proxy->mapToScene(proxy->boundingRect().center()); + // Spontaneous mouse click sets focus on a clickable widget. + for (int retry = 0; retry < 50 && !proxy->hasFocus(); retry++) + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter)); QVERIFY(proxy->hasFocus()); QVERIFY(proxy->widget()->hasFocus()); - QCOMPARE(proxySpy.counts[QEvent::FocusIn], 2); - QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 2); + QCOMPARE(proxySpy.counts[QEvent::FocusIn], 1); + QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 1); + + scene.setFocusItem(0); + QVERIFY(!proxy->hasFocus()); + QVERIFY(!proxy->widget()->hasFocus()); + QCOMPARE(proxySpy.counts[QEvent::FocusOut], 1); + QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 1); + + // Non-spontaneous mouse click sets focus if the widget has been clicked before + { + QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); + event.setScenePos(lineEditCenter); + event.setButton(Qt::LeftButton); + qApp->sendEvent(&scene, &event); + QVERIFY(proxy->hasFocus()); + QVERIFY(proxy->widget()->hasFocus()); + QCOMPARE(proxySpy.counts[QEvent::FocusIn], 2); + QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 2); + } } scene.setFocusItem(0); proxy->setWidget(new QLineEdit); // resets focusWidget - QVERIFY(!proxy->hasFocus()); - QVERIFY(!proxy->widget()->hasFocus()); - QCOMPARE(proxySpy.counts[QEvent::FocusOut], 2); - QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 2); - - // Non-spontaneous mouse click does not set focus on the embedded widget. + { - QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); - event.setScenePos(lineEditCenter); - event.setButton(Qt::LeftButton); - qApp->sendEvent(&scene, &event); + QPointF lineEditCenter = proxy->mapToScene(proxy->boundingRect().center()); + EventSpy proxySpy(proxy); + EventSpy widgetSpy(proxy->widget()); QVERIFY(!proxy->hasFocus()); QVERIFY(!proxy->widget()->hasFocus()); - QCOMPARE(proxySpy.counts[QEvent::FocusIn], 2); - QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 2); + QCOMPARE(proxySpy.counts[QEvent::FocusOut], 0); + QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 0); + + // Non-spontaneous mouse click does not set focus on the embedded widget. + { + QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); + event.setScenePos(lineEditCenter); + event.setButton(Qt::LeftButton); + qApp->sendEvent(&scene, &event); + QVERIFY(!proxy->hasFocus()); + QVERIFY(!proxy->widget()->hasFocus()); + QCOMPARE(proxySpy.counts[QEvent::FocusIn], 0); + QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 0); + } + + scene.setFocusItem(0); + QVERIFY(!proxy->hasFocus()); + QVERIFY(!proxy->widget()->hasFocus()); + QCOMPARE(proxySpy.counts[QEvent::FocusOut], 0); + QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 0); + + // Spontaneous click on non-clickable widget does not give focus. + proxy->widget()->setFocusPolicy(Qt::NoFocus); + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter)); + QVERIFY(!proxy->hasFocus()); + QVERIFY(!proxy->widget()->hasFocus()); + + // Multiple clicks should only result in one FocusIn. + proxy->widget()->setFocusPolicy(Qt::StrongFocus); + scene.setFocusItem(0); + QVERIFY(!proxy->hasFocus()); + QVERIFY(!proxy->widget()->hasFocus()); + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter)); + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter)); + QVERIFY(proxy->hasFocus()); + QVERIFY(proxy->widget()->hasFocus()); + QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 1); + QCOMPARE(proxySpy.counts[QEvent::FocusIn], 1); } - - scene.setFocusItem(0); - QVERIFY(!proxy->hasFocus()); - QVERIFY(!proxy->widget()->hasFocus()); - QCOMPARE(proxySpy.counts[QEvent::FocusOut], 2); - QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 2); - - // Spontaneous click on non-clickable widget does not give focus. - proxy->widget()->setFocusPolicy(Qt::NoFocus); - QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter)); - QVERIFY(!proxy->hasFocus()); - QVERIFY(!proxy->widget()->hasFocus()); } void tst_QGraphicsProxyWidget::windowFrameMargins() diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp --- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp Mon May 03 13:17:34 2010 +0300 @@ -283,6 +283,7 @@ void task250680_childClip(); void taskQTBUG_5904_crashWithDeviceCoordinateCache(); void taskQT657_paintIntoCacheWithTransparentParts(); + void taskQTBUG_7863_paintIntoCacheWithTransparentParts(); }; void tst_QGraphicsScene::initTestCase() @@ -4348,12 +4349,14 @@ void tst_QGraphicsScene::taskQT657_paintIntoCacheWithTransparentParts() { + // Test using DeviceCoordinateCache and opaque item QWidget *w = new QWidget(); - w->setPalette(Qt::blue); + w->setPalette(QColor(0, 0, 255)); w->setGeometry(0, 0, 50, 50); QGraphicsScene *scene = new QGraphicsScene(); - QGraphicsView *view = new QGraphicsView(scene); + CustomView *view = new CustomView; + view->setScene(scene); QGraphicsProxyWidget *proxy = scene->addWidget(w); proxy->setCacheMode(QGraphicsItem::DeviceCoordinateCache); @@ -4361,13 +4364,14 @@ view->show(); QTest::qWaitForWindowShown(view); - w->update(10,10,10,10); + view->repaints = 0; + proxy->update(10, 10, 10, 10); QTest::qWait(50); + QTRY_VERIFY(view->repaints > 0); QPixmap pix; QGraphicsItemPrivate* itemp = QGraphicsItemPrivate::get(proxy); - QPixmapCache::Key key = itemp->extraItemCache()->deviceData.value(view->viewport()).key; - QVERIFY(QPixmapCache::find(key, &pix)); + QTRY_VERIFY(QPixmapCache::find(itemp->extraItemCache()->deviceData.value(view->viewport()).key, &pix)); QTransform t = proxy->sceneTransform(); // Map from scene coordinates to pixmap coordinates. @@ -4382,6 +4386,138 @@ for(int j = 0; j < im.height(); j++) QCOMPARE(qAlpha(im.pixel(i, j)), 255); } + + delete w; +} + +void tst_QGraphicsScene::taskQTBUG_7863_paintIntoCacheWithTransparentParts() +{ + // Test using DeviceCoordinateCache and semi-transparent item + { + QGraphicsRectItem *backItem = new QGraphicsRectItem(0, 0, 100, 100); + backItem->setBrush(QColor(255, 255, 0)); + QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 50, 50); + rectItem->setBrush(QColor(0, 0, 255, 125)); + rectItem->setParentItem(backItem); + + QGraphicsScene *scene = new QGraphicsScene(); + CustomView *view = new CustomView; + view->setScene(scene); + + scene->addItem(backItem); + rectItem->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + backItem->rotate(15); + + view->show(); + QTest::qWaitForWindowShown(view); + view->repaints = 0; + rectItem->update(10, 10, 10, 10); + QTest::qWait(50); + QTRY_VERIFY(view->repaints > 0); + + QPixmap pix; + QGraphicsItemPrivate* itemp = QGraphicsItemPrivate::get(rectItem); + QTRY_VERIFY(QPixmapCache::find(itemp->extraItemCache()->deviceData.value(view->viewport()).key, &pix)); + + QTransform t = rectItem->sceneTransform(); + // Map from scene coordinates to pixmap coordinates. + // X origin in the pixmap is the most-left point + // of the item's boundingRect in the scene. + qreal adjust = t.mapRect(rectItem->boundingRect().toRect()).left(); + QRect rect = t.mapRect(QRect(10, 10, 10, 10)).adjusted(-adjust, 0, -adjust + 1, 1); + QPixmap subpix = pix.copy(rect); + + QImage im = subpix.toImage(); + for(int i = 0; i < im.width(); i++) { + for(int j = 0; j < im.height(); j++) { + QCOMPARE(qAlpha(im.pixel(i, j)), 125); + } + } + + delete view; + } + + // Test using ItemCoordinateCache and opaque item + { + QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 50, 50); + rectItem->setBrush(QColor(0, 0, 255)); + + QGraphicsScene *scene = new QGraphicsScene(); + CustomView *view = new CustomView; + view->setScene(scene); + + scene->addItem(rectItem); + rectItem->setCacheMode(QGraphicsItem::ItemCoordinateCache); + rectItem->rotate(15); + + view->show(); + QTest::qWaitForWindowShown(view); + view->repaints = 0; + rectItem->update(10, 10, 10, 10); + QTest::qWait(50); + QTRY_VERIFY(view->repaints > 0); + + QPixmap pix; + QGraphicsItemPrivate* itemp = QGraphicsItemPrivate::get(rectItem); + QTRY_VERIFY(QPixmapCache::find(itemp->extraItemCache()->key, &pix)); + + QTransform t = rectItem->sceneTransform(); + // Map from scene coordinates to pixmap coordinates. + // X origin in the pixmap is the most-left point + // of the item's boundingRect in the scene. + qreal adjust = t.mapRect(rectItem->boundingRect().toRect()).left(); + QRect rect = t.mapRect(QRect(10, 10, 10, 10)).adjusted(-adjust, 0, -adjust + 1, 1); + QPixmap subpix = pix.copy(rect); + + QImage im = subpix.toImage(); + for(int i = 0; i < im.width(); i++) { + for(int j = 0; j < im.height(); j++) + QCOMPARE(qAlpha(im.pixel(i, j)), 255); + } + + delete view; + } + + // Test using ItemCoordinateCache and semi-transparent item + { + QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 50, 50); + rectItem->setBrush(QColor(0, 0, 255, 125)); + + QGraphicsScene *scene = new QGraphicsScene(); + CustomView *view = new CustomView; + view->setScene(scene); + + scene->addItem(rectItem); + rectItem->setCacheMode(QGraphicsItem::ItemCoordinateCache); + rectItem->rotate(15); + + view->show(); + QTest::qWaitForWindowShown(view); + view->repaints = 0; + rectItem->update(10, 10, 10, 10); + QTest::qWait(50); + QTRY_VERIFY(view->repaints > 0); + + QPixmap pix; + QGraphicsItemPrivate* itemp = QGraphicsItemPrivate::get(rectItem); + QTRY_VERIFY(QPixmapCache::find(itemp->extraItemCache()->key, &pix)); + + QTransform t = rectItem->sceneTransform(); + // Map from scene coordinates to pixmap coordinates. + // X origin in the pixmap is the most-left point + // of the item's boundingRect in the scene. + qreal adjust = t.mapRect(rectItem->boundingRect().toRect()).left(); + QRect rect = t.mapRect(QRect(10, 10, 10, 10)).adjusted(-adjust, 0, -adjust + 1, 1); + QPixmap subpix = pix.copy(rect); + + QImage im = subpix.toImage(); + for(int i = 0; i < im.width(); i++) { + for(int j = 0; j < im.height(); j++) + QCOMPARE(qAlpha(im.pixel(i, j)), 125); + } + + delete view; + } } QTEST_MAIN(tst_QGraphicsScene) diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qgraphicsview/tst_qgraphicsview.cpp --- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp Mon May 03 13:17:34 2010 +0300 @@ -218,6 +218,8 @@ void update(); void inputMethodSensitivity(); void inputContextReset(); + void indirectPainting(); + void compositionModeInDrawBackground(); // task specific tests below me void task172231_untransformableItems(); @@ -3799,6 +3801,64 @@ QCOMPARE(inputContext.resets, 0); } +void tst_QGraphicsView::indirectPainting() +{ + class MyScene : public QGraphicsScene + { public: + MyScene() : QGraphicsScene(), drawCount(0) {} + void drawItems(QPainter *, int, QGraphicsItem **, const QStyleOptionGraphicsItem *, QWidget *) + { ++drawCount; } + int drawCount; + }; + + MyScene scene; + QGraphicsItem *item = scene.addRect(0, 0, 50, 50); + + QGraphicsView view(&scene); + view.setOptimizationFlag(QGraphicsView::IndirectPainting); + view.show(); + QTest::qWaitForWindowShown(&view); + QTest::qWait(100); + + scene.drawCount = 0; + item->setPos(20, 20); + QApplication::processEvents(); + QTRY_VERIFY(scene.drawCount > 0); +} + +void tst_QGraphicsView::compositionModeInDrawBackground() +{ + class MyView : public QGraphicsView + { public: + MyView(QGraphicsScene *scene) : QGraphicsView(scene), + painted(false), compositionMode(QPainter::CompositionMode_SourceOver) {} + bool painted; + QPainter::CompositionMode compositionMode; + void drawBackground(QPainter *painter, const QRectF &) + { + compositionMode = painter->compositionMode(); + painted = true; + } + }; + + QGraphicsScene dummy; + MyView view(&dummy); + view.show(); + QTest::qWaitForWindowShown(&view); + + // Make sure the painter's composition mode is SourceOver in drawBackground. + QTRY_VERIFY(view.painted); + QCOMPARE(view.compositionMode, QPainter::CompositionMode_SourceOver); + + view.painted = false; + view.setCacheMode(QGraphicsView::CacheBackground); + view.viewport()->update(); + + // Make sure the painter's composition mode is SourceOver in drawBackground + // with background cache enabled. + QTRY_VERIFY(view.painted); + QCOMPARE(view.compositionMode, QPainter::CompositionMode_SourceOver); +} void tst_QGraphicsView::task253415_reconnectUpdateSceneOnSceneChanged() { QGraphicsView view; diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp --- a/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qgraphicswidget/tst_qgraphicswidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -111,6 +111,8 @@ void fontPropagationSceneChange(); void geometry_data(); void geometry(); + void width(); + void height(); void getContentsMargins_data(); void getContentsMargins(); void initStyleOption_data(); @@ -461,7 +463,7 @@ QFETCH(int, childWithFocus); SubQGraphicsWidget *widget = children[childWithFocus]; widget->setFocus(); - QVERIFY(widget->hasFocus()); + QTRY_VERIFY(widget->hasFocus()); QCOMPARE(parent->focusWidget(), static_cast(widget)); } } @@ -478,23 +480,23 @@ scene.addItem(widget); - QVERIFY(!widget->hasFocus()); + QTRY_VERIFY(!widget->hasFocus()); widget->setFocusPolicy(Qt::StrongFocus); - QVERIFY(!widget->hasFocus()); + QTRY_VERIFY(!widget->hasFocus()); QGraphicsWidget *subWidget = new QGraphicsWidget(widget); - QVERIFY(!subWidget->hasFocus()); + QTRY_VERIFY(!subWidget->hasFocus()); scene.setFocus(); - QVERIFY(!widget->hasFocus()); - QVERIFY(!subWidget->hasFocus()); + QTRY_VERIFY(!widget->hasFocus()); + QTRY_VERIFY(!subWidget->hasFocus()); widget->setFocus(); - QVERIFY(widget->hasFocus()); - QCOMPARE(focusInSpy.count(), 1); - QVERIFY(!subWidget->hasFocus()); + QTRY_VERIFY(widget->hasFocus()); + QTRY_COMPARE(focusInSpy.count(), 1); + QTRY_VERIFY(!subWidget->hasFocus()); QGraphicsWidget *otherSubWidget = new QGraphicsWidget; EventSpy otherFocusInSpy(otherSubWidget, QEvent::FocusIn); @@ -503,18 +505,18 @@ otherSubWidget->setFocusPolicy(Qt::StrongFocus); otherSubWidget->setParentItem(widget); - QVERIFY(widget->hasFocus()); + QTRY_VERIFY(widget->hasFocus()); QCOMPARE(scene.focusItem(), (QGraphicsItem *)widget); - QVERIFY(!subWidget->hasFocus()); - QVERIFY(!otherSubWidget->hasFocus()); + QTRY_VERIFY(!subWidget->hasFocus()); + QTRY_VERIFY(!otherSubWidget->hasFocus()); widget->hide(); - QVERIFY(!widget->hasFocus()); // lose but still has subfocus + QTRY_VERIFY(!widget->hasFocus()); // lose but still has subfocus QCOMPARE(focusInSpy.count(), 1); QCOMPARE(focusOutSpy.count(), 1); widget->show(); - QVERIFY(!widget->hasFocus()); // no regain + QTRY_VERIFY(!widget->hasFocus()); // no regain QCOMPARE(focusInSpy.count(), 1); QCOMPARE(focusOutSpy.count(), 1); @@ -522,24 +524,24 @@ // try to setup subFocus on item that can't take focus subWidget->setFocus(); - QVERIFY(!subWidget->hasFocus()); + QTRY_VERIFY(!subWidget->hasFocus()); QVERIFY(!scene.focusItem()); // but isn't the scene's focus item // try to setup subFocus on item that can take focus otherSubWidget->setFocus(); - QVERIFY(!otherSubWidget->hasFocus()); + QTRY_VERIFY(!otherSubWidget->hasFocus()); QCOMPARE(widget->focusWidget(), otherSubWidget); QVERIFY(!scene.focusItem()); // but isn't the scene's focus item widget->show(); - QCOMPARE(scene.focusItem(), (QGraphicsItem *)otherSubWidget); // but isn't the scene's focus item + QTRY_COMPARE(scene.focusItem(), (QGraphicsItem *)otherSubWidget); // but isn't the scene's focus item QCOMPARE(otherFocusInSpy.count(), 1); QCOMPARE(otherFocusOutSpy.count(), 0); delete otherSubWidget; - QCOMPARE(otherFocusOutSpy.count(), 1); + QTRY_COMPARE(otherFocusOutSpy.count(), 1); QVERIFY(!scene.focusItem()); QVERIFY(!widget->focusWidget()); } @@ -578,16 +580,16 @@ SubQGraphicsWidget *widget = new SubQGraphicsWidget; scene.addItem(widget); - QCOMPARE(Qt::NoFocus, widget->focusPolicy()); + QTRY_COMPARE(Qt::NoFocus, widget->focusPolicy()); QFETCH(Qt::FocusPolicy, focusPolicy1); widget->setFocusPolicy(focusPolicy1); - QCOMPARE(widget->focusPolicy(), focusPolicy1); + QTRY_COMPARE(widget->focusPolicy(), focusPolicy1); bool isFocusable = widget->flags() & QGraphicsItem::ItemIsFocusable; bool wasFocusable = isFocusable; - QVERIFY(isFocusable == (focusPolicy1 != Qt::NoFocus)); + QTRY_VERIFY(isFocusable == (focusPolicy1 != Qt::NoFocus)); widget->setFocus(); - QCOMPARE(widget->hasFocus(), isFocusable); + QTRY_COMPARE(widget->hasFocus(), isFocusable); QFETCH(Qt::FocusPolicy, focusPolicy2); widget->setFocusPolicy(focusPolicy2); @@ -690,25 +692,21 @@ EventSpy rootSpyFont(root, QEvent::FontChange); EventSpy rootSpyPolish(root, QEvent::Polish); - QCOMPARE(rootSpyFont.count(), 0); - QApplication::processEvents(); //The polish event is sent - QCOMPARE(rootSpyPolish.count(), 1); - QApplication::processEvents(); //Process events to see if we get the font change event + QTRY_COMPARE(rootSpyFont.count(), 0); + QTRY_COMPARE(rootSpyPolish.count(), 1); //The font is still the same so no fontChangeEvent - QCOMPARE(rootSpyFont.count(), 0); + QTRY_COMPARE(rootSpyFont.count(), 0); QFont font; font.setPointSize(43); root->setFont(font); - QApplication::processEvents(); //Process events to get the font change event //The font changed - QCOMPARE(rootSpyFont.count(), 1); + QTRY_COMPARE(rootSpyFont.count(), 1); //then roll back to the default one. root->setFont(appFont); - QApplication::processEvents(); //Process events to get the font change event //The font changed - QCOMPARE(rootSpyFont.count(), 2); + QTRY_COMPARE(rootSpyFont.count(), 2); } void tst_QGraphicsWidget::fontPropagationWidgetItemWidget() @@ -769,14 +767,42 @@ { SubQGraphicsWidget widget; QCOMPARE(widget.geometry(), QRectF(widget.pos(), widget.size())); - + QSignalSpy spy(&widget, SIGNAL(geometryChanged())); QFETCH(QPointF, pos); QFETCH(QSizeF, size); widget.setPos(pos); widget.resize(size); + if (!size.isNull()) + QCOMPARE(spy.count(), 1); QCOMPARE(widget.geometry(), QRectF(pos, size)); } +void tst_QGraphicsWidget::width() +{ + QGraphicsWidget w; + QCOMPARE(w.property("width").toReal(), qreal(0)); + QSignalSpy spy(&w, SIGNAL(widthChanged())); + w.setProperty("width", qreal(50)); + QCOMPARE(w.property("width").toReal(), qreal(50)); + QCOMPARE(spy.count(), 1); + //calling old school setGeometry should work too + w.setGeometry(0, 0, 200, 200); + QCOMPARE(spy.count(), 2); +} + +void tst_QGraphicsWidget::height() +{ + QGraphicsWidget w; + QCOMPARE(w.property("height").toReal(), qreal(0)); + QSignalSpy spy(&w, SIGNAL(heightChanged())); + w.setProperty("height", qreal(50)); + QCOMPARE(w.property("height").toReal(), qreal(50)); + QCOMPARE(spy.count(), 1); + //calling old school setGeometry should work too + w.setGeometry(0, 0, 200, 200); + QCOMPARE(spy.count(), 2); +} + void tst_QGraphicsWidget::getContentsMargins_data() { QTest::addColumn("left"); @@ -842,7 +868,6 @@ qt_x11_wait_for_window_manager(&view); #endif QApplication::setActiveWindow(&view); - QTest::qWait(25); QTRY_COMPARE(QApplication::activeWindow(), &view); view.setAlignment(Qt::AlignTop | Qt::AlignLeft); @@ -867,7 +892,6 @@ view.resize(300, 300); view.show(); QTest::qWaitForWindowShown(&view); - QTest::qWait(20); sendMouseMove(view.viewport(), view.mapFromScene(widget->mapToScene(widget->boundingRect().center()))); } @@ -920,9 +944,7 @@ } widget.setLayout(layout); - QTest::qWait(25); - - QCOMPARE(widget.layout(), static_cast(layout)); + QTRY_COMPARE(widget.layout(), static_cast(layout)); for (int i = 0; i < children.count(); ++i) { SubQGraphicsWidget *item = children[i]; QCOMPARE(item->parentWidget(), (QGraphicsWidget *)&widget); @@ -962,10 +984,9 @@ view->show(); QTest::qWaitForWindowShown(view); for (int i = 0; i < children.count(); ++i) { - QCOMPARE(children[i]->layoutDirection(), layoutDirection); - QCOMPARE(children[i]->testAttribute(Qt::WA_SetLayoutDirection), false); + QTRY_COMPARE(children[i]->layoutDirection(), layoutDirection); + QTRY_COMPARE(children[i]->testAttribute(Qt::WA_SetLayoutDirection), false); view->repaint(); - QApplication::processEvents(); QTRY_COMPARE(children[i]->m_painterLayoutDirection, layoutDirection); } delete view; @@ -1178,7 +1199,6 @@ qt_x11_wait_for_window_manager(&view); #endif QApplication::setActiveWindow(&view); - QTest::qWait(25); QTRY_COMPARE(QApplication::activeWindow(), &view); QGraphicsWidget *lastItem = 0; @@ -1199,7 +1219,6 @@ if (!children.isEmpty()) { QGraphicsWidget *first = children.first(); view.viewport()->setFocus(); - QApplication::processEvents(); QTRY_VERIFY(view.viewport()->hasFocus()); first->setFocus(); QVERIFY(first->hasFocus()); @@ -1460,18 +1479,14 @@ QTest::qWaitForWindowShown(window); lineEdit->setFocus(); - QTest::qWait(25); QTRY_VERIFY(lineEdit->hasFocus()); QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); - QTest::qWait(25); QTRY_VERIFY(w1_1->hasFocus()); QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); - QTest::qWait(25); QTRY_VERIFY(w1_2->hasFocus()); // remove the tabFocusFirst and insert new item delete w1_1; // calls _q_removeItemLater - QTest::qWait(25); SubQGraphicsWidget *w1_3 = new SubQGraphicsWidget; w1_3->setFocusPolicy(Qt::StrongFocus); w1_3->setData(0, "w1_3"); @@ -1479,14 +1494,11 @@ scene.addItem(w1_3); QTRY_VERIFY(w1_2->hasFocus()); QTest::keyPress(QApplication::focusWidget(), Qt::Key_Backtab); - QTest::qWait(25); QTRY_VERIFY(lineEdit->hasFocus()); // tabFocusFirst should now point to w1_2 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); - QTest::qWait(25); QTRY_VERIFY(w1_2->hasFocus()); QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); - QTest::qWait(25); QTRY_VERIFY(w1_3->hasFocus()); scene.removeItem(w1_2); // does not call _q_removeItemLater delete w1_2; // calls _q_removeItemLater @@ -1497,16 +1509,12 @@ w1_4->setGeometry(75,0,25, 25); scene.addItem(w1_4); QTRY_VERIFY(w1_3->hasFocus()); - QTest::qWait(25); QTRY_VERIFY(compareFocusChain(view, QList() << w1_3 << w1_4)); QTest::keyPress(QApplication::focusWidget(), Qt::Key_Backtab); - QTest::qWait(25); QTRY_VERIFY(lineEdit->hasFocus()); // tabFocusFirst should now point to w1_3 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); - QTest::qWait(25); QTRY_VERIFY(w1_3->hasFocus()); - QTest::qWait(25); QTRY_VERIFY(compareFocusChain(view, QList() << w1_3 << w1_4)); delete window; } @@ -1521,7 +1529,6 @@ qt_x11_wait_for_window_manager(&view); #endif QApplication::setActiveWindow(&view); - QTest::qWait(25); QTRY_COMPARE(QApplication::activeWindow(), &view); // delete item in focus chain with no focus and verify chain @@ -1755,31 +1762,29 @@ widget->setPreferredSize(pref); widget->setMaximumSize(max); - QApplication::processEvents(); - for (i = 0; i < compareInstructions.count(); ++i) { Inst input = compareInstructions.at(i); switch (input.first) { case MinimumSize: - QCOMPARE(widget->minimumSize(), input.second.toSizeF()); + QTRY_COMPARE(widget->minimumSize(), input.second.toSizeF()); break; case PreferredSize: - QCOMPARE(widget->preferredSize(), input.second.toSizeF()); + QTRY_COMPARE(widget->preferredSize(), input.second.toSizeF()); break; case MaximumSize: - QCOMPARE(widget->maximumSize(), input.second.toSizeF()); + QTRY_COMPARE(widget->maximumSize(), input.second.toSizeF()); break; case Size: - QCOMPARE(widget->size(), input.second.toSizeF()); + QTRY_COMPARE(widget->size(), input.second.toSizeF()); break; case MinimumWidth: - QCOMPARE(widget->minimumWidth(), qreal(input.second.toDouble())); + QTRY_COMPARE(widget->minimumWidth(), qreal(input.second.toDouble())); break; case PreferredWidth: - QCOMPARE(widget->preferredWidth(), qreal(input.second.toDouble())); + QTRY_COMPARE(widget->preferredWidth(), qreal(input.second.toDouble())); break; case MaximumWidth: - QCOMPARE(widget->maximumWidth(), qreal(input.second.toDouble())); + QTRY_COMPARE(widget->maximumWidth(), qreal(input.second.toDouble())); break; default: qWarning("instruction not implemented"); @@ -1834,14 +1839,13 @@ #ifdef Q_WS_X11 qt_x11_wait_for_window_manager(&view); #endif - QTest::qWait(100); - - QVERIFY(!scene.itemAt(25, 25)); + + QTRY_VERIFY(!scene.itemAt(25, 25)); widget->setGeometry(0, 112, 360, 528); - QCOMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget); + QTRY_COMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget); widget2->setGeometry(0, 573, 360, 67); - QCOMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget); - QCOMPARE(scene.itemAt(50, 585), (QGraphicsItem *)widget2); + QTRY_COMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget); + QTRY_COMPARE(scene.itemAt(50, 585), (QGraphicsItem *)widget2); } void tst_QGraphicsWidget::defaultSize() @@ -1856,7 +1860,6 @@ #ifdef Q_WS_X11 qt_x11_wait_for_window_manager(&view); #endif - QTest::qWait(50); QSizeF initialSize = widget->size(); widget->resize(initialSize); @@ -1866,9 +1869,8 @@ widget->setPreferredSize(60, 60); widget->setMaximumSize(110, 110); widget->setVisible(true); - QTest::qWait(50); // should still have its size set to initialsize - QCOMPARE(widget->geometry().size(), initialSize); + QTRY_COMPARE(widget->geometry().size(), initialSize); } @@ -2390,7 +2392,6 @@ scene.addItem(widget); view.show(); QTest::qWaitForWindowShown(&view); - QTest::qWait(500); } class ProxyStyle : public QCommonStyle @@ -2479,7 +2480,6 @@ view.setScene(&scene); view.show(); QApplication::setActiveWindow(&view); - QTest::qWait(25); QTRY_COMPARE(QApplication::activeWindow(), &view); @@ -2734,9 +2734,7 @@ QTest::qWaitForWindowShown(view); { // here we go - simulate a interactive resize of the window - QTest::qWait(100); QTest::mouseMove(view, view->mapFromScene(71, 71)); // bottom right corner - QTest::qWait(100); QTest::mousePress(view->viewport(), Qt::LeftButton, 0, view->mapFromScene(71, 71), 200); view->grabMouse(); @@ -2750,10 +2748,9 @@ QApplication::sendEvent(view->viewport(), &e); view->releaseMouse(); } - QTest::qWait(100); const QSizeF winSize = window->size(); qreal minHFW = window->effectiveSizeHint(Qt::MinimumSize, QSizeF(winSize.width(), -1)).height(); - QVERIFY(qAbs(minHFW - winSize.height()) < 1); + QTRY_VERIFY(qAbs(minHFW - winSize.height()) < 1); #endif } @@ -2805,7 +2802,7 @@ view.resize(200, 200); view.show(); QTest::qWaitForWindowShown(&view); - QCOMPARE(PolishWidget::numberOfPolish, 2); + QTRY_COMPARE(PolishWidget::numberOfPolish, 2); } void tst_QGraphicsWidget::polishEvent() @@ -2852,10 +2849,8 @@ widget->events.clear(); - QApplication::processEvents(); - // Make sure the item got polish event. - QVERIFY(widget->events.contains(QEvent::Polish)); + QTRY_VERIFY(widget->events.contains(QEvent::Polish)); } void tst_QGraphicsWidget::initialShow() @@ -2875,11 +2870,9 @@ view.show(); QTest::qWaitForWindowShown(&view); - QTest::qWait(100); scene.addItem(widget); - QTest::qWait(100); - - QCOMPARE(widget->repaints, 1); + + QTRY_COMPARE(widget->repaints, 1); } void tst_QGraphicsWidget::initialShow2() @@ -2908,7 +2901,6 @@ const int expectedRepaintCount = paintSpy.count(); delete dummyView; dummyView = 0; - QTest::qWait(200); MyGraphicsWidget *widget = new MyGraphicsWidget; widget->resize(100, 100); @@ -2921,7 +2913,7 @@ view.show(); QTest::qWaitForWindowShown(&view); - QCOMPARE(widget->repaints, expectedRepaintCount); + QTRY_COMPARE(widget->repaints, expectedRepaintCount); } void tst_QGraphicsWidget::QT_BUG_6544_tabFocusFirstUnsetWhenRemovingItems() diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qhostinfo/tst_qhostinfo.cpp --- a/tests/auto/qhostinfo/tst_qhostinfo.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qhostinfo/tst_qhostinfo.cpp Mon May 03 13:17:34 2010 +0300 @@ -72,6 +72,7 @@ #endif #include +#include "private/qhostinfo_p.h" #if !defined(QT_NO_GETADDRINFO) # if !defined(Q_OS_WINCE) @@ -108,10 +109,11 @@ public slots: void init(); void cleanup(); + void initTestCase(); + private slots: void getSetCheck(); void staticInformation(); - void initTestCase(); void lookupIPv4_data(); void lookupIPv4(); void lookupIPv6_data(); @@ -128,6 +130,8 @@ void multipleSameLookups(); void multipleDifferentLookups(); + void cache(); + protected slots: void resultsReady(const QHostInfo &); @@ -205,10 +209,21 @@ // We have IPv6 support ipv6Available = true; } + + + // run each testcase with and without test enabled + QTest::addColumn("cache"); + QTest::newRow("WithCache") << true; + QTest::newRow("WithoutCache") << false; } void tst_QHostInfo::init() { + // delete the cache so inidividual testcase results are independant from each other + qt_qhostinfo_clear_cache(); + + QFETCH_GLOBAL(bool, cache); + qt_qhostinfo_enable_cache(cache); } void tst_QHostInfo::cleanup() @@ -458,6 +473,45 @@ QTRY_VERIFY(lookupsDoneCounter == COUNT); } +void tst_QHostInfo::cache() +{ + QFETCH_GLOBAL(bool, cache); + if (!cache) + return; // test makes only sense when cache enabled + + // reset slot counter + lookupsDoneCounter = 0; + + // lookup once, wait in event loop, result should not come directly. + bool valid = true; + int id = -1; + QHostInfo result = qt_qhostinfo_lookup("localhost", this, SLOT(resultsReady(QHostInfo)), &valid, &id); + QTestEventLoop::instance().enterLoop(5); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(valid == false); + QVERIFY(result.addresses().isEmpty()); + + // loopkup second time, result should come directly + valid = false; + result = qt_qhostinfo_lookup("localhost", this, SLOT(resultsReady(QHostInfo)), &valid, &id); + QVERIFY(valid == true); + QVERIFY(!result.addresses().isEmpty()); + + // clear the cache + qt_qhostinfo_clear_cache(); + + // lookup third time, result should not come directly. + valid = true; + result = qt_qhostinfo_lookup("localhost", this, SLOT(resultsReady(QHostInfo)), &valid, &id); + QTestEventLoop::instance().enterLoop(5); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(valid == false); + QVERIFY(result.addresses().isEmpty()); + + // the slot should have been called 2 times. + QVERIFY(lookupsDoneCounter == 2); +} + void tst_QHostInfo::resultsReady(const QHostInfo &hi) { lookupDone = true; diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qicon/tst_qicon.cpp --- a/tests/auto/qicon/tst_qicon.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qicon/tst_qicon.cpp Mon May 03 13:17:34 2010 +0300 @@ -86,8 +86,14 @@ private: QString oldCurrentDir; + + const static QIcon staticIcon; }; +// Creating an icon statically should not cause a crash. +// But we do not officially support this. See QTBUG-8666 +const QIcon tst_QIcon::staticIcon = QIcon::fromTheme("edit-find"); + void tst_QIcon::init() { QString srcdir(QLatin1String(SRCDIR)); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qnetworkreply/tst_qnetworkreply.cpp --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp Mon May 03 13:17:34 2010 +0300 @@ -199,6 +199,10 @@ #endif void ioGetFromHttpBrokenServer_data(); void ioGetFromHttpBrokenServer(); + void ioGetFromHttpStatus100_data(); + void ioGetFromHttpStatus100(); + void ioGetFromHttpNoHeaders_data(); + void ioGetFromHttpNoHeaders(); void ioGetFromHttpWithCache_data(); void ioGetFromHttpWithCache(); @@ -271,6 +275,9 @@ void ignoreSslErrorsListWithSlot_data(); void ignoreSslErrorsListWithSlot(); #endif + + // NOTE: This test must be last! + void parentingRepliesToTheApp(); }; QT_BEGIN_NAMESPACE @@ -2074,6 +2081,60 @@ QVERIFY(reply->error() != QNetworkReply::NoError); } +void tst_QNetworkReply::ioGetFromHttpStatus100_data() +{ + QTest::addColumn("dataToSend"); + QTest::newRow("normal") << QByteArray("HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + QTest::newRow("minimal") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + QTest::newRow("minimal2") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.0 200 OK\r\n\r\n"); + QTest::newRow("minimal3") << QByteArray("HTTP/1.1 100 Continue\n\nHTTP/1.0 200 OK\n\n"); + QTest::newRow("with_headers") << QByteArray("HTTP/1.1 100 Continue\r\nBla: x\r\n\r\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + QTest::newRow("with_headers2") << QByteArray("HTTP/1.1 100 Continue\nBla: x\n\nHTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); +} + +void tst_QNetworkReply::ioGetFromHttpStatus100() +{ + QFETCH(QByteArray, dataToSend); + MiniHttpServer server(dataToSend); + server.doClose = true; + + QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort()))); + QNetworkReplyPtr reply = manager.get(request); + + connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QCOMPARE(reply->url(), request.url()); + QCOMPARE(reply->error(), QNetworkReply::NoError); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); + QVERIFY(reply->rawHeader("bla").isNull()); +} + +void tst_QNetworkReply::ioGetFromHttpNoHeaders_data() +{ + QTest::addColumn("dataToSend"); + QTest::newRow("justStatus+noheaders+disconnect") << QByteArray("HTTP/1.0 200 OK\r\n\r\n"); +} + +void tst_QNetworkReply::ioGetFromHttpNoHeaders() +{ + QFETCH(QByteArray, dataToSend); + MiniHttpServer server(dataToSend); + server.doClose = true; + + QNetworkRequest request(QUrl("http://localhost:" + QString::number(server.serverPort()))); + QNetworkReplyPtr reply = manager.get(request); + + connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QCOMPARE(reply->url(), request.url()); + QCOMPARE(reply->error(), QNetworkReply::NoError); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); +} + void tst_QNetworkReply::ioGetFromHttpWithCache_data() { qRegisterMetaType(); @@ -3773,7 +3834,7 @@ for (int i = 0; i < 10; i++) { QNetworkRequest request (QUrl("http://127.0.0.1:" + QString::number(server.serverPort()) + "/" + QString::number(i))); QNetworkReply* reply = manager.get(request); - reply->setParent(this); + reply->setParent(&server); } int pendingConnectionCount = 0; @@ -4047,5 +4108,13 @@ #endif // QT_NO_OPENSSL +// NOTE: This test must be last testcase in tst_qnetworkreply! +void tst_QNetworkReply::parentingRepliesToTheApp() +{ + QNetworkRequest request (QUrl("http://" + QtNetworkSettings::serverName())); + manager.get(request)->setParent(this); // parent to this object + manager.get(request)->setParent(qApp); // parent to the app +} + QTEST_MAIN(tst_QNetworkReply) #include "tst_qnetworkreply.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qobject/tst_qobject.cpp --- a/tests/auto/qobject/tst_qobject.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qobject/tst_qobject.cpp Mon May 03 13:17:34 2010 +0300 @@ -2647,6 +2647,16 @@ QVERIFY(spy.eventList().isEmpty()); } +class EmitThread : public QThread +{ Q_OBJECT +public: + void run(void) { + emit work(); + } +signals: + void work(); +}; + class DeleteObject : public QObject { Q_OBJECT @@ -2712,6 +2722,16 @@ QVERIFY(thread.wait(10000)); } + + { + EmitThread sender; + DeleteObject *receiver = new DeleteObject(); + connect(&sender, SIGNAL(work()), receiver, SLOT(deleteSelf()), Qt::DirectConnection); + QPointer p = receiver; + sender.start(); + QVERIFY(sender.wait(10000)); + QVERIFY(p.isNull()); + } } class DisconnectObject : public QObject diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qparallelanimationgroup/tst_qparallelanimationgroup.cpp --- a/tests/auto/qparallelanimationgroup/tst_qparallelanimationgroup.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qparallelanimationgroup/tst_qparallelanimationgroup.cpp Mon May 03 13:17:34 2010 +0300 @@ -75,6 +75,8 @@ void loopCount(); void autoAdd(); void pauseResume(); + + void QTBUG8910_crashWhenRemovingUncontrolledAnimation(); }; tst_QParallelAnimationGroup::tst_QParallelAnimationGroup() @@ -999,9 +1001,22 @@ QCOMPARE(spy.count(), 2); //this shouldn't have changed group.resume(); QCOMPARE(spy.count(), 2); //this shouldn't have changed +} - +void tst_QParallelAnimationGroup::QTBUG8910_crashWhenRemovingUncontrolledAnimation() +{ + QParallelAnimationGroup group; + TestAnimation *anim = new TestAnimation; + anim->setLoopCount(-1); + TestAnimation *anim2 = new TestAnimation; + anim2->setLoopCount(-1); + group.addAnimation(anim); + group.addAnimation(anim2); + group.start(); + delete anim; + // it would crash here because the internals of the group would still have a reference to anim + delete anim2; } diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp --- a/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qpropertyanimation/tst_qpropertyanimation.cpp Mon May 03 13:17:34 2010 +0300 @@ -40,6 +40,7 @@ ****************************************************************************/ #include +#include "../../shared/util.h" #include #include @@ -287,7 +288,7 @@ anim->start(); QTest::qWait(1000); - QCOMPARE(anim->state(), QAnimationGroup::Stopped); + QTRY_COMPARE(anim->state(), QAnimationGroup::Stopped); QCOMPARE(runningSpy.count(), 2); //started and stopped again runningSpy.clear(); QCOMPARE(finishedSpy.count(), 1); @@ -339,7 +340,7 @@ QCOMPARE(anim->state(), QAnimationGroup::Running); QTest::qWait(150); QVERIFY(anim); //The animation should not have been deleted - QCOMPARE(anim->state(), QAnimationGroup::Stopped); + QTRY_COMPARE(anim->state(), QAnimationGroup::Stopped); QCOMPARE(runningSpy.count(), 2); QCOMPARE(finishedSpy.count(), 1); @@ -350,9 +351,9 @@ QVERIFY(anim); QCOMPARE(anim->state(), QAnimationGroup::Running); QTest::qWait(150); + QTRY_COMPARE(runningSpy.count(), 4); + QCOMPARE(finishedSpy.count(), 2); QVERIFY(!anim); //The animation must have been deleted - QCOMPARE(runningSpy.count(), 4); - QCOMPARE(finishedSpy.count(), 2); delete object; } @@ -458,7 +459,7 @@ QTest::qWait(300); - QCOMPARE(o.values.first(), 42); + QTRY_COMPARE(o.values.first(), 42); QCOMPARE(o.values.last(), 420); } @@ -496,7 +497,7 @@ QSignalSpy runningSpy(anim, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State))); anim->start(QVariantAnimation::DeleteWhenStopped); QTest::qWait(anim->duration() + 100); - QCOMPARE(runningSpy.count(), 2); //started and then stopped + QTRY_COMPARE(runningSpy.count(), 2); //started and then stopped QVERIFY(!anim); } @@ -517,7 +518,7 @@ QVERIFY(!anim); //anim should have been deleted QVERIFY(anim2); QTest::qWait(anim2->duration()); - QVERIFY(!anim2); //anim2 is finished: it should have been deleted by now + QTRY_VERIFY(!anim2); //anim2 is finished: it should have been deleted by now QVERIFY(!anim); } @@ -590,7 +591,7 @@ QVERIFY(current < 100); QTest::qWait(200); - QCOMPARE(anim.state(), QVariantAnimation::Stopped); + QTRY_COMPARE(anim.state(), QVariantAnimation::Stopped); current = anim.currentValue().toInt(); QCOMPARE(current, 100); QCOMPARE(o.property("ole").toInt(), current); @@ -630,7 +631,7 @@ QVERIFY(current < 100); QTest::qWait(200); - QCOMPARE(anim.state(), QVariantAnimation::Stopped); + QTRY_COMPARE(anim.state(), QVariantAnimation::Stopped); current = anim.currentValue().toInt(); QCOMPARE(current, 100); QCOMPARE(o.property("ole").toInt(), current); @@ -660,7 +661,7 @@ anim.setEndValue(100); anim.start(); QTest::qWait(anim.duration() + 100); - QCOMPARE(anim.state(), QAbstractAnimation::Stopped); + QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped); QCOMPARE(anim.currentTime(), anim.duration()); //the animation is at the end @@ -668,7 +669,7 @@ anim.start(); QCOMPARE(anim.state(), QAbstractAnimation::Running); QTest::qWait(anim.duration() + 100); - QCOMPARE(anim.state(), QAbstractAnimation::Stopped); + QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped); QCOMPARE(anim.currentTime(), 0); //the direction is backward @@ -677,7 +678,7 @@ QCOMPARE(anim.state(), QAbstractAnimation::Running); QCOMPARE(anim.currentTime(), anim.duration()); QTest::qWait(anim.duration() + 100); - QCOMPARE(anim.state(), QAbstractAnimation::Stopped); + QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped); QCOMPARE(anim.currentTime(), 0); } @@ -1095,7 +1096,7 @@ QTest::qWait(anim.duration() + 100); - QCOMPARE(anim.state(), QAbstractAnimation::Stopped); + QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped); QCOMPARE(anim.currentTime(), anim.duration()); //let's check that the values go forward @@ -1145,7 +1146,7 @@ o2.anim.start(); QTest::qWait(o1.anim.duration() + 100); - QCOMPARE(o1.anim.state(), QAbstractAnimation::Stopped); + QTRY_COMPARE(o1.anim.state(), QAbstractAnimation::Stopped); QCOMPARE(o2.anim.state(), QAbstractAnimation::Stopped); QCOMPARE(o1.ole(), 1000); @@ -1196,7 +1197,7 @@ QCOMPARE(composedAnimation.state(), QAbstractAnimation::Running); QTest::qWait(composedAnimation.duration() + 100); - QCOMPARE(composedAnimation.state(), QAbstractAnimation::Stopped); + QTRY_COMPARE(composedAnimation.state(), QAbstractAnimation::Stopped); QCOMPARE(o.value(), 1000); } diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qscriptclass/tst_qscriptclass.cpp --- a/tests/auto/qscriptclass/tst_qscriptclass.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qscriptclass/tst_qscriptclass.cpp Mon May 03 13:17:34 2010 +0300 @@ -98,7 +98,12 @@ NotCallable, CallableReturnsSum, CallableReturnsArgument, - CallableReturnsInvalidVariant + CallableReturnsInvalidVariant, + CallableReturnsGlobalObject, + CallableReturnsThisObject, + CallableReturnsCallee, + CallableReturnsArgumentsObject, + CallableInitializesThisObject }; TestClass(QScriptEngine *engine); @@ -348,7 +353,7 @@ qsreal sum = 0; for (int i = 0; i < ctx->argumentCount(); ++i) sum += ctx->argument(i).toNumber(); - QScriptValueIterator it(ctx->thisObject()); + QScriptValueIterator it(ctx->callee()); while (it.hasNext()) { it.next(); sum += it.value().toNumber(); @@ -358,6 +363,17 @@ return qVariantFromValue(ctx->argument(0)); } else if (m_callableMode == CallableReturnsInvalidVariant) { return QVariant(); + } else if (m_callableMode == CallableReturnsGlobalObject) { + return qVariantFromValue(engine()->globalObject()); + } else if (m_callableMode == CallableReturnsThisObject) { + return qVariantFromValue(ctx->thisObject()); + } else if (m_callableMode == CallableReturnsCallee) { + return qVariantFromValue(ctx->callee()); + } else if (m_callableMode == CallableReturnsArgumentsObject) { + return qVariantFromValue(ctx->argumentsObject()); + } else if (m_callableMode == CallableInitializesThisObject) { + engine()->newQObject(ctx->thisObject(), engine()); + return QVariant(); } } else if (extension == HasInstance) { Q_ASSERT(m_hasInstance); @@ -796,9 +812,11 @@ QVERIFY(cls.supportsExtension(QScriptClass::Callable)); QScriptValue obj = eng.newObject(&cls); + eng.globalObject().setProperty("obj", obj); obj.setProperty("one", QScriptValue(&eng, 1)); obj.setProperty("two", QScriptValue(&eng, 2)); obj.setProperty("three", QScriptValue(&eng, 3)); + // From C++ cls.clearReceivedArgs(); { QScriptValueList args; @@ -809,8 +827,18 @@ QVERIFY(ret.isNumber()); QCOMPARE(ret.toNumber(), qsreal(15)); } + // From JS + cls.clearReceivedArgs(); + { + QScriptValue ret = eng.evaluate("obj(4, 5)"); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId()); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toNumber(), qsreal(15)); + } cls.setCallableMode(TestClass::CallableReturnsArgument); + // From C++ cls.clearReceivedArgs(); { QScriptValue ret = obj.call(obj, QScriptValueList() << 123); @@ -842,6 +870,13 @@ QScriptValue ret = obj.call(obj, QScriptValueList() << QScriptValue()); QVERIFY(ret.isUndefined()); } + // From JS + cls.clearReceivedArgs(); + { + QScriptValue ret = eng.evaluate("obj(123)"); + QVERIFY(ret.isNumber()); + QCOMPARE(ret.toInt32(), 123); + } cls.setCallableMode(TestClass::CallableReturnsInvalidVariant); { @@ -849,13 +884,92 @@ QVERIFY(ret.isUndefined()); } + cls.setCallableMode(TestClass::CallableReturnsThisObject); + // From C++ + { + QScriptValue ret = obj.call(obj); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(obj)); + } + // From JS + { + QScriptValue ret = eng.evaluate("obj()"); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(eng.globalObject())); + } + + cls.setCallableMode(TestClass::CallableReturnsCallee); + // From C++ + { + QScriptValue ret = obj.call(); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(obj)); + } + // From JS + { + QScriptValue ret = eng.evaluate("obj()"); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(obj)); + } + + cls.setCallableMode(TestClass::CallableReturnsArgumentsObject); + // From C++ + { + QScriptValue ret = obj.call(obj, QScriptValueList() << 123); + QVERIFY(ret.isObject()); + QVERIFY(ret.property("length").isNumber()); + QCOMPARE(ret.property("length").toInt32(), 1); + QVERIFY(ret.property(0).isNumber()); + QCOMPARE(ret.property(0).toInt32(), 123); + } + // From JS + { + QScriptValue ret = eng.evaluate("obj(123)"); + QVERIFY(ret.isObject()); + QVERIFY(ret.property("length").isNumber()); + QCOMPARE(ret.property("length").toInt32(), 1); + QVERIFY(ret.property(0).isNumber()); + QCOMPARE(ret.property(0).toInt32(), 123); + } + // construct() + // From C++ cls.clearReceivedArgs(); + cls.setCallableMode(TestClass::CallableReturnsGlobalObject); { QScriptValue ret = obj.construct(); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId()); QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(eng.globalObject())); + } + // From JS + cls.clearReceivedArgs(); + { + QScriptValue ret = eng.evaluate("new obj()"); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId()); + QVERIFY(ret.isObject()); + QVERIFY(ret.strictlyEquals(eng.globalObject())); + } + // From C++ + cls.clearReceivedArgs(); + cls.setCallableMode(TestClass::CallableInitializesThisObject); + { + QScriptValue ret = obj.construct(); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId()); + QVERIFY(ret.isQObject()); + QCOMPARE(ret.toQObject(), (QObject*)&eng); + } + // From JS + cls.clearReceivedArgs(); + { + QScriptValue ret = eng.evaluate("new obj()"); + QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); + QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId()); + QVERIFY(ret.isQObject()); + QCOMPARE(ret.toQObject(), (QObject*)&eng); } } // HasInstance diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qscriptengine/tst_qscriptengine.cpp --- a/tests/auto/qscriptengine/tst_qscriptengine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp Mon May 03 13:17:34 2010 +0300 @@ -150,6 +150,7 @@ void getSetAgent(); void reentrancy(); void incDecNonObjectProperty(); + void installTranslatorFunctions_data(); void installTranslatorFunctions(); void functionScopes(); void nativeFunctionScopes(); @@ -4118,22 +4119,46 @@ } } +void tst_QScriptEngine::installTranslatorFunctions_data() +{ + QTest::addColumn("useCustomGlobalObject"); + + QTest::newRow("Default global object") << false; + QTest::newRow("Custom global object") << true; +} + void tst_QScriptEngine::installTranslatorFunctions() { + QFETCH(bool, useCustomGlobalObject); + QScriptEngine eng; - QScriptValue global = eng.globalObject(); + QScriptValue globalOrig = eng.globalObject(); + QScriptValue global; + if (useCustomGlobalObject) { + global = eng.newObject(); + eng.setGlobalObject(global); + } else { + global = globalOrig; + } QVERIFY(!global.property("qsTranslate").isValid()); QVERIFY(!global.property("QT_TRANSLATE_NOOP").isValid()); QVERIFY(!global.property("qsTr").isValid()); QVERIFY(!global.property("QT_TR_NOOP").isValid()); - QVERIFY(!global.property("String").property("prototype").property("arg").isValid()); + QVERIFY(!globalOrig.property("String").property("prototype").property("arg").isValid()); eng.installTranslatorFunctions(); QVERIFY(global.property("qsTranslate").isFunction()); QVERIFY(global.property("QT_TRANSLATE_NOOP").isFunction()); QVERIFY(global.property("qsTr").isFunction()); QVERIFY(global.property("QT_TR_NOOP").isFunction()); - QVERIFY(global.property("String").property("prototype").property("arg").isFunction()); + QVERIFY(globalOrig.property("String").property("prototype").property("arg").isFunction()); + + if (useCustomGlobalObject) { + QVERIFY(!globalOrig.property("qsTranslate").isValid()); + QVERIFY(!globalOrig.property("QT_TRANSLATE_NOOP").isValid()); + QVERIFY(!globalOrig.property("qsTr").isValid()); + QVERIFY(!globalOrig.property("QT_TR_NOOP").isValid()); + } { QScriptValue ret = eng.evaluate("qsTr('foo')"); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qscriptstring/tst_qscriptstring.cpp --- a/tests/auto/qscriptstring/tst_qscriptstring.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qscriptstring/tst_qscriptstring.cpp Mon May 03 13:17:34 2010 +0300 @@ -177,6 +177,12 @@ QTest::newRow("101a") << QString::fromLatin1("101a") << false << quint32(0xffffffff); QTest::newRow("4294967294") << QString::fromLatin1("4294967294") << true << quint32(0xfffffffe); QTest::newRow("4294967295") << QString::fromLatin1("4294967295") << false << quint32(0xffffffff); + QTest::newRow("0.0") << QString::fromLatin1("0.0") << false << quint32(0xffffffff); + QTest::newRow("1.0") << QString::fromLatin1("1.0") << false << quint32(0xffffffff); + QTest::newRow("1.5") << QString::fromLatin1("1.5") << false << quint32(0xffffffff); + QTest::newRow("1.") << QString::fromLatin1("1.") << false << quint32(0xffffffff); + QTest::newRow(".1") << QString::fromLatin1(".1") << false << quint32(0xffffffff); + QTest::newRow("1e0") << QString::fromLatin1("1e0") << false << quint32(0xffffffff); } void tst_QScriptString::toArrayIndex() diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qscriptvalue/qscriptvalue.pro --- a/tests/auto/qscriptvalue/qscriptvalue.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qscriptvalue/qscriptvalue.pro Mon May 03 13:17:34 2010 +0300 @@ -5,3 +5,10 @@ # Generated by testgen SOURCES += tst_qscriptvalue_generated.cpp + + +win32-msvc* { + # With -O2, MSVC takes up to 24 minutes to compile this test! + QMAKE_CXXFLAGS_RELEASE -= -O1 -O2 + QMAKE_CXXFLAGS_RELEASE += -Od +} diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qscriptvalue/tst_qscriptvalue.cpp --- a/tests/auto/qscriptvalue/tst_qscriptvalue.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qscriptvalue/tst_qscriptvalue.cpp Mon May 03 13:17:34 2010 +0300 @@ -2571,6 +2571,10 @@ // call with something else as arguments QScriptValue ret5 = fun.call(QScriptValue(), QScriptValue(&eng, 123.0)); QCOMPARE(ret5.isError(), true); + // call with a non-array object as arguments + QScriptValue ret6 = fun.call(QScriptValue(), eng.globalObject()); + QVERIFY(ret6.isError()); + QCOMPARE(ret6.toString(), QString::fromLatin1("TypeError: Arguments must be an array")); } // calling things that are not functions @@ -2703,6 +2707,10 @@ // construct with something else as arguments QScriptValue ret5 = fun.construct(QScriptValue(&eng, 123.0)); QCOMPARE(ret5.isError(), true); + // construct with a non-array object as arguments + QScriptValue ret6 = fun.construct(eng.globalObject()); + QVERIFY(ret6.isError()); + QCOMPARE(ret6.toString(), QString::fromLatin1("TypeError: Arguments must be an array")); } // construct on things that are not functions diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp --- a/tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp Mon May 03 13:17:34 2010 +0300 @@ -934,8 +934,8 @@ QTest::qWait(500); + QTRY_COMPARE(group.state(), QAnimationGroup::Stopped); QVERIFY(group.currentLoopTime() == 375); - QCOMPARE(group.state(), QAnimationGroup::Stopped); } void tst_QSequentialAnimationGroup::clearGroup() @@ -1029,7 +1029,7 @@ QTest::qWait(500); - QCOMPARE(o.property("myProperty").toInt(), 44); + QTRY_COMPARE(o.property("myProperty").toInt(), 44); QCOMPARE(o2.property("myProperty").toInt(), 42); QCOMPARE(o2.property("myOtherProperty").toInt(), 31); QCOMPARE(a1->state(), QAnimationGroup::Stopped); @@ -1171,7 +1171,7 @@ QCOMPARE(anim1->state(), QAnimationGroup::Running); QTest::qWait(100); - QVERIFY(group.currentLoopTime() > 0); + QTRY_VERIFY(group.currentLoopTime() > 0); delete anim1; QCOMPARE(group.animationCount(), 0); @@ -1430,7 +1430,7 @@ QCOMPARE(notTimeDriven.currentLoopTime(), 0); QTest::qWait(300); //wait for the end of notTimeDriven - QCOMPARE(notTimeDriven.state(), QAnimationGroup::Stopped); + QTRY_COMPARE(notTimeDriven.state(), QAnimationGroup::Stopped); const int actualDuration = notTimeDriven.currentLoopTime(); QCOMPARE(group.state(), QAnimationGroup::Stopped); QCOMPARE(group.currentLoopTime(), actualDuration); @@ -1459,14 +1459,14 @@ QCOMPARE(animStateChangedSpy.count(), 0); QTest::qWait(300); //wait for the end of notTimeDriven - QCOMPARE(notTimeDriven.state(), QAnimationGroup::Stopped); + QTRY_COMPARE(notTimeDriven.state(), QAnimationGroup::Stopped); QCOMPARE(group.state(), QAnimationGroup::Running); QCOMPARE(anim.state(), QAnimationGroup::Running); QCOMPARE(group.currentAnimation(), static_cast(&anim)); QCOMPARE(animStateChangedSpy.count(), 1); QTest::qWait(300); //wait for the end of anim - QCOMPARE(anim.state(), QAnimationGroup::Stopped); + QTRY_COMPARE(anim.state(), QAnimationGroup::Stopped); QCOMPARE(anim.currentLoopTime(), anim.duration()); //we should simply be at the end @@ -1621,7 +1621,7 @@ group.start(); QTest::qWait(anim1->duration() + 100); - QCOMPARE(group.animationCount(), 0); + QTRY_COMPARE(group.animationCount(), 0); QCOMPARE(group.state(), QAbstractAnimation::Stopped); QCOMPARE(group.currentLoopTime(), 0); @@ -1629,8 +1629,8 @@ group.connect(anim1, SIGNAL(finished()), SLOT(refill())); group.start(); QTest::qWait(anim1->duration() + 100); + QTRY_COMPARE(group.state(), QAbstractAnimation::Running); QVERIFY(anim1 == 0); //anim1 should have been deleted - QCOMPARE(group.state(), QAbstractAnimation::Running); } void tst_QSequentialAnimationGroup::pauseResume() @@ -1645,7 +1645,7 @@ QCOMPARE(group.duration(), 250); group.start(); QTest::qWait(100); - QCOMPARE(group.state(), QAnimationGroup::Running); + QTRY_COMPARE(group.state(), QAnimationGroup::Running); QCOMPARE(anim->state(), QAnimationGroup::Running); QCOMPARE(spy.count(), 1); spy.clear(); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsqldatabase/tst_databases.h --- a/tests/auto/qsqldatabase/tst_databases.h Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsqldatabase/tst_databases.h Mon May 03 13:17:34 2010 +0300 @@ -95,12 +95,14 @@ // to prevent nameclashes on our database server, each machine // will use its own set of table names. Call this function to get // "tablename_hostname" -inline static QString qTableName( const QString& prefix, QSqlDriver* driver = 0 ) +inline static QString qTableName( const QString& prefix, const char *sourceFileName ) { - if ( !driver ) - return prefix + "_" + qGetHostName().replace( "-", "_" ); - else - return driver->escapeIdentifier( prefix + "_" + qGetHostName(), QSqlDriver::TableName ); + return QLatin1String("dbtst")+QString::number(qHash(QLatin1String(sourceFileName) + "_" + qGetHostName().replace( "-", "_" )), 16)+"_"+prefix; +} + +inline static QString qTableName( const QString& prefix, QSqlDriver* driver ) +{ + return driver->escapeIdentifier( prefix + "_" + qGetHostName(), QSqlDriver::TableName ); } inline static bool testWhiteSpaceNames( const QString &name ) @@ -250,8 +252,8 @@ // addDb( "QODBC3", "DRIVER={SQL SERVER};SERVER=iceblink.nokia.troll.no\\ICEBLINK", "troll", "trond", "" ); // addDb( "QODBC3", "DRIVER={SQL Native Client};SERVER=silence.nokia.troll.no\\SQLEXPRESS", "troll", "trond", "" ); -// addDb( "QODBC", "DRIVER={MySQL ODBC 5.1 Driver};SERVER=mysql5-nokia.trolltech.com.au;DATABASE=testdb", "testuser", "Ee4Gabf6_", "" ); -// addDb( "QODBC", "DRIVER={MySQL ODBC 5.1 Driver};SERVER=mysql4-nokia.trolltech.com.au;DATABASE=testdb", "testuser", "Ee4Gabf6_", "" ); +// addDb( "QODBC", "DRIVER={MySQL ODBC 5.1 Driver};SERVER=bq-mysql50.apac.nokia.com;DATABASE=testdb", "testuser", "Ee4Gabf6_", "" ); +// addDb( "QODBC", "DRIVER={MySQL ODBC 5.1 Driver};SERVER=bq-mysql51.apac.nokia.com;DATABASE=testdb", "testuser", "Ee4Gabf6_", "" ); // addDb( "QODBC", "DRIVER={FreeTDS};SERVER=horsehead.nokia.troll.no;DATABASE=testdb;PORT=4101;UID=troll;PWD=trondk", "troll", "trondk", "" ); // addDb( "QODBC", "DRIVER={FreeTDS};SERVER=silence.nokia.troll.no;DATABASE=testdb;PORT=2392;UID=troll;PWD=trond", "troll", "trond", "" ); // addDb( "QODBC", "DRIVER={FreeTDS};SERVER=bq-winserv2003-x86-01.apac.nokia.com;DATABASE=testdb;PORT=1433;UID=testuser;PWD=Ee4Gabf6_;TDS_Version=8.0", "", "", "" ); @@ -261,7 +263,7 @@ // addDb( "QODBC3", "DRIVER={SQL SERVER};SERVER=bq-winserv2003-x86-01.apac.nokia.com;DATABASE=testdb;PORT=1433", "testuser", "Ee4Gabf6_", "" ); // addDb( "QODBC3", "DRIVER={SQL SERVER};SERVER=bq-winserv2008-x86-01.apac.nokia.com;DATABASE=testdb;PORT=1433", "testuser", "Ee4Gabf6_", "" ); // addDb( "QODBC", "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\\dbs\\access\\testdb.mdb", "", "", "" ); -// addDb( "QODBC", "DRIVER={Postgresql};SERVER=postgres81-nokia.trolltech.com.au;DATABASE=testdb", "testuser", "Ee4Gabf6_", "" ); +// addDb( "QODBC", "DRIVER={Postgresql};SERVER=bq-pgsql84.apac.nokia.com;DATABASE=testdb", "testuser", "Ee4Gabf6_", "" ); } void open() @@ -338,7 +340,7 @@ foreach(const QString &table2, dbtables.filter(table, Qt::CaseInsensitive)) { if(table2.compare(table.section('.', -1, -1), Qt::CaseInsensitive) == 0) { table=db.driver()->escapeIdentifier(table2, QSqlDriver::TableName); - if(db.driverName().startsWith( "QPSQL" )) + if(isPostgreSQL(db)) wasDropped = q.exec( "drop table " + table + " cascade"); else wasDropped = q.exec( "drop table " + table); @@ -483,16 +485,16 @@ static bool isPostgreSQL( QSqlDatabase db ) { - return db.driverName().startsWith("QPSQL") || (db.driverName().startsWith("QODBC") && db.databaseName().contains("PostgreSQL") ); + return db.driverName().startsWith("QPSQL") || (db.driverName().startsWith("QODBC") && ( db.databaseName().contains("PostgreSQL", Qt::CaseInsensitive) || db.databaseName().contains("pgsql", Qt::CaseInsensitive) ) ); } static bool isMySQL( QSqlDatabase db ) { - return db.driverName().startsWith("QMYSQL") || (db.driverName().startsWith("QODBC") && db.databaseName().contains("MySQL") ); + return db.driverName().startsWith("QMYSQL") || (db.driverName().startsWith("QODBC") && db.databaseName().contains("MySQL", Qt::CaseInsensitive) ); } static bool isDB2( QSqlDatabase db ) { - return db.driverName().startsWith("QDB2") || (db.driverName().startsWith("QODBC") && db.databaseName().contains("db2") ); + return db.driverName().startsWith("QDB2") || (db.driverName().startsWith("QODBC") && db.databaseName().contains("db2", Qt::CaseInsensitive) ); } // -1 on fail, else Oracle version diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsqldatabase/tst_qsqldatabase.cpp --- a/tests/auto/qsqldatabase/tst_qsqldatabase.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsqldatabase/tst_qsqldatabase.cpp Mon May 03 13:17:34 2010 +0300 @@ -259,10 +259,10 @@ // excluding the primary key field static int createFieldTable(const FieldDef fieldDefs[], QSqlDatabase db) { - tst_Databases::safeDropTable(db, qTableName("qtestfields")); + tst_Databases::safeDropTable(db, qTableName("qtestfields", __FILE__)); QSqlQuery q(db); // construct a create table statement consisting of all fieldtypes - QString qs = "create table " + qTableName("qtestfields"); + QString qs = "create table " + qTableName("qtestfields", __FILE__); QString autoName = tst_Databases::autoFieldName(db); if (tst_Databases::isMSAccess(db)) qs.append(" (id int not null"); @@ -316,18 +316,18 @@ // please never ever change this table; otherwise fix all tests ;) if (tst_Databases::isMSAccess(db)) { - QVERIFY_SQL(q, exec("create table " + qTableName("qtest") + + QVERIFY_SQL(q, exec("create table " + qTableName("qtest", __FILE__) + " (id int not null, t_varchar varchar(40) not null, t_char char(40), " "t_numeric number, primary key (id, t_varchar))")); } else { - QVERIFY_SQL(q, exec("create table " + qTableName("qtest") + + QVERIFY_SQL(q, exec("create table " + qTableName("qtest", __FILE__) + " (id integer not null, t_varchar varchar(40) not null, " "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar))")); } if (testWhiteSpaceNames(db.driverName())) { QString qry = "create table " - + db.driver()->escapeIdentifier(qTableName("qtest") + " test", QSqlDriver::TableName) + + db.driver()->escapeIdentifier(qTableName("qtest", __FILE__) + " test", QSqlDriver::TableName) + '(' + db.driver()->escapeIdentifier(QLatin1String("test test"), QSqlDriver::FieldName) + " int not null primary key)"; @@ -346,45 +346,45 @@ } // drop the view first, otherwise we'll get dependency problems - tst_Databases::safeDropViews(db, QStringList() << qTableName("qtest_view") << qTableName("qtest_view2")); + tst_Databases::safeDropViews(db, QStringList() << qTableName("qtest_view", __FILE__) << qTableName("qtest_view2", __FILE__)); QStringList tableNames; - tableNames << qTableName("qtest") - << qTableName("qtestfields") - << qTableName("qtestalter") - << qTableName("qtest_temp") - << qTableName("qtest_bigint") - << qTableName("qtest_xmltype") - << qTableName("latin1table") - << qTableName("qtest_sqlguid") - << qTableName("batable") - << qTableName("qtest_prec") - << qTableName("uint") - << qTableName("strings") - << qTableName("numericfields") - << qTableName("qtest_ibaseblobs") - << qTableName("qtestBindBool") - << qTableName("testqGetString") - << qTableName("qtest_sqlguid") - << qTableName("uint_table") - << qTableName("uint_test") - << qTableName("bug_249059"); + tableNames << qTableName("qtest", __FILE__) + << qTableName("qtestfields", __FILE__) + << qTableName("qtestalter", __FILE__) + << qTableName("qtest_temp", __FILE__) + << qTableName("qtest_bigint", __FILE__) + << qTableName("qtest_xmltype", __FILE__) + << qTableName("latin1table", __FILE__) + << qTableName("qtest_sqlguid", __FILE__) + << qTableName("batable", __FILE__) + << qTableName("qtest_prec", __FILE__) + << qTableName("uint", __FILE__) + << qTableName("strings", __FILE__) + << qTableName("numericfields", __FILE__) + << qTableName("qtest_ibaseblobs", __FILE__) + << qTableName("qtestBindBool", __FILE__) + << qTableName("testqGetString", __FILE__) + << qTableName("qtest_sqlguid", __FILE__) + << qTableName("uint_table", __FILE__) + << qTableName("uint_test", __FILE__) + << qTableName("bug_249059", __FILE__); QSqlQuery q(0, db); if (db.driverName().startsWith("QPSQL")) { - q.exec("drop schema " + qTableName("qtestschema") + " cascade"); - q.exec("drop schema " + qTableName("qtestScHeMa") + " cascade"); + q.exec("drop schema " + qTableName("qtestschema", __FILE__) + " cascade"); + q.exec("drop schema " + qTableName("qtestScHeMa", __FILE__) + " cascade"); } if (testWhiteSpaceNames(db.driverName())) - tableNames << db.driver()->escapeIdentifier(qTableName("qtest") + " test", QSqlDriver::TableName); + tableNames << db.driver()->escapeIdentifier(qTableName("qtest", __FILE__) + " test", QSqlDriver::TableName); tst_Databases::safeDropTables(db, tableNames); if (db.driverName().startsWith("QOCI")) { - q.exec("drop user "+qTableName("CREATOR")+" cascade"); - q.exec("drop user "+qTableName("APPUSER")+" cascade"); - q.exec("DROP TABLE system."+qTableName("mypassword")); + q.exec("drop user "+qTableName("CREATOR", __FILE__)+" cascade"); + q.exec("drop user "+qTableName("APPUSER", __FILE__)+" cascade"); + q.exec("DROP TABLE system."+qTableName("mypassword", __FILE__)); } } @@ -394,13 +394,14 @@ if (!db.isValid()) return; QSqlQuery q(db); + const QString qtest(qTableName("qtest", __FILE__)); - q.exec("delete from " + qTableName("qtest")); //non-fatal - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (0, 'VarChar0', 'Char0', 1.1)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (1, 'VarChar1', 'Char1', 2.2)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (2, 'VarChar2', 'Char2', 3.3)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (3, 'VarChar3', 'Char3', 4.4)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " (id, t_varchar, t_char, t_numeric) values (4, 'VarChar4', NULL, NULL)")); + q.exec("delete from " + qtest); //non-fatal + QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (0, 'VarChar0', 'Char0', 1.1)")); + QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (1, 'VarChar1', 'Char1', 2.2)")); + QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (2, 'VarChar2', 'Char2', 3.3)")); + QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (3, 'VarChar3', 'Char3', 4.4)")); + QVERIFY_SQL(q, exec("insert into " + qtest + " (id, t_varchar, t_char, t_numeric) values (4, 'VarChar4', NULL, NULL)")); } void tst_QSqlDatabase::initTestCase() @@ -496,7 +497,7 @@ Q3SqlRecordInfo rInf = db.recordInfo(q); QVERIFY(rInf.isEmpty()); - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_temp") + " (id int)")); + QVERIFY_SQL(q, exec("create table " + qTableName("qtest_temp", __FILE__) + " (id int)")); // query without result set should return empty record rec = db.record(q); @@ -512,6 +513,8 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); + const QString qtest(qTableName("qtest", __FILE__)), qtest_view(qTableName("qtest_view", __FILE__)), temp_tab(qTableName("test_tab", __FILE__)); + bool views = true; bool tempTables = false; @@ -520,50 +523,50 @@ QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); - if (!q.exec("CREATE VIEW " + qTableName("qtest_view") + " as select * from " + qTableName("qtest"))) { + if (!q.exec("CREATE VIEW " + qtest_view + " as select * from " + qtest)) { qDebug(QString("DBMS '%1' cannot handle VIEWs: %2").arg( tst_Databases::dbToString(db)).arg(QString(tst_Databases::printError(q.lastError()))).toLatin1()); views = false; } if (db.driverName().startsWith("QSQLITE3")) { - QVERIFY_SQL(q, exec("CREATE TEMPORARY TABLE " + qTableName("temp_tab") + " (id int)")); + QVERIFY_SQL(q, exec("CREATE TEMPORARY TABLE " + temp_tab + " (id int)")); tempTables = true; } QStringList tables = db.tables(QSql::Tables); - QVERIFY(tables.contains(qTableName("qtest"), Qt::CaseInsensitive)); + QVERIFY(tables.contains(qtest, Qt::CaseInsensitive)); QVERIFY(!tables.contains("sql_features", Qt::CaseInsensitive)); //check for postgres 7.4 internal tables if (views) { - QVERIFY(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)); + QVERIFY(!tables.contains(qtest_view, Qt::CaseInsensitive)); } if (tempTables) - QVERIFY(tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive)); + QVERIFY(tables.contains(temp_tab, Qt::CaseInsensitive)); tables = db.tables(QSql::Views); if (views) { - 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(!tables.contains(qtest_view, Qt::CaseInsensitive)) + qDebug() << "failed to find" << qtest_view << "in" << tables; + QVERIFY(tables.contains(qtest_view, Qt::CaseInsensitive)); } if (tempTables) - QVERIFY(!tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive)); - QVERIFY(!tables.contains(qTableName("qtest"), Qt::CaseInsensitive)); + QVERIFY(!tables.contains(temp_tab, Qt::CaseInsensitive)); + QVERIFY(!tables.contains(qtest, Qt::CaseInsensitive)); tables = db.tables(QSql::SystemTables); - QVERIFY(!tables.contains(qTableName("qtest"), Qt::CaseInsensitive)); - QVERIFY(!tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)); - QVERIFY(!tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive)); + QVERIFY(!tables.contains(qtest, Qt::CaseInsensitive)); + QVERIFY(!tables.contains(qtest_view, Qt::CaseInsensitive)); + QVERIFY(!tables.contains(temp_tab, Qt::CaseInsensitive)); tables = db.tables(QSql::AllTables); if (views) - QVERIFY(tables.contains(qTableName("qtest_view"), Qt::CaseInsensitive)); + QVERIFY(tables.contains(qtest_view, Qt::CaseInsensitive)); if (tempTables) - QVERIFY(tables.contains(qTableName("temp_tab"), Qt::CaseInsensitive)); - QVERIFY(tables.contains(qTableName("qtest"), Qt::CaseInsensitive)); + QVERIFY(tables.contains(temp_tab, Qt::CaseInsensitive)); + QVERIFY(tables.contains(qtest, Qt::CaseInsensitive)); if (db.driverName().startsWith("QPSQL")) { - QVERIFY(tables.contains(qTableName("qtest") + " test")); + QVERIFY(tables.contains(qtest + " test")); } } @@ -574,7 +577,7 @@ CHECK_DATABASE(db); if (testWhiteSpaceNames(db.driverName())) { - QString tableName = qTableName("qtest") + " test"; + const QString tableName(qTableName("qtest", __FILE__) + " test"); QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive)); QSqlRecord rec = db.record(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName)); @@ -602,14 +605,15 @@ QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); + const QString qtestalter(qTableName("qtestalter", __FILE__)); QSqlQuery q(db); - QVERIFY_SQL(q, exec("create table " + qTableName("qtestalter") + " (F1 char(20), F2 char(20), F3 char(20))")); - QSqlRecord rec = db.record(qTableName("qtestalter")); + QVERIFY_SQL(q, exec("create table " + qtestalter + " (F1 char(20), F2 char(20), F3 char(20))")); + QSqlRecord rec = db.record(qtestalter); QCOMPARE((int)rec.count(), 3); #ifdef QT3_SUPPORT - Q3SqlRecordInfo rinf = db.recordInfo(qTableName("qtestalter")); + Q3SqlRecordInfo rinf = db.recordInfo(qtestalter); QCOMPARE((int)rinf.count(), 3); #endif @@ -622,13 +626,13 @@ #endif } - if (!q.exec("alter table " + qTableName("qtestalter") + " drop column F2")) { + if (!q.exec("alter table " + qtestalter + " drop column F2")) { QSKIP("DBMS doesn't support dropping columns in ALTER TABLE statement", SkipSingle); } - rec = db.record(qTableName("qtestalter")); + rec = db.record(qtestalter); #ifdef QT3_SUPPORT - rinf = db.recordInfo(qTableName("qtestalter")); + rinf = db.recordInfo(qtestalter); #endif QCOMPARE((int)rec.count(), 2); @@ -643,7 +647,7 @@ QCOMPARE(rinf[ 1 ].name().upper(), QString("F3")); #endif - q.exec("select * from " + qTableName("qtestalter")); + q.exec("select * from " + qtestalter); #ifdef QT3_SUPPORT rec = db.record(q); @@ -730,17 +734,17 @@ // check whether recordInfo returns the right types #ifdef QT3_SUPPORT - Q3SqlRecordInfo inf = db.recordInfo(qTableName("qtestfields")); + Q3SqlRecordInfo inf = db.recordInfo(qTableName("qtestfields", __FILE__)); QCOMPARE((int)inf.count(), fieldCount+1); testRecordInfo(fieldDefs, inf); #endif - QSqlRecord rec = db.record(qTableName("qtestfields")); + QSqlRecord rec = db.record(qTableName("qtestfields", __FILE__)); QCOMPARE((int)rec.count(), fieldCount+1); testRecord(fieldDefs, rec, db); QSqlQuery q(db); - QVERIFY_SQL(q, exec("select * from " + qTableName("qtestfields"))); + QVERIFY_SQL(q, exec("select * from " + qTableName("qtestfields", __FILE__))); #ifdef QT3_SUPPORT inf = db.recordInfo(q); @@ -760,7 +764,7 @@ #ifdef QT3_SUPPORT CHECK_DATABASE(db); - Q3SqlCursor cur(qTableName("qtestfields"), true, db); + Q3SqlCursor cur(qTableName("qtestfields", __FILE__), true, db); QVERIFY_SQL(cur, select()); QSqlRecord* rec = cur.primeInsert(); Q_ASSERT(rec); @@ -821,7 +825,7 @@ #ifdef QT3_SUPPORT CHECK_DATABASE(db); - Q3SqlCursor cur(qTableName("qtestfields"), true, db); + Q3SqlCursor cur(qTableName("qtestfields", __FILE__), true, db); QVERIFY_SQL(cur, select()); QSqlRecord* rec = cur.primeInsert(); Q_ASSERT(rec); @@ -955,12 +959,12 @@ checkValues(fieldDefs, db); // some additional tests - QSqlRecord rec = db.record(qTableName("qtestfields")); + QSqlRecord rec = db.record(qTableName("qtestfields", __FILE__)); QCOMPARE(rec.field("T_NUMBER").length(), 10); QCOMPARE(rec.field("T_NUMBER").precision(), 5); QSqlQuery q(db); - QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtestfields"))); + QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtestfields", __FILE__))); rec = q.record(); QCOMPARE(rec.field("T_NUMBER").length(), 10); QCOMPARE(rec.field("T_NUMBER").precision(), 5); @@ -1024,11 +1028,11 @@ if(tst_Databases::isPostgreSQL(db)) QVERIFY_SQL( q, exec("set client_min_messages='warning'")); - q.exec("drop sequence " + qTableName("qtestfields") + "_t_bigserial_seq"); - q.exec("drop sequence " + qTableName("qtestfields") + "_t_serial_seq"); + q.exec("drop sequence " + qTableName("qtestfields", __FILE__) + "_t_bigserial_seq"); + q.exec("drop sequence " + qTableName("qtestfields", __FILE__) + "_t_serial_seq"); // older psql cut off the table name - q.exec("drop sequence " + qTableName("qtestfields").left(15) + "_t_bigserial_seq"); - q.exec("drop sequence " + qTableName("qtestfields").left(18) + "_t_serial_seq"); + q.exec("drop sequence " + qTableName("qtestfields", __FILE__).left(15) + "_t_bigserial_seq"); + q.exec("drop sequence " + qTableName("qtestfields", __FILE__).left(18) + "_t_serial_seq"); const int fieldCount = createFieldTable(fieldDefs, db); QVERIFY(fieldCount > 0); @@ -1325,6 +1329,7 @@ QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); + const QString qtest(qTableName("qtest", __FILE__)); if (!db.driver()->hasFeature(QSqlDriver::Transactions)) { QSKIP("DBMS not transaction capable", SkipSingle); @@ -1333,8 +1338,8 @@ QVERIFY(db.transaction()); QSqlQuery q(db); - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " values (40, 'VarChar40', 'Char40', 40.40)")); - QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 40")); + QVERIFY_SQL(q, exec("insert into " + qtest + " values (40, 'VarChar40', 'Char40', 40.40)")); + QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 40")); QVERIFY(q.next()); QCOMPARE(q.value(0).toInt(), 40); q.clear(); @@ -1342,15 +1347,15 @@ QVERIFY(db.commit()); QVERIFY(db.transaction()); - QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 40")); + QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 40")); QVERIFY(q.next()); QCOMPARE(q.value(0).toInt(), 40); q.clear(); QVERIFY(db.commit()); QVERIFY(db.transaction()); - QVERIFY_SQL(q, exec("insert into " + qTableName("qtest") + " values (41, 'VarChar41', 'Char41', 41.41)")); - QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 41")); + QVERIFY_SQL(q, exec("insert into " + qtest + " values (41, 'VarChar41', 'Char41', 41.41)")); + QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 41")); QVERIFY(q.next()); QCOMPARE(q.value(0).toInt(), 41); q.clear(); // for SQLite which does not allow any references on rows that shall be rolled back @@ -1363,7 +1368,7 @@ } } - QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 41")); + QVERIFY_SQL(q, exec("select * from " + qtest + " where id = 41")); if(db.driverName().startsWith("QODBC") && dbName.contains("MySQL")) QEXPECT_FAIL("", "Some odbc drivers don't actually roll back despite telling us they do, especially the mysql driver", Continue); QVERIFY(!q.next()); @@ -1377,6 +1382,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); QString drvName = db.driverName(); + const QString qtest_bigint(qTableName("qtest_bigint", __FILE__)); QSqlQuery q(db); q.setForwardOnly(true); @@ -1384,19 +1390,19 @@ q.setNumericalPrecisionPolicy(QSql::LowPrecisionInt64); if (drvName.startsWith("QMYSQL")) { - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit bigint, t_u64bit bigint unsigned)")); + QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit bigint, t_u64bit bigint unsigned)")); } else if (drvName.startsWith("QPSQL") || drvName.startsWith("QDB2") || tst_Databases::isSqlServer(db)) { - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + "(id int, t_s64bit bigint, t_u64bit bigint)")); + QVERIFY_SQL(q, exec("create table " + qtest_bigint + "(id int, t_s64bit bigint, t_u64bit bigint)")); } else if (drvName.startsWith("QOCI")) { - QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit int, t_u64bit int)")); + QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit int, t_u64bit int)")); //} else if (drvName.startsWith("QIBASE")) { - // QVERIFY_SQL(q, exec("create table " + qTableName("qtest_bigint") + " (id int, t_s64bit int64, t_u64bit int64)")); + // QVERIFY_SQL(q, exec("create table " + qtest_bigint + " (id int, t_s64bit int64, t_u64bit int64)")); } else { QSKIP("no 64 bit integer support", SkipAll); } - QVERIFY(q.prepare("insert into " + qTableName("qtest_bigint") + " values (?, ?, ?)")); + QVERIFY(q.prepare("insert into " + qtest_bigint + " values (?, ?, ?)")); qlonglong ll = Q_INT64_C(9223372036854775807); qulonglong ull = Q_UINT64_C(18446744073709551615); @@ -1420,7 +1426,7 @@ q.bindValue(2, (qlonglong) ull); QVERIFY_SQL(q, exec()); } - QVERIFY(q.exec("select * from " + qTableName("qtest_bigint") + " order by id")); + QVERIFY(q.exec("select * from " + qtest_bigint + " order by id")); QVERIFY(q.next()); QCOMPARE(q.value(1).toDouble(), (double)ll); QCOMPARE(q.value(1).toLongLong(), ll); @@ -1447,32 +1453,32 @@ || db.driverName().startsWith("QODBC")) cs = true; - QSqlRecord rec = db.record(qTableName("qtest")); + QSqlRecord rec = db.record(qTableName("qtest", __FILE__)); QVERIFY((int)rec.count() > 0); if (!cs) { - rec = db.record(qTableName("QTEST").toUpper()); + rec = db.record(qTableName("QTEST", __FILE__).toUpper()); QVERIFY((int)rec.count() > 0); - rec = db.record(qTableName("qTesT")); + rec = db.record(qTableName("qTesT", __FILE__)); QVERIFY((int)rec.count() > 0); } #ifdef QT3_SUPPORT - Q3SqlRecordInfo rInf = db.recordInfo(qTableName("qtest")); + Q3SqlRecordInfo rInf = db.recordInfo(qTableName("qtest", __FILE__)); QVERIFY((int)rInf.count() > 0); if (!cs) { - rInf = db.recordInfo(qTableName("QTEST").upper()); + rInf = db.recordInfo(qTableName("QTEST", __FILE__).upper()); QVERIFY((int)rInf.count() > 0); - rInf = db.recordInfo(qTableName("qTesT")); + rInf = db.recordInfo(qTableName("qTesT", __FILE__)); QVERIFY((int)rInf.count() > 0); } #endif - rec = db.primaryIndex(qTableName("qtest")); + rec = db.primaryIndex(qTableName("qtest", __FILE__)); QVERIFY((int)rec.count() > 0); if (!cs) { - rec = db.primaryIndex(qTableName("QTEST").toUpper()); + rec = db.primaryIndex(qTableName("QTEST", __FILE__).toUpper()); QVERIFY((int)rec.count() > 0); - rec = db.primaryIndex(qTableName("qTesT")); + rec = db.primaryIndex(qTableName("qTesT", __FILE__)); QVERIFY((int)rec.count() > 0); } } @@ -1488,7 +1494,7 @@ fieldname = fieldname.toUpper(); QSqlQuery q(db); - QString query = "SELECT " + db.driver()->escapeIdentifier(fieldname, QSqlDriver::FieldName) + " FROM " + qTableName("qtest"); + QString query = "SELECT " + db.driver()->escapeIdentifier(fieldname, QSqlDriver::FieldName) + " FROM " + qTableName("qtest", __FILE__); QVERIFY_SQL(q, exec(query)); QCOMPARE(q.record().fieldName(0), fieldname); } @@ -1508,9 +1514,9 @@ QVERIFY_SQL( q, exec("set client_min_messages='warning'")); } - QVERIFY_SQL(q, exec("CREATE SCHEMA " + qTableName("qtestschema"))); + QVERIFY_SQL(q, exec("CREATE SCHEMA " + qTableName("qtestschema", __FILE__))); - QString table = qTableName("qtestschema") + '.' + qTableName("qtesttable"); + QString table = qTableName("qtestschema", __FILE__) + '.' + qTableName("qtesttable", __FILE__); QVERIFY_SQL(q, exec("CREATE TABLE " + table + " (id int primary key, name varchar(20))")); QVERIFY(db.tables().contains(table)); @@ -1546,10 +1552,10 @@ if(tst_Databases::isPostgreSQL(db)) QVERIFY_SQL( q, exec("set client_min_messages='warning'")); - QString schemaName = qTableName("qtestScHeMa"); - QString tableName = qTableName("qtest"); - QString field1Name = QString("fIeLdNaMe"); - QString field2Name = QString("ZuLu"); + const QString schemaName(qTableName("qtestScHeMa", __FILE__)), + tableName(qTableName("qtest", __FILE__)), + field1Name(QLatin1String("fIeLdNaMe")), + field2Name(QLatin1String("ZuLu")); q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName)); QString createSchema = QString("CREATE SCHEMA \"%1\"").arg(schemaName); @@ -1576,7 +1582,6 @@ q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName)); } - void tst_QSqlDatabase::psql_escapeBytea() { QFETCH(QString, dbName); @@ -1587,7 +1592,7 @@ QByteArray ba(dta, 4); QSqlQuery q(db); - QString tableName = qTableName("batable"); + const QString tableName(qTableName("batable", __FILE__)); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (ba bytea)").arg(tableName))); QSqlQuery iq(db); @@ -1620,7 +1625,7 @@ QSKIP("Test requires PostgreSQL >= 7.3", SkipSingle); QSqlQuery q(db); - QString tableName = qTableName("bug_249059"); + const QString tableName(qTableName("bug_249059", __FILE__)); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (dt timestamp, t time)").arg(tableName))); QSqlQuery iq(db); @@ -1655,7 +1660,7 @@ // DBMS_SPECIFIC(db, "QPSQL"); QSqlQuery q(db); - QString tableName = qTableName("qtest_prec"); + const QString tableName(qTableName("qtest_prec", __FILE__)); if(!db.driver()->hasFeature(QSqlDriver::LowPrecisionNumbers)) QSKIP("Driver or database doesn't support setting precision policy", SkipSingle); @@ -1752,7 +1757,7 @@ } QSqlQuery q(db); - QString tableName = qTableName("uint"); + const QString tableName(qTableName("uint", __FILE__)); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (foo integer(10) unsigned, bar integer(10))").arg(tableName))); QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (-4000000000, -4000000000)").arg(tableName))); QVERIFY_SQL(q, exec(QString("INSERT INTO %1 VALUES (4000000000, 4000000000)").arg(tableName))); @@ -1778,7 +1783,7 @@ } QSqlQuery q(db); - QString tableName = qTableName("strings"); + const QString tableName(qTableName("strings", __FILE__)); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (aStr memo, bStr memo, cStr memo, dStr memo" ", eStr memo, fStr memo, gStr memo, hStr memo)").arg(tableName))); @@ -1816,7 +1821,7 @@ CHECK_DATABASE(db); QSqlQuery q(db); - QString tableName = qTableName("numericfields"); + const QString tableName(qTableName("numericfields", __FILE__)); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id int not null, num1 NUMERIC(2,1), " "num2 NUMERIC(5,2), num3 NUMERIC(10,3), " "num4 NUMERIC(18,4))").arg(tableName))); @@ -1888,7 +1893,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QString tableName = qTableName("qtest_ibaseblobs"); + const QString tableName(qTableName("qtest_ibaseblobs", __FILE__)); QSqlQuery q(db); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (blob1 BLOB segment size 256)").arg(tableName))); @@ -1921,7 +1926,7 @@ CHECK_DATABASE(db); QSqlQuery q(db); - QString procName = qTableName("qtest_proc1"); + const QString procName(qTableName("qtest_proc1", __FILE__)); q.exec(QString("drop procedure %1").arg(procName)); QVERIFY_SQL(q, exec("CREATE PROCEDURE " + procName + " (str VARCHAR(10))\nAS BEGIN\nstr='test';\nEND;")); QVERIFY_SQL(q, exec(QString("execute procedure %1('qtest')").arg(procName))); @@ -1939,7 +1944,7 @@ return; } - QString procName = qTableName("qtest_proc2"); + const QString procName(qTableName("qtest_proc2", __FILE__)); QSqlQuery q(db); q.exec(QString("drop procedure %1").arg(procName)); @@ -1981,11 +1986,11 @@ QSqlQuery q(db); - QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (50, 'Trim Test ', 'Trim Test 2 ')").arg(qTableName("qtest")))); - QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (51, 'TrimTest', 'Trim Test 2')").arg(qTableName("qtest")))); - QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (52, ' ', ' ')").arg(qTableName("qtest")))); + QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (50, 'Trim Test ', 'Trim Test 2 ')").arg(qTableName("qtest", __FILE__)))); + QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (51, 'TrimTest', 'Trim Test 2')").arg(qTableName("qtest", __FILE__)))); + QVERIFY_SQL(q, exec(QString("INSERT INTO %1 (id, t_varchar, t_char) values (52, ' ', ' ')").arg(qTableName("qtest", __FILE__)))); - QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1 WHERE id >= 50 AND id <= 52 ORDER BY id").arg(qTableName("qtest")))); + QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1 WHERE id >= 50 AND id <= 52 ORDER BY id").arg(qTableName("qtest", __FILE__)))); QVERIFY_SQL(q, next()); @@ -2009,10 +2014,10 @@ CHECK_DATABASE(db); QSqlQuery q(db); - QVERIFY_SQL(q, exec("SELECT * from " + qTableName("qtest"))); + QVERIFY_SQL(q, exec("SELECT * from " + qTableName("qtest", __FILE__))); QVERIFY_SQL(q, next()); db.open(); - QVERIFY_SQL(q, exec("SELECT * from " + qTableName("qtest"))); + QVERIFY_SQL(q, exec("SELECT * from " + qTableName("qtest", __FILE__))); QVERIFY_SQL(q, next()); db.open(); } @@ -2029,10 +2034,10 @@ } QSqlQuery q(db); - QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("qtestBindBool") + "(id int, boolvalue bit)")); + QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("qtestBindBool", __FILE__) + "(id int, boolvalue bit)")); // Bind and insert - QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("qtestBindBool") + " VALUES(?, ?)")); + QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("qtestBindBool", __FILE__) + " VALUES(?, ?)")); q.bindValue(0, 1); q.bindValue(1, true); QVERIFY_SQL(q, exec()); @@ -2041,7 +2046,7 @@ QVERIFY_SQL(q, exec()); // Retrive - QVERIFY_SQL(q, exec("SELECT id, boolvalue FROM " + qTableName("qtestBindBool") + " ORDER BY id")); + QVERIFY_SQL(q, exec("SELECT id, boolvalue FROM " + qTableName("qtestBindBool", __FILE__) + " ORDER BY id")); QVERIFY_SQL(q, next()); QCOMPARE(q.value(0).toInt(), 1); QCOMPARE(q.value(1).toBool(), true); @@ -2055,20 +2060,21 @@ QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); + const QString testqGetString(qTableName("testqGetString", __FILE__)); QSqlQuery q(db); if (tst_Databases::isSqlServer(db)) - QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue varchar(MAX))")); + QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue varchar(MAX))")); else if(tst_Databases::isMSAccess(db)) - QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue memo)")); + QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue memo)")); else - QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("testqGetString") + "(id int, vcvalue varchar(65538))")); + QVERIFY_SQL(q, exec("CREATE TABLE " + testqGetString + "(id int, vcvalue varchar(65538))")); QString largeString; largeString.fill('A', 65536); // Bind and insert - QVERIFY_SQL(q, prepare("INSERT INTO " + qTableName("testqGetString") + " VALUES(?, ?)")); + QVERIFY_SQL(q, prepare("INSERT INTO " + testqGetString + " VALUES(?, ?)")); q.bindValue(0, 1); q.bindValue(1, largeString); QVERIFY_SQL(q, exec()); @@ -2080,7 +2086,7 @@ QVERIFY_SQL(q, exec()); // Retrive - QVERIFY_SQL(q, exec("SELECT id, vcvalue FROM " + qTableName("testqGetString") + " ORDER BY id")); + QVERIFY_SQL(q, exec("SELECT id, vcvalue FROM " + testqGetString + " ORDER BY id")); QVERIFY_SQL(q, next()); QCOMPARE(q.value(0).toInt(), 1); QCOMPARE(q.value(1).toString().length(), 65536); @@ -2098,6 +2104,7 @@ QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); + const QString qtest(qTableName("qtest", __FILE__)); QSqlQuery q(db); QString version=tst_Databases::getMySqlVersion( db ); @@ -2105,11 +2112,11 @@ if (ver < 4.1) QSKIP("Test requires MySQL >= 4.1", SkipSingle); - QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest") + "; SELECT * FROM " + qTableName("qtest"))); + QVERIFY_SQL(q, exec("SELECT * FROM " + qtest + "; SELECT * FROM " + qtest)); QVERIFY_SQL(q, next()); - QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest") + "; SELECT * FROM " + qTableName("qtest"))); + QVERIFY_SQL(q, exec("SELECT * FROM " + qtest + "; SELECT * FROM " + qtest)); QVERIFY_SQL(q, next()); - QVERIFY_SQL(q, exec("SELECT * FROM " + qTableName("qtest"))); + QVERIFY_SQL(q, exec("SELECT * FROM " + qtest)); } void tst_QSqlDatabase::ibase_useCustomCharset() @@ -2123,7 +2130,7 @@ db.setConnectOptions("ISC_DPB_LC_CTYPE=Latin1"); db.open(); - QString tableName = qTableName("latin1table"); + const QString tableName(qTableName("latin1table", __FILE__)); QSqlQuery q(db); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(text VARCHAR(6) CHARACTER SET Latin1)").arg(tableName))); @@ -2161,7 +2168,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QString tableName = qTableName("qtest_xmltype"); + const QString tableName(qTableName("qtest_xmltype", __FILE__)); QString xml("MY_TABLE"); QSqlQuery q(db); @@ -2189,7 +2196,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QString tableName = qTableName("qtest"); + const QString tableName(qTableName("qtest", __FILE__)); QSqlQuery q(db); QVERIFY_SQL(q, exec(QString("SELECT t_varchar, t_char FROM %1").arg(tableName))); @@ -2205,7 +2212,7 @@ CHECK_DATABASE(db); QSqlQuery q(db); - QString creator(qTableName("CREATOR")), appuser(qTableName("APPUSER")), table1(qTableName("TABLE1")); + const QString creator(qTableName("CREATOR", __FILE__)), appuser(qTableName("APPUSER", __FILE__)), table1(qTableName("TABLE1", __FILE__)); // QVERIFY_SQL(q, exec("drop public synonym "+table1)); QVERIFY_SQL(q, exec(QString("create user %1 identified by %2 default tablespace users temporary tablespace temp").arg(creator).arg(creator))); QVERIFY_SQL(q, exec(QString("grant CONNECT to %1").arg(creator))); @@ -2223,8 +2230,8 @@ db3.close(); QVERIFY_SQL(db3, open(appuser,appuser)); QSqlQuery q3(db3); - QVERIFY_SQL(q3, exec("create synonym "+appuser+'.'+qTableName("synonyms")+" for "+creator+'.'+table1)); - QVERIFY_SQL(db3, tables().filter(qTableName("synonyms"), Qt::CaseInsensitive).count() >= 1); + QVERIFY_SQL(q3, exec("create synonym "+appuser+'.'+qTableName("synonyms", __FILE__)+" for "+creator+'.'+table1)); + QVERIFY_SQL(db3, tables().filter(qTableName("synonyms", __FILE__), Qt::CaseInsensitive).count() >= 1); } @@ -2240,7 +2247,7 @@ return; } - QString tableName = qTableName("qtest_sqlguid"); + const QString tableName(qTableName("qtest_sqlguid", __FILE__)); QString guid = QString("AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"); QString invalidGuid = QString("GAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"); @@ -2283,7 +2290,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QString tableName = qTableName("uint_table"); + const QString tableName(qTableName("uint_table", __FILE__)); unsigned int val = 4294967295U; QSqlQuery q(db); @@ -2347,7 +2354,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QString procedureName = qTableName("posteventProc"); + const QString procedureName(qTableName("posteventProc", __FILE__)); QSqlDriver *driver=db.driver(); QVERIFY_SQL(*driver, subscribeToNotification(procedureName)); QTest::qWait(300); // Interbase needs some time to call the driver callback. @@ -2381,7 +2388,7 @@ #endif QSqlQuery query(db); - QString procedureName = qTableName("posteventProc"); + QString procedureName = qTableName("posteventProc", __FILE__); QSqlDriver &driver=*(db.driver()); QVERIFY_SQL(driver, subscribeToNotification(procedureName)); @@ -2405,7 +2412,7 @@ } QSqlQuery q(db); - QString tableName = qTableName("uint_test"); + const QString tableName(qTableName("uint_test", __FILE__)); QVERIFY_SQL(q, exec(QString("CREATE TABLE %1(uint_field UNSIGNED INTEGER)").arg(tableName))); QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES(?)").arg(tableName))); q.addBindValue(4000000000U); @@ -2425,7 +2432,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QString tableName = qTableName("qtest"); + const QString tableName(qTableName("qtest", __FILE__)); QSqlQuery q(db); q.exec(QString("SELECT id, t_varchar, t_char, t_numeric FROM %1").arg(tableName)); q.next(); @@ -2448,7 +2455,7 @@ // select a record with NULL value QSqlQuery q(QString::null, db); - QVERIFY_SQL(q, exec("select * from " + qTableName("qtest") + " where id = 4")); + QVERIFY_SQL(q, exec("select * from " + qTableName("qtest", __FILE__) + " where id = 4")); QVERIFY_SQL(q, next()); QSqlDriver *driver = db.driver(); @@ -2471,7 +2478,7 @@ QSqlQuery q(db); QVERIFY_SQL(q, exec("begin")); - QVERIFY_SQL(q, exec("insert into "+qTableName("qtest")+" VALUES (54, 'foo', 'foo', 54.54)")); + QVERIFY_SQL(q, exec("insert into "+qTableName("qtest", __FILE__)+" VALUES (54, 'foo', 'foo', 54.54)")); QVERIFY_SQL(q, exec("savepoint foo")); } @@ -2481,7 +2488,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); QSqlQuery q(db); - QString systemTableName("system."+qTableName("mypassword")); + const QString systemTableName("system."+qTableName("mypassword", __FILE__)); QVERIFY_SQL(q, exec("CREATE TABLE "+systemTableName+"(name VARCHAR(20))")); QVERIFY(!db.tables().contains(systemTableName.toUpper())); QVERIFY(db.tables(QSql::SystemTables).contains(systemTableName.toUpper())); @@ -2501,8 +2508,8 @@ db2.setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); QVERIFY_SQL(db2, open()); QSqlQuery q(db), q2(db2); - QVERIFY_SQL(q, exec("select * from "+qTableName("qtest"))); - QVERIFY_SQL(q2, exec("select * from "+qTableName("qtest"))); + QVERIFY_SQL(q, exec("select * from "+qTableName("qtest", __FILE__))); + QVERIFY_SQL(q2, exec("select * from "+qTableName("qtest", __FILE__))); } QTEST_MAIN(tst_QSqlDatabase) diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsqldriver/tst_qsqldriver.cpp --- a/tests/auto/qsqldriver/tst_qsqldriver.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsqldriver/tst_qsqldriver.cpp Mon May 03 13:17:34 2010 +0300 @@ -84,18 +84,19 @@ void tst_QSqlDriver::recreateTestTables(QSqlDatabase db) { QSqlQuery q(db); + const QString relTEST1(qTableName("relTEST1", __FILE__)); if(tst_Databases::isPostgreSQL(db)) QVERIFY_SQL( q, exec("set client_min_messages='warning'")); - tst_Databases::safeDropTable( db, qTableName( "relTEST1" ) ); + tst_Databases::safeDropTable( db, relTEST1 ); - QVERIFY_SQL( q, exec("create table " + qTableName("relTEST1") + + QVERIFY_SQL( q, exec("create table " + relTEST1 + " (id int not null primary key, name varchar(20), title_key int, another_title_key int)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("relTEST1") + " values(1, 'harry', 1, 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("relTEST1") + " values(2, 'trond', 2, 1)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("relTEST1") + " values(3, 'vohi', 1, 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("relTEST1") + " values(4, 'boris', 2, 2)")); + QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(1, 'harry', 1, 2)")); + QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(2, 'trond', 2, 1)")); + QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(3, 'vohi', 1, 2)")); + QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(4, 'boris', 2, 2)")); } void tst_QSqlDriver::initTestCase() @@ -108,7 +109,7 @@ { foreach (const QString &dbName, dbs.dbNames) { QSqlDatabase db = QSqlDatabase::database(dbName); - tst_Databases::safeDropTable( db, qTableName( "relTEST1" ) ); + tst_Databases::safeDropTable( db, qTableName( "relTEST1", __FILE__ ) ); } dbs.close(); } @@ -127,7 +128,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QString tablename = qTableName("relTEST1"); + QString tablename(qTableName("relTEST1", __FILE__)); QStringList fields; fields << "id" << "name" << "title_key" << "another_title_key"; @@ -180,7 +181,7 @@ QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QString tablename = qTableName("relTEST1"); + QString tablename(qTableName("relTEST1", __FILE__)); //check that we can get primary index using unquoted mixed case table name QSqlIndex index = db.driver()->primaryIndex(tablename); QCOMPARE(index.count(), 1); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsqlquery/tst_qsqlquery.cpp --- a/tests/auto/qsqlquery/tst_qsqlquery.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsqlquery/tst_qsqlquery.cpp Mon May 03 13:17:34 2010 +0300 @@ -44,6 +44,8 @@ #include "../qsqldatabase/tst_databases.h" +const QString qtest(qTableName( "qtest", __FILE__ )); + //TESTED_FILES= class tst_QSqlQuery : public QObject @@ -205,6 +207,13 @@ void QTBUG_6618(); void QTBUG_6852_data() { generic_data("QMYSQL"); } void QTBUG_6852(); + void QTBUG_5765_data() { generic_data("QMYSQL"); } + void QTBUG_5765(); + +#if 0 + void benchmark_data() { generic_data(); } + void benchmark(); +#endif private: // returns all database connections @@ -288,57 +297,56 @@ { QStringList tablenames; // drop all the table in case a testcase failed - tablenames << qTableName( "qtest" ) - << qTableName( "qtest_null" ) - << qTableName( "qtest_blob" ) - << qTableName( "qtest_bittest" ) - << qTableName( "qtest_nullblob" ) - << qTableName( "qtest_rawtest" ) - << qTableName( "qtest_precision" ) - << qTableName( "qtest_prepare" ) - << qTableName( "qtestj1" ) - << qTableName( "qtestj2" ) - << qTableName( "char1Select" ) - << qTableName( "char1SelectUnicode" ) - << qTableName( "qxmltest" ) - << qTableName( "qtest_exerr" ) - << qTableName( "qtest_empty" ) - << qTableName( "clobby" ) - << qTableName( "bindtest" ) - << qTableName( "more_results" ) - << qTableName( "blobstest" ) - << qTableName( "oraRowId" ) - << qTableName( "qtest_batch" ) - << qTableName(QLatin1String("bug6421")).toUpper(); + tablenames << qtest + << qTableName( "qtest_null", __FILE__ ) + << qTableName( "qtest_blob", __FILE__ ) + << qTableName( "qtest_bittest", __FILE__ ) + << qTableName( "qtest_nullblob", __FILE__ ) + << qTableName( "qtest_rawtest", __FILE__ ) + << qTableName( "qtest_precision", __FILE__ ) + << qTableName( "qtest_prepare", __FILE__ ) + << qTableName( "qtestj1", __FILE__ ) + << qTableName( "qtestj2", __FILE__ ) + << qTableName( "char1Select", __FILE__ ) + << qTableName( "char1SU", __FILE__ ) + << qTableName( "qxmltest", __FILE__ ) + << qTableName( "qtest_exerr", __FILE__ ) + << qTableName( "qtest_empty", __FILE__ ) + << qTableName( "clobby", __FILE__ ) + << qTableName( "bindtest", __FILE__ ) + << qTableName( "more_results", __FILE__ ) + << qTableName( "blobstest", __FILE__ ) + << qTableName( "oraRowId", __FILE__ ) + << qTableName( "qtest_batch", __FILE__ ) + << qTableName("bug6421", __FILE__).toUpper() + << qTableName("bug5765", __FILE__) + << qTableName("bug6852", __FILE__) + << qTableName( "qtest_lockedtable", __FILE__ ) + << qTableName( "Planet", __FILE__ ) + << qTableName( "task_250026", __FILE__ ) + << qTableName( "task_234422", __FILE__ ) + << qTableName("test141895", __FILE__); if ( db.driverName().startsWith("QPSQL") ) - tablenames << qTableName("task_233829"); + tablenames << qTableName("task_233829", __FILE__); if ( db.driverName().startsWith("QSQLITE") ) - tablenames << qTableName( "record_sqlite" ); + tablenames << qTableName( "record_sqlite", __FILE__ ); if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QOCI" ) ) - tablenames << qTableName( "qtest_longstr" ); - - tablenames << qTableName( "qtest_lockedtable" ); - - tablenames << qTableName( "Planet" ); - - tablenames << qTableName( "task_250026" ); - tablenames << qTableName( "task_234422" ); - - if (tst_Databases::isSqlServer( db )) { - QSqlQuery q( db ); - q.exec("DROP PROCEDURE " + qTableName("test141895_proc")); - } - - tablenames << qTableName("test141895"); + tablenames << qTableName( "qtest_longstr", __FILE__ ); + + if (tst_Databases::isSqlServer( db )) + db.exec("DROP PROCEDURE " + qTableName("test141895_proc", __FILE__)); + + if (tst_Databases::isMySQL( db )) + db.exec("DROP PROCEDURE IF EXISTS "+qTableName("bug6852_proc", __FILE__)); tst_Databases::safeDropTables( db, tablenames ); if ( db.driverName().startsWith( "QOCI" ) ) { QSqlQuery q( db ); - q.exec( "DROP PACKAGE " + qTableName("pkg") ); + q.exec( "DROP PACKAGE " + qTableName("pkg", __FILE__) ); } } @@ -354,31 +362,32 @@ QVERIFY_SQL( q, exec("set client_min_messages='warning'")); if(tst_Databases::isPostgreSQL(db)) - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest" ) + " (id serial NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id)) WITH OIDS" ) ); + QVERIFY_SQL( q, exec( "create table " + qtest + " (id serial NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id)) WITH OIDS" ) ); else - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest" ) + " (id int "+tst_Databases::autoFieldName(db) +" NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id))" ) ); + QVERIFY_SQL( q, exec( "create table " + qtest + " (id int "+tst_Databases::autoFieldName(db) +" NOT NULL, t_varchar varchar(20), t_char char(20), primary key(id))" ) ); if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) ) - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null" ) + " (id int null, t_varchar varchar(20) null)" ) ); + QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null", __FILE__ ) + " (id int null, t_varchar varchar(20) null)" ) ); else - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null" ) + " (id int, t_varchar varchar(20))" ) ); + QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_null", __FILE__ ) + " (id int, t_varchar varchar(20))" ) ); } void tst_QSqlQuery::populateTestTables( QSqlDatabase db ) { QSqlQuery q( db ); - q.exec( "delete from " + qTableName( "qtest" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (1, 'VarChar1', 'Char1')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (2, 'VarChar2', 'Char2')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (3, 'VarChar3', 'Char3')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (4, 'VarChar4', 'Char4')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (5, 'VarChar5', 'Char5')" ) ); - - q.exec( "delete from " + qTableName( "qtest_null" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (0, NULL)" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (1, 'n')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (2, 'i')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_null" ) + " values (3, NULL)" ) ); + const QString qtest_null(qTableName( "qtest_null", __FILE__ )); + q.exec( "delete from " + qtest ); + QVERIFY_SQL( q, exec( "insert into " + qtest + " values (1, 'VarChar1', 'Char1')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest + " values (2, 'VarChar2', 'Char2')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest + " values (3, 'VarChar3', 'Char3')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest + " values (4, 'VarChar4', 'Char4')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest + " values (5, 'VarChar5', 'Char5')" ) ); + + q.exec( "delete from " + qtest_null ); + QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (0, NULL)" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (1, 'n')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (2, 'i')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest_null + " values (3, NULL)" ) ); } // There were problems with char fields of size 1 @@ -390,9 +399,9 @@ { QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "char1Select" ) + " (id char(1))" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "char1Select" ) + " values ('a')" ) ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "char1Select" ) ) ); + QVERIFY_SQL( q, exec( "create table " + qTableName( "char1Select", __FILE__ ) + " (id char(1))" ) ); + QVERIFY_SQL( q, exec( "insert into " + qTableName( "char1Select", __FILE__ ) + " values ('a')" ) ); + QVERIFY_SQL( q, exec( "select * from " + qTableName( "char1Select", __FILE__ ) ) ); QVERIFY( q.next() ); if ( db.driverName().startsWith( "QIBASE" ) ) @@ -421,31 +430,32 @@ QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); QString createQuery; + const QString char1SelectUnicode(qTableName( "char1SU", __FILE__ )); if ( tst_Databases::isSqlServer( db ) ) - createQuery = "create table " + qTableName( "char1SelectUnicode" ) + "(id nchar(1))"; + createQuery = "create table " + char1SelectUnicode + "(id nchar(1))"; else if ( db.driverName().startsWith( "QDB2" ) || db.driverName().startsWith( "QOCI" ) || db.driverName().startsWith( "QPSQL" ) ) - createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(3))"; + createQuery = "create table " + char1SelectUnicode + " (id char(3))"; else if ( db.driverName().startsWith( "QIBASE" ) ) - createQuery = "create table " + qTableName( "char1SelectUnicode" ) + + createQuery = "create table " + char1SelectUnicode + " (id char(1) character set unicode_fss)"; else if ( db.driverName().startsWith( "QMYSQL" ) ) - createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(1)) " + createQuery = "create table " + char1SelectUnicode + " (id char(1)) " "default character set 'utf8'"; else - createQuery = "create table " + qTableName( "char1SelectUnicode" ) + " (id char(1))"; + createQuery = "create table " + char1SelectUnicode + " (id char(1))"; QVERIFY_SQL( q, exec( createQuery ) ); - QVERIFY_SQL( q, prepare( "insert into " + qTableName( "char1SelectUnicode" ) + " values(?)" ) ); + QVERIFY_SQL( q, prepare( "insert into " + char1SelectUnicode + " values(?)" ) ); q.bindValue( 0, uniStr ); QVERIFY_SQL( q, exec() ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "char1SelectUnicode" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + char1SelectUnicode ) ); QVERIFY( q.next() ); @@ -465,24 +475,25 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString oraRowId(qTableName("oraRowId", __FILE__)); QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "select rowid from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select rowid from " + qtest ) ); QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).type(), QVariant::String ); QVERIFY( !q.value( 0 ).toString().isEmpty() ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "oraRowId" ) + " (id char(1))" ) ); - - QVERIFY_SQL( q, exec( "insert into " + qTableName( "oraRowId" ) + " values('a')" ) ); + QVERIFY_SQL( q, exec( "create table " + oraRowId + " (id char(1))" ) ); + + QVERIFY_SQL( q, exec( "insert into " + oraRowId + " values('a')" ) ); QVariant v1 = q.lastInsertId(); QVERIFY( v1.isValid() ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "oraRowId" ) + " values('b')" ) ); + QVERIFY_SQL( q, exec( "insert into " + oraRowId + " values('b')" ) ); QVariant v2 = q.lastInsertId(); QVERIFY( v2.isValid() ); - QVERIFY_SQL( q, prepare( "select * from " + qTableName( "oraRowId" ) + " where rowid = ?" ) ); + QVERIFY_SQL( q, prepare( "select * from " + oraRowId + " where rowid = ?" ) ); q.addBindValue( v1 ); QVERIFY_SQL( q, exec() ); QVERIFY( q.next() ); @@ -499,49 +510,50 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString hello(qTableName( "hello", __FILE__ )), qtestproc(qTableName( "qtestproc", __FILE__ )); QSqlQuery q( db ); if ( db.driverName().startsWith( "QMYSQL" ) && tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); - q.exec( "drop function " + qTableName( "hello" ) ); - - QVERIFY_SQL( q, exec( "create function " + qTableName( "hello" ) + " (s char(20)) returns varchar(50) return concat('Hello ', s)" ) ); - - QVERIFY_SQL( q, exec( "select " + qTableName( "hello" ) + "('world')" ) ); + q.exec( "drop function " + hello ); + + QVERIFY_SQL( q, exec( "create function " + hello + " (s char(20)) returns varchar(50) return concat('Hello ', s)" ) ); + + QVERIFY_SQL( q, exec( "select " + hello + "('world')" ) ); QVERIFY_SQL( q, next() ); QCOMPARE( q.value( 0 ).toString(), QString( "Hello world" ) ); - QVERIFY_SQL( q, prepare( "select " + qTableName( "hello" ) + "('harald')" ) ); + QVERIFY_SQL( q, prepare( "select " + hello + "('harald')" ) ); QVERIFY_SQL( q, exec() ); QVERIFY_SQL( q, next() ); QCOMPARE( q.value( 0 ).toString(), QString( "Hello harald" ) ); - QVERIFY_SQL( q, exec( "drop function " + qTableName( "hello" ) ) ); - - q.exec( "drop procedure " + qTableName( "qtestproc" ) ); - - QVERIFY_SQL( q, exec( "create procedure " + qTableName( "qtestproc" ) + " () " - "BEGIN select * from " + qTableName( "qtest" ) + " order by id; END" ) ); - QVERIFY_SQL( q, exec( "call " + qTableName( "qtestproc" ) + "()" ) ); + QVERIFY_SQL( q, exec( "drop function " + hello ) ); + + q.exec( "drop procedure " + qtestproc ); + + QVERIFY_SQL( q, exec( "create procedure " + qtestproc + " () " + "BEGIN select * from " + qtest + " order by id; END" ) ); + QVERIFY_SQL( q, exec( "call " + qtestproc + "()" ) ); QVERIFY_SQL( q, next() ); QCOMPARE( q.value( 1 ).toString(), QString( "VarChar1" ) ); - QVERIFY_SQL( q, exec( "drop procedure " + qTableName( "qtestproc" ) ) ); - - QVERIFY_SQL( q, exec( "create procedure " + qTableName( "qtestproc" ) + " (OUT param1 INT) " + QVERIFY_SQL( q, exec( "drop procedure " + qtestproc ) ); + + QVERIFY_SQL( q, exec( "create procedure " + qtestproc + " (OUT param1 INT) " "BEGIN set param1 = 42; END" ) ); - QVERIFY_SQL( q, exec( "call " + qTableName( "qtestproc" ) + " (@out)" ) ); + QVERIFY_SQL( q, exec( "call " + qtestproc + " (@out)" ) ); QVERIFY_SQL( q, exec( "select @out" ) ); QCOMPARE( q.record().fieldName( 0 ), QString( "@out" ) ); QVERIFY_SQL( q, next() ); QCOMPARE( q.value( 0 ).toInt(), 42 ); - QVERIFY_SQL( q, exec( "drop procedure " + qTableName( "qtestproc" ) ) ); + QVERIFY_SQL( q, exec( "drop procedure " + qtestproc ) ); } void tst_QSqlQuery::oraOutValues() @@ -549,6 +561,7 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString tst_outValues(qTableName("tst_outValues", __FILE__)); if ( !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) { QSKIP( "Test requires prepared query support", SkipSingle ); @@ -560,11 +573,11 @@ q.setForwardOnly( true ); /*** outvalue int ***/ - QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x out int) is\n" + QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out int) is\n" "begin\n" " x := 42;\n" "end;\n" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); q.addBindValue( 0, QSql::Out ); QVERIFY_SQL( q, exec() ); QCOMPARE( q.boundValue( 0 ).toInt(), 42 ); @@ -576,11 +589,11 @@ QVERIFY( !q.boundValue( 0 ).isNull() ); /*** outvalue varchar ***/ - QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x out varchar) is\n" + QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out varchar) is\n" "begin\n" " x := 'blah';\n" "end;\n" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); QString s1( "12345" ); s1.reserve( 512 ); q.addBindValue( s1, QSql::Out ); @@ -588,51 +601,51 @@ QCOMPARE( q.boundValue( 0 ).toString(), QString( "blah" ) ); /*** in/outvalue numeric ***/ - QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out numeric) is\n" + QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out numeric) is\n" "begin\n" " x := x + 10;\n" "end;\n" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); q.addBindValue( 10, QSql::Out ); QVERIFY_SQL( q, exec() ); QCOMPARE( q.boundValue( 0 ).toInt(), 20 ); /*** in/outvalue varchar ***/ - QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out varchar) is\n" + QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out varchar) is\n" "begin\n" " x := 'homer';\n" "end;\n" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); q.addBindValue( QString( "maggy" ), QSql::Out ); QVERIFY_SQL( q, exec() ); QCOMPARE( q.boundValue( 0 ).toString(), QString( "homer" ) ); /*** in/outvalue varchar ***/ - QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out varchar) is\n" + QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out varchar) is\n" "begin\n" " x := NULL;\n" "end;\n" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); q.addBindValue( QString( "maggy" ), QSql::Out ); QVERIFY_SQL( q, exec() ); QVERIFY( q.boundValue( 0 ).isNull() ); /*** in/outvalue int ***/ - QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in out int) is\n" + QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in out int) is\n" "begin\n" " x := NULL;\n" "end;\n" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); q.addBindValue( 42, QSql::Out ); QVERIFY_SQL( q, exec() ); QVERIFY( q.boundValue( 0 ).isNull() ); /*** in/outvalue varchar ***/ - QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x in varchar, y out varchar) is\n" + QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x in varchar, y out varchar) is\n" "begin\n" " y := x||'bubulalakikikokololo';\n" "end;\n" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?, ?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?, ?)" ) ); q.addBindValue( QString( "fifi" ), QSql::In ); QString out; out.reserve( 50 ); @@ -646,30 +659,31 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString clobby(qTableName("clobby", __FILE__)); QSqlQuery q( db ); // simple short string - QVERIFY_SQL( q, exec( "create table " + qTableName( "clobby" ) + "(id int primary key, cl clob, bl blob)" ) ); - QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) ); + QVERIFY_SQL( q, exec( "create table " + clobby + "(id int primary key, cl clob, bl blob)" ) ); + QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) ); q.addBindValue( 1 ); q.addBindValue( "bubu" ); q.addBindValue( QByteArray("bubu") ); QVERIFY_SQL( q, exec() ); - QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 1" ) ); + QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 1" ) ); QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).toString(), QString( "bubu" ) ); QCOMPARE( q.value( 1 ).toString(), QString( "bubu" ) ); // simple short string with binding - QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) ); + QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) ); q.addBindValue( 2 ); q.addBindValue( "lala", QSql::Binary ); q.addBindValue( QByteArray("lala"), QSql::Binary ); QVERIFY_SQL( q, exec() ); - QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 2" ) ); + QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 2" ) ); QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).toString(), QString( "lala" ) ); QCOMPARE( q.value( 1 ).toString(), QString( "lala" ) ); @@ -677,13 +691,13 @@ // loooong string QString loong; loong.fill( QLatin1Char( 'A' ), 25000 ); - QVERIFY_SQL( q, prepare( "insert into " + qTableName( "clobby" ) + " (id, cl, bl) values(?, ?, ?)" ) ); + QVERIFY_SQL( q, prepare( "insert into " + clobby + " (id, cl, bl) values(?, ?, ?)" ) ); q.addBindValue( 3 ); q.addBindValue( loong, QSql::Binary ); q.addBindValue( loong.toLatin1(), QSql::Binary ); QVERIFY_SQL( q, exec() ); - QVERIFY_SQL( q, exec( "select bl, cl from " + qTableName( "clobby" ) + " where id = 3" ) ); + QVERIFY_SQL( q, exec( "select bl, cl from " + clobby + " where id = 3" ) ); QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).toString().count(), loong.count() ); QVERIFY( q.value( 0 ).toString() == loong ); @@ -698,16 +712,16 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - q.exec( "drop procedure " + qTableName( "TESTPROC" ) ); - - QVERIFY_SQL( q, exec( "create procedure " + qTableName( "TESTPROC" ) + + q.exec( "drop procedure " + qTableName( "TESTPROC", __FILE__ ) ); + + QVERIFY_SQL( q, exec( "create procedure " + qTableName( "TESTPROC", __FILE__ ) + " RETURNS (x integer, y varchar(20)) " "AS BEGIN " " x = 42; " " y = 'Hello Anders'; " "END" ) ); - QVERIFY_SQL( q, prepare( "execute procedure " + qTableName( "TestProc" ) ) ); + QVERIFY_SQL( q, prepare( "execute procedure " + qTableName( "TestProc", __FILE__ ) ) ); QVERIFY_SQL( q, exec() ); // check for a valid result set @@ -724,7 +738,7 @@ // the second next shall fail QVERIFY( !q.next() ); - q.exec( "drop procedure " + qTableName( "TestProc" ) ); + q.exec( "drop procedure " + qTableName( "TestProc", __FILE__ ) ); } void tst_QSqlQuery::outValuesDB2() @@ -742,8 +756,8 @@ q.setForwardOnly( true ); - q.exec( "drop procedure " + qTableName( "tst_outValues" ) ); //non-fatal - QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues" ) + + q.exec( "drop procedure " + qTableName( "tst_outValues", __FILE__ ) ); //non-fatal + QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues", __FILE__ ) + " (OUT x int, OUT x2 double, OUT x3 char(20))\n" "LANGUAGE SQL\n" "P1: BEGIN\n" @@ -752,7 +766,7 @@ " SET x3 = 'Homer';\n" "END P1" ) ); - QVERIFY_SQL( q, prepare( "call " + qTableName( "tst_outValues" ) + "(?, ?, ?)" ) ); + QVERIFY_SQL( q, prepare( "call " + qTableName( "tst_outValues", __FILE__ ) + "(?, ?, ?)" ) ); q.addBindValue( 0, QSql::Out ); q.addBindValue( 0.0, QSql::Out ); @@ -770,6 +784,7 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString tst_outValues(qTableName("tst_outValues", __FILE__)); if ( !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) { QSKIP( "Test requires prepared query support", SkipSingle ); @@ -781,26 +796,26 @@ q.setForwardOnly( true ); if ( db.driverName().startsWith( "QOCI" ) ) { - QVERIFY_SQL( q, exec( "create or replace procedure " + qTableName( "tst_outValues" ) + "(x out int) is\n" + QVERIFY_SQL( q, exec( "create or replace procedure " + tst_outValues + "(x out int) is\n" "begin\n" " x := 42;\n" "end;\n" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outvalues" ) + "(?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); } else if ( db.driverName().startsWith( "QDB2" ) ) { - q.exec( "drop procedure " + qTableName( "tst_outValues" ) ); //non-fatal - QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + qTableName( "tst_outValues" ) + " (OUT x int)\n" + q.exec( "drop procedure " + tst_outValues ); //non-fatal + QVERIFY_SQL( q, exec( "CREATE PROCEDURE " + tst_outValues + " (OUT x int)\n" "LANGUAGE SQL\n" "P1: BEGIN\n" " SET x = 42;\n" "END P1" ) ); - QVERIFY( q.prepare( "call " + qTableName( "tst_outValues" ) + "(?)" ) ); + QVERIFY( q.prepare( "call " + tst_outValues + "(?)" ) ); } else if ( tst_Databases::isSqlServer( db ) ) { - q.exec( "drop procedure " + qTableName( "tst_outValues" ) ); //non-fatal - QVERIFY_SQL( q, exec( "create procedure " + qTableName( "tst_outValues" ) + " (@x int out) as\n" + q.exec( "drop procedure " + tst_outValues ); //non-fatal + QVERIFY_SQL( q, exec( "create procedure " + tst_outValues + " (@x int out) as\n" "begin\n" " set @x = 42\n" "end\n" ) ); - QVERIFY( q.prepare( "{call " + qTableName( "tst_outvalues" ) + "(?)}" ) ); + QVERIFY( q.prepare( "{call " + tst_outValues + "(?)}" ) ); } else { QSKIP( "Don't know how to create a stored procedure for this database server, please fix this test", SkipSingle ); return; @@ -837,11 +852,11 @@ q.setForwardOnly( true ); - QString queryString = QString( "create table " + qTableName( "qtest_blob" ) + + QString queryString = QString( "create table " + qTableName( "qtest_blob", __FILE__ ) + " (id int not null primary key, t_blob %1)" ).arg( tst_Databases::blobTypeName( db, BLOBSIZE ) ); QVERIFY_SQL( q, exec( queryString ) ); - QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_blob" ) + " (id, t_blob) values (?, ?)" ) ); + QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_blob", __FILE__ ) + " (id, t_blob) values (?, ?)" ) ); for ( i = 0; i < BLOBCOUNT; ++i ) { q.addBindValue( i ); @@ -849,7 +864,7 @@ QVERIFY_SQL( q, exec() ); } - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_blob" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_blob", __FILE__ ) ) ); for ( i = 0; i < BLOBCOUNT; ++i ) { QVERIFY( q.next() ); @@ -872,7 +887,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qTableName( "qtest" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qtest + " order by id" ) ); int i = 1; while ( q.next() ) { @@ -904,7 +919,7 @@ QSqlQuery q( db ); QVERIFY( q.record().isEmpty() ); - QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qTableName( "qtest" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "select id, t_varchar, t_char from " + qtest + " order by id" ) ); QSqlRecord rec = q.record(); QCOMPARE( q.record().fieldName( 0 ).toLower(), QString( "id" ) ); QCOMPARE( q.record().fieldName( 1 ).toLower(), QString( "t_varchar" ) ); @@ -928,7 +943,7 @@ QSqlQuery q( db ); QVERIFY( !q.isValid() ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); QVERIFY( q.first() ); QVERIFY( q.isValid() ); } @@ -941,7 +956,7 @@ QSqlQuery q( db ); QVERIFY( !q.isActive() ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); QVERIFY( q.isActive() ); QVERIFY( q.last() ); @@ -951,15 +966,15 @@ QVERIFY( q.isActive() ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (41, 'VarChar41', 'Char41')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest + " values (41, 'VarChar41', 'Char41')" ) ); QVERIFY( q.isActive() ); - QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 42 where id = 41" ) ); + QVERIFY_SQL( q, exec( "update " + qtest + " set id = 42 where id = 41" ) ); QVERIFY( q.isActive() ); - QVERIFY_SQL( q, exec( "delete from " + qTableName( "qtest" ) + " where id = 42" ) ); + QVERIFY_SQL( q, exec( "delete from " + qtest + " where id = 42" ) ); QVERIFY( q.isActive() ); } @@ -973,7 +988,7 @@ QSqlQuery q( db ); QCOMPARE( q.numRowsAffected(), -1 ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); int i = 0; while ( q.next() ) @@ -987,21 +1002,21 @@ qDebug( "Expected numRowsAffected to be -1, 0 or %d, got %d", i, q.numRowsAffected() ); } - QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 100 where id = 1" ) ); + QVERIFY_SQL( q, exec( "update " + qtest + " set id = 100 where id = 1" ) ); QCOMPARE( q.numRowsAffected(), 1 ); QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice - QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = id + 100" ) ); + QVERIFY_SQL( q, exec( "update " + qtest + " set id = id + 100" ) ); QCOMPARE( q.numRowsAffected(), i ); QCOMPARE( q.numRowsAffected(), i ); // yes, we check twice - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (42000, 'homer', 'marge')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest + " values (42000, 'homer', 'marge')" ) ); QCOMPARE( q.numRowsAffected(), 1 ); QCOMPARE( q.numRowsAffected(), 1 ); // yes, we check twice QSqlQuery q2( db ); - QVERIFY_SQL( q2, exec( "insert into " + qTableName( "qtest" ) + " values (42001, 'homer', 'marge')" ) ); + QVERIFY_SQL( q2, exec( "insert into " + qtest + " values (42001, 'homer', 'marge')" ) ); if ( !db.driverName().startsWith( "QSQLITE2" ) ) { // SQLite 2.x accumulates changed rows in nested queries. See task 33794 @@ -1019,7 +1034,7 @@ QSqlQuery q( db ); QCOMPARE( q.size(), -1 ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); int i = 0; while ( q.next() ) @@ -1033,7 +1048,7 @@ QCOMPARE( q.size(), -1 ); // yes, twice } - QSqlQuery q2( "select * from " + qTableName( "qtest" ), db ); + QSqlQuery q2( "select * from " + qtest, db ); if ( db.driver()->hasFeature( QSqlDriver::QuerySize ) ) QCOMPARE( q.size(), i ); @@ -1042,7 +1057,7 @@ q2.clear(); - QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 100 where id = 1" ) ); + QVERIFY_SQL( q, exec( "update " + qtest + " set id = 100 where id = 1" ) ); QCOMPARE( q.size(), -1 ); QCOMPARE( q.size(), -1 ); // yes, twice } @@ -1054,10 +1069,10 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); QVERIFY( q.isSelect() ); - QVERIFY_SQL( q, exec( "update " + qTableName( "qtest" ) + " set id = 1 where id = 1" ) ); + QVERIFY_SQL( q, exec( "update " + qtest + " set id = 1 where id = 1" ) ); QVERIFY( q.isSelect() == false ); } @@ -1069,7 +1084,7 @@ QSqlQuery q( db ); QVERIFY( q.at() == QSql::BeforeFirstRow ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); QVERIFY( q.last() ); QVERIFY_SQL( q, first() ); QVERIFY( q.at() == 0 ); @@ -1083,7 +1098,7 @@ QSqlQuery q( db ); QVERIFY( q.at() == QSql::BeforeFirstRow ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); QVERIFY( q.first() ); QVERIFY( q.next() ); QVERIFY( q.at() == 1 ); @@ -1097,7 +1112,7 @@ QSqlQuery q( db ); QVERIFY( q.at() == QSql::BeforeFirstRow ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); QVERIFY( q.first() ); QVERIFY( q.next() ); QVERIFY( q.previous() ); @@ -1112,7 +1127,7 @@ QSqlQuery q( db ); QCOMPARE( q.at(), int( QSql::BeforeFirstRow ) ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); int i = 0; while ( q.next() ) @@ -1122,17 +1137,14 @@ QVERIFY( q.last() ); - if ( !tst_Databases::isMSAccess( db ) ) - // Access doesn't return the correct position - QCOMPARE( q.at(), ( i-1 ) ); - - QSqlQuery q2( "select * from " + qTableName( "qtest" ), db ); + QSet validReturns(QSet() << -1 << i-1); + QVERIFY( validReturns.contains(q.at()) ); + + QSqlQuery q2( "select * from " + qtest, db ); QVERIFY( q2.last() ); - if ( !tst_Databases::isMSAccess( db ) ) - // Access doesn't return the correct position - QCOMPARE( q.at(), ( i-1 ) ); + QVERIFY( validReturns.contains(q.at()) ); } void tst_QSqlQuery::seek() @@ -1142,7 +1154,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); QVERIFY( q.at() == QSql::BeforeFirstRow ); - QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qTableName( "qtest" ) ) ) ); + QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qtest ) ) ); // NB! The order of the calls below are important! QVERIFY( q.last() ); @@ -1178,7 +1190,7 @@ QVERIFY( !q.isForwardOnly() ); QVERIFY( q.at() == QSql::BeforeFirstRow ); - QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qTableName( "qtest" ) ) ) ); + QVERIFY_SQL( q, exec( QString( "select id from %1 order by id" ).arg( qtest ) ) ); QSqlRecord rec; @@ -1217,7 +1229,7 @@ q.setForwardOnly( true ); QVERIFY( q.isForwardOnly() ); QVERIFY( q.at() == QSql::BeforeFirstRow ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest + " order by id" ) ); QVERIFY( q.at() == QSql::BeforeFirstRow ); QVERIFY( q.first() ); QCOMPARE( q.at(), 0 ); @@ -1242,7 +1254,7 @@ QCOMPARE( q.at(), 3 ); QCOMPARE( q.value( 0 ).toInt(), 4 ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); int i = 0; while ( q.next() ) @@ -1254,7 +1266,7 @@ QVERIFY( q2.isForwardOnly() ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest + " order by id" ) ); QVERIFY( q.isForwardOnly() ); @@ -1300,7 +1312,7 @@ QSqlQuery q( db ); QVERIFY( !q.isValid() ); QVERIFY( !q.isActive() ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest ) ); QVERIFY( q.isActive() ); QVERIFY( q.next() ); QVERIFY( q.isValid() ); @@ -1313,7 +1325,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "select id, t_varchar from " + qTableName( "qtest_null" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "select id, t_varchar from " + qTableName( "qtest_null", __FILE__ ) + " order by id" ) ); QVERIFY( q.next() ); QVERIFY( !q.isNull( 0 ) ); QVERIFY( q.isNull( 1 ) ); @@ -1339,13 +1351,13 @@ QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_bittest" ) + " (bitty bit)" ) ); - - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_bittest" ) + " values (0)" ) ); - - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_bittest" ) + " values (1)" ) ); - - QVERIFY_SQL( q, exec( "select bitty from " + qTableName( "qtest_bittest" ) ) ); + QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_bittest", __FILE__ ) + " (bitty bit)" ) ); + + QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_bittest", __FILE__ ) + " values (0)" ) ); + + QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_bittest", __FILE__ ) + " values (1)" ) ); + + QVERIFY_SQL( q, exec( "select bitty from " + qTableName( "qtest_bittest", __FILE__ ) ) ); QVERIFY( q.next() ); @@ -1363,15 +1375,16 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString qtest_nullblob(qTableName("qtest_nullblob", __FILE__)); QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_nullblob" ) + " (id int primary key, bb blob)" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (0, EMPTY_BLOB())" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (1, NULL)" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_nullblob" ) + " values (2, 'aabbcc00112233445566')" ) ); + QVERIFY_SQL( q, exec( "create table " + qtest_nullblob + " (id int primary key, bb blob)" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (0, EMPTY_BLOB())" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (1, NULL)" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest_nullblob + " values (2, 'aabbcc00112233445566')" ) ); // necessary otherwise oracle will bombard you with internal errors q.setForwardOnly( true ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_nullblob" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest_nullblob + " order by id" ) ); QVERIFY( q.next() ); QCOMPARE(( int )q.value( 1 ).toByteArray().size(), 0 ); @@ -1392,14 +1405,15 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString qtest_rawtest(qTableName("qtest_rawtest", __FILE__)); QSqlQuery q( db ); q.setForwardOnly( true ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_rawtest" ) + + QVERIFY_SQL( q, exec( "create table " + qtest_rawtest + " (id int, col raw(20))" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_rawtest" ) + " values (0, NULL)" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_rawtest" ) + " values (1, '00aa1100ddeeff')" ) ); - QVERIFY_SQL( q, exec( "select col from " + qTableName( "qtest_rawtest" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest_rawtest + " values (0, NULL)" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest_rawtest + " values (1, '00aa1100ddeeff')" ) ); + QVERIFY_SQL( q, exec( "select col from " + qtest_rawtest + " order by id" ) ); QVERIFY( q.next() ); QVERIFY( q.isNull( 0 ) ); QCOMPARE(( int )q.value( 0 ).toByteArray().size(), 0 ); @@ -1416,6 +1430,7 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString qtest_precision(qTableName( "qtest_precision", __FILE__ )); static const char* precStr = "1.2345678901234567891"; @@ -1427,13 +1442,13 @@ QSqlQuery q( db ); if ( tst_Databases::isMSAccess( db ) ) - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_precision" ) + " (col1 number)" ) ); + QVERIFY_SQL( q, exec( "create table " + qtest_precision + " (col1 number)" ) ); else - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_precision" ) + " (col1 numeric(21, 20))" ) ); - - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest_precision" ) + " (col1) values (1.2345678901234567891)" ) ); - - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_precision" ) ) ); + QVERIFY_SQL( q, exec( "create table " + qtest_precision + " (col1 numeric(21, 20))" ) ); + + QVERIFY_SQL( q, exec( "insert into " + qtest_precision + " (col1) values (1.2345678901234567891)" ) ); + + QVERIFY_SQL( q, exec( "select * from " + qtest_precision ) ); QVERIFY( q.next() ); QString val = q.value( 0 ).toString(); @@ -1466,7 +1481,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest" ) + " where id > 50000" ) ); + QVERIFY_SQL( q, exec( "select * from " + qtest + " where id > 50000" ) ); if ( q.driver()->hasFeature( QSqlDriver::QuerySize ) ) QCOMPARE( q.size(), 0 ); @@ -1507,9 +1522,9 @@ // test a working transaction q.exec( startTransactionStr ); - QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (40, 'VarChar40', 'Char40')" ) ); - - QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 40" ) ); + QVERIFY_SQL( q, exec( "insert into" + qtest + " values (40, 'VarChar40', 'Char40')" ) ); + + QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 40" ) ); QVERIFY( q.next() ); @@ -1517,7 +1532,7 @@ QVERIFY_SQL( q, exec( "commit" ) ); - QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 40" ) ); + QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 40" ) ); QVERIFY( q.next() ); @@ -1526,9 +1541,9 @@ // test a rollback q.exec( startTransactionStr ); - QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (41, 'VarChar41', 'Char41')" ) ); - - QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 41" ) ); + QVERIFY_SQL( q, exec( "insert into" + qtest + " values (41, 'VarChar41', 'Char41')" ) ); + + QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 41" ) ); QVERIFY( q.next() ); @@ -1542,18 +1557,18 @@ QFAIL( "Could not rollback transaction: " + tst_Databases::printError( q.lastError() ) ); } - QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 41" ) ); + QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 41" ) ); QVERIFY( q.next() == false ); // test concurrent access q.exec( startTransactionStr ); - QVERIFY_SQL( q, exec( "insert into" + qTableName( "qtest" ) + " values (42, 'VarChar42', 'Char42')" ) ); - QVERIFY_SQL( q, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) ); + QVERIFY_SQL( q, exec( "insert into" + qtest + " values (42, 'VarChar42', 'Char42')" ) ); + QVERIFY_SQL( q, exec( "select * from" + qtest + " where id = 42" ) ); QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).toInt(), 42 ); - QVERIFY_SQL( q2, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) ); + QVERIFY_SQL( q2, exec( "select * from" + qtest + " where id = 42" ) ); if ( q2.next() ) qDebug( QString( "DBMS '%1' doesn't support query based transactions with concurrent access" ).arg( @@ -1561,7 +1576,7 @@ QVERIFY_SQL( q, exec( "commit" ) ); - QVERIFY_SQL( q2, exec( "select * from" + qTableName( "qtest" ) + " where id = 42" ) ); + QVERIFY_SQL( q2, exec( "select * from" + qtest + " where id = 42" ) ); QVERIFY( q2.next() ); @@ -1573,6 +1588,7 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString qtestj1(qTableName("qtestj1", __FILE__)), qtestj2(qTableName("qtestj2", __FILE__)); if ( db.driverName().startsWith( "QOCI" ) || db.driverName().startsWith( "QTDS" ) @@ -1586,17 +1602,17 @@ QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtestj1" ) + " (id1 int, id2 int)" ) ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtestj2" ) + " (id int, name varchar(20))" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj1" ) + " values (1, 1)" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj1" ) + " values (1, 2)" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj2" ) + " values(1, 'trenton')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtestj2" ) + " values(2, 'marius')" ) ); + QVERIFY_SQL( q, exec( "create table " + qtestj1 + " (id1 int, id2 int)" ) ); + QVERIFY_SQL( q, exec( "create table " + qtestj2 + " (id int, name varchar(20))" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtestj1 + " values (1, 1)" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtestj1 + " values (1, 2)" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtestj2 + " values(1, 'trenton')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtestj2 + " values(2, 'marius')" ) ); QVERIFY_SQL( q, exec( "select qtestj1.id1, qtestj1.id2, qtestj2.id, qtestj2.name, qtestj3.id, qtestj3.name " - "from " + qTableName( "qtestj1" ) + " qtestj1 left outer join " + qTableName( "qtestj2" ) + + "from " + qtestj1 + " qtestj1 left outer join " + qtestj2 + " qtestj2 on (qtestj1.id1 = qtestj2.id) " - "left outer join " + qTableName( "qtestj2" ) + " as qtestj3 on (qtestj1.id2 = qtestj3.id)" ) ); + "left outer join " + qtestj2 + " as qtestj3 on (qtestj1.id2 = qtestj3.id)" ) ); QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).toInt(), 1 ); @@ -1622,7 +1638,7 @@ CHECK_DATABASE( db ); QSqlQuery q(db); - QVERIFY_SQL( q, exec("select a.id, a.t_char, a.t_varchar from " + qTableName( "qtest" ) + " a where a.id = 1") ); + QVERIFY_SQL( q, exec("select a.id, a.t_char, a.t_varchar from " + qtest + " a where a.id = 1") ); QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).toInt(), 1 ); QCOMPARE( q.value( 1 ).toString().trimmed(), QString( "Char1" ) ); @@ -1641,6 +1657,8 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString qtest_prepare(qTableName("qtest_prepare", __FILE__)); + if(db.driverName().startsWith("QIBASE") && (db.databaseName() == "silence.nokia.troll.no:c:\\ibase\\testdb_ascii" || db.databaseName() == "/opt/interbase/qttest.gdb")) QSKIP("Can't transliterate extended unicode to ascii", SkipSingle); if(db.driverName().startsWith("QDB2")) @@ -1665,15 +1683,15 @@ QVERIFY_SQL( q, exec("set client_min_messages='warning'")); if ( tst_Databases::isSqlServer( db ) || db.driverName().startsWith( "QTDS" ) ) - createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int primary key, name nvarchar(200) null)"; + createQuery = "create table " + qtest_prepare + " (id int primary key, name nvarchar(200) null)"; else if ( tst_Databases::isMySQL(db) && useUnicode ) - createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(200) character set utf8)"; + createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200) character set utf8)"; else - createQuery = "create table " + qTableName( "qtest_prepare" ) + " (id int not null primary key, name varchar(200))"; + createQuery = "create table " + qtest_prepare + " (id int not null primary key, name varchar(200))"; QVERIFY_SQL( q, exec( createQuery ) ); - QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (:id, :name)" ) ); + QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (:id, :name)" ) ); int i; for ( i = 0; i < 6; ++i ) { @@ -1696,7 +1714,7 @@ QVERIFY_SQL( q, exec() ); } - QVERIFY_SQL( q, exec( "SELECT * FROM " + qTableName( "qtest_prepare" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "SELECT * FROM " + qtest_prepare + " order by id" ) ); for ( i = 0; i < 6; ++i ) { QVERIFY( q.next() ); @@ -1715,12 +1733,12 @@ QCOMPARE( q.value( 0 ).toInt(), 8 ); QCOMPARE( q.value( 1 ).toString(), values[5] ); - QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (:id, 'Bart')" ) ); + QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (:id, 'Bart')" ) ); q.bindValue( ":id", 99 ); QVERIFY_SQL( q, exec() ); q.bindValue( ":id", 100 ); QVERIFY_SQL( q, exec() ); - QVERIFY( q.exec( "select * from " + qTableName( "qtest_prepare" ) + " where id > 98 order by id" ) ); + QVERIFY( q.exec( "select * from " + qtest_prepare + " where id > 98 order by id" ) ); for ( i = 99; i <= 100; ++i ) { QVERIFY( q.next() ); @@ -1729,7 +1747,7 @@ } /*** SELECT stuff ***/ - QVERIFY( q.prepare( "select * from " + qTableName( "qtest_prepare" ) + " where id = :id" ) ); + QVERIFY( q.prepare( "select * from " + qtest_prepare + " where id = :id" ) ); for ( i = 0; i < 6; ++i ) { q.bindValue( ":id", i ); @@ -1744,9 +1762,9 @@ QVERIFY( !q.next() ); } - QVERIFY_SQL( q, exec( "DELETE FROM " + qTableName( "qtest_prepare" ) ) ); - - QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, ?)" ) ); + QVERIFY_SQL( q, exec( "DELETE FROM " + qtest_prepare ) ); + + QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, ?)" ) ); q.bindValue( 0, 0 ); q.bindValue( 1, values[ 0 ] ); QVERIFY_SQL( q, exec() ); @@ -1775,7 +1793,7 @@ QVERIFY_SQL( q, exec() ); } - QVERIFY_SQL( q, exec( "SELECT * FROM " + qTableName( "qtest_prepare" ) + " order by id" ) ); + QVERIFY_SQL( q, exec( "SELECT * FROM " + qtest_prepare + " order by id" ) ); for ( i = 0; i < 6; ++i ) { QVERIFY( q.next() ); @@ -1794,13 +1812,13 @@ QCOMPARE( q.value( 1 ).toString(), utf8str ); } - QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, 'Bart')" ) ); + QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, 'Bart')" ) ); q.bindValue( 0, 99 ); QVERIFY_SQL( q, exec() ); q.addBindValue( 100 ); QVERIFY_SQL( q, exec() ); - QVERIFY( q.exec( "select * from " + qTableName( "qtest_prepare" ) + " where id > 98 order by id" ) ); + QVERIFY( q.exec( "select * from " + qtest_prepare + " where id > 98 order by id" ) ); for ( i = 99; i <= 100; ++i ) { QVERIFY( q.next() ); @@ -1809,7 +1827,7 @@ } /* insert a duplicate id and make sure the db bails out */ - QVERIFY( q.prepare( "insert into " + qTableName( "qtest_prepare" ) + " (id, name) values (?, ?)" ) ); + QVERIFY( q.prepare( "insert into " + qtest_prepare + " (id, name) values (?, ?)" ) ); q.addBindValue( 99 ); @@ -1831,7 +1849,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QVERIFY_SQL( q, prepare( "select a.id, a.t_char, a.t_varchar from " + qTableName( "qtest" ) + " a where a.id = ?" ) ); + QVERIFY_SQL( q, prepare( "select a.id, a.t_char, a.t_varchar from " + qtest + " a where a.id = ?" ) ); q.bindValue( 0, 1 ); QVERIFY_SQL( q, exec() ); @@ -1851,7 +1869,7 @@ QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).toInt(), 3 ); - QVERIFY_SQL( q, prepare( "select a.id, a.t_char, a.t_varchar from " + qTableName( "qtest" ) + " a where a.id = ?" ) ); + QVERIFY_SQL( q, prepare( "select a.id, a.t_char, a.t_varchar from " + qtest + " a where a.id = ?" ) ); QCOMPARE( q.at(), ( int )QSql::BeforeFirstRow ); QVERIFY( !q.first() ); } @@ -1867,9 +1885,9 @@ QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "CREATE TABLE " + qTableName( "qtest_longstr" ) + " (id int primary key, longstring ntext)" ) ); - - QVERIFY_SQL( q, prepare( "INSERT INTO " + qTableName( "qtest_longstr" ) + " VALUES (?, ?)" ) ); + QVERIFY_SQL( q, exec( "CREATE TABLE " + qTableName( "qtest_longstr", __FILE__ ) + " (id int primary key, longstring ntext)" ) ); + + QVERIFY_SQL( q, prepare( "INSERT INTO " + qTableName( "qtest_longstr", __FILE__ ) + " VALUES (?, ?)" ) ); q.addBindValue( 0 ); @@ -1887,7 +1905,7 @@ QVERIFY_SQL( q, exec() ); - QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_longstr" ) ) ); + QVERIFY_SQL( q, exec( "select * from " + qTableName( "qtest_longstr", __FILE__ ) ) ); QVERIFY_SQL( q, next() ); @@ -1951,7 +1969,7 @@ QSKIP( "Database can't do BatchOperations", SkipSingle ); QSqlQuery q( db ); - QString tableName = qTableName( "qtest_batch" ); + const QString tableName = qTableName( "qtest_batch", __FILE__ ); QVERIFY_SQL( q, exec( "create table " + tableName + " (id int, name varchar(20), dt date, num numeric(8, 4))" ) ); QVERIFY_SQL( q, prepare( "insert into " + tableName + " (id, name, dt, num) values (?, ?, ?, ?)" ) ); @@ -2095,9 +2113,9 @@ QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "create table "+qTableName( "record_sqlite" )+"(id integer primary key, name varchar, title int)" ) ); - - QSqlRecord rec = db.record( qTableName( "record_sqlite" ) ); + QVERIFY_SQL( q, exec( "create table "+qTableName( "record_sqlite", __FILE__ )+"(id integer primary key, name varchar, title int)" ) ); + + QSqlRecord rec = db.record( qTableName( "record_sqlite", __FILE__ ) ); QCOMPARE( rec.count(), 3 ); QCOMPARE( rec.field( 0 ).type(), QVariant::Int ); @@ -2105,7 +2123,7 @@ QCOMPARE( rec.field( 2 ).type(), QVariant::Int ); /* important - select from an empty table */ - QVERIFY_SQL( q, exec( "select id, name, title from "+qTableName( "record_sqlite" ) ) ); + QVERIFY_SQL( q, exec( "select id, name, title from "+qTableName( "record_sqlite", __FILE__ ) ) ); rec = q.record(); QCOMPARE( rec.count(), 3 ); @@ -2124,13 +2142,13 @@ QString aLotOfText( 127000, QLatin1Char( 'H' ) ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_longstr" ) + " (id int primary key, astr long)" ) ); - QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_longstr" ) + " (id, astr) values (?, ?)" ) ); + QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_longstr", __FILE__ ) + " (id int primary key, astr long)" ) ); + QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_longstr", __FILE__ ) + " (id, astr) values (?, ?)" ) ); q.addBindValue( 1 ); q.addBindValue( aLotOfText ); QVERIFY_SQL( q, exec() ); - QVERIFY_SQL( q, exec( "select id,astr from " + qTableName( "qtest_longstr" ) ) ); + QVERIFY_SQL( q, exec( "select id,astr from " + qTableName( "qtest_longstr", __FILE__ ) ) ); QVERIFY( q.next() ); QCOMPARE( q.value( 0 ).toInt(), 1 ); @@ -2145,8 +2163,8 @@ QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_exerr" ) + " (id int not null primary key)" ) ); - QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_exerr" ) + " values (?)" ) ); + QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_exerr", __FILE__ ) + " (id int not null primary key)" ) ); + QVERIFY_SQL( q, prepare( "insert into " + qTableName( "qtest_exerr", __FILE__ ) + " values (?)" ) ); q.addBindValue( 1 ); QVERIFY_SQL( q, exec() ); @@ -2169,7 +2187,7 @@ QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "qtest" ) + " values (41, 'VarChar41', 'Char41')" ) ); + QVERIFY_SQL( q, exec( "insert into " + qtest + " values (41, 'VarChar41', 'Char41')" ) ); QVariant v = q.lastInsertId(); @@ -2183,7 +2201,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QString sql = "select * from " + qTableName( "qtest" ); + QString sql = "select * from " + qtest; QVERIFY_SQL( q, exec( sql ) ); QCOMPARE( q.lastQuery(), sql ); QCOMPARE( q.executedQuery(), sql ); @@ -2202,7 +2220,7 @@ return; } - QString tablename = qTableName( "bindtest" ); + const QString tablename(qTableName( "bindtest", __FILE__ )); QSqlQuery q( db ); @@ -2276,7 +2294,7 @@ QSqlQuery q( db ); db.open(); - QVERIFY_SQL( q, exec( QString( "select * from %1 where id = 1" ).arg( qTableName( "qtest" ) ) ) ); + QVERIFY_SQL( q, exec( QString( "select * from %1 where id = 1" ).arg( qtest ) ) ); QVERIFY_SQL( q, next() ); QCOMPARE( q.value( 0 ).toInt(), 1 ); @@ -2284,7 +2302,7 @@ QCOMPARE( q.value( 2 ).toString().trimmed(), QLatin1String( "Char1" ) ); db.close(); - QVERIFY2( !q.exec( QString( "select * from %1 where id = 1" ).arg( qTableName( "qtest" ) ) ), + QVERIFY2( !q.exec( QString( "select * from %1 where id = 1" ).arg( qtest ) ), qPrintable( QString( "This can't happen! The query should not have been executed!" ) ) ); } @@ -2297,7 +2315,7 @@ QSqlQuery q( db ); q.setForwardOnly( true ); - QVERIFY_SQL( q, prepare( QString( "SELECT id, t_varchar, t_char FROM %1 WHERE id = :id" ).arg( qTableName( "qtest" ) ) ) ); + QVERIFY_SQL( q, prepare( QString( "SELECT id, t_varchar, t_char FROM %1 WHERE id = :id" ).arg( qtest ) ) ); q.bindValue( ":id", 1 ); QVERIFY_SQL( q, exec() ); @@ -2322,7 +2340,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QVERIFY_SQL( q, prepare( "SELECT id FROM " + qTableName( "qtest" ) + " WHERE id = ?" ) ); + QVERIFY_SQL( q, prepare( "SELECT id FROM " + qtest + " WHERE id = ?" ) ); int id = 4; q.bindValue( 0, id ); @@ -2343,7 +2361,7 @@ q.finish(); QVERIFY( !q.isActive() ); - QVERIFY_SQL( q, exec( "SELECT id FROM " + qTableName( "qtest" ) + " WHERE id = 1" ) ); + QVERIFY_SQL( q, exec( "SELECT id FROM " + qtest + " WHERE id = 1" ) ); QVERIFY( q.isActive() ); QVERIFY_SQL( q, next() ); QCOMPARE( q.value( 0 ).toInt(), 1 ); @@ -2368,7 +2386,7 @@ db2.setDatabaseName( db.databaseName() ); QVERIFY_SQL( db2, open() ); - QString tableName = qTableName( "qtest_lockedtable" ); + const QString tableName(qTableName( "qtest_lockedtable", __FILE__ )); QSqlQuery q( db ); tst_Databases::safeDropTable( db, tableName ); @@ -2418,7 +2436,7 @@ else if ( db.driverName().startsWith( "QDB2" ) ) driverType = DB2; - QString tableName = qTableName( "more_results" ); + const QString tableName(qTableName( "more_results", __FILE__ )); QVERIFY_SQL( q, exec( "CREATE TABLE " + tableName + " (id integer, text varchar(20), num numeric(6, 3), empty varchar(10));" ) ); @@ -2522,7 +2540,7 @@ } // Stored procedure with multiple result sets - QString procName = qTableName( "proc_more_res" ); + const QString procName(qTableName( "proc_more_res", __FILE__ )); q.exec( QString( "DROP PROCEDURE %1;" ).arg( procName ) ); @@ -2600,7 +2618,7 @@ if ( !db.driver()->hasFeature( QSqlDriver::BLOB ) || !db.driver()->hasFeature( QSqlDriver::PreparedQueries ) ) QSKIP( "DBMS does not support BLOBs or prepared queries", SkipSingle ); - QString tableName = qTableName( "blobstest" ); + const QString tableName(qTableName( "blobstest", __FILE__ )); QSqlQuery q( db ); q.setForwardOnly( true ); // This is needed to make the test work with DB2. @@ -2655,8 +2673,8 @@ { QSqlQuery q( db ); - QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_empty" ) + " (id char(10))" ) ); - QVERIFY_SQL( q, prepare( "select * from " + qTableName( "qtest_empty" ) ) ); + QVERIFY_SQL( q, exec( "create table " + qTableName( "qtest_empty", __FILE__ ) + " (id char(10))" ) ); + QVERIFY_SQL( q, prepare( "select * from " + qTableName( "qtest_empty", __FILE__ ) ) ); QVERIFY_SQL( q, exec() ); QVERIFY( !q.next() ); QCOMPARE( q.lastError().isValid(), false ); @@ -2669,19 +2687,20 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); QSqlQuery q( db ); - - QVERIFY_SQL( q, exec( "create table " + qTableName( "Planet" ) + " (Name varchar(20))" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Mercury')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Venus')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Earth')" ) ); - QVERIFY_SQL( q, exec( "insert into " + qTableName( "Planet" ) + " VALUES ('Mars')" ) ); - - QVERIFY_SQL( q, exec( "SELECT Name FROM "+qTableName( "Planet" ) ) ); + const QString Planet(qTableName( "Planet", __FILE__)); + + QVERIFY_SQL( q, exec( "create table " + Planet + " (Name varchar(20))" ) ); + QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Mercury')" ) ); + QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Venus')" ) ); + QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Earth')" ) ); + QVERIFY_SQL( q, exec( "insert into " + Planet + " VALUES ('Mars')" ) ); + + QVERIFY_SQL( q, exec( "SELECT Name FROM " + Planet ) ); QVERIFY_SQL( q, seek( 3 ) ); QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) ); QVERIFY_SQL( q, seek( 1 ) ); QCOMPARE( q.value( 0 ).toString(), QString( "Venus" ) ); - QVERIFY_SQL( q, exec( "SELECT Name FROM "+qTableName( "Planet" ) ) ); + QVERIFY_SQL( q, exec( "SELECT Name FROM " + Planet ) ); QVERIFY_SQL( q, seek( 3 ) ); QCOMPARE( q.value( 0 ).toString(), QString( "Mars" ) ); QVERIFY_SQL( q, seek( 0 ) ); @@ -2698,7 +2717,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QString tableName = qTableName( "task_250026" ); + const QString tableName(qTableName( "task_250026", __FILE__ )); if ( !q.exec( "create table " + tableName + " (longfield varchar(1100))" ) ) { qDebug() << "Error" << q.lastError(); @@ -2746,7 +2765,7 @@ QSqlQuery q( db ); - QString tableName = qTableName( "task_229811" ); + const QString tableName(qTableName( "task_229811", __FILE__ )); if ( !q.exec( "CREATE TABLE " + tableName + " (Word varchar(20))" ) ) { qDebug() << "Warning" << q.lastError(); @@ -2793,7 +2812,7 @@ m_airlines << "Lufthansa" << "SAS" << "United" << "KLM" << "Aeroflot"; m_countries << "DE" << "SE" << "US" << "NL" << "RU"; - QString tableName = qTableName( "task_234422" ); + const QString tableName(qTableName( "task_234422", __FILE__ )); QVERIFY_SQL(query,exec("CREATE TABLE " + tableName + " (id int primary key, " "name varchar(20), homecountry varchar(2))")); @@ -2825,7 +2844,7 @@ CHECK_DATABASE( db ); QSqlQuery q( db ); - QString tableName = qTableName("task_233829"); + const QString tableName(qTableName("task_233829", __FILE__)); QVERIFY_SQL(q,exec("CREATE TABLE " + tableName + "(dbl1 double precision,dbl2 double precision) without oids;")); QString queryString("INSERT INTO " + tableName +"(dbl1, dbl2) VALUES(?,?)"); @@ -2845,7 +2864,7 @@ if (!tst_Databases::isSqlServer( db )) QSKIP("SQL Server specific test", SkipSingle); - QString tableName(qTableName("test141895")), procName(qTableName("test141895_proc")); + const QString tableName(qTableName("test141895", __FILE__)), procName(qTableName("test141895_proc", __FILE__)); QSqlQuery q( db ); q.exec("DROP TABLE " + tableName); q.exec("DROP PROCEDURE " + procName); @@ -2871,7 +2890,7 @@ QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); QSqlQuery q(db); - QString pkgname=qTableName("pkg"); + const QString pkgname(qTableName("pkg", __FILE__)); QVERIFY_SQL(q, exec("CREATE OR REPLACE PACKAGE "+pkgname+" IS \n\ \n\ TYPE IntType IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;\n\ @@ -2917,17 +2936,18 @@ QFETCH( QString, dbName ); QSqlDatabase db = QSqlDatabase::database( dbName ); CHECK_DATABASE( db ); + const QString timetest(qTableName("timetest", __FILE__)); if (!db.driverName().startsWith( "QPSQL" )) return; QSqlQuery q(db); - q.exec("DROP TABLE " + qTableName("timetest")); - QVERIFY_SQL(q, exec("CREATE TABLE " + qTableName("timetest") + " (t TIME)")); - QVERIFY_SQL(q, exec("INSERT INTO " + qTableName("timetest") + " VALUES ('1:2:3.666')")); + q.exec("DROP TABLE " + timetest); + QVERIFY_SQL(q, exec("CREATE TABLE " + timetest + " (t TIME)")); + QVERIFY_SQL(q, exec("INSERT INTO " + timetest + " VALUES ('1:2:3.666')")); QSqlTableModel timetestModel(0,db); timetestModel.setEditStrategy(QSqlTableModel::OnManualSubmit); - timetestModel.setTable(qTableName("timetest")); + timetestModel.setTable(timetest); QVERIFY_SQL(timetestModel, select()); QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("01:02:03.666")); @@ -2936,7 +2956,7 @@ QVERIFY_SQL(timetestModel, submitAll()); QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500")); - QVERIFY_SQL(q, exec("UPDATE " + qTableName("timetest") + " SET t = '0:11:22.33'")); + QVERIFY_SQL(q, exec("UPDATE " + timetest + " SET t = '0:11:22.33'")); QVERIFY_SQL(timetestModel, select()); QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:11:22.330")); @@ -2949,7 +2969,7 @@ CHECK_DATABASE( db ); QSqlQuery q(db); - QString tableName=qTableName(QLatin1String("bug6421")).toUpper(); + const QString tableName(qTableName("bug6421", __FILE__).toUpper()); QVERIFY_SQL(q, exec("create table "+tableName+"(COL1 char(10), COL2 char(10), COL3 char(10))")); QVERIFY_SQL(q, exec("create index INDEX1 on "+tableName+" (COL1 desc)")); @@ -2974,16 +2994,16 @@ QSKIP("SQL Server specific test", SkipSingle); QSqlQuery q(db); - q.exec( "drop procedure " + qTableName( "tst_raiseError" ) ); //non-fatal + q.exec( "drop procedure " + qTableName( "tst_raiseError", __FILE__ ) ); //non-fatal QString errorString; for (int i=0;i<110;i++) errorString+="reallylong"; errorString+=" error"; - QVERIFY_SQL( q, exec("create procedure " + qTableName( "tst_raiseError" ) + " as\n" + QVERIFY_SQL( q, exec("create procedure " + qTableName( "tst_raiseError", __FILE__ ) + " as\n" "begin\n" " raiserror('" + errorString + "', 16, 1)\n" "end\n" )); - q.exec( "{call " + qTableName( "tst_raiseError" ) + "}" ); + q.exec( "{call " + qTableName( "tst_raiseError", __FILE__ ) + "}" ); QVERIFY(q.lastError().text().contains(errorString)); } @@ -2996,10 +3016,9 @@ QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); QSqlQuery q(db); - QString tableName(qTableName(QLatin1String("bug6421"))), procName(qTableName(QLatin1String("bug6421_proc"))); + const QString tableName(qTableName("bug6852", __FILE__)), procName(qTableName("bug6852_proc", __FILE__)); QVERIFY_SQL(q, exec("DROP PROCEDURE IF EXISTS "+procName)); - tst_Databases::safeDropTable(db, tableName); QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(\n" "MainKey INT NOT NULL,\n" "OtherTextCol VARCHAR(45) NOT NULL,\n" @@ -3022,6 +3041,72 @@ QCOMPARE(q.value(1).toString(), QLatin1String("Disabled")); } +void tst_QSqlQuery::QTBUG_5765() +{ + QFETCH( QString, dbName ); + QSqlDatabase db = QSqlDatabase::database( dbName ); + CHECK_DATABASE( db ); + if ( tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 1 ).toFloat()<4.1 ) + QSKIP( "Test requires MySQL >= 4.1", SkipSingle ); + + QSqlQuery q(db); + const QString tableName(qTableName("bug5765", __FILE__)); + + QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(testval TINYINT(1) DEFAULT 0)")); + q.prepare("INSERT INTO "+tableName+" SET testval = :VALUE"); + q.bindValue(":VALUE", 1); + QVERIFY_SQL(q, exec()); + q.bindValue(":VALUE", 12); + QVERIFY_SQL(q, exec()); + q.bindValue(":VALUE", 123); + QVERIFY_SQL(q, exec()); + QString sql="select testval from "+tableName; + QVERIFY_SQL(q, exec(sql)); + QVERIFY_SQL(q, next()); + QCOMPARE(q.value(0).toInt(), 1); + QVERIFY_SQL(q, next()); + QCOMPARE(q.value(0).toInt(), 12); + QVERIFY_SQL(q, next()); + QCOMPARE(q.value(0).toInt(), 123); + QVERIFY_SQL(q, prepare(sql)); + QVERIFY_SQL(q, exec()); + QVERIFY_SQL(q, next()); + QCOMPARE(q.value(0).toInt(), 1); + QVERIFY_SQL(q, next()); + QCOMPARE(q.value(0).toInt(), 12); + QVERIFY_SQL(q, next()); + QCOMPARE(q.value(0).toInt(), 123); +} + +#if 0 +void tst_QSqlQuery::benchmark() +{ + QFETCH( QString, dbName ); + QSqlDatabase db = QSqlDatabase::database( dbName ); + CHECK_DATABASE( db ); + if ( tst_Databases::getMySqlVersion( db ).section( QChar('.'), 0, 0 ).toInt()<5 ) + QSKIP( "Test requires MySQL >= 5.0", SkipSingle ); + + QSqlQuery q(db); + const QString tableName(qTableName("benchmark", __FILE__)); + + tst_Databases::safeDropTable( db, tableName ); + + QVERIFY_SQL(q, exec("CREATE TABLE "+tableName+"(\n" + "MainKey INT NOT NULL,\n" + "OtherTextCol VARCHAR(45) NOT NULL,\n" + "PRIMARY KEY(`MainKey`))")); + + int i=1; + + QBENCHMARK { + QVERIFY_SQL(q, exec("INSERT INTO "+tableName+" VALUES("+QString::number(i)+", \"Value"+QString::number(i)+"\")")); + i++; + } + + tst_Databases::safeDropTable( db, tableName ); +} +#endif QTEST_MAIN( tst_QSqlQuery ) #include "tst_qsqlquery.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp --- a/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsqlquerymodel/tst_qsqlquerymodel.cpp Mon May 03 13:17:34 2010 +0300 @@ -148,10 +148,10 @@ void tst_QSqlQueryModel::dropTestTables(QSqlDatabase db) { QStringList tableNames; - tableNames << qTableName("test") - << qTableName("test2") - << qTableName("test3") - << qTableName("many"); + tableNames << qTableName("test", __FILE__) + << qTableName("test2", __FILE__) + << qTableName("test3", __FILE__) + << qTableName("many", __FILE__); tst_Databases::safeDropTables(db, tableNames); } @@ -161,10 +161,10 @@ QSqlQuery q(db); if(tst_Databases::isPostgreSQL(db)) QVERIFY_SQL( q, exec("set client_min_messages='warning'")); - QVERIFY_SQL( q, exec("create table " + qTableName("test") + "(id integer not null, name varchar(20), title integer, primary key (id))")); - QVERIFY_SQL( q, exec("create table " + qTableName("test2") + "(id integer not null, title varchar(20), primary key (id))")); - QVERIFY_SQL( q, exec("create table " + qTableName("test3") + "(id integer not null, primary key (id))")); - QVERIFY_SQL( q, exec("create table " + qTableName("many") + "(id integer not null, name varchar(20), primary key (id))")); + QVERIFY_SQL( q, exec("create table " + qTableName("test", __FILE__) + "(id integer not null, name varchar(20), title integer, primary key (id))")); + QVERIFY_SQL( q, exec("create table " + qTableName("test2", __FILE__) + "(id integer not null, title varchar(20), primary key (id))")); + QVERIFY_SQL( q, exec("create table " + qTableName("test3", __FILE__) + "(id integer not null, primary key (id))")); + QVERIFY_SQL( q, exec("create table " + qTableName("many", __FILE__) + "(id integer not null, name varchar(20), primary key (id))")); } void tst_QSqlQueryModel::populateTestTables(QSqlDatabase db) @@ -174,38 +174,38 @@ QSqlQuery q(db), q2(db); - tst_Databases::safeDropTables(db, QStringList() << qTableName("manytmp") << qTableName("test3tmp")); - QVERIFY_SQL(q, exec("create table " + qTableName("manytmp") + "(id integer not null, name varchar(20), primary key (id))")); - QVERIFY_SQL(q, exec("create table " + qTableName("test3tmp") + "(id integer not null, primary key (id))")); + tst_Databases::safeDropTables(db, QStringList() << qTableName("manytmp", __FILE__) << qTableName("test3tmp", __FILE__)); + QVERIFY_SQL(q, exec("create table " + qTableName("manytmp", __FILE__) + "(id integer not null, name varchar(20), primary key (id))")); + QVERIFY_SQL(q, exec("create table " + qTableName("test3tmp", __FILE__) + "(id integer not null, primary key (id))")); if (hasTransactions) QVERIFY_SQL(db, transaction()); - QVERIFY_SQL(q, exec("insert into " + qTableName("test") + " values(1, 'harry', 1)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("test") + " values(2, 'trond', 2)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("test2") + " values(1, 'herr')")); - QVERIFY_SQL(q, exec("insert into " + qTableName("test2") + " values(2, 'mister')")); + QVERIFY_SQL(q, exec("insert into " + qTableName("test", __FILE__) + " values(1, 'harry', 1)")); + QVERIFY_SQL(q, exec("insert into " + qTableName("test", __FILE__) + " values(2, 'trond', 2)")); + QVERIFY_SQL(q, exec("insert into " + qTableName("test2", __FILE__) + " values(1, 'herr')")); + QVERIFY_SQL(q, exec("insert into " + qTableName("test2", __FILE__) + " values(2, 'mister')")); - QVERIFY_SQL(q, exec(QString("insert into " + qTableName("test3") + " values(0)"))); - QVERIFY_SQL(q, prepare("insert into "+qTableName("test3")+"(id) select id + ? from "+qTableName("test3tmp"))); + QVERIFY_SQL(q, exec(QString("insert into " + qTableName("test3", __FILE__) + " values(0)"))); + QVERIFY_SQL(q, prepare("insert into "+qTableName("test3", __FILE__)+"(id) select id + ? from "+qTableName("test3tmp", __FILE__))); for (int i=1; i<260; i*=2) { - q2.exec("delete from "+qTableName("test3tmp")); - QVERIFY_SQL(q2, exec("insert into "+qTableName("test3tmp")+"(id) select id from "+qTableName("test3"))); + q2.exec("delete from "+qTableName("test3tmp", __FILE__)); + QVERIFY_SQL(q2, exec("insert into "+qTableName("test3tmp", __FILE__)+"(id) select id from "+qTableName("test3", __FILE__))); q.bindValue(0, i); QVERIFY_SQL(q, exec()); } - QVERIFY_SQL(q, exec(QString("insert into " + qTableName("many") + "(id, name) values (0, \'harry\')"))); - QVERIFY_SQL(q, prepare("insert into "+qTableName("many")+"(id, name) select id + ?, name from "+qTableName("manytmp"))); + QVERIFY_SQL(q, exec(QString("insert into " + qTableName("many", __FILE__) + "(id, name) values (0, \'harry\')"))); + QVERIFY_SQL(q, prepare("insert into "+qTableName("many", __FILE__)+"(id, name) select id + ?, name from "+qTableName("manytmp", __FILE__))); for (int i=1; i < 2048; i*=2) { - q2.exec("delete from "+qTableName("manytmp")); - QVERIFY_SQL(q2, exec("insert into "+qTableName("manytmp")+"(id, name) select id, name from "+qTableName("many"))); + q2.exec("delete from "+qTableName("manytmp", __FILE__)); + QVERIFY_SQL(q2, exec("insert into "+qTableName("manytmp", __FILE__)+"(id, name) select id, name from "+qTableName("many", __FILE__))); q.bindValue(0, i); QVERIFY_SQL(q, exec()); } if (hasTransactions) QVERIFY_SQL(db, commit()); - tst_Databases::safeDropTables(db, QStringList() << qTableName("manytmp") << qTableName("test3tmp")); + tst_Databases::safeDropTables(db, QStringList() << qTableName("manytmp", __FILE__) << qTableName("test3tmp", __FILE__)); } void tst_QSqlQueryModel::generic_data(const QString& engine) @@ -233,7 +233,7 @@ CHECK_DATABASE(db); DBTestModel model; - model.setQuery(QSqlQuery("select * from " + qTableName("test"), db)); + model.setQuery(QSqlQuery("select * from " + qTableName("test", __FILE__), db)); model.fetchMore(); QSignalSpy spy(&model, SIGNAL(columnsAboutToBeRemoved(QModelIndex, int, int))); @@ -315,7 +315,7 @@ CHECK_DATABASE(db); DBTestModel model; - model.setQuery(QSqlQuery("select * from " + qTableName("test"), db)); + model.setQuery(QSqlQuery("select * from " + qTableName("test", __FILE__), db)); model.fetchMore(); // necessary??? QSignalSpy spy(&model, SIGNAL(columnsInserted(QModelIndex, int, int))); @@ -395,7 +395,7 @@ CHECK_DATABASE(db); QSqlQueryModel model; - model.setQuery(QSqlQuery("select * from " + qTableName("test"), db)); + model.setQuery(QSqlQuery("select * from " + qTableName("test", __FILE__), db)); QSqlRecord rec = model.record(); @@ -429,7 +429,7 @@ QVERIFY(!model.setHeaderData(5, Qt::Vertical, "foo")); QVERIFY(model.headerData(5, Qt::Vertical).isValid()); - model.setQuery(QSqlQuery("select * from " + qTableName("test"), db)); + model.setQuery(QSqlQuery("select * from " + qTableName("test", __FILE__), db)); qRegisterMetaType("Qt::Orientation"); QSignalSpy spy(&model, SIGNAL(headerDataChanged(Qt::Orientation, int, int))); @@ -459,7 +459,7 @@ QSqlQueryModel model; QSignalSpy spy(&model, SIGNAL(rowsInserted(QModelIndex, int, int))); - model.setQuery(QSqlQuery("select * from " + qTableName("many"), db)); + model.setQuery(QSqlQuery("select * from " + qTableName("many", __FILE__), db)); int rowCount = model.rowCount(); QCOMPARE(spy.value(0).value(1).toInt(), 0); @@ -491,7 +491,7 @@ QSKIP("Test applies only for drivers not reporting the query size.", SkipSingle); QSqlQueryModel model; - model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test3"), db)); + model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test3", __FILE__), db)); QSortFilterProxyModel proxy; proxy.setSourceModel(&model); @@ -500,7 +500,7 @@ QSignalSpy modelRowsRemovedSpy(&model, SIGNAL(rowsRemoved(const QModelIndex &, int, int))); QSignalSpy modelRowsInsertedSpy(&model, SIGNAL(rowsInserted(const QModelIndex &, int, int))); - model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test3"), db)); + model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test3", __FILE__), db)); view.scrollToBottom(); QTestEventLoop::instance().enterLoop(1); @@ -536,12 +536,12 @@ QSignalSpy modelRowsRemovedSpy(&model, SIGNAL(rowsRemoved(const QModelIndex &, int, int))); // First select, the model was empty and no rows had to be removed! - model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test"), db)); + model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test", __FILE__), db)); QCOMPARE(modelRowsAboutToBeRemovedSpy.count(), 0); QCOMPARE(modelRowsRemovedSpy.count(), 0); // Second select, the model wasn't empty and two rows had to be removed! - model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test"), db)); + model.setQuery(QSqlQuery("SELECT * FROM " + qTableName("test", __FILE__), db)); QCOMPARE(modelRowsAboutToBeRemovedSpy.count(), 1); QCOMPARE(modelRowsAboutToBeRemovedSpy.value(0).value(1).toInt(), 0); QCOMPARE(modelRowsAboutToBeRemovedSpy.value(0).value(2).toInt(), 1); @@ -564,7 +564,7 @@ // The query's result set will be empty so no signals should be emitted! QSqlQuery query(db); - QVERIFY_SQL(query, exec("SELECT * FROM " + qTableName("test") + " where 0 = 1")); + QVERIFY_SQL(query, exec("SELECT * FROM " + qTableName("test", __FILE__) + " where 0 = 1")); model.setQuery(query); QCOMPARE(modelRowsAboutToBeInsertedSpy.count(), 0); QCOMPARE(modelRowsInsertedSpy.count(), 0); @@ -578,13 +578,14 @@ QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); + const QString test3(qTableName("test3", __FILE__)); QTableView view; QCOMPARE(view.columnAt(0), -1); QCOMPARE(view.rowAt(0), -1); QSqlQueryModel model; - model.setQuery( "SELECT TOP 0 * FROM " + qTableName("test3"), db ); + model.setQuery( "SELECT TOP 0 * FROM " + test3, db ); view.setModel(&model); bool error = false; @@ -595,10 +596,10 @@ QCOMPARE(view.columnAt(0), (error)?-1:0 ); QCOMPARE(view.rowAt(0), -1); - model.setQuery( "SELECT TOP 0 * FROM " + qTableName("test3"), db ); - model.setQuery( "SELECT TOP 0 * FROM " + qTableName("test3"), db ); - model.setQuery( "SELECT TOP 0 * FROM " + qTableName("test3"), db ); - model.setQuery( "SELECT TOP 0 * FROM " + qTableName("test3"), db ); + model.setQuery( "SELECT TOP 0 * FROM " + test3, db ); + model.setQuery( "SELECT TOP 0 * FROM " + test3, db ); + model.setQuery( "SELECT TOP 0 * FROM " + test3, db ); + model.setQuery( "SELECT TOP 0 * FROM " + test3, db ); QCOMPARE(view.columnAt(0), (error)?-1:0 ); QCOMPARE(view.rowAt(0), -1); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp --- a/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp Mon May 03 13:17:34 2010 +0300 @@ -45,6 +45,11 @@ #include "../qsqldatabase/tst_databases.h" +const QString reltest1(qTableName("reltest1", __FILE__)), + reltest2(qTableName("reltest2", __FILE__)), + reltest3(qTableName("reltest3", __FILE__)), + reltest4(qTableName("reltest4", __FILE__)), + reltest5(qTableName("reltest5", __FILE__)); //TESTED_CLASS= @@ -107,37 +112,37 @@ dropTestTables(db); QSqlQuery q(db); - QVERIFY_SQL( q, exec("create table " + qTableName("reltest1") + + QVERIFY_SQL( q, exec("create table " + reltest1 + " (id int not null primary key, name varchar(20), title_key int, another_title_key int)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest1") + " values(1, 'harry', 1, 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest1") + " values(2, 'trond', 2, 1)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest1") + " values(3, 'vohi', 1, 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest1") + " values(4, 'boris', 2, 2)")); + QVERIFY_SQL( q, exec("insert into " + reltest1 + " values(1, 'harry', 1, 2)")); + QVERIFY_SQL( q, exec("insert into " + reltest1 + " values(2, 'trond', 2, 1)")); + QVERIFY_SQL( q, exec("insert into " + reltest1 + " values(3, 'vohi', 1, 2)")); + QVERIFY_SQL( q, exec("insert into " + reltest1 + " values(4, 'boris', 2, 2)")); - QVERIFY_SQL( q, exec("create table " + qTableName("reltest2") + " (tid int not null primary key, title varchar(20))")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest2") + " values(1, 'herr')")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest2") + " values(2, 'mister')")); + QVERIFY_SQL( q, exec("create table " + reltest2 + " (tid int not null primary key, title varchar(20))")); + QVERIFY_SQL( q, exec("insert into " + reltest2 + " values(1, 'herr')")); + QVERIFY_SQL( q, exec("insert into " + reltest2 + " values(2, 'mister')")); - QVERIFY_SQL( q, exec("create table " + qTableName("reltest3") + " (id int not null primary key, name varchar(20), city_key int)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest3") + " values(1, 'Gustav', 1)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest3") + " values(2, 'Heidi', 2)")); + QVERIFY_SQL( q, exec("create table " + reltest3 + " (id int not null primary key, name varchar(20), city_key int)")); + QVERIFY_SQL( q, exec("insert into " + reltest3 + " values(1, 'Gustav', 1)")); + QVERIFY_SQL( q, exec("insert into " + reltest3 + " values(2, 'Heidi', 2)")); - QVERIFY_SQL( q, exec("create table " + qTableName("reltest4") + " (id int not null primary key, name varchar(20))")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest4") + " values(1, 'Oslo')")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest4") + " values(2, 'Trondheim')")); + QVERIFY_SQL( q, exec("create table " + reltest4 + " (id int not null primary key, name varchar(20))")); + QVERIFY_SQL( q, exec("insert into " + reltest4 + " values(1, 'Oslo')")); + QVERIFY_SQL( q, exec("insert into " + reltest4 + " values(2, 'Trondheim')")); - QVERIFY_SQL( q, exec("create table " + qTableName("reltest5") + " (title varchar(20) not null primary key, abbrev varchar(20))")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest5") + " values('herr', 'Hr')")); - QVERIFY_SQL( q, exec("insert into " + qTableName("reltest5") + " values('mister', 'Mr')")); + QVERIFY_SQL( q, exec("create table " + reltest5 + " (title varchar(20) not null primary key, abbrev varchar(20))")); + QVERIFY_SQL( q, exec("insert into " + reltest5 + " values('herr', 'Hr')")); + QVERIFY_SQL( q, exec("insert into " + reltest5 + " values('mister', 'Mr')")); if (testWhiteSpaceNames(db.driverName())) { - QString reltest6 = db.driver()->escapeIdentifier(qTableName("rel test6"), QSqlDriver::TableName); + QString reltest6 = db.driver()->escapeIdentifier(qTableName("rel", __FILE__)+" test6", QSqlDriver::TableName); QVERIFY_SQL( q, exec("create table " + reltest6 + " (id int not null primary key, " + db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName) + " int, " + db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName) + " int)")); QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(1, 1,9)")); QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(2, 2,8)")); - QString reltest7 = db.driver()->escapeIdentifier(qTableName("rel test7"), QSqlDriver::TableName); + QString reltest7 = db.driver()->escapeIdentifier(qTableName("rel", __FILE__)+" test7", QSqlDriver::TableName); QVERIFY_SQL( q, exec("create table " + reltest7 + " (" + db.driver()->escapeIdentifier("city id", QSqlDriver::TableName) + " int not null primary key, " + db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName) + " varchar(20))")); QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(1, 'New York')")); QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(2, 'Washington')")); @@ -173,19 +178,19 @@ void tst_QSqlRelationalTableModel::dropTestTables( QSqlDatabase db ) { QStringList tableNames; - tableNames << qTableName( "reltest1" ) - << qTableName( "reltest2" ) - << qTableName( "reltest3" ) - << qTableName( "reltest4" ) - << qTableName( "reltest5" ) - << qTableName( "rel test6" ) - << qTableName( "rel test7" ) - << qTableName("CASETEST1" ) - << qTableName("casetest1" ); + tableNames << reltest1 + << reltest2 + << reltest3 + << reltest4 + << reltest5 + << (qTableName( "rel", __FILE__)+" test6") + << (qTableName( "rel", __FILE__)+" test7") + << qTableName("CASETEST1", db.driver() ) + << qTableName("casetest1", db.driver() ); tst_Databases::safeDropTables( db, tableNames ); - db.exec("DROP SCHEMA "+qTableName("QTBUG_5373")+" CASCADE"); - db.exec("DROP SCHEMA "+qTableName("QTBUG_5373_s2")+" CASCADE"); + db.exec("DROP SCHEMA "+qTableName("QTBUG_5373", __FILE__)+" CASCADE"); + db.exec("DROP SCHEMA "+qTableName("QTBUG_5373_s2", __FILE__)+" CASCADE"); } void tst_QSqlRelationalTableModel::init() @@ -204,8 +209,8 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.columnCount(), 4); @@ -219,8 +224,8 @@ //check data retrieval when relational key is a non-integer type //in this case a string QSqlRelationalTableModel model2(0,db); - model2.setTable(qTableName("reltest2")); - model2.setRelation(1, QSqlRelation(qTableName("reltest5"),"title","abbrev")); + model2.setTable(reltest2); + model2.setRelation(1, QSqlRelation(reltest5,"title","abbrev")); QVERIFY_SQL(model2, select()); QCOMPARE(model2.data(model2.index(0, 1)).toString(), QString("Hr")); @@ -237,9 +242,9 @@ { QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); + model.setTable(reltest1); model.setSort(0, Qt::AscendingOrder); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QVERIFY(model.setData(model.index(0, 1), QString("harry2"))); @@ -260,7 +265,7 @@ } { //verify values QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); + model.setTable(reltest1); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -269,7 +274,7 @@ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("boris2")); QCOMPARE(model.data(model.index(3, 2)).toInt(), 1); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister")); QCOMPARE(model.data(model.index(3,2)).toString(), QString("herr")); @@ -279,10 +284,10 @@ //set the values using OnFieldChange strategy { QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); + model.setTable(reltest1); model.setEditStrategy(QSqlTableModel::OnFieldChange); model.setSort(0, Qt::AscendingOrder); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QVERIFY(model.setData(model.index(1,1), QString("trond2"))); @@ -293,14 +298,14 @@ } { //verify values QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); + model.setTable(reltest1); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond2")); QCOMPARE(model.data(model.index(2, 2)).toInt(), 2); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(2, 2)).toString(), QString("mister")); } @@ -309,13 +314,13 @@ { QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); //sybase doesn't allow tables with the same alias used twice as col names //so don't set up an identical relation when using the tds driver if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(reltest2, "tid", "title")); model.setEditStrategy(QSqlTableModel::OnManualSubmit); model.setSort(0, Qt::AscendingOrder); @@ -336,7 +341,7 @@ } { //verify values QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); + model.setTable(reltest1); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -344,9 +349,9 @@ QCOMPARE(model.data(model.index(3, 2)).toInt(), 1); QCOMPARE(model.data(model.index(0, 3)).toInt(), 1); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(3, 2)).toString(), QString("herr")); @@ -361,8 +366,8 @@ { QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest2")); - model.setRelation(1, QSqlRelation(qTableName("reltest5"), "title", "abbrev")); + model.setTable(reltest2); + model.setRelation(1, QSqlRelation(reltest5, "title", "abbrev")); model.setEditStrategy(QSqlTableModel::OnManualSubmit); QVERIFY_SQL(model, select()); @@ -385,9 +390,9 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - model.setRelation(3, QSqlRelation(qTableName("reltest4"), "id", "name")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); + model.setRelation(3, QSqlRelation(reltest4, "id", "name")); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -407,8 +412,8 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -449,8 +454,8 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -502,12 +507,12 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); model.setSort(0, Qt::AscendingOrder); if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(0,0)).toInt(), 1); @@ -608,8 +613,8 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QVERIFY_SQL(model, removeColumn(3)); @@ -639,8 +644,8 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); model.setFilter("title = 'herr'"); QVERIFY_SQL(model, select()); @@ -657,10 +662,10 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(reltest2, "tid", "title")); model.setSort(2, Qt::DescendingOrder); QVERIFY_SQL(model, select()); @@ -755,9 +760,9 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); - model.setRelation(3, QSqlRelation(qTableName("reltest4"), "id", "name")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); + model.setRelation(3, QSqlRelation(reltest4, "id", "name")); model.setSort(0, Qt::AscendingOrder); @@ -781,11 +786,11 @@ QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); if (!db.driverName().startsWith("QTDS")) - model.setRelation(3, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(3, QSqlRelation(reltest2, "tid", "title")); model.setSort(1, Qt::AscendingOrder); model.setEditStrategy(QSqlTableModel::OnManualSubmit); @@ -833,19 +838,19 @@ CHECK_DATABASE(db); QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest3")); + model.setTable(reltest3); model.setEditStrategy(QSqlTableModel::OnManualSubmit); model.setSort(0, Qt::AscendingOrder); // Duplication of "name", used in both reltest3 and reltest4. - model.setRelation(2, QSqlRelation(qTableName("reltest4"), "id", "name")); + model.setRelation(2, QSqlRelation(reltest4, "id", "name")); QVERIFY_SQL(model, select()); if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name_2")).toUpper()).toString(), + QCOMPARE(model.record(1).value((reltest4+QLatin1String("_name_2")).toUpper()).toString(), QString("Trondheim")); } else { - QCOMPARE(model.record(1).value(qTableName("reltest4").append(QLatin1String("_name_2"))).toString(), + QCOMPARE(model.record(1).value((reltest4+QLatin1String("_name_2"))).toString(), QString("Trondheim")); } @@ -864,9 +869,9 @@ // The duplicate field names is aliased because it's comes from the relation's display column. if(db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) - QCOMPARE(rec.fieldName(2), (qTableName("reltest4").append(QLatin1String("_name_2"))).toUpper()); + QCOMPARE(rec.fieldName(2), (reltest4+QLatin1String("_name_2")).toUpper()); else - QCOMPARE(rec.fieldName(2), qTableName("reltest4").append(QLatin1String("_name_2"))); + QCOMPARE(rec.fieldName(2), reltest4+QLatin1String("_name_2")); QVERIFY(model.insertRecord(-1, rec)); QCOMPARE(model.data(model.index(2, 2)).toString(), QString("Oslo")); @@ -881,8 +886,8 @@ CHECK_DATABASE(db); QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); //try set a non-existent relational key @@ -900,8 +905,8 @@ CHECK_DATABASE(db); QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setTable(reltest1); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QVERIFY(model.relationModel(0) == NULL); @@ -910,7 +915,7 @@ QVERIFY(model.relationModel(3) == NULL); QVERIFY(model.relationModel(4) == NULL); - model.setRelation(3, QSqlRelation(qTableName("reltest4"), "id", "name")); + model.setRelation(3, QSqlRelation(reltest4, "id", "name")); QVERIFY_SQL(model, select()); QVERIFY(model.relationModel(0) == NULL); @@ -981,7 +986,7 @@ QSqlRelationalTableModel model(0, db); model.setTable(qTableName("CASETEST1", db.driver()).toUpper()); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); @@ -997,15 +1002,15 @@ recreateTestTables(db); QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); + model.setTable(reltest1); //try with relation table name quoted if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setRelation(2, QSqlRelation(db.driver()->escapeIdentifier(qTableName("reltest2").toUpper(),QSqlDriver::TableName), + model.setRelation(2, QSqlRelation(db.driver()->escapeIdentifier(reltest2.toUpper(),QSqlDriver::TableName), "tid", "title")); } else { - model.setRelation(2, QSqlRelation(db.driver()->escapeIdentifier(qTableName("reltest2"),QSqlDriver::TableName), + model.setRelation(2, QSqlRelation(db.driver()->escapeIdentifier(reltest2,QSqlDriver::TableName), "tid", "title")); @@ -1018,11 +1023,11 @@ //try with index column quoted if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), + model.setRelation(2, QSqlRelation(reltest2, db.driver()->escapeIdentifier("tid", QSqlDriver::FieldName).toUpper(), "title")); } else { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), + model.setRelation(2, QSqlRelation(reltest2, db.driver()->escapeIdentifier("tid", QSqlDriver::FieldName), "title")); } @@ -1036,11 +1041,11 @@ if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), + model.setRelation(2, QSqlRelation(reltest2, "tid", db.driver()->escapeIdentifier("title", QSqlDriver::FieldName).toUpper())); } else { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), + model.setRelation(2, QSqlRelation(reltest2, "tid", db.driver()->escapeIdentifier("title", QSqlDriver::FieldName))); } @@ -1054,11 +1059,11 @@ //try with tablename and index and display columns quoted in the relation if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), + model.setRelation(2, QSqlRelation(reltest2, "tid", db.driver()->escapeIdentifier("title", QSqlDriver::FieldName).toUpper())); } else { - model.setRelation(2, QSqlRelation(qTableName("reltest2"), + model.setRelation(2, QSqlRelation(reltest2, "tid", db.driver()->escapeIdentifier("title", QSqlDriver::FieldName))); } @@ -1080,12 +1085,12 @@ QSqlRelationalTableModel model(0, db); if (db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) { - model.setTable(db.driver()->escapeIdentifier(qTableName("reltest1").toUpper(), QSqlDriver::TableName)); + model.setTable(db.driver()->escapeIdentifier(reltest1.toUpper(), QSqlDriver::TableName)); } else { - model.setTable(db.driver()->escapeIdentifier(qTableName("reltest1"), QSqlDriver::TableName)); + model.setTable(db.driver()->escapeIdentifier(reltest1, QSqlDriver::TableName)); } model.setSort(0, Qt::AscendingOrder); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QVERIFY(model.setData(model.index(0, 1), QString("harry2"))); @@ -1106,7 +1111,7 @@ } { //verify values QSqlRelationalTableModel model(0, db); - model.setTable(qTableName("reltest1")); + model.setTable(reltest1); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -1115,7 +1120,7 @@ QCOMPARE(model.data(model.index(3, 1)).toString(), QString("boris2")); QCOMPARE(model.data(model.index(3, 2)).toInt(), 1); - model.setRelation(2, QSqlRelation(qTableName("reltest2"), "tid", "title")); + model.setRelation(2, QSqlRelation(reltest2, "tid", "title")); QVERIFY_SQL(model, select()); QCOMPARE(model.data(model.index(0, 2)).toString(), QString("mister")); QCOMPARE(model.data(model.index(3,2)).toString(), QString("herr")); @@ -1132,9 +1137,9 @@ if (!testWhiteSpaceNames(db.driverName())) QSKIP("White space test irrelevant for driver", SkipAll); QSqlRelationalTableModel model(0, db); - model.setTable(db.driver()->escapeIdentifier(qTableName("rel test6"), QSqlDriver::TableName)); + model.setTable(db.driver()->escapeIdentifier(qTableName("rel", __FILE__)+" test6", QSqlDriver::TableName)); model.setSort(0, Qt::DescendingOrder); - model.setRelation(1, QSqlRelation(db.driver()->escapeIdentifier(qTableName("rel test7"), QSqlDriver::TableName), + model.setRelation(1, QSqlRelation(db.driver()->escapeIdentifier(qTableName("rel", __FILE__)+" test7", QSqlDriver::TableName), db.driver()->escapeIdentifier("city id", QSqlDriver::FieldName), db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName))); QVERIFY_SQL(model, select()); @@ -1210,13 +1215,13 @@ } QSqlRelationalTableModel model(0, db); QSqlQuery q(db); - QVERIFY_SQL(q, exec("create schema "+qTableName("QTBUG_5373"))); - QVERIFY_SQL(q, exec("create schema "+qTableName("QTBUG_5373_s2"))); - QVERIFY_SQL(q, exec("create table "+qTableName("QTBUG_5373")+"."+qTableName("document")+"(document_id int primary key, relatingid int, userid int)")); - QVERIFY_SQL(q, exec("create table "+qTableName("QTBUG_5373_s2")+"."+qTableName("user")+"(userid int primary key, username char(40))")); - model.setTable(qTableName("QTBUG_5373")+"."+qTableName("document")); - model.setRelation(1, QSqlRelation(qTableName("QTBUG_5373_s2")+"."+qTableName("user"), "userid", "username")); - model.setRelation(2, QSqlRelation(qTableName("QTBUG_5373_s2")+"."+qTableName("user"), "userid", "username")); + QVERIFY_SQL(q, exec("create schema "+qTableName("QTBUG_5373", __FILE__))); + QVERIFY_SQL(q, exec("create schema "+qTableName("QTBUG_5373_s2", __FILE__))); + QVERIFY_SQL(q, exec("create table "+qTableName("QTBUG_5373", __FILE__)+"."+qTableName("document", __FILE__)+"(document_id int primary key, relatingid int, userid int)")); + QVERIFY_SQL(q, exec("create table "+qTableName("QTBUG_5373_s2", __FILE__)+"."+qTableName("user", __FILE__)+"(userid int primary key, username char(40))")); + model.setTable(qTableName("QTBUG_5373", __FILE__)+"."+qTableName("document", __FILE__)); + model.setRelation(1, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__)+"."+qTableName("user", __FILE__), "userid", "username")); + model.setRelation(2, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__)+"."+qTableName("user", __FILE__), "userid", "username")); QVERIFY_SQL(model, select()); } diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp --- a/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsqltablemodel/tst_qsqltablemodel.cpp Mon May 03 13:17:34 2010 +0300 @@ -44,6 +44,10 @@ #include "../qsqldatabase/tst_databases.h" #include +const QString test(qTableName("test", __FILE__)), + test2(qTableName("test2", __FILE__)), + test3(qTableName("test3", __FILE__)); + //TESTED_CLASS= //TESTED_FILES= @@ -147,20 +151,20 @@ QVERIFY_SQL( q, exec("set client_min_messages='warning'")); QStringList tableNames; - tableNames << qTableName("test") - << qTableName("test2") - << qTableName("test3") - << qTableName("test4") - << qTableName("emptytable") - << qTableName("bigtable") - << qTableName("foo"); + tableNames << test + << test2 + << test3 + << qTableName("test4", __FILE__) + << qTableName("emptytable", __FILE__) + << qTableName("bigtable", __FILE__) + << qTableName("foo", __FILE__); if (testWhiteSpaceNames(db.driverName())) tableNames << qTableName("qtestw hitespace", db.driver()); tst_Databases::safeDropTables(db, tableNames); if (db.driverName().startsWith("QPSQL")) { - q.exec("DROP SCHEMA " + qTableName("testschema") + " CASCADE"); + q.exec("DROP SCHEMA " + qTableName("testschema", __FILE__) + " CASCADE"); } } } @@ -171,15 +175,15 @@ QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i)); QSqlQuery q(db); - QVERIFY_SQL( q, exec("create table " + qTableName("test") + "(id int, name varchar(20), title int)")); + QVERIFY_SQL( q, exec("create table " + test + "(id int, name varchar(20), title int)")); - QVERIFY_SQL( q, exec("create table " + qTableName("test2") + "(id int, title varchar(20))")); + QVERIFY_SQL( q, exec("create table " + test2 + "(id int, title varchar(20))")); - QVERIFY_SQL( q, exec("create table " + qTableName("test3") + "(id int, random varchar(20), randomtwo varchar(20))")); + QVERIFY_SQL( q, exec("create table " + test3 + "(id int, random varchar(20), randomtwo varchar(20))")); - QVERIFY_SQL( q, exec("create table " + qTableName("test4") + "(column1 varchar(50), column2 varchar(50), column3 varchar(50))")); + QVERIFY_SQL( q, exec("create table " + qTableName("test4", __FILE__) + "(column1 varchar(50), column2 varchar(50), column3 varchar(50))")); - QVERIFY_SQL( q, exec("create table " + qTableName("emptytable") + "(id int)")); + QVERIFY_SQL( q, exec("create table " + qTableName("emptytable", __FILE__) + "(id int)")); if (testWhiteSpaceNames(db.driverName())) { QString qry = "create table " + qTableName("qtestw hitespace", db.driver()) + " ("+ db.driver()->escapeIdentifier("a field", QSqlDriver::FieldName) + " int)"; @@ -194,18 +198,18 @@ QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i)); QSqlQuery q(db); - q.exec("delete from " + qTableName("test")); - QVERIFY_SQL( q, exec("insert into " + qTableName("test") + " values(1, 'harry', 1)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("test") + " values(2, 'trond', 2)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("test") + " values(3, 'vohi', 3)")); + q.exec("delete from " + test); + QVERIFY_SQL( q, exec("insert into " + test + " values(1, 'harry', 1)")); + QVERIFY_SQL( q, exec("insert into " + test + " values(2, 'trond', 2)")); + QVERIFY_SQL( q, exec("insert into " + test + " values(3, 'vohi', 3)")); - q.exec("delete from " + qTableName("test2")); - QVERIFY_SQL( q, exec("insert into " + qTableName("test2") + " values(1, 'herr')")); - QVERIFY_SQL( q, exec("insert into " + qTableName("test2") + " values(2, 'mister')")); + q.exec("delete from " + test2); + QVERIFY_SQL( q, exec("insert into " + test2 + " values(1, 'herr')")); + QVERIFY_SQL( q, exec("insert into " + test2 + " values(2, 'mister')")); - q.exec("delete from " + qTableName("test3")); - QVERIFY_SQL( q, exec("insert into " + qTableName("test3") + " values(1, 'foo', 'bar')")); - QVERIFY_SQL( q, exec("insert into " + qTableName("test3") + " values(2, 'baz', 'joe')")); + q.exec("delete from " + test3); + QVERIFY_SQL( q, exec("insert into " + test3 + " values(1, 'foo', 'bar')")); + QVERIFY_SQL( q, exec("insert into " + test3 + " values(2, 'baz', 'joe')")); } } @@ -253,7 +257,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -294,7 +298,7 @@ QSqlTableModel model(0, db); model.setEditStrategy((QSqlTableModel::EditStrategy)submitpolicy); - model.setTable(qTableName("test3")); + model.setTable(test3); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -336,7 +340,7 @@ QSqlTableModel model(0, db); model.setEditStrategy(QSqlTableModel::OnRowChange); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -361,7 +365,7 @@ QSqlTableModel model(0, db); model.setEditStrategy(QSqlTableModel::OnManualSubmit); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -394,7 +398,7 @@ QSqlTableModel model(0, db); model.setEditStrategy(QSqlTableModel::OnManualSubmit); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -421,7 +425,7 @@ QVERIFY(model.submitAll()); model.clear(); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -442,7 +446,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); model.setEditStrategy(QSqlTableModel::OnManualSubmit); QVERIFY_SQL(model, select()); @@ -477,7 +481,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); model.setEditStrategy(QSqlTableModel::OnManualSubmit); QVERIFY_SQL(model, select()); @@ -502,7 +506,7 @@ recreateTestTables(); - model.setTable(qTableName("test")); + model.setTable(test); model.setEditStrategy(QSqlTableModel::OnRowChange); QVERIFY_SQL(model, select()); QCOMPARE(model.rowCount(), 3); @@ -523,7 +527,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); model.setEditStrategy(QSqlTableModel::OnFieldChange); QVERIFY_SQL(model, select()); @@ -539,7 +543,7 @@ model.clear(); recreateTestTables(); - model.setTable(qTableName("test")); + model.setTable(test); model.setEditStrategy(QSqlTableModel::OnManualSubmit); QVERIFY_SQL(model, select()); QCOMPARE(model.rowCount(), 3); @@ -574,7 +578,7 @@ for (int i = 0; i <= 1; ++i) { QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setSort(0, Qt::AscendingOrder); model.setEditStrategy(i == 0 @@ -607,7 +611,7 @@ QCOMPARE(model.rowCount(), 0); QCOMPARE(model.columnCount(), 0); - model.setTable(qTableName("emptytable")); + model.setTable(qTableName("emptytable", __FILE__)); QCOMPARE(model.rowCount(), 0); QCOMPARE(model.columnCount(), 1); @@ -623,9 +627,9 @@ CHECK_DATABASE(db); QSqlQuery q(db); - q.exec("DROP SCHEMA " + qTableName("testschema") + " CASCADE"); - QVERIFY_SQL( q, exec("create schema " + qTableName("testschema"))); - QString tableName = qTableName("testschema") + '.' + qTableName("testtable"); + q.exec("DROP SCHEMA " + qTableName("testschema", __FILE__) + " CASCADE"); + QVERIFY_SQL( q, exec("create schema " + qTableName("testschema", __FILE__))); + QString tableName = qTableName("testschema", __FILE__) + '.' + qTableName("testtable", __FILE__); QVERIFY_SQL( q, exec("create table " + tableName + "(id int)")); QVERIFY_SQL( q, exec("insert into " + tableName + " values(1)")); QVERIFY_SQL( q, exec("insert into " + tableName + " values(2)")); @@ -664,10 +668,10 @@ if(tst_Databases::isPostgreSQL(db)) QVERIFY_SQL( q, exec("set client_min_messages='warning'")); - QVERIFY_SQL( q, exec("create table "+qTableName("foo")+"(a varchar(20), id int not null primary key, b varchar(20))")); + QVERIFY_SQL( q, exec("create table "+qTableName("foo", __FILE__)+"(a varchar(20), id int not null primary key, b varchar(20))")); QSqlTableModel model(0, db); - model.setTable(qTableName("foo")); + model.setTable(qTableName("foo", __FILE__)); QSqlIndex pk = model.primaryKey(); QCOMPARE(pk.count(), 1); @@ -693,7 +697,7 @@ // set an invalid filter, make sure it fails QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setFilter("blahfahsel"); QCOMPARE(model.filter(), QString("blahfahsel")); @@ -711,7 +715,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setFilter("id = 1"); QCOMPARE(model.filter(), QString("id = 1")); QVERIFY_SQL(model, select()); @@ -762,12 +766,13 @@ QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); + const QString bigtable(qTableName("bigtable", __FILE__)); bool hasTransactions = db.driver()->hasFeature(QSqlDriver::Transactions); if (hasTransactions) QVERIFY(db.transaction()); QSqlQuery q(db); - QVERIFY_SQL( q, exec("create table "+qTableName("bigtable")+"(id int primary key, name varchar)")); - QVERIFY_SQL( q, prepare("insert into "+qTableName("bigtable")+"(id, name) values (?, ?)")); + QVERIFY_SQL( q, exec("create table "+bigtable+"(id int primary key, name varchar)")); + QVERIFY_SQL( q, prepare("insert into "+bigtable+"(id, name) values (?, ?)")); QTime startTime; startTime.start(); for (int i = 0; i < 10000; ++i) { @@ -781,7 +786,7 @@ if (hasTransactions) QVERIFY(db.commit()); QSqlTableModel model(0, db); - model.setTable(qTableName("bigtable")); + model.setTable(bigtable); QVERIFY_SQL(model, select()); QSqlRecord rec = model.record(); @@ -801,7 +806,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); QCOMPARE(model.lastError().type(), QSqlError::NoError); QSqlRecord buffer = model.record(); @@ -820,7 +825,7 @@ QCOMPARE(model.rowCount(), 0); QSqlTableModel model2(0, db); - model2.setTable(qTableName("test")); + model2.setTable(test); QVERIFY_SQL(model2, select()); QCOMPARE(model2.rowCount(), rowCount); } @@ -838,7 +843,7 @@ // setTable returns a void, so the error can only be caught by // manually checking lastError(). ### Qt5: This should be changed! - model.setTable(qTableName("invalidTable")); + model.setTable(qTableName("invalidTable", __FILE__)); QCOMPARE(model.lastError().type(), QSqlError::StatementError); // This will give us an empty record which is expected behavior @@ -866,7 +871,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setEditStrategy(QSqlTableModel::OnManualSubmit); model.select(); @@ -952,7 +957,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test4")); + model.setTable(qTableName("test4", __FILE__)); model.select(); //generate a time stamp for the test. Add one second to the current time to make sure @@ -1008,7 +1013,7 @@ CHECK_DATABASE(db); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setEditStrategy(QSqlTableModel::OnManualSubmit); QVERIFY_SQL(model, select()); QCOMPARE(model.rowCount(), 3); @@ -1023,7 +1028,7 @@ // check with another table because the model has been modified // but not the sql table QSqlTableModel model2(0, db); - model2.setTable(qTableName("test")); + model2.setTable(test); QVERIFY_SQL(model2, select()); QCOMPARE(model2.rowCount(), 2); QCOMPARE(model2.columnCount(), 3); @@ -1036,11 +1041,11 @@ CHECK_DATABASE(db); QSqlQuery q(db); - QVERIFY_SQL( q, exec("insert into " + qTableName("test") + " values(9, 'andrew', 9)")); - QVERIFY_SQL( q, exec("insert into " + qTableName("test") + " values(10, 'justin', 10)")); + QVERIFY_SQL( q, exec("insert into " + test + " values(9, 'andrew', 9)")); + QVERIFY_SQL( q, exec("insert into " + test + " values(10, 'justin', 10)")); QSqlTableModel model(0, db); - model.setTable(qTableName("test")); + model.setTable(test); model.setEditStrategy(QSqlTableModel::OnManualSubmit); QVERIFY_SQL(model, select()); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsqlthread/tst_qsqlthread.cpp --- a/tests/auto/qsqlthread/tst_qsqlthread.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsqlthread/tst_qsqlthread.cpp Mon May 03 13:17:34 2010 +0300 @@ -53,6 +53,7 @@ #include #endif +const QString qtest(qTableName("qtest", __FILE__)); // set this define if Oracle is built with threading support //#define QOCI_THREADED @@ -115,7 +116,7 @@ QVERIFY_SQL(db, open()); int sum = 0; - QSqlQuery q("select id from " + qTableName("test"), db); + QSqlQuery q("select id from " + qtest, db); QVERIFY_SQL(q, isActive()); while (q.next()) sum += q.value(0).toInt(); @@ -150,7 +151,7 @@ QSqlDatabase db = QSqlDatabase::cloneDatabase(sourceDb, dbName); QVERIFY_SQL(db, open()); QSqlQuery q(db); - QVERIFY_SQL(q, prepare("insert into " + qTableName("test") + " values (?, ?, ?)")); + QVERIFY_SQL(q, prepare("insert into " + qtest + " values (?, ?, ?)")); int id = 10; for (int i = 0; i < ProdConIterations; ++i) { q.bindValue(0, ++id); @@ -187,10 +188,10 @@ QSqlDatabase db = QSqlDatabase::cloneDatabase(sourceDb, dbName); QVERIFY_SQL(db, open()); QSqlQuery q1(db), q2(db); - QVERIFY_SQL(q2, prepare("delete from " + qTableName("test") + " where id = :id")); + QVERIFY_SQL(q2, prepare("delete from " + qtest + " where id = :id")); for (int i = 0; i < ProdConIterations; ++i) { - QVERIFY_SQL(q1, exec("select max(id) from " + qTableName("test"))); + QVERIFY_SQL(q1, exec("select max(id) from " + qtest)); q1.first(); q2.bindValue("id", q1.value(0)); q1.clear(); @@ -231,7 +232,7 @@ // Executes a Query for reading, iterates over the first 4 results QSqlQuery q(sourceDb); for (int j = 0; j < ProdConIterations; ++j) { - QVERIFY_SQL(q, exec("select id,name from " + qTableName("test") + " order by id")); + QVERIFY_SQL(q, exec("select id,name from " + qtest + " order by id")); for (int i = 1; i < 4; ++i) { QVERIFY_SQL(q, next()); QCOMPARE(q.value(0).toInt(), i); @@ -242,7 +243,7 @@ // Executes a query for writing (appends a new row) QSqlQuery q(sourceDb); for (int j = 0; j < ProdConIterations; ++j) { - QVERIFY_SQL(q, exec(QString("insert into " + qTableName("test") + QVERIFY_SQL(q, exec(QString("insert into " + qtest + " (id, name) values(%1, '%2')") .arg(counter.fetchAndAddRelaxed(1)).arg("Robert"))); } @@ -250,7 +251,7 @@ case PreparedReading: { // Prepares a query for reading and iterates over the results QSqlQuery q(sourceDb); - QVERIFY_SQL(q, prepare("select id, name from " + qTableName("test") + " where id = ?")); + QVERIFY_SQL(q, prepare("select id, name from " + qtest + " where id = ?")); for (int j = 0; j < ProdConIterations; ++j) { q.addBindValue(j % 3 + 1); QVERIFY_SQL(q, exec()); @@ -260,7 +261,7 @@ break; } case PreparedWriting: { QSqlQuery q(sourceDb); - QVERIFY_SQL(q, prepare("insert into " + qTableName("test") + " (id, name) " + QVERIFY_SQL(q, prepare("insert into " + qtest + " (id, name) " "values(?, ?)")); for (int i = 0; i < ProdConIterations; ++i) { q.addBindValue(counter.fetchAndAddRelaxed(1)); @@ -302,7 +303,7 @@ QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i)); QSqlQuery q(db); - tst_Databases::safeDropTables(db, QStringList() << qTableName("test") << qTableName("test2") << qTableName("emptytable")); + tst_Databases::safeDropTables(db, QStringList() << qtest << qTableName("qtest2", __FILE__) << qTableName("emptytable", __FILE__)); } } @@ -312,13 +313,13 @@ QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i)); QSqlQuery q(db); - QVERIFY_SQL(q, exec("create table " + qTableName("test") + QVERIFY_SQL(q, exec("create table " + qtest + "(id int NOT NULL primary key, name varchar(20), title int)")); - QVERIFY_SQL(q, exec("create table " + qTableName("test2") + QVERIFY_SQL(q, exec("create table " + qTableName("qtest2", __FILE__) + "(id int NOT NULL primary key, title varchar(20))")); - QVERIFY_SQL(q, exec("create table " + qTableName("emptytable") + QVERIFY_SQL(q, exec("create table " + qTableName("emptytable", __FILE__) + "(id int NOT NULL primary key)")); } } @@ -329,14 +330,14 @@ QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i)); QSqlQuery q(db); - QVERIFY_SQL(q, exec("delete from " + qTableName("test"))); - QVERIFY_SQL(q, exec("insert into " + qTableName("test") + " values(1, 'harry', 1)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("test") + " values(2, 'trond', 2)")); - QVERIFY_SQL(q, exec("insert into " + qTableName("test") + " values(3, 'vohi', 3)")); + QVERIFY_SQL(q, exec("delete from " + qtest)); + QVERIFY_SQL(q, exec("insert into " + qtest + " values(1, 'harry', 1)")); + QVERIFY_SQL(q, exec("insert into " + qtest + " values(2, 'trond', 2)")); + QVERIFY_SQL(q, exec("insert into " + qtest + " values(3, 'vohi', 3)")); - QVERIFY_SQL(q, exec("delete from " + qTableName("test2"))); - QVERIFY_SQL(q, exec("insert into " + qTableName("test2") + " values(1, 'herr')")); - QVERIFY_SQL(q, exec("insert into " + qTableName("test2") + " values(2, 'mister')")); + QVERIFY_SQL(q, exec("delete from " + qTableName("qtest2", __FILE__))); + QVERIFY_SQL(q, exec("insert into " + qTableName("qtest2", __FILE__) + " values(1, 'herr')")); + QVERIFY_SQL(q, exec("insert into " + qTableName("qtest2", __FILE__) + " values(2, 'mister')")); } } diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsslkey/rsa-with-passphrase.pem --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/qsslkey/rsa-with-passphrase.pem Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-CBC,36BD1242254C5E1E + +sqt8qlQfkjJiz0djd0WYjhN/IGxA/nU/wVKuf5RWDAghDBrABzJ3dU4Jh1WIsS4+ +f22TBr6fwgjpPxGkt361Z9oxon/QeyBZLFtyUxnFSqZcVMMR3vndtMyYJbVKjRm1 +lvF3BjFWNh6+SZe20cut2GiUJDqhw7RbjaAN6LaCpFqwusY6vbjW6vzB8ezDvLou +5jQAkwArGoI0KqUMwBOYukiWdBA0iERavspKGRnB3mGtgv5ziTEFzx58mn1Lv3Qs +LYQqTYgzpFyAMP9SZaRv4m/y5O9foAXnlh0GhmDWBQ2D5flwZqrIAzoJ5BcZKU6/ +HJCh4snw3kheeE8NhrlzypEONedvu4ifUbqN5idMU7S4t40NAmQ/dF0Z4wDen/M/ +iFbt5tTWh6sXK82XzJtAfprH07odtJHK7CMeurCi5BupmnLtPbUrl6hpKItBzu+g +7MB5AyNk548V9Y8+kKBtEG5EgYZrMYX4yqQ+Z8F1hy0UUMXu9cAnO06OTavxLtWJ +ikmwYJNy421Hj+oZVSagCUILQyUfgx6fXWwDRqy/stlX+hpPPjVmd/A2WBm5x/Sf +5CGfUtddZRuAZpChBXV6a/R+nMzDXhkKl4XTkN8hg3yXLY6xy3CR3RIYDlKkn85y +VziP32V6Bc8ucGifsZLNnvj8CFXTZP+8CWun9yLSkcq+wm4cQOLswztEMA8bbPJQ +g7Gp59BC4ofN5bMZ1R1z+l96x+YMY9btkyjE1uEyRT88dHwxnkhC5AKBx2P6sg0C +doe5Dh8Ny5Ic24ibwyvZbAS46tSVdha7ACGnGXV4Z3iqBfN0b0UNmw== +-----END RSA PRIVATE KEY----- diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsslkey/rsa-without-passphrase.pem --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/qsslkey/rsa-without-passphrase.pem Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQC1mZlLC6g8/vaw8XEOQ59gwQ5WxIvcKCSx7B5SHaeN8zzbENpl +32BtyfrCccHF7j6qwfMZ2RwM5RTlFw/eBF4SSXAgp/P5CgcugSs1dOJUfPveos/5 +h3fmnUcKeQIU4m5EGcQicmR8//WUUfdtHDp/fJ0dRXcY2tTOx89vNPEtgwIDAQAB +AoGBAKqE2f4vqf/sYPPxInmEYclWPgKXd8R4JUy0LBxrIAQYXBJPluOFhmRQ/hdK +/eq/NTTd/UlOJhqtmJsstoeAjlsELl2AejX2n1B9aSffQ0WzdB5gVMNotPGRKRIG +eOq2pp2JOFkGps11LUAqDEMNUb3EV6HiBucoGEOUpdITLrRxAkEA4Ul3o44wMvIb +muwp7/erSvDMWRZ1GjksEmBMAHL6y8avZd9UgrjHeCy8uHXrT0id4Cig8FA+nQA5 +UwTr9y5e9wJBAM5bc8xuAuCg4Si3exssFfxQIxFTmPzhkVubglO9IcLqfXLl3k5S +CxgRb/4pBMKVRCMRXAkaZpjJqTIofjp4ptUCQQC4hySnot932zchPi9bjtGPII1A +q1RfllSy+I1IEOW745HnL3ZZXGCF3p71uCB1YFVwNdcc/51Jm9VYWr+sRx8hAkBL +KoTDsk7aA8AAVNVC0Iwxm/8qEIlpk8Ce3cZbOklR9pg7gf+4B6qC2dcxfT9+oWBw +ZaJgrn0wqkQ3QQi5w7kBAkBAR2tKc2OqnljMPnXYEreRyHHjhqCsJYFAE7u16cY/ +NQGJq9jBAD5WANclrYRxKtD6yohi+Y7Vi7+SXve3pGdF +-----END RSA PRIVATE KEY----- diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsslkey/tst_qsslkey.cpp --- a/tests/auto/qsslkey/tst_qsslkey.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsslkey/tst_qsslkey.cpp Mon May 03 13:17:34 2010 +0300 @@ -99,6 +99,7 @@ void toEncryptedPemOrDer_data(); void toEncryptedPemOrDer(); + void passphraseChecks(); #endif }; @@ -371,6 +372,77 @@ // ### add a test to verify that public keys are _decrypted_ correctly (by the ctor) } +void tst_QSslKey::passphraseChecks() +{ + { + QString fileName(SRCDIR "/rsa-with-passphrase.pem"); + QFile keyFile(fileName); + QVERIFY(keyFile.exists()); + { + if (!keyFile.isOpen()) + keyFile.open(QIODevice::ReadOnly); + else + keyFile.reset(); + QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey); + QVERIFY(key.isNull()); // null passphrase => should not be able to decode key + } + { + if (!keyFile.isOpen()) + keyFile.open(QIODevice::ReadOnly); + else + keyFile.reset(); + QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, ""); + QVERIFY(key.isNull()); // empty passphrase => should not be able to decode key + } + { + if (!keyFile.isOpen()) + keyFile.open(QIODevice::ReadOnly); + else + keyFile.reset(); + QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, "WRONG!"); + QVERIFY(key.isNull()); // wrong passphrase => should not be able to decode key + } + { + if (!keyFile.isOpen()) + keyFile.open(QIODevice::ReadOnly); + else + keyFile.reset(); + QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, "123"); + QVERIFY(!key.isNull()); // correct passphrase + } + } + + { + // be sure and check a key without passphrase too + QString fileName(SRCDIR "/rsa-without-passphrase.pem"); + QFile keyFile(fileName); + { + if (!keyFile.isOpen()) + keyFile.open(QIODevice::ReadOnly); + else + keyFile.reset(); + QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey); + QVERIFY(!key.isNull()); // null passphrase => should be able to decode key + } + { + if (!keyFile.isOpen()) + keyFile.open(QIODevice::ReadOnly); + else + keyFile.reset(); + QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, ""); + QVERIFY(!key.isNull()); // empty passphrase => should be able to decode key + } + { + if (!keyFile.isOpen()) + keyFile.open(QIODevice::ReadOnly); + else + keyFile.reset(); + QSslKey key(&keyFile,QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, "xxx"); + QVERIFY(!key.isNull()); // passphrase given but key is not encrypted anyway => should work + } + } +} + #endif QTEST_MAIN(tst_QSslKey) diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsslsocket/qsslsocket.pro --- a/tests/auto/qsslsocket/qsslsocket.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsslsocket/qsslsocket.pro Mon May 03 13:17:34 2010 +0300 @@ -32,3 +32,5 @@ } else { DEFINES += SRCDIR=\\\"$$PWD/\\\" } + +requires(contains(QT_CONFIG,private_tests)) diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qsslsocket/tst_qsslsocket.cpp --- a/tests/auto/qsslsocket/tst_qsslsocket.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qsslsocket/tst_qsslsocket.cpp Mon May 03 13:17:34 2010 +0300 @@ -54,6 +54,8 @@ #include #include +#include "private/qhostinfo_p.h" + #include "../network-settings.h" Q_DECLARE_METATYPE(QAbstractSocket::SocketState) @@ -288,6 +290,8 @@ } QNetworkProxy::setApplicationProxy(proxy); } + + qt_qhostinfo_clear_cache(); } void tst_QSslSocket::cleanup() @@ -477,7 +481,7 @@ // Start connecting socket.connectToHost(QtNetworkSettings::serverName(), 993); - QCOMPARE(socket.state(), QAbstractSocket::HostLookupState); + QVERIFY(socket.state() != QAbstractSocket::UnconnectedState); // something must be in progress enterLoop(10); // Start handshake diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qstatemachine/tst_qstatemachine.cpp --- a/tests/auto/qstatemachine/tst_qstatemachine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qstatemachine/tst_qstatemachine.cpp Mon May 03 13:17:34 2010 +0300 @@ -155,6 +155,7 @@ void clearError(); void historyStateHasNowhereToGo(); void historyStateAsInitialState(); + void historyStateAfterRestart(); void brokenStateIsNeverEntered(); void customErrorStateNotInGraph(); void transitionToStateNotInGraph(); @@ -906,6 +907,64 @@ QCOMPARE(machine.errorString(), QString::fromLatin1("Missing default state in history state 'historyState'")); } +void tst_QStateMachine::historyStateAfterRestart() +{ + // QTBUG-8842 + QStateMachine machine; + + QState *s1 = new QState(&machine); + machine.setInitialState(s1); + QState *s2 = new QState(&machine); + QState *s21 = new QState(s2); + QState *s22 = new QState(s2); + QHistoryState *s2h = new QHistoryState(s2); + s2h->setDefaultState(s21); + s1->addTransition(new EventTransition(QEvent::User, s2h)); + s21->addTransition(new EventTransition(QEvent::User, s22)); + s2->addTransition(new EventTransition(QEvent::User, s1)); + + for (int x = 0; x < 2; ++x) { + QSignalSpy startedSpy(&machine, SIGNAL(started())); + machine.start(); + QTRY_COMPARE(startedSpy.count(), 1); + QCOMPARE(machine.configuration().count(), 1); + QVERIFY(machine.configuration().contains(s1)); + + // s1 -> s2h -> s21 (default state) + machine.postEvent(new QEvent(QEvent::User)); + QCoreApplication::processEvents(); + QCOMPARE(machine.configuration().count(), 2); + QVERIFY(machine.configuration().contains(s2)); + // This used to fail on the 2nd run because the + // history had not been cleared. + QVERIFY(machine.configuration().contains(s21)); + + // s21 -> s22 + machine.postEvent(new QEvent(QEvent::User)); + QCoreApplication::processEvents(); + QCOMPARE(machine.configuration().count(), 2); + QVERIFY(machine.configuration().contains(s2)); + QVERIFY(machine.configuration().contains(s22)); + + // s2 -> s1 (s22 saved in s2h) + machine.postEvent(new QEvent(QEvent::User)); + QCoreApplication::processEvents(); + QCOMPARE(machine.configuration().count(), 1); + QVERIFY(machine.configuration().contains(s1)); + + // s1 -> s2h -> s22 (saved state) + machine.postEvent(new QEvent(QEvent::User)); + QCoreApplication::processEvents(); + QCOMPARE(machine.configuration().count(), 2); + QVERIFY(machine.configuration().contains(s2)); + QVERIFY(machine.configuration().contains(s22)); + + QSignalSpy stoppedSpy(&machine, SIGNAL(stopped())); + machine.stop(); + QTRY_COMPARE(stoppedSpy.count(), 1); + } +} + void tst_QStateMachine::brokenStateIsNeverEntered() { QStateMachine machine; diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qstring/tst_qstring.cpp --- a/tests/auto/qstring/tst_qstring.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qstring/tst_qstring.cpp Mon May 03 13:17:34 2010 +0300 @@ -3503,7 +3503,10 @@ << QString("\\b") << 3 << 3 << int(QString::SectionDefault) << QString("is") << true; - + QTest::newRow( "task257941-rx" ) << QString("99.0 42.3") + << QString("\\s*[AaBb]\\s*") << 1 << 1 + << int(QString::SectionIncludeLeadingSep) + << QString() << true; } void tst_QString::section() diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qstringmatcher/qstringmatcher.pro --- a/tests/auto/qstringmatcher/qstringmatcher.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qstringmatcher/qstringmatcher.pro Mon May 03 13:17:34 2010 +0300 @@ -1,5 +1,5 @@ load(qttest_p4) SOURCES += tst_qstringmatcher.cpp - +QT = core DEFINES += QT_NO_CAST_TO_ASCII diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qt3support.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/qt3support.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,54 @@ +TEMPLATE=subdirs +SUBDIRS=\ + q3accel \ + q3action \ + q3actiongroup \ + q3buttongroup \ + q3canvas \ + q3checklistitem \ + q3cstring \ + q3databrowser \ + q3dateedit \ + q3datetimeedit \ + q3deepcopy \ + q3dict \ + q3dns \ + q3dockwindow \ + q3filedialog \ + q3groupbox \ + q3hbox \ + q3header \ + q3iconview \ + q3listbox \ + q3listview \ + q3listviewitemiterator \ + q3mainwindow \ + q3popupmenu \ + q3process \ + q3progressbar \ + q3progressdialog \ + q3ptrlist \ + q3richtext \ + q3scrollview \ + q3semaphore \ + q3serversocket \ + q3socket \ + q3socketdevice \ + q3sqlcursor \ + q3sqlselectcursor \ + q3stylesheet \ + q3tabdialog \ + q3table \ + q3textbrowser \ + q3textedit \ + q3textstream \ + q3timeedit \ + q3toolbar \ + q3urloperator \ + q3valuelist \ + q3valuevector \ + q3combobox \ + q3frame \ + q3uridrag \ + q3widgetstack + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtableview/tst_qtableview.cpp --- a/tests/auto/qtableview/tst_qtableview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtableview/tst_qtableview.cpp Mon May 03 13:17:34 2010 +0300 @@ -199,6 +199,9 @@ void taskQTBUG_5062_spansInconsistency(); void taskQTBUG_4516_clickOnRichTextLabel(); void taskQTBUG_5237_wheelEventOnHeader(); + void taskQTBUG_8585_crashForNoGoodReason(); + void taskQTBUG_7774_RtoLVisualRegionForSelection(); + void taskQTBUG_8777_scrollToSpans(); void mouseWheel_data(); void mouseWheel(); @@ -3948,5 +3951,88 @@ QVERIFY(sbValueBefore != sbValueAfter); } +class TestTableView : public QTableView { +Q_OBJECT +public: + TestTableView(QWidget *parent = 0) : QTableView(parent) + { + connect(this, SIGNAL(entered(const QModelIndex&)), this, SLOT(openEditor(const QModelIndex&))); + } + ~TestTableView(){} +public slots: + void onDataChanged() + { + for (int i = 0; i < model()->rowCount(); i++) { + setRowHidden(i, model()->data(model()->index(i, 0)).toBool()); + } + } + + void openEditor(const QModelIndex& index) + { openPersistentEditor(index); } +}; + + +void tst_QTableView::taskQTBUG_8585_crashForNoGoodReason() +{ + QStandardItemModel model; + model.insertColumn(0, QModelIndex()); + for(int i = 0; i < 20; i++) + { + model.insertRow(i); + } + + TestTableView w; + w.setMouseTracking(true); + w.setModel(&model); + connect(&model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), &w, SLOT(onDataChanged())); + w.show(); + QTest::qWaitForWindowShown(&w); + for (int i = 0; i < 10; i++) + { + QTest::mouseMove(w.viewport(), QPoint(50, 20)); + w.model()->setData(w.indexAt(QPoint(50, 20)), true); + QTest::mouseMove(w.viewport(), QPoint(50, 25)); + } +} + +class TableView7774 : public QTableView +{ +public: + QRegion visualRegionForSelection(const QItemSelection &selection) const + { + return QTableView::visualRegionForSelection(selection); + } +}; + +void tst_QTableView::taskQTBUG_7774_RtoLVisualRegionForSelection() +{ + TableView7774 view; + QStandardItemModel model(5,5); + view.setModel(&model); + view.setLayoutDirection(Qt::RightToLeft); + view.show(); + QTest::qWaitForWindowShown(&view); + + QItemSelectionRange range(model.index(2, 0), model.index(2, model.columnCount() - 1)); + QItemSelection selection; + selection << range; + QRegion region = view.visualRegionForSelection(selection); + QCOMPARE(region.rects().at(0), view.visualRect(range.topLeft()) | view.visualRect(range.bottomRight())); +} + +void tst_QTableView::taskQTBUG_8777_scrollToSpans() +{ + QTableWidget table(75,5); + for (int i=0; i<50; i++) + table.setSpan(2+i, 0, 1, 5); + table.setCurrentCell(0,2); + table.show(); + + for (int i = 0; i < 45; ++i) + QTest::keyClick(&table, Qt::Key_Down); + + QVERIFY(table.verticalScrollBar()->value() > 10); +} + QTEST_MAIN(tst_QTableView) #include "tst_qtableview.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp --- a/tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtconcurrentiteratekernel/tst_qtconcurrentiteratekernel.cpp Mon May 03 13:17:34 2010 +0300 @@ -90,7 +90,7 @@ using namespace QtConcurrent; -class tst_iteratekernel: public QObject +class tst_QtConcurrentIterateKernel: public QObject { Q_OBJECT private slots: @@ -149,13 +149,13 @@ }; -void tst_iteratekernel::instantiate() +void tst_QtConcurrentIterateKernel::instantiate() { startThreadEngine(new PrintFor(0, 40)).startBlocking(); QCOMPARE((int)iterations, 40); } -void tst_iteratekernel::cancel() +void tst_QtConcurrentIterateKernel::cancel() { { QFuture f = startThreadEngine(new SleepPrintFor(0, 40)).startAsynchronously(); @@ -182,7 +182,7 @@ } }; -void tst_iteratekernel::stresstest() +void tst_QtConcurrentIterateKernel::stresstest() { const int iterations = 1000; const int times = 50; @@ -194,7 +194,7 @@ } } -void tst_iteratekernel::noIterations() +void tst_QtConcurrentIterateKernel::noIterations() { const int times = 20000; for (int i = 0; i < times; ++i) @@ -242,7 +242,7 @@ bool throttling; }; -void tst_iteratekernel::throttling() +void tst_QtConcurrentIterateKernel::throttling() { const int totalIterations = 400; iterations = 0; @@ -271,7 +271,7 @@ } }; -void tst_iteratekernel::blockSize() +void tst_QtConcurrentIterateKernel::blockSize() { #ifdef QT_NO_STL QSKIP("Missing stl iterators prevent correct block size calculation", SkipAll); @@ -296,7 +296,7 @@ }; -void tst_iteratekernel::multipleResults() +void tst_QtConcurrentIterateKernel::multipleResults() { #ifdef QT_NO_STL QSKIP("Missing stl iterators prevent correct summation", SkipAll); @@ -320,7 +320,7 @@ } }; -void tst_iteratekernel::instantiateWhile() +void tst_QtConcurrentIterateKernel::instantiateWhile() { PrintWhile w; w.startBlocking(); @@ -339,7 +339,7 @@ } }; -void tst_iteratekernel::stresstestWhile() +void tst_QtConcurrentIterateKernel::stresstestWhile() { int iterations = 100000; StressWhile w(iterations); @@ -348,7 +348,7 @@ } #endif -QTEST_MAIN(tst_iteratekernel) +QTEST_MAIN(tst_QtConcurrentIterateKernel) #include "tst_qtconcurrentiteratekernel.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp --- a/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtconcurrentmap/tst_qtconcurrentmap.cpp Mon May 03 13:17:34 2010 +0300 @@ -56,7 +56,7 @@ Q_DECLARE_METATYPE(QList); Q_DECLARE_METATYPE(QList); -class tst_map: public QObject +class tst_QtConcurrentMap: public QObject { Q_OBJECT private slots: @@ -114,7 +114,7 @@ Q_DECLARE_METATYPE(QList); -void tst_map::map() +void tst_QtConcurrentMap::map() { // functors take arguments by reference, modifying the sequence in place { @@ -246,7 +246,7 @@ #endif } -void tst_map::blocking_map() +void tst_QtConcurrentMap::blocking_map() { // functors take arguments by reference, modifying the sequence in place { @@ -428,7 +428,7 @@ } }; -void tst_map::mapped() +void tst_QtConcurrentMap::mapped() { QList list; list << 1 << 2 << 3; @@ -790,7 +790,7 @@ } } -void tst_map::blocking_mapped() +void tst_QtConcurrentMap::blocking_mapped() { QList list; list << 1 << 2 << 3; @@ -1244,7 +1244,7 @@ } }; -void tst_map::mappedReduced() +void tst_QtConcurrentMap::mappedReduced() { QList list; list << 1 << 2 << 3; @@ -1625,7 +1625,7 @@ // ### the same as above, with an initial result value } -void tst_map::blocking_mappedReduced() +void tst_QtConcurrentMap::blocking_mappedReduced() { QList list; list << 1 << 2 << 3; @@ -2010,7 +2010,7 @@ return val; } -void tst_map::assignResult() +void tst_QtConcurrentMap::assignResult() { const QList startList = QList() << 0 << 1 << 2; QList list = QtConcurrent::blockingMapped(startList, sleeper); @@ -2077,7 +2077,7 @@ Q_DECLARE_METATYPE(QVector); Q_DECLARE_METATYPE(QList); -void tst_map::functionOverloads() +void tst_QtConcurrentMap::functionOverloads() { QList intList; const QList constIntList; @@ -2159,7 +2159,7 @@ ++result; } -void tst_map::throttling() +void tst_QtConcurrentMap::throttling() { const int itemcount = 100; const int allowedTemporaries = QThread::idealThreadCount() * 40; @@ -2208,7 +2208,7 @@ throw QtConcurrent::Exception(); } -void tst_map::exceptions() +void tst_QtConcurrentMap::exceptions() { bool caught = false; try { @@ -2228,7 +2228,7 @@ return i; } -void tst_map::incrementalResults() +void tst_QtConcurrentMap::incrementalResults() { const int count = 200; QList ints; @@ -2256,7 +2256,7 @@ Test that mapped does not cause deep copies when holding references to Qt containers. */ -void tst_map::noDetatch() +void tst_QtConcurrentMap::noDetatch() { { QList l = QList() << 1; @@ -2299,7 +2299,7 @@ } -void tst_map::stlContainers() +void tst_QtConcurrentMap::stlContainers() { #ifdef QT_NO_STL QSKIP("Qt compiled without STL support", SkipAll); @@ -2331,7 +2331,7 @@ // Verify that held results are deleted when a future is // assigned over with operator == -void tst_map::qFutureAssignmentLeak() +void tst_QtConcurrentMap::qFutureAssignmentLeak() { currentInstanceCount = 0; peakInstanceCount = 0; @@ -2370,7 +2370,7 @@ result += sum; } -void tst_map::stressTest() +void tst_QtConcurrentMap::stressTest() { const int listSize = 1000; const int sum = (listSize - 1) * (listSize / 2); @@ -2399,26 +2399,26 @@ } } -QTEST_MAIN(tst_map) +QTEST_MAIN(tst_QtConcurrentMap) #else -void tst_map::map() {} -void tst_map::blocking_map() {} -void tst_map::mapped() {} -void tst_map::blocking_mapped() {} -void tst_map::mappedReduced() {} -void tst_map::blocking_mappedReduced() {} -void tst_map::assignResult() {} -void tst_map::functionOverloads() {} +void tst_QtConcurrentMap::map() {} +void tst_QtConcurrentMap::blocking_map() {} +void tst_QtConcurrentMap::mapped() {} +void tst_QtConcurrentMap::blocking_mapped() {} +void tst_QtConcurrentMap::mappedReduced() {} +void tst_QtConcurrentMap::blocking_mappedReduced() {} +void tst_QtConcurrentMap::assignResult() {} +void tst_QtConcurrentMap::functionOverloads() {} #ifndef QT_NO_EXCEPTIONS -void tst_map::exceptions() {} +void tst_QtConcurrentMap::exceptions() {} #endif -void tst_map::incrementalResults() {} -void tst_map::stressTest() {} -void tst_map::throttling() {} -void tst_map::stlContainers() {} -void tst_map::noDetatch() {} +void tst_QtConcurrentMap::incrementalResults() {} +void tst_QtConcurrentMap::stressTest() {} +void tst_QtConcurrentMap::throttling() {} +void tst_QtConcurrentMap::stlContainers() {} +void tst_QtConcurrentMap::noDetatch() {} QTEST_NOOP_MAIN diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp --- a/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtconcurrentrun/tst_qtconcurrentrun.cpp Mon May 03 13:17:34 2010 +0300 @@ -49,7 +49,7 @@ using namespace QtConcurrent; -class TestRunFunction: public QObject +class tst_QtConcurrentRun: public QObject { Q_OBJECT private slots: @@ -73,7 +73,7 @@ #endif -QTEST_MAIN(TestRunFunction) +QTEST_MAIN(tst_QtConcurrentRun) void light() { @@ -91,7 +91,7 @@ } -void TestRunFunction::runLightFunction() +void tst_QtConcurrentRun::runLightFunction() { qDebug("starting function"); QFuture future = run(F(light)); @@ -100,7 +100,7 @@ qDebug("done"); } -void TestRunFunction::runHeavyFunction() +void tst_QtConcurrentRun::runHeavyFunction() { qDebug("starting function"); QFuture future = run(F(heavy)); @@ -141,7 +141,7 @@ int operator()(int in) const { return in; } }; -void TestRunFunction::returnValue() +void tst_QtConcurrentRun::returnValue() { QFuture f; @@ -217,7 +217,7 @@ void fooInt(int) const { }; }; -void TestRunFunction::functionObject() +void tst_QtConcurrentRun::functionObject() { QFuture f; TestClass c; @@ -235,7 +235,7 @@ } -void TestRunFunction::memberFunctions() +void tst_QtConcurrentRun::memberFunctions() { TestClass c; @@ -278,7 +278,7 @@ } -void TestRunFunction::implicitConvertibleTypes() +void tst_QtConcurrentRun::implicitConvertibleTypes() { double d; run(F(doubleFunction), d).waitForFinished(); @@ -294,7 +294,7 @@ void fn() { } -void TestRunFunction::runWaitLoop() +void tst_QtConcurrentRun::runWaitLoop() { for (int i = 0; i < 1000; ++i) run(fn).waitForFinished(); @@ -324,7 +324,7 @@ return 1; } -void TestRunFunction::recursive() +void tst_QtConcurrentRun::recursive() { int levels = 15; @@ -375,7 +375,7 @@ } #if 0 -void TestRunFunction::createFunctor() +void tst_QtConcurrentRun::createFunctor() { e = 0; ::QtConcurrent::createFunctor(vfn0)(); diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp --- a/tests/auto/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtconcurrentthreadengine/tst_qtconcurrentthreadengine.cpp Mon May 03 13:17:34 2010 +0300 @@ -48,7 +48,7 @@ using namespace QtConcurrent; -class tst_threadengine: public QObject +class tst_QtConcurrentThreadEngine: public QObject { Q_OBJECT public: @@ -79,7 +79,7 @@ } }; -void tst_threadengine::runDirectly() +void tst_QtConcurrentThreadEngine::runDirectly() { { PrintUser engine; @@ -120,7 +120,7 @@ bool done; }; -void tst_threadengine::result() +void tst_QtConcurrentThreadEngine::result() { StringResultUser engine; QCOMPARE(*engine.startBlocking(), QString("Foo")); @@ -147,7 +147,7 @@ bool done; }; -void tst_threadengine::runThroughStarter() +void tst_QtConcurrentThreadEngine::runThroughStarter() { { ThreadEngineStarter starter = startThreadEngine(new StringResultUser()); @@ -180,7 +180,7 @@ } }; -void tst_threadengine::cancel() +void tst_QtConcurrentThreadEngine::cancel() { { CancelUser *engine = new CancelUser(); @@ -234,7 +234,7 @@ // Test that a user task with a thread function that always // want to be throttled still completes. The thread engine // should make keep one thread running at all times. -void tst_threadengine::throttle() +void tst_QtConcurrentThreadEngine::throttle() { const int repeats = 10; for (int i = 0; i < repeats; ++i) { @@ -280,7 +280,7 @@ bool finishing; }; -void tst_threadengine::threadCount() +void tst_QtConcurrentThreadEngine::threadCount() { const int repeats = 10; for (int i = 0; i < repeats; ++i) { @@ -320,7 +320,7 @@ }; -void tst_threadengine::multipleResults() +void tst_QtConcurrentThreadEngine::multipleResults() { MultipleResultsUser *engine = new MultipleResultsUser(); QFuture f = engine->startAsynchronously(); @@ -351,7 +351,7 @@ } }; -void tst_threadengine::stresstest() +void tst_QtConcurrentThreadEngine::stresstest() { const int times = 20000; @@ -379,7 +379,7 @@ ThreadFunctionResult threadFunction() { QTest::qSleep(sleepTime); return ThreadFinished; } }; -void tst_threadengine::cancelQueuedSlowUser() +void tst_QtConcurrentThreadEngine::cancelQueuedSlowUser() { const int times = 100; @@ -436,7 +436,7 @@ QThread *blockThread; }; -void tst_threadengine::exceptions() +void tst_QtConcurrentThreadEngine::exceptions() { // Asynchronous mode: { @@ -527,7 +527,7 @@ #endif -QTEST_MAIN(tst_threadengine) +QTEST_MAIN(tst_QtConcurrentThreadEngine) #include "tst_qtconcurrentthreadengine.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtcpsocket/qtcpsocket.pro --- a/tests/auto/qtcpsocket/qtcpsocket.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtcpsocket/qtcpsocket.pro Mon May 03 13:17:34 2010 +0300 @@ -3,3 +3,6 @@ !wince*: SUBDIRS = test stressTest wince*|symbian*|vxworks* : SUBDIRS = test + + +requires(contains(QT_CONFIG,private_tests)) diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtcpsocket/tst_qtcpsocket.cpp --- a/tests/auto/qtcpsocket/tst_qtcpsocket.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtcpsocket/tst_qtcpsocket.cpp Mon May 03 13:17:34 2010 +0300 @@ -92,6 +92,8 @@ #include #endif +#include "private/qhostinfo_p.h" + #include "../network-settings.h" Q_DECLARE_METATYPE(QAbstractSocket::SocketError) @@ -315,6 +317,8 @@ } QNetworkProxy::setApplicationProxy(proxy); } + + qt_qhostinfo_clear_cache(); } QTcpSocket *tst_QTcpSocket::newSocket() const @@ -1059,7 +1063,9 @@ // just connect and disconnect, then make sure nothing weird happened QTcpSocket *socket = newSocket(); socket->connectToHost(QtNetworkSettings::serverName(), 21); - QVERIFY(socket->state() == QAbstractSocket::HostLookupState); + + // check that connect is in progress + QVERIFY(socket->state() != QAbstractSocket::UnconnectedState); QFETCH(bool, doClose); if (doClose) { @@ -1665,7 +1671,10 @@ connect(tmpSocket, SIGNAL(hostFound()), this, SLOT(hostLookupSlot())); tmpSocket->connectToHost(QtNetworkSettings::serverName(), 143); - loop.exec(); + // only execute the loop if not already connected + if (tmpSocket->state() != QAbstractSocket::ConnectedState) + loop.exec(); + QCOMPARE(timerSpy.count(), 0); delete tmpSocket; diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtpauto.pro --- a/tests/auto/qtpauto.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtpauto.pro Mon May 03 13:17:34 2010 +0300 @@ -125,7 +125,7 @@ # qhelpindexmodel \ # qhelpprojectdata \ qhostaddress \ - qhostinfo \ +# qhostinfo \ qhttp \ # qhttpnetworkreply \ # qhttpnetworkconnection \ @@ -255,7 +255,7 @@ qsslcipher \ qsslerror \ qsslkey \ - qsslsocket \ +# qsslsocket \ qstackedlayout \ qstackedwidget \ qstandarditem \ @@ -285,13 +285,13 @@ qtablewidget \ qtabwidget \ qtcpserver \ - qtcpsocket \ +# qtcpsocket \ qtemporaryfile \ qtessellator \ qtextblock \ qtextboundaryfinder \ qtextbrowser \ - qtextcodec \ +# #qtextcodec \ qtextcursor \ qtextdocument \ qtextdocumentfragment \ diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtransform/tst_qtransform.cpp --- a/tests/auto/qtransform/tst_qtransform.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtransform/tst_qtransform.cpp Mon May 03 13:17:34 2010 +0300 @@ -610,6 +610,11 @@ m4.rotate(45); QCOMPARE(m4.type(), QTransform::TxRotate); + + QTransform m5; + m5.scale(5, 5); + m5 = m5.adjoint() / m5.determinant(); + QCOMPARE(m5.type(), QTransform::TxScale); } diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qtreeview/tst_qtreeview.cpp --- a/tests/auto/qtreeview/tst_qtreeview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qtreeview/tst_qtreeview.cpp Mon May 03 13:17:34 2010 +0300 @@ -3083,6 +3083,20 @@ QApplication::processEvents(); QTRY_VERIFY(delegate.count >= 3); QApplication::processEvents(); + + item00->setText("OnlyOne"); + item0->insertRow(2, new QStandardItem("OnlyOne Last")); + view.collapse(item0->index()); + item0->removeRow(0); + delegate.count = 0; + QTRY_VERIFY(delegate.count >= 2); + QApplication::processEvents(); + + item0->removeRow(1); + item0->setText("OnlyOne"); + delegate.count = 0; + QTRY_VERIFY(delegate.count >= 2); + QApplication::processEvents(); } } diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qurl/tst_qurl.cpp --- a/tests/auto/qurl/tst_qurl.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qurl/tst_qurl.cpp Mon May 03 13:17:34 2010 +0300 @@ -2513,13 +2513,9 @@ void tst_QUrl::invalidSchemeValidator() { - // enable that test when QUrl is fixed - return; - // test that if scheme does not start with an ALPHA, QUrl::isValid() returns false { QUrl url("1http://qt.nokia.com", QUrl::StrictMode); - qDebug() << url; QCOMPARE(url.isValid(), false); } { diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qvariant/tst_qvariant.cpp --- a/tests/auto/qvariant/tst_qvariant.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qvariant/tst_qvariant.cpp Mon May 03 13:17:34 2010 +0300 @@ -1968,6 +1968,10 @@ QTest::newRow("HashSecondLarger") << QVariant(hash1) << QVariant(hash2) << false; } + + QTest::newRow( "UserType" ) << QVariant(QVariant::UserType) << QVariant(QVariant::UserType) << true; + QVariant mUserType(QVariant::UserType); + QTest::newRow( "Shared UserType" ) << mUserType << mUserType << true; } void tst_QVariant::operator_eq_eq() diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qvarlengtharray/tst_qvarlengtharray.cpp --- a/tests/auto/qvarlengtharray/tst_qvarlengtharray.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qvarlengtharray/tst_qvarlengtharray.cpp Mon May 03 13:17:34 2010 +0300 @@ -42,6 +42,7 @@ #include #include +#include const int N = 1; @@ -61,6 +62,7 @@ void removeLast(); void oldTests(); void task214223(); + void QTBUG6718_resize(); }; int fooCtor = 0; @@ -71,7 +73,7 @@ int *p; Foo() { p = new int; ++fooCtor; } - Foo(const Foo &other) { p = new int; ++fooCtor; } + Foo(const Foo &/*other*/) { p = new int; ++fooCtor; } void operator=(const Foo & /* other */) { } @@ -244,9 +246,50 @@ // will make the next call to append(const T&) corrupt the memory // you should get a segfault pretty soon after that :-) QVarLengthArray d(1); - for (int i=0; i<30; i++) + for (int i=0; i<30; i++) d.append(i); } +void tst_QVarLengthArray::QTBUG6718_resize() +{ + //MOVABLE + { + QVarLengthArray values(1); + QCOMPARE(values.size(), 1); + values[0] = 1; + values.resize(2); + QCOMPARE(values[1], QVariant()); + QCOMPARE(values[0], QVariant(1)); + values[1] = 2; + QCOMPARE(values[1], QVariant(2)); + QCOMPARE(values.size(), 2); + } + + //POD + { + QVarLengthArray values(1); + QCOMPARE(values.size(), 1); + values[0] = 1; + values.resize(2); + QCOMPARE(values[0], 1); + values[1] = 2; + QCOMPARE(values[1], 2); + QCOMPARE(values.size(), 2); + } + + //COMPLEX + { + QVarLengthArray,1> values(1); + QCOMPARE(values.size(), 1); + values[0].resize(10); + values.resize(2); + QCOMPARE(values[1].size(), 0); + QCOMPARE(values[0].size(), 10); + values[1].resize(20); + QCOMPARE(values[1].size(), 20); + QCOMPARE(values.size(), 2); + } +} + QTEST_APPLESS_MAIN(tst_QVarLengthArray) #include "tst_qvarlengtharray.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qvectornd/tst_qvectornd.cpp --- a/tests/auto/qvectornd/tst_qvectornd.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qvectornd/tst_qvectornd.cpp Mon May 03 13:17:34 2010 +0300 @@ -45,12 +45,12 @@ #include #include -class tst_QVector : public QObject +class tst_QVectorND : public QObject { Q_OBJECT public: - tst_QVector() {} - ~tst_QVector() {} + tst_QVectorND() {} + ~tst_QVectorND() {} private slots: void create2(); @@ -155,7 +155,7 @@ // Test the creation of QVector2D objects in various ways: // construct, copy, and modify. -void tst_QVector::create2() +void tst_QVectorND::create2() { QVector2D null; QCOMPARE(null.x(), (qreal)0.0f); @@ -244,7 +244,7 @@ // Test the creation of QVector3D objects in various ways: // construct, copy, and modify. -void tst_QVector::create3() +void tst_QVectorND::create3() { QVector3D null; QCOMPARE(null.x(), (qreal)0.0f); @@ -370,7 +370,7 @@ // Test the creation of QVector4D objects in various ways: // construct, copy, and modify. -void tst_QVector::create4() +void tst_QVectorND::create4() { QVector4D null; QCOMPARE(null.x(), (qreal)0.0f); @@ -556,7 +556,7 @@ } // Test vector length computation for 2D vectors. -void tst_QVector::length2_data() +void tst_QVectorND::length2_data() { QTest::addColumn("x"); QTest::addColumn("y"); @@ -569,7 +569,7 @@ QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)qSqrt(8.0f); } -void tst_QVector::length2() +void tst_QVectorND::length2() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -581,7 +581,7 @@ } // Test vector length computation for 3D vectors. -void tst_QVector::length3_data() +void tst_QVectorND::length3_data() { QTest::addColumn("x"); QTest::addColumn("y"); @@ -597,7 +597,7 @@ QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)qSqrt(12.0f); } -void tst_QVector::length3() +void tst_QVectorND::length3() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -610,7 +610,7 @@ } // Test vector length computation for 4D vectors. -void tst_QVector::length4_data() +void tst_QVectorND::length4_data() { QTest::addColumn("x"); QTest::addColumn("y"); @@ -629,7 +629,7 @@ QTest::newRow("-1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)2.0f << (qreal)qSqrt(16.0f); } -void tst_QVector::length4() +void tst_QVectorND::length4() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -643,12 +643,12 @@ } // Test the unit vector conversion for 2D vectors. -void tst_QVector::normalized2_data() +void tst_QVectorND::normalized2_data() { // Use the same test data as the length test. length2_data(); } -void tst_QVector::normalized2() +void tst_QVectorND::normalized2() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -665,12 +665,12 @@ } // Test the unit vector conversion for 3D vectors. -void tst_QVector::normalized3_data() +void tst_QVectorND::normalized3_data() { // Use the same test data as the length test. length3_data(); } -void tst_QVector::normalized3() +void tst_QVectorND::normalized3() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -689,12 +689,12 @@ } // Test the unit vector conversion for 4D vectors. -void tst_QVector::normalized4_data() +void tst_QVectorND::normalized4_data() { // Use the same test data as the length test. length4_data(); } -void tst_QVector::normalized4() +void tst_QVectorND::normalized4() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -715,12 +715,12 @@ } // Test the unit vector conversion for 2D vectors. -void tst_QVector::normalize2_data() +void tst_QVectorND::normalize2_data() { // Use the same test data as the length test. length2_data(); } -void tst_QVector::normalize2() +void tst_QVectorND::normalize2() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -735,12 +735,12 @@ } // Test the unit vector conversion for 3D vectors. -void tst_QVector::normalize3_data() +void tst_QVectorND::normalize3_data() { // Use the same test data as the length test. length3_data(); } -void tst_QVector::normalize3() +void tst_QVectorND::normalize3() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -756,12 +756,12 @@ } // Test the unit vector conversion for 4D vectors. -void tst_QVector::normalize4_data() +void tst_QVectorND::normalize4_data() { // Use the same test data as the length test. length4_data(); } -void tst_QVector::normalize4() +void tst_QVectorND::normalize4() { QFETCH(qreal, x); QFETCH(qreal, y); @@ -778,7 +778,7 @@ } // Test the comparison operators for 2D vectors. -void tst_QVector::compare2() +void tst_QVectorND::compare2() { QVector2D v1(1, 2); QVector2D v2(1, 2); @@ -791,7 +791,7 @@ } // Test the comparison operators for 3D vectors. -void tst_QVector::compare3() +void tst_QVectorND::compare3() { QVector3D v1(1, 2, 4); QVector3D v2(1, 2, 4); @@ -806,7 +806,7 @@ } // Test the comparison operators for 4D vectors. -void tst_QVector::compare4() +void tst_QVectorND::compare4() { QVector4D v1(1, 2, 4, 8); QVector4D v2(1, 2, 4, 8); @@ -823,7 +823,7 @@ } // Test vector addition for 2D vectors. -void tst_QVector::add2_data() +void tst_QVectorND::add2_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -852,7 +852,7 @@ << (qreal)4.0f << (qreal)5.0f << (qreal)5.0f << (qreal)7.0f; } -void tst_QVector::add2() +void tst_QVectorND::add2() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -876,7 +876,7 @@ } // Test vector addition for 3D vectors. -void tst_QVector::add3_data() +void tst_QVectorND::add3_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -913,7 +913,7 @@ << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f; } -void tst_QVector::add3() +void tst_QVectorND::add3() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -941,7 +941,7 @@ } // Test vector addition for 4D vectors. -void tst_QVector::add4_data() +void tst_QVectorND::add4_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -986,7 +986,7 @@ << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f << (qreal)17.0f; } -void tst_QVector::add4() +void tst_QVectorND::add4() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1018,12 +1018,12 @@ } // Test vector subtraction for 2D vectors. -void tst_QVector::subtract2_data() +void tst_QVectorND::subtract2_data() { // Use the same test data as the add test. add2_data(); } -void tst_QVector::subtract2() +void tst_QVectorND::subtract2() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1055,12 +1055,12 @@ } // Test vector subtraction for 3D vectors. -void tst_QVector::subtract3_data() +void tst_QVectorND::subtract3_data() { // Use the same test data as the add test. add3_data(); } -void tst_QVector::subtract3() +void tst_QVectorND::subtract3() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1097,12 +1097,12 @@ } // Test vector subtraction for 4D vectors. -void tst_QVector::subtract4_data() +void tst_QVectorND::subtract4_data() { // Use the same test data as the add test. add4_data(); } -void tst_QVector::subtract4() +void tst_QVectorND::subtract4() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1144,7 +1144,7 @@ } // Test component-wise vector multiplication for 2D vectors. -void tst_QVector::multiply2_data() +void tst_QVectorND::multiply2_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -1173,7 +1173,7 @@ << (qreal)4.0f << (qreal)5.0f << (qreal)4.0f << (qreal)10.0f; } -void tst_QVector::multiply2() +void tst_QVectorND::multiply2() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1197,7 +1197,7 @@ } // Test component-wise vector multiplication for 3D vectors. -void tst_QVector::multiply3_data() +void tst_QVectorND::multiply3_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -1234,7 +1234,7 @@ << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)4.0f << (qreal)10.0f << (qreal)-18.0f; } -void tst_QVector::multiply3() +void tst_QVectorND::multiply3() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1262,7 +1262,7 @@ } // Test component-wise vector multiplication for 4D vectors. -void tst_QVector::multiply4_data() +void tst_QVectorND::multiply4_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -1307,7 +1307,7 @@ << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f << (qreal)4.0f << (qreal)10.0f << (qreal)-18.0f << (qreal)72.0f; } -void tst_QVector::multiply4() +void tst_QVectorND::multiply4() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1339,7 +1339,7 @@ } // Test vector multiplication by a factor for 2D vectors. -void tst_QVector::multiplyFactor2_data() +void tst_QVectorND::multiplyFactor2_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -1372,7 +1372,7 @@ << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; } -void tst_QVector::multiplyFactor2() +void tst_QVectorND::multiplyFactor2() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1395,7 +1395,7 @@ } // Test vector multiplication by a factor for 3D vectors. -void tst_QVector::multiplyFactor3_data() +void tst_QVectorND::multiplyFactor3_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -1435,7 +1435,7 @@ << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; } -void tst_QVector::multiplyFactor3() +void tst_QVectorND::multiplyFactor3() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1461,7 +1461,7 @@ } // Test vector multiplication by a factor for 4D vectors. -void tst_QVector::multiplyFactor4_data() +void tst_QVectorND::multiplyFactor4_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -1508,7 +1508,7 @@ << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; } -void tst_QVector::multiplyFactor4() +void tst_QVectorND::multiplyFactor4() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1537,12 +1537,12 @@ } // Test vector division by a factor for 2D vectors. -void tst_QVector::divide2_data() +void tst_QVectorND::divide2_data() { // Use the same test data as the multiply test. multiplyFactor2_data(); } -void tst_QVector::divide2() +void tst_QVectorND::divide2() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1567,12 +1567,12 @@ } // Test vector division by a factor for 3D vectors. -void tst_QVector::divide3_data() +void tst_QVectorND::divide3_data() { // Use the same test data as the multiply test. multiplyFactor3_data(); } -void tst_QVector::divide3() +void tst_QVectorND::divide3() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1600,12 +1600,12 @@ } // Test vector division by a factor for 4D vectors. -void tst_QVector::divide4_data() +void tst_QVectorND::divide4_data() { // Use the same test data as the multiply test. multiplyFactor4_data(); } -void tst_QVector::divide4() +void tst_QVectorND::divide4() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1636,12 +1636,12 @@ } // Test vector negation for 2D vectors. -void tst_QVector::negate2_data() +void tst_QVectorND::negate2_data() { // Use the same test data as the add test. add2_data(); } -void tst_QVector::negate2() +void tst_QVectorND::negate2() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1653,12 +1653,12 @@ } // Test vector negation for 3D vectors. -void tst_QVector::negate3_data() +void tst_QVectorND::negate3_data() { // Use the same test data as the add test. add3_data(); } -void tst_QVector::negate3() +void tst_QVectorND::negate3() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1671,12 +1671,12 @@ } // Test vector negation for 4D vectors. -void tst_QVector::negate4_data() +void tst_QVectorND::negate4_data() { // Use the same test data as the add test. add4_data(); } -void tst_QVector::negate4() +void tst_QVectorND::negate4() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1690,7 +1690,7 @@ } // Test the computation of vector cross-products. -void tst_QVector::crossProduct_data() +void tst_QVectorND::crossProduct_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -1721,7 +1721,7 @@ << (qreal)-3.0f << (qreal)6.0f << (qreal)-3.0f << (qreal)32.0f; } -void tst_QVector::crossProduct() +void tst_QVectorND::crossProduct() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1751,12 +1751,12 @@ } // Test the computation of normals. -void tst_QVector::normal_data() +void tst_QVectorND::normal_data() { // Use the same test data as the crossProduct test. crossProduct_data(); } -void tst_QVector::normal() +void tst_QVectorND::normal() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1780,7 +1780,7 @@ } // Test distance to plane calculations. -void tst_QVector::distanceToPlane_data() +void tst_QVectorND::distanceToPlane_data() { QTest::addColumn("x1"); // Point on plane QTest::addColumn("y1"); @@ -1823,7 +1823,7 @@ << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)-2.0f; } -void tst_QVector::distanceToPlane() +void tst_QVectorND::distanceToPlane() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1853,7 +1853,7 @@ } // Test distance to line calculations. -void tst_QVector::distanceToLine_data() +void tst_QVectorND::distanceToLine_data() { QTest::addColumn("x1"); // Point on line QTest::addColumn("y1"); @@ -1896,7 +1896,7 @@ << (qreal)0.0f << (qreal)5.0f << (qreal)0.0f << (qreal)5.0f; } -void tst_QVector::distanceToLine() +void tst_QVectorND::distanceToLine() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1917,7 +1917,7 @@ } // Test the computation of dot products for 2D vectors. -void tst_QVector::dotProduct2_data() +void tst_QVectorND::dotProduct2_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -1940,7 +1940,7 @@ << (qreal)4.0f << (qreal)5.0f << (qreal)14.0f; } -void tst_QVector::dotProduct2() +void tst_QVectorND::dotProduct2() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1960,12 +1960,12 @@ } // Test the computation of dot products for 3D vectors. -void tst_QVector::dotProduct3_data() +void tst_QVectorND::dotProduct3_data() { // Use the same test data as the crossProduct test. crossProduct_data(); } -void tst_QVector::dotProduct3() +void tst_QVectorND::dotProduct3() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -1994,7 +1994,7 @@ } // Test the computation of dot products for 4D vectors. -void tst_QVector::dotProduct4_data() +void tst_QVectorND::dotProduct4_data() { QTest::addColumn("x1"); QTest::addColumn("y1"); @@ -2021,7 +2021,7 @@ << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f << (qreal)7.0f << (qreal)60.0f; } -void tst_QVector::dotProduct4() +void tst_QVectorND::dotProduct4() { QFETCH(qreal, x1); QFETCH(qreal, y1); @@ -2044,14 +2044,14 @@ QCOMPARE(QVector4D::dotProduct(v1, v2), d); } -class tst_QVectorProperties : public QObject +class tst_QVectorNDProperties : public QObject { Q_OBJECT Q_PROPERTY(QVector2D vector2D READ vector2D WRITE setVector2D) Q_PROPERTY(QVector3D vector3D READ vector3D WRITE setVector3D) Q_PROPERTY(QVector4D vector4D READ vector4D WRITE setVector4D) public: - tst_QVectorProperties(QObject *parent = 0) : QObject(parent) {} + tst_QVectorNDProperties(QObject *parent = 0) : QObject(parent) {} QVector2D vector2D() const { return v2; } void setVector2D(const QVector2D& value) { v2 = value; } @@ -2069,9 +2069,9 @@ }; // Test getting and setting vector properties via the metaobject system. -void tst_QVector::properties() +void tst_QVectorND::properties() { - tst_QVectorProperties obj; + tst_QVectorNDProperties obj; obj.setVector2D(QVector2D(1.0f, 2.0f)); obj.setVector3D(QVector3D(3.0f, 4.0f, 5.0f)); @@ -2115,7 +2115,7 @@ QCOMPARE(v4.w(), (qreal)-9.0f); } -void tst_QVector::metaTypes() +void tst_QVectorND::metaTypes() { QVERIFY(QMetaType::type("QVector2D") == QMetaType::QVector2D); QVERIFY(QMetaType::type("QVector3D") == QMetaType::QVector3D); @@ -2137,6 +2137,6 @@ QVERIFY(qMetaTypeId() == QMetaType::QVector4D); } -QTEST_APPLESS_MAIN(tst_QVector) +QTEST_APPLESS_MAIN(tst_QVectorND) #include "tst_qvectornd.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/qwidget/tst_qwidget.cpp --- a/tests/auto/qwidget/tst_qwidget.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/qwidget/tst_qwidget.cpp Mon May 03 13:17:34 2010 +0300 @@ -402,6 +402,7 @@ void scrollWithoutBackingStore(); void taskQTBUG_7532_tabOrderWithFocusProxy(); + void movedAndResizedAttributes(); private: bool ensureScreenSize(int width, int height); @@ -8829,7 +8830,15 @@ #endif QTest::qWait(200); - QPixmap widgetSnapshot = QPixmap::grabWindow(label.winId()); + QPixmap widgetSnapshot; + +#ifdef Q_WS_WIN + QWidget *desktopWidget = QApplication::desktop()->screen(0); + if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) + widgetSnapshot = QPixmap::grabWindow(desktopWidget->winId(), 0,0, label.width(), label.height()); + else +#endif + widgetSnapshot = QPixmap::grabWindow(label.winId()); QImage actual = widgetSnapshot.toImage().convertToFormat(QImage::Format_RGB32); QImage expected = pm.toImage().convertToFormat(QImage::Format_RGB32); QCOMPARE(actual.size(),expected.size()); @@ -10032,5 +10041,61 @@ // No Q_ASSERT, then it's allright. } +void tst_QWidget::movedAndResizedAttributes() +{ +#if defined (Q_OS_MAC) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) + QEXPECT_FAIL("", "FixMe, QTBUG-8941 and QTBUG-8977", Abort); + QVERIFY(false); +#else + QWidget w; + w.show(); + + QVERIFY(!w.testAttribute(Qt::WA_Moved)); + QVERIFY(!w.testAttribute(Qt::WA_Resized)); + + w.setWindowState(Qt::WindowFullScreen); + + QVERIFY(!w.testAttribute(Qt::WA_Moved)); + QVERIFY(!w.testAttribute(Qt::WA_Resized)); + + w.setWindowState(Qt::WindowMaximized); + + QVERIFY(!w.testAttribute(Qt::WA_Moved)); + QVERIFY(!w.testAttribute(Qt::WA_Resized)); + + w.setWindowState(Qt::WindowMinimized); + + QVERIFY(!w.testAttribute(Qt::WA_Moved)); + QVERIFY(!w.testAttribute(Qt::WA_Resized)); + + w.showNormal(); + + QVERIFY(!w.testAttribute(Qt::WA_Moved)); + QVERIFY(!w.testAttribute(Qt::WA_Resized)); + + w.showMaximized(); + + QVERIFY(!w.testAttribute(Qt::WA_Moved)); + QVERIFY(!w.testAttribute(Qt::WA_Resized)); + + w.showFullScreen(); + + QVERIFY(!w.testAttribute(Qt::WA_Moved)); + QVERIFY(!w.testAttribute(Qt::WA_Resized)); + + w.showNormal(); + w.move(10,10); + QVERIFY(w.testAttribute(Qt::WA_Moved)); +#if defined(Q_OS_WIN) + QEXPECT_FAIL("", "FixMe, QTBUG-8911", Abort); +#endif + QVERIFY(!w.testAttribute(Qt::WA_Resized)); + + w.resize(100, 100); + QVERIFY(w.testAttribute(Qt::WA_Moved)); + QVERIFY(w.testAttribute(Qt::WA_Resized)); +#endif +} + QTEST_MAIN(tst_QWidget) #include "tst_qwidget.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/auto/script.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/script.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,16 @@ +TEMPLATE=subdirs +SUBDIRS=\ + qscriptable \ + qscriptclass \ + qscriptcontext \ + qscriptcontextinfo \ + qscriptengine \ + qscriptengineagent \ + qscriptenginedebugger \ + qscriptextqobject \ + qscriptjstestsuite \ + qscriptstring \ + qscriptv8testsuite \ + qscriptvalue \ + qscriptvalueiterator \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/sql.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/sql.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,14 @@ +TEMPLATE=subdirs +SUBDIRS=\ + qsql \ + qsqldatabase \ + qsqldriver \ + qsqlerror \ + qsqlfield \ + qsqlquery \ + qsqlquerymodel \ + qsqlrecord \ + qsqlrelationaltablemodel \ + qsqltablemodel \ + qsqlthread \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/svg.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/svg.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,6 @@ +TEMPLATE=subdirs +SUBDIRS=\ + qsvgdevice \ + qsvggenerator \ + qsvgrenderer \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/webkit.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/webkit.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,8 @@ +TEMPLATE=subdirs +SUBDIRS=\ + qwebelement \ + qwebframe \ + qwebhistory \ + qwebhistoryinterface \ + qwebpage \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xml.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xml.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,8 @@ +TEMPLATE=subdirs +SUBDIRS=\ + qdom \ + qxml \ + qxmlinputsource \ + qxmlsimplereader \ + qxmlstream \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatterns.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatterns.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,47 @@ +TEMPLATE=subdirs +SUBDIRS=\ + checkxmlfiles \ + patternistexamplefiletree \ + patternistexamples \ + patternistheaders \ + qabstractmessagehandler \ + qabstracturiresolver \ + qabstractxmlforwarditerator \ + qabstractxmlnodemodel \ + qabstractxmlreceiver \ + qapplicationargumentparser \ + qautoptr \ + qsimplexmlnodemodel \ + qsourcelocation \ + qxmlformatter \ + qxmlitem \ + qxmlname \ + qxmlnamepool \ + qxmlnodemodelindex \ + qxmlquery \ + qxmlresultitems \ + qxmlschema \ + qxmlschemavalidator \ + qxmlserializer \ + xmlpatterns \ + xmlpatternsdiagnosticsts \ + xmlpatternsschema \ + xmlpatternsschemats \ + xmlpatternssdk \ + xmlpatternsvalidator \ + xmlpatternsview \ + xmlpatternsxqts \ + xmlpatternsxslts \ + +xmlpatternsdiagnosticsts.depends = xmlpatternssdk +xmlpatternsview.depends = xmlpatternssdk +xmlpatternsxslts.depends = xmlpatternssdk +xmlpatternsschemats.depends = xmlpatternssdk + +!contains(QT_CONFIG, private_tests): SUBDIRS -= \ + xmlpatternsdiagnosticsts \ + xmlpatternsview \ + xmlpatternssdk \ + xmlpatternsxqts \ + xmlpatternsxslts \ + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsdiagnosticsts/tst_xmlpatternsdiagnosticsts.cpp --- a/tests/auto/xmlpatternsdiagnosticsts/tst_xmlpatternsdiagnosticsts.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/xmlpatternsdiagnosticsts/tst_xmlpatternsdiagnosticsts.cpp Mon May 03 13:17:34 2010 +0300 @@ -52,25 +52,25 @@ \since 4.5 \brief Test QtXmlPatterns test suite driver in tests/auto/xmlpatternsxqts/lib/. */ -class tst_XmlPatternsXSLTS : public tst_SuiteTest +class tst_XmlPatternsDiagnosticsTS : public tst_SuiteTest { Q_OBJECT public: - tst_XmlPatternsXSLTS(); + tst_XmlPatternsDiagnosticsTS(); protected: virtual void catalogPath(QString &write) const; }; -tst_XmlPatternsXSLTS::tst_XmlPatternsXSLTS() : tst_SuiteTest(tst_SuiteTest::XQuerySuite, true) +tst_XmlPatternsDiagnosticsTS::tst_XmlPatternsDiagnosticsTS() : tst_SuiteTest(tst_SuiteTest::XQuerySuite, true) { } -void tst_XmlPatternsXSLTS::catalogPath(QString &write) const +void tst_XmlPatternsDiagnosticsTS::catalogPath(QString &write) const { write = QLatin1String("TestSuite/DiagnosticsCatalog.xml"); } -QTEST_MAIN(tst_XmlPatternsXSLTS) +QTEST_MAIN(tst_XmlPatternsDiagnosticsTS) #include "tst_xmlpatternsdiagnosticsts.moc" #else diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-datatype.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-datatype.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,6 @@ + + + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-import-a.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-import-a.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,5 @@ + + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-import-b.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-import-b.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,4 @@ + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-import-c.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-import-c.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,4 @@ + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-include-a.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-include-a.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,5 @@ + + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-include-b.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-include-b.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,4 @@ + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-include-c.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-include-c.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,4 @@ + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-redefine-a.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-redefine-a.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,5 @@ + + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-redefine-b.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-redefine-b.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,4 @@ + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/files/indirect-redefine-c.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/xmlpatternsvalidator/files/indirect-redefine-c.xsd Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,4 @@ + + + + diff -r 2f34d5167611 -r fcece45ef507 tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp --- a/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/auto/xmlpatternsvalidator/tst_xmlpatternsvalidator.cpp Mon May 03 13:17:34 2010 +0300 @@ -196,6 +196,21 @@ << 1 << (QStringList() << QLatin1String("files/instance.xml")) << QString(); + + QTest::newRow("A schema with an indirectly included type") + << 0 + << (QStringList() << QLatin1String("files/indirect-include-a.xsd")) + << QString(); + + QTest::newRow("A schema with an indirectly imported type") + << 0 + << (QStringList() << QLatin1String("files/indirect-import-a.xsd")) + << QString(); + + QTest::newRow("A schema with an indirectly redefined type") + << 0 + << (QStringList() << QLatin1String("files/indirect-redefine-a.xsd")) + << QString(); } QTEST_MAIN(tst_XmlPatternsValidator) diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro --- a/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro Mon May 03 13:17:34 2010 +0300 @@ -1,5 +1,5 @@ load(qttest_p4) -TARGET = tst_qtextcodec +TARGET = tst_bench_qtextcodec QT -= gui SOURCES += main.cpp diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp --- a/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp Mon May 03 13:17:34 2010 +0300 @@ -165,7 +165,7 @@ WIN32_FIND_DATA fd; HANDLE hSearch = FindFirstFileW(appendedPath, &fd); - QVERIFY(hSearch == INVALID_HANDLE_VALUE); + QVERIFY(hSearch != INVALID_HANDLE_VALUE); QBENCHMARK { do { diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/io/qdir/qdir.pro --- a/tests/benchmarks/corelib/io/qdir/qdir.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/corelib/io/qdir/qdir.pro Mon May 03 13:17:34 2010 +0300 @@ -1,13 +1,2 @@ -<<<<<<< HEAD -load(qttest_p4) -TEMPLATE = app -TARGET = tst_bench_qdir -DEPENDPATH += . -INCLUDEPATH += . - -# Input -SOURCES += tst_qdir.cpp -======= TEMPLATE = subdirs SUBDIRS = 10000 ->>>>>>> qt-master/4.6 diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/io/qdir/tree/4.6.0-list.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/benchmarks/corelib/io/qdir/tree/4.6.0-list.txt Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,11963 @@ +0 src/ +0 3rdparty/ +0 ce-compat/ +0 ce_time.c + ce_time.h +2 clucene/ +0 APACHE.license + AUTHORS + ChangeLog + COPYING + LGPL.license + README + src/ +0 CLucene/ +0 analysis/ +0 AnalysisHeader.cpp + AnalysisHeader.h + Analyzers.cpp + Analyzers.h + standard/ +0 StandardAnalyzer.cpp + StandardAnalyzer.h + StandardFilter.cpp + StandardFilter.h + StandardTokenizerConstants.h + StandardTokenizer.cpp + StandardTokenizer.h +3 CLBackwards.h + CLConfig.h + CLMonolithic.cpp + config/ +0 CompilerAcc.h + CompilerBcb.h + CompilerGcc.h + compiler.h + CompilerMsvc.h + define_std.h + gunichartables.cpp + gunichartables.h + PlatformMac.h + PlatformUnix.h + PlatformWin32.h + repl_lltot.cpp + repl_tchar.h + repl_tcscasecmp.cpp + repl_tcslwr.cpp + repl_tcstod.cpp + repl_tcstoll.cpp + repl_tprintf.cpp + repl_wchar.h + threadCSection.h + threadPthread.h + threads.cpp + utf8.cpp +2 debug/ +0 condition.cpp + condition.h + error.cpp + error.h + lucenebase.h + mem.h + memtracking.cpp +2 document/ +0 DateField.cpp + DateField.h + Document.cpp + Document.h + Field.cpp + Field.h +3 CLucene.h + CLucene/index/ +0 CompoundFile.cpp + CompoundFile.h + DocumentWriter.cpp + DocumentWriter.h + FieldInfo.h + FieldInfos.cpp + FieldInfos.h + FieldsReader.cpp + FieldsReader.h + FieldsWriter.cpp + FieldsWriter.h + IndexModifier.cpp + IndexModifier.h + IndexReader.cpp + IndexReader.h + IndexWriter.cpp + IndexWriter.h + MultiReader.cpp + MultiReader.h + SegmentHeader.h + SegmentInfos.cpp + SegmentInfos.h + SegmentMergeInfo.cpp + SegmentMergeInfo.h + SegmentMergeQueue.cpp + SegmentMergeQueue.h + SegmentMerger.cpp + SegmentMerger.h + SegmentReader.cpp + SegmentTermDocs.cpp + SegmentTermEnum.cpp + SegmentTermEnum.h + SegmentTermPositions.cpp + SegmentTermVector.cpp + Term.cpp + Term.h + TermInfo.cpp + TermInfo.h + TermInfosReader.cpp + TermInfosReader.h + TermInfosWriter.cpp + TermInfosWriter.h + Terms.h + TermVector.h + TermVectorReader.cpp + TermVectorWriter.cpp +2 CLucene/LuceneThreads.h + CLucene/queryParser/ +0 Lexer.cpp + Lexer.h + MultiFieldQueryParser.cpp + MultiFieldQueryParser.h + QueryParserBase.cpp + QueryParserBase.h + QueryParser.cpp + QueryParser.h + QueryToken.cpp + QueryToken.h + TokenList.cpp + TokenList.h +2 CLucene/search/ +0 BooleanClause.h + BooleanQuery.cpp + BooleanQuery.h + BooleanScorer.cpp + BooleanScorer.h + CachingWrapperFilter.cpp + CachingWrapperFilter.h + ChainedFilter.cpp + ChainedFilter.h + Compare.h + ConjunctionScorer.cpp + ConjunctionScorer.h + DateFilter.cpp + DateFilter.h + ExactPhraseScorer.cpp + ExactPhraseScorer.h + Explanation.cpp + Explanation.h + FieldCache.cpp + FieldCache.h + FieldCacheImpl.cpp + FieldCacheImpl.h + FieldDoc.h + FieldDocSortedHitQueue.cpp + FieldDocSortedHitQueue.h + FieldSortedHitQueue.cpp + FieldSortedHitQueue.h + FilteredTermEnum.cpp + FilteredTermEnum.h + Filter.h + FuzzyQuery.cpp + FuzzyQuery.h + HitQueue.cpp + HitQueue.h + Hits.cpp + IndexSearcher.cpp + IndexSearcher.h + MultiSearcher.cpp + MultiSearcher.h + MultiTermQuery.cpp + MultiTermQuery.h + PhrasePositions.cpp + PhrasePositions.h + PhraseQuery.cpp + PhraseQuery.h + PhraseQueue.h + PhraseScorer.cpp + PhraseScorer.h + PrefixQuery.cpp + PrefixQuery.h + QueryFilter.cpp + QueryFilter.h + RangeFilter.cpp + RangeFilter.h + RangeQuery.cpp + RangeQuery.h + Scorer.h + SearchHeader.cpp + SearchHeader.h + Similarity.cpp + Similarity.h + SloppyPhraseScorer.cpp + SloppyPhraseScorer.h + Sort.cpp + Sort.h + TermQuery.cpp + TermQuery.h + TermScorer.cpp + TermScorer.h + WildcardQuery.cpp + WildcardQuery.h + WildcardTermEnum.cpp + WildcardTermEnum.h +2 CLucene/StdHeader.cpp + CLucene/StdHeader.h + CLucene/store/ +0 Directory.h + FSDirectory.cpp + FSDirectory.h + IndexInput.cpp + IndexInput.h + IndexOutput.cpp + IndexOutput.h + InputStream.h + Lock.cpp + Lock.h + MMapInput.cpp + OutputStream.h + RAMDirectory.cpp + RAMDirectory.h + TransactionalRAMDirectory.cpp + TransactionalRAMDirectory.h +2 CLucene/util/ +0 Arrays.h + BitSet.cpp + BitSet.h + bufferedstream.h + dirent.cpp + dirent.h + Equators.cpp + Equators.h + FastCharStream.cpp + FastCharStream.h + fileinputstream.cpp + fileinputstream.h + inputstreambuffer.h + jstreamsconfig.h + Misc.cpp + Misc.h + PriorityQueue.h + Reader.cpp + Reader.h + streambase.h + StringBuffer.cpp + StringBuffer.h + StringIntern.cpp + StringIntern.h + stringreader.h + subinputstream.h + ThreadLocal.cpp + ThreadLocal.h + VoidList.h + VoidMap.h +4 des/ +0 des.cpp +2 easing/ +0 easing.cpp + legal.qdoc +2 fonts/ +0 5x7.bdf + 6x13.bdf + COPYING.Cursor + COPYING.Helvetica + COPYING.Utopia + COPYRIGHT.BH + COPYRIGHT.Charter + COPYRIGHT.Courier + COPYRIGHT.DejaVu + COPYRIGHT.IBM + COPYRIGHT.Unifont + COPYRIGHT.Vera + helvB08.bdf + helvB10.bdf + helvB12.bdf + helvB14.bdf + helvB18.bdf + helvB24.bdf + helvBO08.bdf + helvBO10.bdf + helvBO12.bdf + helvBO14.bdf + helvBO18.bdf + helvBO24.bdf + helvO08.bdf + helvO10.bdf + helvO12.bdf + helvO14.bdf + helvO18.bdf + helvO24.bdf + helvR08.bdf + helvR10.bdf + helvR12.bdf + helvR14.bdf + helvR18.bdf + helvR24.bdf + micro.bdf + README.DejaVu + unifont.bdf +2 freetype/ +0 autogen.sh + builds/ +0 amiga/ +0 include/ +0 freetype/ +0 config/ +0 ftconfig.h + ftmodule.h +4 makefile +0 .os4 +2 README + smakefile + src/ +0 base/ +0 ftdebug.c + ftsystem.c +4 ansi/ +0 ansi-def.mk + ansi.mk +2 atari/ +0 ATARI.H + FNames.SIC + FREETYPE.PRJ + README.TXT +2 beos/ +0 beos-def.mk + beos.mk + detect.mk +2 compiler/ +0 ansi-cc.mk + bcc-dev.mk + bcc.mk + emx.mk + gcc-dev.mk + gcc.mk + intelc.mk + unix-lcc.mk + visualage.mk + visualc.mk + watcom.mk + win-lcc.mk +2 detect.mk + dos/ +0 detect.mk + dos-def.mk + dos-emx.mk + dos-gcc.mk + dos-wat.mk +2 exports.mk + freetype.mk + link_dos.mk + link_std.mk + mac/ +0 ascii2mpw.py + FreeType.m68k_cfm.make.txt + FreeType.m68k_far.make.txt + FreeType.ppc_carbon.make.txt + FreeType.ppc_classic.make.txt + ftlib.prj.xml + ftmac.c + README +2 modules.mk + newline + os2/ +0 detect.mk + os2-def.mk + os2-dev.mk + os2-gcc.mk +2 symbian/ +0 bld.inf + freetype.mmp +2 toplevel.mk + unix/ +0 aclocal.m4 + config.guess + config.sub + configure +0 .ac + .raw +2 detect.mk + freetype2.in + freetype2.m4 + freetype-config.in + ft2unix.h + ftconfig.h + ftconfig.in + ft-munmap.m4 + ftsystem.c + install.mk + install-sh + ltmain.sh + mkinstalldirs + unix-cc.in + unixddef.mk + unix-def.in + unix-dev.mk + unix-lcc.mk + unix.mk +2 vms/ +0 ftconfig.h + ftsystem.c +2 win32/ +0 detect.mk + ftdebug.c + vc2005/ +0 freetype.sln + freetype.vcproj + index.html +2 vc2008/ +0 freetype.sln + freetype.vcproj + index.html +2 visualc/ +0 freetype.dsp + freetype.dsw + index.html +2 w32-bccd.mk + w32-bcc.mk + w32-dev.mk + w32-gcc.mk + w32-icc.mk + w32-intl.mk + w32-lcc.mk + w32-mingw32.mk + w32-vcc.mk + w32-wat.mk + win32-def.mk +2 wince/ +0 ftdebug.c + vc2005-ce/ +0 freetype.sln + freetype.vcproj + index.html +2 vc2008-ce/ +0 freetype.sln + freetype.vcproj + index.html +4 ChangeLog +0 .20 + .21 + .22 +2 configure + devel/ +0 ft2build.h + ftoption.h +2 docs/ +0 CHANGES + CUSTOMIZE + DEBUG + formats.txt + FTL.TXT + GPL.TXT + INSTALL +0 .ANY + .CROSS + .GNU + .MAC + .UNIX + .VMS +2 LICENSE.TXT + MAKEPP + PATENTS + PROBLEMS + raster.txt + reference/ +0 ft2-base_interface.html + ft2-basic_types.html + ft2-bdf_fonts.html + ft2-bitmap_handling.html + ft2-cache_subsystem.html + ft2-cid_fonts.html + ft2-computations.html + ft2-font_formats.html + ft2-gasp_table.html + ft2-glyph_management.html + ft2-glyph_stroker.html + ft2-glyph_variants.html + ft2-gx_validation.html + ft2-gzip.html + ft2-header_file_macros.html + ft2-incremental.html + ft2-index.html + ft2-lcd_filtering.html + ft2-list_processing.html + ft2-lzw.html + ft2-mac_specific.html + ft2-module_management.html + ft2-multiple_masters.html + ft2-ot_validation.html + ft2-outline_processing.html + ft2-pfr_fonts.html + ft2-quick_advance.html + ft2-raster.html + ft2-sfnt_names.html + ft2-sizes_management.html + ft2-system_interface.html + ft2-toc.html + ft2-truetype_engine.html + ft2-truetype_tables.html + ft2-type1_tables.html + ft2-user_allocation.html + ft2-version.html + ft2-winfnt_fonts.html + README +2 release + TODO + TRUETYPE + UPGRADE.UNIX + VERSION.DLL +2 include/ +0 freetype/ +0 config/ +0 ftconfig.h + ftheader.h + ftmodule.h + ftoption.h + ftstdlib.h +2 freetype.h + ftadvanc.h + ftbbox.h + ftbdf.h + ftbitmap.h + ftcache.h + ftchapters.h + ftcid.h + fterrdef.h + fterrors.h + ftgasp.h + ftglyph.h + ftgxval.h + ftgzip.h + ftimage.h + ftincrem.h + ftlcdfil.h + ftlist.h + ftlzw.h + ftmac.h + ftmm.h + ftmodapi.h + ftmoderr.h + ftotval.h + ftoutln.h + ftpfr.h + ftrender.h + ftsizes.h + ftsnames.h + ftstroke.h + ftsynth.h + ftsystem.h + fttrigon.h + fttypes.h + ftwinfnt.h + ftxf86.h + internal/ +0 autohint.h + ftcalc.h + ftdebug.h + ftdriver.h + ftgloadr.h + ftmemory.h + ftobjs.h + ftrfork.h + ftserv.h + ftstream.h + fttrace.h + ftvalid.h + internal.h + pcftypes.h + psaux.h + pshints.h + services/ +0 svbdf.h + svcid.h + svgldict.h + svgxval.h + svkern.h + svmm.h + svotval.h + svpfr.h + svpostnm.h + svpscmap.h + svpsinfo.h + svsfnt.h + svttcmap.h + svtteng.h + svttglyf.h + svwinfnt.h + svxf86nm.h +2 sfnt.h + t1types.h + tttypes.h +2 t1tables.h + ttnameid.h + tttables.h + tttags.h + ttunpat.h +2 ft2build.h +2 Jamfile + Jamrules + Makefile + modules.cfg + objs/ +0 README +2 README +0 .CVS +2 src/ +0 autofit/ +0 afangles.c + afangles.h + afcjk.c + afcjk.h + afdummy.c + afdummy.h + aferrors.h + afglobal.c + afglobal.h + afhints.c + afhints.h + afindic.c + afindic.h + aflatin2.c + aflatin2.h + aflatin.c + aflatin.h + afloader.c + afloader.h + afmodule.c + afmodule.h + aftypes.h + afwarp.c + afwarp.h + autofit.c + Jamfile + module.mk + rules.mk +2 base/ +0 ftadvanc.c + ftapi.c + ftbase.c + ftbase.h + ftbbox.c + ftbdf.c + ftbitmap.c + ftcalc.c + ftcid.c + ftdbgmem.c + ftdebug.c + ftfstype.c + ftgasp.c + ftgloadr.c + ftglyph.c + ftgxval.c + ftinit.c + ftlcdfil.c + ftmac.c + ftmm.c + ftnames.c + ftobjs.c + ftotval.c + ftoutln.c + ftpatent.c + ftpfr.c + ftrfork.c + ftstream.c + ftstroke.c + ftsynth.c + ftsystem.c + fttrigon.c + fttype1.c + ftutil.c + ftwinfnt.c + ftxf86.c + Jamfile + rules.mk +2 bdf/ +0 bdf.c + bdfdrivr.c + bdfdrivr.h + bdferror.h + bdf.h + bdflib.c + Jamfile + module.mk + README + rules.mk +2 cache/ +0 ftcache.c + ftcbasic.c + ftccache.c + ftccache.h + ftccback.h + ftccmap.c + ftcerror.h + ftcglyph.c + ftcglyph.h + ftcimage.c + ftcimage.h + ftcmanag.c + ftcmanag.h + ftcmru.c + ftcmru.h + ftcsbits.c + ftcsbits.h + Jamfile + rules.mk +2 cff/ +0 cff.c + cffcmap.c + cffcmap.h + cffdrivr.c + cffdrivr.h + cfferrs.h + cffgload.c + cffgload.h + cffload.c + cffload.h + cffobjs.c + cffobjs.h + cffparse.c + cffparse.h + cfftoken.h + cfftypes.h + Jamfile + module.mk + rules.mk +2 cid/ +0 ciderrs.h + cidgload.c + cidgload.h + cidload.c + cidload.h + cidobjs.c + cidobjs.h + cidparse.c + cidparse.h + cidriver.c + cidriver.h + cidtoken.h + Jamfile + module.mk + rules.mk + type1cid.c +2 gxvalid/ +0 gxvalid.c + gxvalid.h + gxvbsln.c + gxvcommn.c + gxvcommn.h + gxverror.h + gxvfeat.c + gxvfeat.h + gxvfgen.c + gxvjust.c + gxvkern.c + gxvlcar.c + gxvmod.c + gxvmod.h + gxvmort0.c + gxvmort1.c + gxvmort2.c + gxvmort4.c + gxvmort5.c + gxvmort.c + gxvmort.h + gxvmorx0.c + gxvmorx1.c + gxvmorx2.c + gxvmorx4.c + gxvmorx5.c + gxvmorx.c + gxvmorx.h + gxvopbd.c + gxvprop.c + gxvtrak.c + Jamfile + module.mk + README + rules.mk +2 gzip/ +0 adler32.c + ftgzip.c + infblock.c + infblock.h + infcodes.c + infcodes.h + inffixed.h + inflate.c + inftrees.c + inftrees.h + infutil.c + infutil.h + Jamfile + rules.mk + zconf.h + zlib.h + zutil.c + zutil.h +2 Jamfile + lzw/ +0 ftlzw.c + ftzopen.c + ftzopen.h + Jamfile + rules.mk +2 otvalid/ +0 Jamfile + module.mk + otvalid.c + otvalid.h + otvbase.c + otvcommn.c + otvcommn.h + otverror.h + otvgdef.c + otvgpos.c + otvgpos.h + otvgsub.c + otvjstf.c + otvmath.c + otvmod.c + otvmod.h + rules.mk +2 pcf/ +0 Jamfile + module.mk + pcf.c + pcfdrivr.c + pcfdrivr.h + pcferror.h + pcf.h + pcfread.c + pcfread.h + pcfutil.c + pcfutil.h + README + rules.mk +2 pfr/ +0 Jamfile + module.mk + pfr.c + pfrcmap.c + pfrcmap.h + pfrdrivr.c + pfrdrivr.h + pfrerror.h + pfrgload.c + pfrgload.h + pfrload.c + pfrload.h + pfrobjs.c + pfrobjs.h + pfrsbit.c + pfrsbit.h + pfrtypes.h + rules.mk +2 psaux/ +0 afmparse.c + afmparse.h + Jamfile + module.mk + psaux.c + psauxerr.h + psauxmod.c + psauxmod.h + psconv.c + psconv.h + psobjs.c + psobjs.h + rules.mk + t1cmap.c + t1cmap.h + t1decode.c + t1decode.h +2 pshinter/ +0 Jamfile + module.mk + pshalgo.c + pshalgo.h + pshglob.c + pshglob.h + pshinter.c + pshmod.c + pshmod.h + pshnterr.h + pshrec.c + pshrec.h + rules.mk +2 psnames/ +0 Jamfile + module.mk + psmodule.c + psmodule.h + psnamerr.h + psnames.c + pstables.h + rules.mk +2 raster/ +0 ftmisc.h + ftraster.c + ftraster.h + ftrend1.c + ftrend1.h + Jamfile + module.mk + raster.c + rasterrs.h + rules.mk +2 sfnt/ +0 Jamfile + module.mk + rules.mk + sfdriver.c + sfdriver.h + sferrors.h + sfnt.c + sfobjs.c + sfobjs.h + ttbdf.c + ttbdf.h + ttcmap.c + ttcmap.h + ttkern.c + ttkern.h + ttload.c + ttload.h + ttmtx.c + ttmtx.h + ttpost.c + ttpost.h + ttsbit0.c + ttsbit.c + ttsbit.h +2 smooth/ +0 ftgrays.c + ftgrays.h + ftsmerrs.h + ftsmooth.c + ftsmooth.h + Jamfile + module.mk + rules.mk + smooth.c +2 tools/ +0 apinames.c + cordic.py + docmaker/ +0 content.py + docbeauty.py + docmaker.py + formatter.py + sources.py + tohtml.py + utils.py +2 ftrandom/ +0 ftrandom.c + Makefile + README +2 glnames.py + Jamfile + test_afm.c + test_bbox.c + test_trig.c +2 truetype/ +0 Jamfile + module.mk + rules.mk + truetype.c + ttdriver.c + ttdriver.h + tterrors.h + ttgload.c + ttgload.h + ttgxvar.c + ttgxvar.h + ttinterp.c + ttinterp.h + ttobjs.c + ttobjs.h + ttpload.c + ttpload.h +2 type1/ +0 Jamfile + module.mk + rules.mk + t1afm.c + t1afm.h + t1driver.c + t1driver.h + t1errors.h + t1gload.c + t1gload.h + t1load.c + t1load.h + t1objs.c + t1objs.h + t1parse.c + t1parse.h + t1tokens.h + type1.c +2 type42/ +0 Jamfile + module.mk + rules.mk + t42drivr.c + t42drivr.h + t42error.h + t42objs.c + t42objs.h + t42parse.c + t42parse.h + t42types.h + type42.c +2 winfonts/ +0 fnterrs.h + Jamfile + module.mk + rules.mk + winfnt.c + winfnt.h +3 version.sed + vms_make.com +2 .gitattributes + harfbuzz/ +0 AUTHORS + autogen.sh + ChangeLog + configure.ac + COPYING + .gitignore + Makefile.am + NEWS + README + src/ +0 .gitignore + harfbuzz-arabic.c + harfbuzz-buffer.c + harfbuzz-buffer.h + harfbuzz-buffer-private.h + harfbuzz.c + harfbuzz-dump.c + harfbuzz-dump.h + harfbuzz-dump-main.c + harfbuzz-external.h + harfbuzz-gdef.c + harfbuzz-gdef.h + harfbuzz-gdef-private.h + harfbuzz-global.h + harfbuzz-gpos.c + harfbuzz-gpos.h + harfbuzz-gpos-private.h + harfbuzz-gsub.c + harfbuzz-gsub.h + harfbuzz-gsub-private.h + harfbuzz.h + harfbuzz-hangul.c + harfbuzz-hebrew.c + harfbuzz-impl.c + harfbuzz-impl.h + harfbuzz-indic.cpp + harfbuzz-khmer.c + harfbuzz-myanmar.c + harfbuzz-open.c + harfbuzz-open.h + harfbuzz-open-private.h + harfbuzz-shape.h + harfbuzz-shaper-all.cpp + harfbuzz-shaper.cpp + harfbuzz-shaper.h + harfbuzz-shaper-private.h + harfbuzz-stream.c + harfbuzz-stream.h + harfbuzz-stream-private.h + harfbuzz-thai.c + harfbuzz-tibetan.c + Makefile.am +2 tests/ +0 linebreaking/ +0 .gitignore + harfbuzz-qt.cpp + main.cpp + Makefile.am +2 Makefile.am + shaping/ +0 .gitignore + main.cpp + Makefile.am + README +4 javascriptcore/ +0 JavaScriptCore/ +0 API/ +0 APICast.h + JavaScriptCore.h + JavaScript.h + JSBase.cpp + JSBase.h + JSBasePrivate.h + JSCallbackConstructor.cpp + JSCallbackConstructor.h + JSCallbackFunction.cpp + JSCallbackFunction.h + JSCallbackObject.cpp + JSCallbackObjectFunctions.h + JSCallbackObject.h + JSClassRef.cpp + JSClassRef.h + JSContextRef.cpp + JSContextRef.h + JSObjectRef.cpp + JSObjectRef.h + JSProfilerPrivate.cpp + JSProfilerPrivate.h + JSRetainPtr.h + JSStringRefBSTR.cpp + JSStringRefBSTR.h + JSStringRefCF.cpp + JSStringRefCF.h + JSStringRef.cpp + JSStringRef.h + JSValueRef.cpp + JSValueRef.h + OpaqueJSString.cpp + OpaqueJSString.h + WebKitAvailability.h +2 assembler/ +0 AbstractMacroAssembler.h + ARMAssembler.cpp + ARMAssembler.h + ARMv7Assembler.h + AssemblerBuffer.h + AssemblerBufferWithConstantPool.h + CodeLocation.h + LinkBuffer.h + MacroAssemblerARM.cpp + MacroAssemblerARM.h + MacroAssemblerARMv7.h + MacroAssemblerCodeRef.h + MacroAssembler.h + MacroAssemblerX86_64.h + MacroAssemblerX86Common.h + MacroAssemblerX86.h + RepatchBuffer.h + X86Assembler.h +2 AUTHORS + bytecode/ +0 CodeBlock.cpp + CodeBlock.h + EvalCodeCache.h + Instruction.h + JumpTable.cpp + JumpTable.h + Opcode.cpp + Opcode.h + SamplingTool.cpp + SamplingTool.h + StructureStubInfo.cpp + StructureStubInfo.h +2 bytecompiler/ +0 BytecodeGenerator.cpp + BytecodeGenerator.h + Label.h + LabelScope.h + RegisterID.h +2 ChangeLog +0 -2002-12-03 + -2003-10-25 + -2007-10-14 + -2008-08-10 + -2009-06-16 +2 config.h + COPYING.LIB + create_hash_table + debugger/ +0 DebuggerActivation.cpp + DebuggerActivation.h + DebuggerCallFrame.cpp + DebuggerCallFrame.h + Debugger.cpp + Debugger.h +2 DerivedSources.make + docs/ +0 make-bytecode-docs.pl +2 ForwardingHeaders/ +0 JavaScriptCore/ +0 APICast.h + JavaScriptCore.h + JavaScript.h + JSBase.h + JSContextRef.h + JSObjectRef.h + JSRetainPtr.h + JSStringRefCF.h + JSStringRef.h + JSValueRef.h + OpaqueJSString.h + WebKitAvailability.h +3 generated/ +0 ArrayPrototype.lut.h + chartables.c + DatePrototype.lut.h + Grammar.cpp + Grammar.h + JSONObject.lut.h + Lexer.lut.h + MathObject.lut.h + NumberConstructor.lut.h + RegExpConstructor.lut.h + RegExpObject.lut.h + StringPrototype.lut.h +2 headers.pri + Info.plist + interpreter/ +0 CachedCall.h + CallFrameClosure.h + CallFrame.cpp + CallFrame.h + Interpreter.cpp + Interpreter.h + RegisterFile.cpp + RegisterFile.h + Register.h +2 JavaScriptCore.gypi + JavaScriptCore.order + JavaScriptCorePrefix.h + JavaScriptCore.pri + jit/ +0 ExecutableAllocator.cpp + ExecutableAllocatorFixedVMPool.cpp + ExecutableAllocator.h + ExecutableAllocatorPosix.cpp + ExecutableAllocatorWin.cpp + JITArithmetic.cpp + JITCall.cpp + JITCode.h + JIT.cpp + JIT.h + JITInlineMethods.h + JITOpcodes.cpp + JITPropertyAccess.cpp + JITStubCall.h + JITStubs.cpp + JITStubs.h +2 jsc.cpp + make-generated-sources.sh + os-win32/ +0 stdbool.h + stdint.h +2 parser/ +0 Grammar.y + Keywords.table + Lexer.cpp + Lexer.h + NodeConstructors.h + NodeInfo.h + Nodes.cpp + Nodes.h + ParserArena.cpp + ParserArena.h + Parser.cpp + Parser.h + ResultType.h + SourceCode.h + SourceProvider.h +2 pcre/ +0 AUTHORS + COPYING + dftables + pcre_compile.cpp + pcre_exec.cpp + pcre.h + pcre_internal.h + pcre.pri + pcre_tables.cpp + pcre_ucp_searchfuncs.cpp + pcre_xclass.cpp + ucpinternal.h + ucptable.cpp +2 profiler/ +0 CallIdentifier.h + HeavyProfile.cpp + HeavyProfile.h + Profile.cpp + ProfileGenerator.cpp + ProfileGenerator.h + Profile.h + ProfileNode.cpp + ProfileNode.h + Profiler.cpp + Profiler.h + ProfilerServer.h + ProfilerServer.mm + TreeProfile.cpp + TreeProfile.h +2 runtime/ +0 ArgList.cpp + ArgList.h + Arguments.cpp + Arguments.h + ArrayConstructor.cpp + ArrayConstructor.h + ArrayPrototype.cpp + ArrayPrototype.h + BatchedTransitionOptimizer.h + BooleanConstructor.cpp + BooleanConstructor.h + BooleanObject.cpp + BooleanObject.h + BooleanPrototype.cpp + BooleanPrototype.h + CallData.cpp + CallData.h + ClassInfo.h + Collector.cpp + Collector.h + CollectorHeapIterator.h + CommonIdentifiers.cpp + CommonIdentifiers.h + Completion.cpp + Completion.h + ConstructData.cpp + ConstructData.h + DateConstructor.cpp + DateConstructor.h + DateConversion.cpp + DateConversion.h + DateInstance.cpp + DateInstance.h + DatePrototype.cpp + DatePrototype.h + ErrorConstructor.cpp + ErrorConstructor.h + Error.cpp + Error.h + ErrorInstance.cpp + ErrorInstance.h + ErrorPrototype.cpp + ErrorPrototype.h + ExceptionHelpers.cpp + ExceptionHelpers.h + Executable.cpp + Executable.h + FunctionConstructor.cpp + FunctionConstructor.h + FunctionPrototype.cpp + FunctionPrototype.h + GetterSetter.cpp + GetterSetter.h + GlobalEvalFunction.cpp + GlobalEvalFunction.h + Identifier.cpp + Identifier.h + InitializeThreading.cpp + InitializeThreading.h + InternalFunction.cpp + InternalFunction.h + JSActivation.cpp + JSActivation.h + JSAPIValueWrapper.cpp + JSAPIValueWrapper.h + JSArray.cpp + JSArray.h + JSByteArray.cpp + JSByteArray.h + JSCell.cpp + JSCell.h + JSFunction.cpp + JSFunction.h + JSGlobalData.cpp + JSGlobalData.h + JSGlobalObject.cpp + JSGlobalObjectFunctions.cpp + JSGlobalObjectFunctions.h + JSGlobalObject.h + JSImmediate.cpp + JSImmediate.h + JSLock.cpp + JSLock.h + JSNotAnObject.cpp + JSNotAnObject.h + JSNumberCell.cpp + JSNumberCell.h + JSObject.cpp + JSObject.h + JSONObject.cpp + JSONObject.h + JSPropertyNameIterator.cpp + JSPropertyNameIterator.h + JSStaticScopeObject.cpp + JSStaticScopeObject.h + JSString.cpp + JSString.h + JSType.h + JSTypeInfo.h + JSValue.cpp + JSValue.h + JSVariableObject.cpp + JSVariableObject.h + JSWrapperObject.cpp + JSWrapperObject.h + LiteralParser.cpp + LiteralParser.h + Lookup.cpp + Lookup.h + MarkStack.cpp + MarkStack.h + MarkStackPosix.cpp + MarkStackWin.cpp + MathObject.cpp + MathObject.h + NativeErrorConstructor.cpp + NativeErrorConstructor.h + NativeErrorPrototype.cpp + NativeErrorPrototype.h + NativeFunctionWrapper.h + NumberConstructor.cpp + NumberConstructor.h + NumberObject.cpp + NumberObject.h + NumberPrototype.cpp + NumberPrototype.h + NumericStrings.h + ObjectConstructor.cpp + ObjectConstructor.h + ObjectPrototype.cpp + ObjectPrototype.h + Operations.cpp + Operations.h + PropertyDescriptor.cpp + PropertyDescriptor.h + PropertyMapHashTable.h + PropertyNameArray.cpp + PropertyNameArray.h + PropertySlot.cpp + PropertySlot.h + Protect.h + PrototypeFunction.cpp + PrototypeFunction.h + PutPropertySlot.h + RegExpConstructor.cpp + RegExpConstructor.h + RegExp.cpp + RegExp.h + RegExpMatchesArray.h + RegExpObject.cpp + RegExpObject.h + RegExpPrototype.cpp + RegExpPrototype.h + ScopeChain.cpp + ScopeChain.h + ScopeChainMark.h + SmallStrings.cpp + SmallStrings.h + StringConstructor.cpp + StringConstructor.h + StringObject.cpp + StringObject.h + StringObjectThatMasqueradesAsUndefined.h + StringPrototype.cpp + StringPrototype.h + StructureChain.cpp + StructureChain.h + Structure.cpp + Structure.h + StructureTransitionTable.h + SymbolTable.h + TimeoutChecker.cpp + TimeoutChecker.h + Tracing.h + UString.cpp + UString.h +2 THANKS + wrec/ +0 CharacterClassConstructor.cpp + CharacterClassConstructor.h + CharacterClass.cpp + CharacterClass.h + Escapes.h + Quantifier.h + WREC.cpp + WRECFunctors.cpp + WRECFunctors.h + WRECGenerator.cpp + WRECGenerator.h + WREC.h + WRECParser.cpp + WRECParser.h +2 wscript + wtf/ +0 AlwaysInline.h + ASCIICType.h + Assertions.cpp + Assertions.h + AVLTree.h + ByteArray.cpp + ByteArray.h + CONTRIBUTORS.pthreads-win32 + CrossThreadRefCounted.h + CurrentTime.cpp + CurrentTime.h + DateMath.cpp + DateMath.h + Deque.h + DisallowCType.h + dtoa.cpp + dtoa.h + FastAllocBase.h + FastMalloc.cpp + FastMalloc.h + Forward.h + GetPtr.h + GOwnPtr.cpp + GOwnPtr.h + HashCountedSet.h + HashFunctions.h + HashIterators.h + HashMap.h + HashSet.h + HashTable.cpp + HashTable.h + HashTraits.h + ListHashSet.h + ListRefPtr.h + Locker.h + MainThread.cpp + MainThread.h + MallocZoneSupport.h + MathExtras.h + MessageQueue.h + Noncopyable.h + NotFound.h + OwnArrayPtr.h + OwnFastMallocPtr.h + OwnPtrCommon.h + OwnPtr.h + OwnPtrWin.cpp + PassOwnPtr.h + PassRefPtr.h + Platform.h + PossiblyNull.h + PtrAndFlags.h + qt/ +0 MainThreadQt.cpp + ThreadingQt.cpp +2 RandomNumber.cpp + RandomNumber.h + RandomNumberSeed.h + RefCounted.h + RefCountedLeakCounter.cpp + RefCountedLeakCounter.h + RefPtr.h + RefPtrHashMap.h + RetainPtr.h + SegmentedVector.h + StdLibExtras.h + StringExtras.h + TCPackedCache.h + TCPageMap.h + TCSpinLock.h + TCSystemAlloc.cpp + TCSystemAlloc.h + Threading.cpp + Threading.h + ThreadingNone.cpp + ThreadingPthreads.cpp + ThreadingWin.cpp + ThreadSpecific.h + ThreadSpecificWin.cpp + TypeTraits.cpp + TypeTraits.h + unicode/ +0 CollatorDefault.cpp + Collator.h + glib/ +0 UnicodeGLib.cpp + UnicodeGLib.h + UnicodeMacrosFromICU.h +2 icu/ +0 CollatorICU.cpp + UnicodeIcu.h +2 qt4/ +0 UnicodeQt4.h +2 Unicode.h + UTF8.cpp + UTF8.h + wince/ +0 UnicodeWince.cpp + UnicodeWince.h +3 UnusedParam.h + Vector.h + VectorTraits.h + VMTags.h + wince/ +0 FastMallocWince.h + MemoryManager.cpp + MemoryManager.h + mt19937ar.c +3 yarr/ +0 RegexCompiler.cpp + RegexCompiler.h + RegexInterpreter.cpp + RegexInterpreter.h + RegexJIT.cpp + RegexJIT.h + RegexParser.h + RegexPattern.h +3 VERSION + WebKit.pri +2 libjpeg/ +0 change.log + coderules.doc + filelist.doc + install.doc + jcapimin.c + jcapistd.c + jccoefct.c + jccolor.c + jcdctmgr.c + jchuff.c + jchuff.h + jcinit.c + jcmainct.c + jcmarker.c + jcmaster.c + jcomapi.c + jconfig.bcc + jconfig.cfg + jconfig.dj + jconfig.doc + jconfig.h + jconfig.mac + jconfig.manx + jconfig.mc6 + jconfig.sas + jconfig.st + jconfig.vc + jconfig.vms + jconfig.wat + jcparam.c + jcphuff.c + jcprepct.c + jcsample.c + jctrans.c + jdapimin.c + jdapistd.c + jdatadst.c + jdatasrc.c + jdcoefct.c + jdcolor.c + jdct.h + jddctmgr.c + jdhuff.c + jdhuff.h + jdinput.c + jdmainct.c + jdmarker.c + jdmaster.c + jdmerge.c + jdphuff.c + jdpostct.c + jdsample.c + jdtrans.c + jerror.c + jerror.h + jfdctflt.c + jfdctfst.c + jfdctint.c + jidctflt.c + jidctfst.c + jidctint.c + jidctred.c + jinclude.h + jmemmgr.c + jmemnobs.c + jmemsys.h + jmorecfg.h + jpegint.h + jpeglib.h + jquant1.c + jquant2.c + jutils.c + jversion.h + libjpeg.doc + makefile.ansi + makefile.bcc + makefile.cfg + makefile.dj + makefile.manx + makefile.mc6 + makefile.mms + makefile.sas + makefile.unix + makefile.vc + makefile.vms + makefile.wat + README + structure.doc + usage.doc + wizard.doc +2 libmng/ +0 CHANGES + doc/ +0 doc.readme + libmng.txt + man/ +0 jng.5 + libmng.3 + mng.5 +2 misc/ +0 magic.dif +2 Plan1.png + Plan2.png + rpm/ +0 libmng-1.0.10-rhconf.patch + libmng.spec +3 libmng_callback_xs.c + libmng_chunk_descr.c + libmng_chunk_descr.h + libmng_chunk_io.c + libmng_chunk_io.h + libmng_chunk_prc.c + libmng_chunk_prc.h + libmng_chunks.h + libmng_chunk_xs.c + libmng_cms.c + libmng_cms.h + libmng_conf.h + libmng_data.h + libmng_display.c + libmng_display.h + libmng_dither.c + libmng_dither.h + libmng_error.c + libmng_error.h + libmng_filter.c + libmng_filter.h + libmng.h + libmng_hlapi.c + libmng_jpeg.c + libmng_jpeg.h + libmng_memory.h + libmng_object_prc.c + libmng_object_prc.h + libmng_objects.h + libmng_pixels.c + libmng_pixels.h + libmng_prop_xs.c + libmng_read.c + libmng_read.h + libmng_trace.c + libmng_trace.h + libmng_types.h + libmng_write.c + libmng_write.h + libmng_zlib.c + libmng_zlib.h + LICENSE + makefiles/ +0 configure.in + Makefile.am + makefile.bcb3 + makefile.dj + makefile.linux + makefile.mingw +0 dll +2 makefile.qnx + makefile.unix + makefile.vcwin32 + README +2 README +0 .autoconf + .config + .contrib + .dll + .examples + .footprint + .packaging +2 unmaintained/ +0 autogen.sh +3 libpng/ +0 ANNOUNCE + CHANGES + configure + example.c + INSTALL + KNOWNBUG + libpng-1.2.40.txt + libpng.3 + libpngpf.3 + LICENSE + png.5 + pngbar.jpg + pngbar.png + png.c + pngconf.h + pngerror.c + pnggccrd.c + pngget.c + png.h + pngmem.c + pngnow.png + pngpread.c + pngread.c + pngrio.c + pngrtran.c + pngrutil.c + pngset.c + pngtest.c + pngtest.png + pngtrans.c + pngvcrd.c + pngwio.c + pngwrite.c + pngwtran.c + pngwutil.c + projects/ +0 beos/ +0 x86-shared.proj + x86-shared.txt + x86-static.proj + x86-static.txt +2 cbuilder5/ +0 libpng.bpf + libpng.bpg + libpng.bpr + libpng.cpp + libpng.readme.txt + libpngstat.bpf + libpngstat.bpr + zlib.readme.txt +2 netware.txt + visualc6/ +0 libpng.dsp + libpng.dsw + pngtest.dsp + README.txt +2 visualc71/ +0 libpng.sln + libpng.vcproj + pngtest.vcproj + PRJ0041.mak + README.txt + README_zlib.txt + zlib.vcproj +2 wince.txt +2 README + scripts/ +0 CMakeLists.txt + descrip.mms + libpng-config-body.in + libpng-config-head.in + libpng-config.in + libpng.icc + libpng.pc-configure.in + libpng.pc.in + makefile.32sunu + makefile.64sunu + makefile.acorn + makefile.aix + makefile.amiga + makefile.atari + makefile.bc32 + makefile.beos + makefile.bor + makefile.cygwin + makefile.darwin + makefile.dec + makefile.dj2 + makefile.elf + makefile.freebsd + makefile.gcc + makefile.gcmmx + makefile.hp64 + makefile.hpgcc + makefile.hpux + makefile.ibmc + makefile.intel + makefile.knr + makefile.linux + makefile.mingw + makefile.mips + makefile.msc + makefile.ne12bsd + makefile.netbsd + makefile.nommx + makefile.openbsd + makefile.os2 + makefile.sco + makefile.sggcc + makefile.sgi + makefile.so9 + makefile.solaris +0 -x86 +2 makefile.std + makefile.sunos + makefile.tc3 + makefile.vcawin32 + makefile.vcwin32 + makefile.watcom + makevms.com + pngos2.def + pngw32.def + pngw32.rc + SCOPTIONS.ppc + smakefile.ppc +2 TODO + Y2KINFO +2 libtiff/ +0 aclocal.m4 + autogen.sh + ChangeLog + config/ +0 compile + config.guess + config.sub + depcomp + install-sh + ltmain.sh + missing + mkinstalldirs +2 configure +0 .ac +2 COPYRIGHT + HOWTO-RELEASE + html/ +0 addingtags.html + bugs.html + build.html + contrib.html + document.html + images/ +0 back.gif + bali.jpg + cat.gif + cover.jpg + cramps.gif + dave.gif +2 images.html + images/info.gif + images/jello.jpg + images/jim.gif + images/Makefile.am + images/Makefile.in + images/note.gif + images/oxford.gif + images/quad.jpg + images/ring.gif + images/smallliz.jpg + images/strike.gif + images/warning.gif + index.html + internals.html + intro.html + libtiff.html + Makefile.am + Makefile.in + man/ +0 fax2ps.1.html + fax2tiff.1.html + gif2tiff.1.html + index.html + libtiff.3tiff.html + Makefile.am + Makefile.in + pal2rgb.1.html + ppm2tiff.1.html + ras2tiff.1.html + raw2tiff.1.html + rgb2ycbcr.1.html + sgi2tiff.1.html + thumbnail.1.html + tiff2bw.1.html + tiff2pdf.1.html + tiff2ps.1.html + tiff2rgba.1.html + TIFFbuffer.3tiff.html + TIFFClose.3tiff.html + tiffcmp.1.html + TIFFcodec.3tiff.html + TIFFcolor.3tiff.html + tiffcp.1.html + TIFFDataWidth.3tiff.html + tiffdither.1.html + tiffdump.1.html + TIFFError.3tiff.html + TIFFFlush.3tiff.html + TIFFGetField.3tiff.html + tiffgt.1.html + tiffinfo.1.html + tiffmedian.1.html + TIFFmemory.3tiff.html + TIFFOpen.3tiff.html + TIFFPrintDirectory.3tiff.html + TIFFquery.3tiff.html + TIFFReadDirectory.3tiff.html + TIFFReadEncodedStrip.3tiff.html + TIFFReadEncodedTile.3tiff.html + TIFFReadRawStrip.3tiff.html + TIFFReadRawTile.3tiff.html + TIFFReadRGBAImage.3tiff.html + TIFFReadRGBAStrip.3tiff.html + TIFFReadRGBATile.3tiff.html + TIFFReadScanline.3tiff.html + TIFFReadTile.3tiff.html + TIFFRGBAImage.3tiff.html + tiffset.1.html + TIFFSetDirectory.3tiff.html + TIFFSetField.3tiff.html + TIFFsize.3tiff.html + tiffsplit.1.html + TIFFstrip.3tiff.html + tiffsv.1.html + TIFFswab.3tiff.html + TIFFtile.3tiff.html + TIFFWarning.3tiff.html + TIFFWriteDirectory.3tiff.html + TIFFWriteEncodedStrip.3tiff.html + TIFFWriteEncodedTile.3tiff.html + TIFFWriteRawStrip.3tiff.html + TIFFWriteRawTile.3tiff.html + TIFFWriteScanline.3tiff.html + TIFFWriteTile.3tiff.html +2 misc.html + support.html + TIFFTechNote2.html + tools.html + v3.4beta007.html + v3.4beta016.html + v3.4beta018.html + v3.4beta024.html + v3.4beta028.html + v3.4beta029.html + v3.4beta031.html + v3.4beta032.html + v3.4beta033.html + v3.4beta034.html + v3.4beta035.html + v3.4beta036.html + v3.5.1.html + v3.5.2.html + v3.5.3.html + v3.5.4.html + v3.5.5.html + v3.5.6-beta.html + v3.5.7.html + v3.6.0.html + v3.6.1.html + v3.7.0alpha.html + v3.7.0beta2.html + v3.7.0beta.html + v3.7.0.html + v3.7.1.html + v3.7.2.html + v3.7.3.html + v3.7.4.html + v3.8.0.html + v3.8.1.html + v3.8.2.html +2 libtiff/ +0 libtiff.def + Makefile.am + Makefile.in + Makefile.vc + mkg3states.c + SConstruct + t4.h + tif_acorn.c + tif_apple.c + tif_atari.c + tif_aux.c + tif_close.c + tif_codec.c + tif_color.c + tif_compress.c + tif_config.h +0 .in + .vc +2 tif_dir.c + tif_dir.h + tif_dirinfo.c + tif_dirread.c + tif_dirwrite.c + tif_dumpmode.c + tif_error.c + tif_extension.c + tif_fax3.c + tif_fax3.h + tif_fax3sm.c + tiffconf.h +0 .in + .vc +2 tiff.h + tiffio.h +0 xx +2 tiffiop.h + tif_flush.c + tiffvers.h + tif_getimage.c + tif_jpeg.c + tif_luv.c + tif_lzw.c + tif_msdos.c + tif_next.c + tif_ojpeg.c + tif_open.c + tif_packbits.c + tif_pixarlog.c + tif_predict.c + tif_predict.h + tif_print.c + tif_read.c + tif_stream.cxx + tif_strip.c + tif_swab.c + tif_thunder.c + tif_tile.c + tif_unix.c + tif_version.c + tif_warning.c + tif_win32.c + tif_win3.c + tif_write.c + tif_zip.c + uvcode.h +2 m4/ +0 acinclude.m4 + libtool.m4 + ltoptions.m4 + ltsugar.m4 + ltversion.m4 +2 Makefile.am + Makefile.in + Makefile.vc + nmake.opt + port/ +0 dummy.c + getopt.c + lfind.c + Makefile.am + Makefile.in + Makefile.vc + strcasecmp.c + strtoul.c +2 README + RELEASE-DATE + SConstruct + test/ +0 ascii_tag.c + check_tag.c + long_tag.c + Makefile.am + Makefile.in + short_tag.c + strip.c + strip_rw.c + test_arrays.c + test_arrays.h +2 TODO + VERSION +2 Makefile + md4/ +0 md4.cpp + md4.h +2 md5/ +0 md5.cpp + md5.h +2 patches/ +0 freetype-2.3.5-config.patch + freetype-2.3.6-ascii.patch + freetype-2.3.6-vxworks.patch + libjpeg-6b-config.patch + libjpeg-6b-vxworks.patch + libmng-1.0.10-endless-loop.patch + libpng-1.2.20-elf-visibility.patch + libpng-1.2.20-vxworks.patch + libtiff-3.8.2-config.patch + libtiff-3.8.2-vxworks.patch + sqlite-3.5.6-config.patch + sqlite-3.5.6-vxworks.patch + sqlite-3.5.6-wince.patch + zlib-1.2.3-elf-visibility.patch +2 phonon/ +0 CMakeLists.txt + COPYING.LIB + ds9/ +0 abstractvideorenderer.cpp + abstractvideorenderer.h + audiooutput.cpp + audiooutput.h + backend.cpp + backend.h + backendnode.cpp + backendnode.h + CMakeLists.txt + compointer.h + ConfigureChecks.cmake + ds9.desktop + effect.cpp + effect.h + fakesource.cpp + fakesource.h + iodevicereader.cpp + iodevicereader.h + lgpl-2.1.txt + lgpl-3.txt + mediagraph.cpp + mediagraph.h + mediaobject.cpp + mediaobject.h + phononds9_namespace.h + qasyncreader.cpp + qasyncreader.h + qaudiocdreader.cpp + qaudiocdreader.h + qbasefilter.cpp + qbasefilter.h + qmeminputpin.cpp + qmeminputpin.h + qpin.cpp + qpin.h + videorenderer_soft.cpp + videorenderer_soft.h + videorenderer_vmr9.cpp + videorenderer_vmr9.h + videowidget.cpp + videowidget.h + volumeeffect.cpp + volumeeffect.h +2 gstreamer/ +0 abstractrenderer.cpp + abstractrenderer.h + alsasink2.c + alsasink2.h + artssink.cpp + artssink.h + audioeffect.cpp + audioeffect.h + audiooutput.cpp + audiooutput.h + backend.cpp + backend.h + CMakeLists.txt + common.h + ConfigureChecks.cmake + devicemanager.cpp + devicemanager.h + effect.cpp + effect.h + effectmanager.cpp + effectmanager.h + glrenderer.cpp + glrenderer.h + gsthelper.cpp + gsthelper.h + gstreamer.desktop + lgpl-2.1.txt + lgpl-3.txt + medianode.cpp + medianodeevent.cpp + medianodeevent.h + medianode.h + mediaobject.cpp + mediaobject.h + message.cpp + message.h + Messages.sh + phononsrc.cpp + phononsrc.h + qwidgetvideosink.cpp + qwidgetvideosink.h + streamreader.cpp + streamreader.h + videowidget.cpp + videowidget.h + volumefadereffect.cpp + volumefadereffect.h + widgetrenderer.cpp + widgetrenderer.h + x11renderer.cpp + x11renderer.h +2 includes/ +0 CMakeLists.txt + Phonon/ +0 AbstractAudioOutput + AbstractMediaStream + AbstractVideoOutput + AddonInterface + AudioDevice +0 Enumerator +2 AudioOutput +0 Device +0 Model +2 Interface +2 BackendCapabilities + BackendInterface + Effect +0 Description +0 Model +2 Interface + Parameter + Widget +2 Experimental/ +0 AbstractVideoDataOutput + AudioDataOutput + SnapshotInterface + VideoDataOutput +0 Interface +2 VideoFrame +0 2 +2 Visualization +2 Global + MediaController + MediaNode + MediaObject +0 Interface +2 MediaSource + ObjectDescription +0 Model +2 Path + PlatformPlugin + SeekSlider + StreamInterface + VideoPlayer + VideoWidget +0 Interface +2 VolumeFaderEffect + VolumeFaderInterface + VolumeSlider +3 mmf/ +0 abstractaudioeffect.cpp + abstractaudioeffect.h + abstractmediaplayer.cpp + abstractmediaplayer.h + abstractplayer.cpp + abstractplayer.h + ancestormovemonitor.cpp + ancestormovemonitor.h + audioequalizer.cpp + audioequalizer.h + audiooutput.cpp + audiooutput.h + audioplayer.cpp + audioplayer.h + backend.cpp + backend.h + bassboost.cpp + bassboost.h + defs.h + dummyplayer.cpp + dummyplayer.h + effectfactory.cpp + effectfactory.h + mediaobject.cpp + mediaobject.h + mmf_medianode.cpp + mmf_medianode.h + mmf_videoplayer.cpp + mmf_videoplayer.h + objectdump.cpp + objectdump.h + objectdump_symbian.cpp + objectdump_symbian.h + objecttree.cpp + objecttree.h + utils.cpp + utils.h + videooutput.cpp + videooutput.h + videooutputobserver.h + videowidget.cpp + videowidget.h + volumeobserver.h +2 phonon/ +0 abstractaudiooutput.cpp + abstractaudiooutput.h + abstractaudiooutput_p.cpp + abstractaudiooutput_p.h + abstractmediastream.cpp + abstractmediastream.h + abstractmediastream_p.h + abstractvideooutput.cpp + abstractvideooutput.h + abstractvideooutput_p.cpp + abstractvideooutput_p.h + addoninterface.h + audiooutputadaptor.cpp + audiooutputadaptor_p.h + audiooutput.cpp + audiooutput.h + audiooutputinterface.cpp + audiooutputinterface.h + audiooutput_p.h + backendcapabilities.cpp + backendcapabilities.h + backendcapabilities_p.h + backend.dox + backendinterface.h + BUGS + CMakeLists.txt + effect.cpp + effect.h + effectinterface.h + effectparameter.cpp + effectparameter.h + effectparameter_p.h + effect_p.h + effectwidget.cpp + effectwidget.h + effectwidget_p.h + extractmethodcalls.rb + factory.cpp + factory_p.h + frontendinterface_p.h + globalconfig.cpp + globalconfig_p.h + globalstatic_p.h + IDEAS + iodevicestream.cpp + iodevicestream_p.h + .krazy + mediacontroller.cpp + mediacontroller.h + medianode.cpp + medianodedestructionhandler_p.h + medianode.h + medianode_p.h + mediaobject.cpp + mediaobject.dox + mediaobject.h + mediaobjectinterface.h + mediaobject_p.h + mediasource.cpp + mediasource.h + mediasource_p.h + Messages.sh + objectdescription.cpp + objectdescription.h + objectdescriptionmodel.cpp + objectdescriptionmodel.h + objectdescriptionmodel_p.h + objectdescription_p.h + org.kde.Phonon.AudioOutput.xml + path.cpp + path.h + path_p.h +2 phonon.pc.cmake + phonon/phonondefs.h + phonon/phonondefs_p.h + phonon/phonon_export.h + phonon/phononnamespace.cpp + phonon/phononnamespace.h +0 .in +2 phonon/phononnamespace_p.h + phonon/platform.cpp + phonon/platform_p.h + phonon/platformplugin.h + phonon/preprocessandextract.sh + phonon/qsettingsgroup_p.h + phonon/seekslider.cpp + phonon/seekslider.h + phonon/seekslider_p.h + phonon/streaminterface.cpp + phonon/streaminterface.h + phonon/streaminterface_p.h + phonon/stream-thoughts + phonon/TODO + phonon/videoplayer.cpp + phonon/videoplayer.h + phonon/videowidget.cpp + phonon/videowidget.h + phonon/videowidgetinterface.h + phonon/videowidget_p.h + phonon/volumefadereffect.cpp + phonon/volumefadereffect.h + phonon/volumefadereffect_p.h + phonon/volumefaderinterface.h + phonon/volumeslider.cpp + phonon/volumeslider.h + phonon/volumeslider_p.h + qt7/ +0 audioconnection.h + audioconnection.mm + audiodevice.h + audiodevice.mm + audioeffects.h + audioeffects.mm + audiograph.h + audiograph.mm + audiomixer.h + audiomixer.mm + audionode.h + audionode.mm + audiooutput.h + audiooutput.mm + audiopartoutput.h + audiopartoutput.mm + audiosplitter.h + audiosplitter.mm + backend.h + backendheader.h + backendheader.mm + backendinfo.h + backendinfo.mm + backend.mm + CMakeLists.txt + ConfigureChecks.cmake + lgpl-2.1.txt + lgpl-3.txt + medianodeevent.h + medianodeevent.mm + medianode.h + medianode.mm + medianodevideopart.h + medianodevideopart.mm + mediaobjectaudionode.h + mediaobjectaudionode.mm + mediaobject.h + mediaobject.mm + quicktimeaudioplayer.h + quicktimeaudioplayer.mm + quicktimemetadata.h + quicktimemetadata.mm + quicktimestreamreader.h + quicktimestreamreader.mm + quicktimevideoplayer.h + quicktimevideoplayer.mm + videoeffect.h + videoeffect.mm + videoframe.h + videoframe.mm + videowidget.h + videowidget.mm +2 waveout/ +0 audiooutput.cpp + audiooutput.h + backend.cpp + backend.h + mediaobject.cpp + mediaobject.h +3 powervr/ +0 pvr2d.h + wsegl.h +2 ptmalloc/ +0 ChangeLog + COPYRIGHT + lran2.h + Makefile + malloc-2.8.3.h + malloc.c + malloc-private.h + ptmalloc3.c + README + sysdeps/ +0 generic/ +0 atomic.h + malloc-machine.h + thread-st.h +2 pthread/ +0 malloc-machine.h + thread-st.h +2 solaris/ +0 malloc-machine.h + thread-st.h +2 sproc/ +0 malloc-machine.h + thread-st.h +4 README + sha1/ +0 sha1.cpp +2 sqlite/ +0 shell.c + sqlite3.c + sqlite3.h +2 webkit/ +0 ChangeLog + .gitignore + JavaScriptCore/ +0 API/ +0 APICast.h + JavaScriptCore.h + JavaScript.h + JSBase.cpp + JSBase.h + JSBasePrivate.h + JSCallbackConstructor.cpp + JSCallbackConstructor.h + JSCallbackFunction.cpp + JSCallbackFunction.h + JSCallbackObject.cpp + JSCallbackObjectFunctions.h + JSCallbackObject.h + JSClassRef.cpp + JSClassRef.h + JSContextRef.cpp + JSContextRef.h + JSContextRefPrivate.h + JSObjectRef.cpp + JSObjectRef.h + JSProfilerPrivate.cpp + JSProfilerPrivate.h + JSRetainPtr.h + JSStringRefBSTR.cpp + JSStringRefBSTR.h + JSStringRefCF.cpp + JSStringRefCF.h + JSStringRef.cpp + JSStringRef.h + JSValueRef.cpp + JSValueRef.h + OpaqueJSString.cpp + OpaqueJSString.h + WebKitAvailability.h +2 assembler/ +0 AbstractMacroAssembler.h + ARMAssembler.cpp + ARMAssembler.h + ARMv7Assembler.h + AssemblerBuffer.h + AssemblerBufferWithConstantPool.h + CodeLocation.h + LinkBuffer.h + MacroAssemblerARM.cpp + MacroAssemblerARM.h + MacroAssemblerARMv7.h + MacroAssemblerCodeRef.h + MacroAssembler.h + MacroAssemblerX86_64.h + MacroAssemblerX86Common.h + MacroAssemblerX86.h + RepatchBuffer.h + X86Assembler.h +2 AUTHORS + bytecode/ +0 CodeBlock.cpp + CodeBlock.h + EvalCodeCache.h + Instruction.h + JumpTable.cpp + JumpTable.h + Opcode.cpp + Opcode.h + SamplingTool.cpp + SamplingTool.h + StructureStubInfo.cpp + StructureStubInfo.h +2 bytecompiler/ +0 BytecodeGenerator.cpp + BytecodeGenerator.h + Label.h + LabelScope.h + RegisterID.h +2 ChangeLog +0 -2002-12-03 + -2003-10-25 + -2007-10-14 + -2008-08-10 + -2009-06-16 +2 config.h + COPYING.LIB + create_hash_table + debugger/ +0 DebuggerActivation.cpp + DebuggerActivation.h + DebuggerCallFrame.cpp + DebuggerCallFrame.h + Debugger.cpp + Debugger.h +2 DerivedSources.make + docs/ +0 make-bytecode-docs.pl +2 ForwardingHeaders/ +0 JavaScriptCore/ +0 APICast.h + JavaScriptCore.h + JavaScript.h + JSBase.h + JSContextRef.h + JSObjectRef.h + JSRetainPtr.h + JSStringRefCF.h + JSStringRef.h + JSValueRef.h + OpaqueJSString.h + WebKitAvailability.h +3 generated/ +0 ArrayPrototype.lut.h + chartables.c + DatePrototype.lut.h + Grammar.cpp + Grammar.h + JSONObject.lut.h + Lexer.lut.h + MathObject.lut.h + NumberConstructor.lut.h + RegExpConstructor.lut.h + RegExpObject.lut.h + StringPrototype.lut.h +2 headers.pri + Info.plist + interpreter/ +0 CachedCall.h + CallFrameClosure.h + CallFrame.cpp + CallFrame.h + Interpreter.cpp + Interpreter.h + RegisterFile.cpp + RegisterFile.h + Register.h +2 JavaScriptCore.gypi + JavaScriptCore.order + JavaScriptCorePrefix.h + JavaScriptCore.pri + JavaScriptCore.pro + jit/ +0 ExecutableAllocator.cpp + ExecutableAllocatorFixedVMPool.cpp + ExecutableAllocator.h + ExecutableAllocatorPosix.cpp + ExecutableAllocatorSymbian.cpp + ExecutableAllocatorWin.cpp + JITArithmetic.cpp + JITCall.cpp + JITCode.h + JIT.cpp + JIT.h + JITInlineMethods.h + JITOpcodes.cpp + JITPropertyAccess.cpp + JITStubCall.h + JITStubs.cpp + JITStubs.h +2 jsc.cpp + make-generated-sources.sh + os-win32/ +0 stdbool.h + stdint.h +2 parser/ +0 Grammar.y + Keywords.table + Lexer.cpp + Lexer.h + NodeConstructors.h + NodeInfo.h + Nodes.cpp + Nodes.h + ParserArena.cpp + ParserArena.h + Parser.cpp + Parser.h + ResultType.h + SourceCode.h + SourceProvider.h +2 pcre/ +0 AUTHORS + COPYING + dftables + pcre_compile.cpp + pcre_exec.cpp + pcre.h + pcre_internal.h + pcre.pri + pcre_tables.cpp + pcre_ucp_searchfuncs.cpp + pcre_xclass.cpp + ucpinternal.h + ucptable.cpp +2 profiler/ +0 CallIdentifier.h + HeavyProfile.cpp + HeavyProfile.h + Profile.cpp + ProfileGenerator.cpp + ProfileGenerator.h + Profile.h + ProfileNode.cpp + ProfileNode.h + Profiler.cpp + Profiler.h + ProfilerServer.h + ProfilerServer.mm + TreeProfile.cpp + TreeProfile.h +2 runtime/ +0 ArgList.cpp + ArgList.h + Arguments.cpp + Arguments.h + ArrayConstructor.cpp + ArrayConstructor.h + ArrayPrototype.cpp + ArrayPrototype.h + BatchedTransitionOptimizer.h + BooleanConstructor.cpp + BooleanConstructor.h + BooleanObject.cpp + BooleanObject.h + BooleanPrototype.cpp + BooleanPrototype.h + CallData.cpp + CallData.h + ClassInfo.h + Collector.cpp + Collector.h + CollectorHeapIterator.h + CommonIdentifiers.cpp + CommonIdentifiers.h + Completion.cpp + Completion.h + ConstructData.cpp + ConstructData.h + DateConstructor.cpp + DateConstructor.h + DateConversion.cpp + DateConversion.h + DateInstanceCache.h + DateInstance.cpp + DateInstance.h + DatePrototype.cpp + DatePrototype.h + ErrorConstructor.cpp + ErrorConstructor.h + Error.cpp + Error.h + ErrorInstance.cpp + ErrorInstance.h + ErrorPrototype.cpp + ErrorPrototype.h + ExceptionHelpers.cpp + ExceptionHelpers.h + Executable.cpp + Executable.h + FunctionConstructor.cpp + FunctionConstructor.h + FunctionPrototype.cpp + FunctionPrototype.h + GetterSetter.cpp + GetterSetter.h + GlobalEvalFunction.cpp + GlobalEvalFunction.h + Identifier.cpp + Identifier.h + InitializeThreading.cpp + InitializeThreading.h + InternalFunction.cpp + InternalFunction.h + JSActivation.cpp + JSActivation.h + JSAPIValueWrapper.cpp + JSAPIValueWrapper.h + JSArray.cpp + JSArray.h + JSByteArray.cpp + JSByteArray.h + JSCell.cpp + JSCell.h + JSFunction.cpp + JSFunction.h + JSGlobalData.cpp + JSGlobalData.h + JSGlobalObject.cpp + JSGlobalObjectFunctions.cpp + JSGlobalObjectFunctions.h + JSGlobalObject.h + JSImmediate.cpp + JSImmediate.h + JSLock.cpp + JSLock.h + JSNotAnObject.cpp + JSNotAnObject.h + JSNumberCell.cpp + JSNumberCell.h + JSObject.cpp + JSObject.h + JSONObject.cpp + JSONObject.h + JSPropertyNameIterator.cpp + JSPropertyNameIterator.h + JSStaticScopeObject.cpp + JSStaticScopeObject.h + JSString.cpp + JSString.h + JSType.h + JSTypeInfo.h + JSValue.cpp + JSValue.h + JSVariableObject.cpp + JSVariableObject.h + JSWrapperObject.cpp + JSWrapperObject.h + LiteralParser.cpp + LiteralParser.h + Lookup.cpp + Lookup.h + MarkStack.cpp + MarkStack.h + MarkStackPosix.cpp + MarkStackSymbian.cpp + MarkStackWin.cpp + MathObject.cpp + MathObject.h + NativeErrorConstructor.cpp + NativeErrorConstructor.h + NativeErrorPrototype.cpp + NativeErrorPrototype.h + NativeFunctionWrapper.h + NumberConstructor.cpp + NumberConstructor.h + NumberObject.cpp + NumberObject.h + NumberPrototype.cpp + NumberPrototype.h + NumericStrings.h + ObjectConstructor.cpp + ObjectConstructor.h + ObjectPrototype.cpp + ObjectPrototype.h + Operations.cpp + Operations.h + PropertyDescriptor.cpp + PropertyDescriptor.h + PropertyMapHashTable.h + PropertyNameArray.cpp + PropertyNameArray.h + PropertySlot.cpp + PropertySlot.h + Protect.h + PrototypeFunction.cpp + PrototypeFunction.h + PutPropertySlot.h + RegExpConstructor.cpp + RegExpConstructor.h + RegExp.cpp + RegExp.h + RegExpMatchesArray.h + RegExpObject.cpp + RegExpObject.h + RegExpPrototype.cpp + RegExpPrototype.h + ScopeChain.cpp + ScopeChain.h + ScopeChainMark.h + SmallStrings.cpp + SmallStrings.h + StringConstructor.cpp + StringConstructor.h + StringObject.cpp + StringObject.h + StringObjectThatMasqueradesAsUndefined.h + StringPrototype.cpp + StringPrototype.h + StructureChain.cpp + StructureChain.h + Structure.cpp + Structure.h + StructureTransitionTable.h + SymbolTable.h + TimeoutChecker.cpp + TimeoutChecker.h + Tracing.h + UString.cpp + UString.h +2 THANKS + wrec/ +0 CharacterClassConstructor.cpp + CharacterClassConstructor.h + CharacterClass.cpp + CharacterClass.h + Escapes.h + Quantifier.h + WREC.cpp + WRECFunctors.cpp + WRECFunctors.h + WRECGenerator.cpp + WRECGenerator.h + WREC.h + WRECParser.cpp + WRECParser.h +2 wscript + wtf/ +0 AlwaysInline.h + ASCIICType.h + Assertions.cpp + Assertions.h + AVLTree.h + ByteArray.cpp + ByteArray.h + CONTRIBUTORS.pthreads-win32 + CrossThreadRefCounted.h + CurrentTime.cpp + CurrentTime.h + DateMath.cpp + DateMath.h + Deque.h + DisallowCType.h + dtoa.cpp + dtoa.h + FastAllocBase.h + FastMalloc.cpp + FastMalloc.h + Forward.h + GetPtr.h + GOwnPtr.cpp + GOwnPtr.h + HashCountedSet.h + HashFunctions.h + HashIterators.h + HashMap.h + HashSet.h + HashTable.cpp + HashTable.h + HashTraits.h + ListHashSet.h + ListRefPtr.h + Locker.h + MainThread.cpp + MainThread.h + MallocZoneSupport.h + MathExtras.h + MessageQueue.h + Noncopyable.h + NotFound.h + OwnArrayPtr.h + OwnFastMallocPtr.h + OwnPtrCommon.h + OwnPtr.h + OwnPtrWin.cpp + PassOwnPtr.h + PassRefPtr.h + Platform.h + PossiblyNull.h + PtrAndFlags.h + qt/ +0 MainThreadQt.cpp + ThreadingQt.cpp +2 RandomNumber.cpp + RandomNumber.h + RandomNumberSeed.h + RefCounted.h + RefCountedLeakCounter.cpp + RefCountedLeakCounter.h + RefPtr.h + RefPtrHashMap.h + RetainPtr.h + SegmentedVector.h + StdLibExtras.h + StringExtras.h + TCPackedCache.h + TCPageMap.h + TCSpinLock.h + TCSystemAlloc.cpp + TCSystemAlloc.h + Threading.cpp + Threading.h + ThreadingNone.cpp + ThreadingPthreads.cpp + ThreadingWin.cpp + ThreadSpecific.h + ThreadSpecificWin.cpp + TypeTraits.cpp + TypeTraits.h + unicode/ +0 CollatorDefault.cpp + Collator.h + glib/ +0 UnicodeGLib.cpp + UnicodeGLib.h + UnicodeMacrosFromICU.h +2 icu/ +0 CollatorICU.cpp + UnicodeIcu.h +2 qt4/ +0 UnicodeQt4.h +2 Unicode.h + UTF8.cpp + UTF8.h + wince/ +0 UnicodeWince.cpp + UnicodeWince.h +3 UnusedParam.h + Vector.h + VectorTraits.h + VMTags.h + wince/ +0 FastMallocWince.h + MemoryManager.cpp + MemoryManager.h + mt19937ar.c +3 yarr/ +0 RegexCompiler.cpp + RegexCompiler.h + RegexInterpreter.cpp + RegexInterpreter.h + RegexJIT.cpp + RegexJIT.h + RegexParser.h + RegexPattern.h +3 VERSION + WebCore/ +0 accessibility/ +0 AccessibilityAllInOne.cpp + AccessibilityARIAGridCell.cpp + AccessibilityARIAGridCell.h + AccessibilityARIAGrid.cpp + AccessibilityARIAGrid.h + AccessibilityARIAGridRow.cpp + AccessibilityARIAGridRow.h + AccessibilityImageMapLink.cpp + AccessibilityImageMapLink.h + AccessibilityListBox.cpp + AccessibilityListBox.h + AccessibilityListBoxOption.cpp + AccessibilityListBoxOption.h + AccessibilityList.cpp + AccessibilityList.h + AccessibilityMediaControls.cpp + AccessibilityMediaControls.h + AccessibilityObject.cpp + AccessibilityObject.h + AccessibilityRenderObject.cpp + AccessibilityRenderObject.h + AccessibilitySlider.cpp + AccessibilitySlider.h + AccessibilityTableCell.cpp + AccessibilityTableCell.h + AccessibilityTableColumn.cpp + AccessibilityTableColumn.h + AccessibilityTable.cpp + AccessibilityTable.h + AccessibilityTableHeaderContainer.cpp + AccessibilityTableHeaderContainer.h + AccessibilityTableRow.cpp + AccessibilityTableRow.h + AXObjectCache.cpp + AXObjectCache.h + qt/ +0 AccessibilityObjectQt.cpp +3 bindings/ +0 js/ +0 CachedScriptSourceProvider.h + DOMObjectWithSVGContext.h + GCController.cpp + GCController.h + JSAbstractWorkerCustom.cpp + JSAttrCustom.cpp + JSAudioConstructor.cpp + JSAudioConstructor.h + JSBindingsAllInOne.cpp + JSCallbackData.cpp + JSCallbackData.h + JSCanvasArrayBufferConstructor.cpp + JSCanvasArrayBufferConstructor.h + JSCanvasArrayCustom.cpp + JSCanvasByteArrayConstructor.cpp + JSCanvasByteArrayConstructor.h + JSCanvasByteArrayCustom.cpp + JSCanvasFloatArrayConstructor.cpp + JSCanvasFloatArrayConstructor.h + JSCanvasFloatArrayCustom.cpp + JSCanvasIntArrayConstructor.cpp + JSCanvasIntArrayConstructor.h + JSCanvasIntArrayCustom.cpp + JSCanvasNumberArrayCustom.cpp + JSCanvasRenderingContext2DCustom.cpp + JSCanvasRenderingContext3DCustom.cpp + JSCanvasRenderingContextCustom.cpp + JSCanvasShortArrayConstructor.cpp + JSCanvasShortArrayConstructor.h + JSCanvasShortArrayCustom.cpp + JSCanvasUnsignedByteArrayConstructor.cpp + JSCanvasUnsignedByteArrayConstructor.h + JSCanvasUnsignedByteArrayCustom.cpp + JSCanvasUnsignedIntArrayConstructor.cpp + JSCanvasUnsignedIntArrayConstructor.h + JSCanvasUnsignedIntArrayCustom.cpp + JSCanvasUnsignedShortArrayConstructor.cpp + JSCanvasUnsignedShortArrayConstructor.h + JSCanvasUnsignedShortArrayCustom.cpp + JSCDATASectionCustom.cpp + JSClipboardCustom.cpp + JSConsoleCustom.cpp + JSCoordinatesCustom.cpp + JSCSSRuleCustom.cpp + JSCSSRuleListCustom.cpp + JSCSSStyleDeclarationCustom.cpp + JSCSSStyleDeclarationCustom.h + JSCSSValueCustom.cpp + JSCustomPositionCallback.cpp + JSCustomPositionCallback.h + JSCustomPositionErrorCallback.cpp + JSCustomPositionErrorCallback.h + JSCustomSQLStatementCallback.cpp + JSCustomSQLStatementCallback.h + JSCustomSQLStatementErrorCallback.cpp + JSCustomSQLStatementErrorCallback.h + JSCustomSQLTransactionCallback.cpp + JSCustomSQLTransactionCallback.h + JSCustomSQLTransactionErrorCallback.cpp + JSCustomSQLTransactionErrorCallback.h + JSCustomVoidCallback.cpp + JSCustomVoidCallback.h + JSCustomXPathNSResolver.cpp + JSCustomXPathNSResolver.h + JSDatabaseCustom.cpp + JSDataGridColumnListCustom.cpp + JSDataGridDataSource.cpp + JSDataGridDataSource.h + JSDedicatedWorkerContextCustom.cpp + JSDesktopNotificationsCustom.cpp + JSDocumentCustom.cpp + JSDocumentFragmentCustom.cpp + JSDOMApplicationCacheCustom.cpp + JSDOMBinding.cpp + JSDOMBinding.h + JSDOMGlobalObject.cpp + JSDOMGlobalObject.h + JSDOMWindowBase.cpp + JSDOMWindowBase.h + JSDOMWindowCustom.cpp + JSDOMWindowCustom.h + JSDOMWindowShell.cpp + JSDOMWindowShell.h + JSElementCustom.cpp + JSEventCustom.cpp + JSEventListener.cpp + JSEventListener.h + JSEventSourceConstructor.cpp + JSEventSourceConstructor.h + JSEventSourceCustom.cpp + JSEventTarget.cpp + JSEventTarget.h + JSExceptionBase.cpp + JSExceptionBase.h + JSGeolocationCustom.cpp + JSHistoryCustom.cpp + JSHistoryCustom.h + JSHTMLAllCollectionCustom.cpp + JSHTMLAppletElementCustom.cpp + JSHTMLAppletElementCustom.h + JSHTMLCanvasElementCustom.cpp + JSHTMLCollectionCustom.cpp + JSHTMLDataGridElementCustom.cpp + JSHTMLDocumentCustom.cpp + JSHTMLElementCustom.cpp + JSHTMLEmbedElementCustom.cpp + JSHTMLEmbedElementCustom.h + JSHTMLFormElementCustom.cpp + JSHTMLFrameElementCustom.cpp + JSHTMLFrameSetElementCustom.cpp + JSHTMLIFrameElementCustom.cpp + JSHTMLInputElementCustom.cpp + JSHTMLInputElementCustom.h + JSHTMLObjectElementCustom.cpp + JSHTMLObjectElementCustom.h + JSHTMLOptionsCollectionCustom.cpp + JSHTMLSelectElementCustom.cpp + JSHTMLSelectElementCustom.h + JSImageConstructor.cpp + JSImageConstructor.h + JSImageDataCustom.cpp + JSInspectedObjectWrapper.cpp + JSInspectedObjectWrapper.h + JSInspectorBackendCustom.cpp + JSInspectorCallbackWrapper.cpp + JSInspectorCallbackWrapper.h + JSJavaScriptCallFrameCustom.cpp + JSLazyEventListener.cpp + JSLazyEventListener.h + JSLocationCustom.cpp + JSLocationCustom.h + JSMessageChannelConstructor.cpp + JSMessageChannelConstructor.h + JSMessageChannelCustom.cpp + JSMessageEventCustom.cpp + JSMessagePortCustom.cpp + JSMessagePortCustom.h + JSMimeTypeArrayCustom.cpp + JSNamedNodeMapCustom.cpp + JSNavigatorCustom.cpp + JSNodeCustom.cpp + JSNodeFilterCondition.cpp + JSNodeFilterCondition.h + JSNodeFilterCustom.cpp + JSNodeIteratorCustom.cpp + JSNodeListCustom.cpp + JSOptionConstructor.cpp + JSOptionConstructor.h + JSPluginArrayCustom.cpp + JSPluginCustom.cpp + JSPluginElementFunctions.cpp + JSPluginElementFunctions.h + JSQuarantinedObjectWrapper.cpp + JSQuarantinedObjectWrapper.h + JSSharedWorkerConstructor.cpp + JSSharedWorkerConstructor.h + JSSharedWorkerCustom.cpp + JSSQLResultSetRowListCustom.cpp + JSSQLTransactionCustom.cpp + JSStorageCustom.cpp + JSStorageCustom.h + JSStyleSheetCustom.cpp + JSStyleSheetListCustom.cpp + JSSVGElementInstanceCustom.cpp + JSSVGLengthCustom.cpp + JSSVGMatrixCustom.cpp + JSSVGPathSegCustom.cpp + JSSVGPathSegListCustom.cpp + JSSVGPODTypeWrapper.h + JSSVGPointListCustom.cpp + JSSVGTransformListCustom.cpp + JSTextCustom.cpp + JSTreeWalkerCustom.cpp + JSWebKitCSSMatrixConstructor.cpp + JSWebKitCSSMatrixConstructor.h + JSWebKitPointConstructor.cpp + JSWebKitPointConstructor.h + JSWebSocketConstructor.cpp + JSWebSocketConstructor.h + JSWebSocketCustom.cpp + JSWorkerConstructor.cpp + JSWorkerConstructor.h + JSWorkerContextBase.cpp + JSWorkerContextBase.h + JSWorkerContextCustom.cpp + JSWorkerCustom.cpp + JSXMLHttpRequestConstructor.cpp + JSXMLHttpRequestConstructor.h + JSXMLHttpRequestCustom.cpp + JSXMLHttpRequestUploadCustom.cpp + JSXSLTProcessorConstructor.cpp + JSXSLTProcessorConstructor.h + JSXSLTProcessorCustom.cpp + ScheduledAction.cpp + ScheduledAction.h + ScriptArray.cpp + ScriptArray.h + ScriptCachedFrameData.cpp + ScriptCachedFrameData.h + ScriptCallFrame.cpp + ScriptCallFrame.h + ScriptCallStack.cpp + ScriptCallStack.h + ScriptController.cpp + ScriptControllerGtk.cpp + ScriptController.h + ScriptControllerHaiku.cpp + ScriptControllerMac.mm + ScriptControllerQt.cpp + ScriptControllerWin.cpp + ScriptControllerWx.cpp + ScriptEventListener.cpp + ScriptEventListener.h + ScriptFunctionCall.cpp + ScriptFunctionCall.h + ScriptInstance.h + ScriptObject.cpp + ScriptObject.h + ScriptObjectQuarantine.cpp + ScriptObjectQuarantine.h + ScriptSourceCode.h + ScriptSourceProvider.h + ScriptState.cpp + ScriptState.h + ScriptString.h + ScriptValue.cpp + ScriptValue.h + SerializedScriptValue.cpp + SerializedScriptValue.h + StringSourceProvider.h + WorkerScriptController.cpp + WorkerScriptController.h +2 ScriptControllerBase.cpp + scripts/ +0 CodeGeneratorCOM.pm + CodeGeneratorJS.pm + CodeGeneratorObjC.pm + CodeGenerator.pm + CodeGeneratorV8.pm + generate-bindings.pl + IDLParser.pm + IDLStructure.pm + InFilesParser.pm +3 bridge/ +0 c/ +0 c_class.cpp + c_class.h + c_instance.cpp + c_instance.h + c_runtime.cpp + c_runtime.h + c_utility.cpp + c_utility.h +2 IdentifierRep.cpp + IdentifierRep.h + jni/ +0 jni_class.cpp + jni_class.h + jni_instance.cpp + jni_instance.h + jni_jsobject.h + jni_jsobject.mm + jni_objc.mm + jni_runtime.cpp + jni_runtime.h + jni_utility.cpp + jni_utility.h +2 make_testbindings + npapi.h + NP_jsobject.cpp + NP_jsobject.h + npruntime.cpp + npruntime.h + npruntime_impl.h + npruntime_internal.h + npruntime_priv.h + qt/ +0 qt_class.cpp + qt_class.h + qt_instance.cpp + qt_instance.h + qt_runtime.cpp + qt_runtime.h +2 runtime_array.cpp + runtime_array.h + runtime.cpp + runtime.h + runtime_method.cpp + runtime_method.h + runtime_object.cpp + runtime_object.h + runtime_root.cpp + runtime_root.h + testbindings.cpp + testbindings.mm + testC.js + test.js + testM.js + testqtbindings.cpp +2 ChangeLog +0 -2002-12-03 + -2003-10-25 + -2005-08-23 + -2005-12-19 + -2006-05-10 + -2006-12-31 + -2007-10-14 + -2008-08-10 + -2009-06-16 +2 combine-javascript-resources + config.h + css/ +0 Counter.h + Counter.idl + CSSBorderImageValue.cpp + CSSBorderImageValue.h + CSSCanvasValue.cpp + CSSCanvasValue.h + CSSCharsetRule.cpp + CSSCharsetRule.h + CSSCharsetRule.idl + CSSComputedStyleDeclaration.cpp + CSSComputedStyleDeclaration.h + CSSCursorImageValue.cpp + CSSCursorImageValue.h + CSSFontFace.cpp + CSSFontFace.h + CSSFontFaceRule.cpp + CSSFontFaceRule.h + CSSFontFaceRule.idl + CSSFontFaceSource.cpp + CSSFontFaceSource.h + CSSFontFaceSrcValue.cpp + CSSFontFaceSrcValue.h + CSSFontSelector.cpp + CSSFontSelector.h + CSSFunctionValue.cpp + CSSFunctionValue.h + CSSGradientValue.cpp + CSSGradientValue.h + CSSGrammar.y + CSSHelper.cpp + CSSHelper.h + CSSImageGeneratorValue.cpp + CSSImageGeneratorValue.h + CSSImageValue.cpp + CSSImageValue.h + CSSImportRule.cpp + CSSImportRule.h + CSSImportRule.idl + CSSInheritedValue.cpp + CSSInheritedValue.h + CSSInitialValue.cpp + CSSInitialValue.h + CSSMediaRule.cpp + CSSMediaRule.h + CSSMediaRule.idl + CSSMutableStyleDeclaration.cpp + CSSMutableStyleDeclaration.h + CSSNamespace.h + CSSPageRule.cpp + CSSPageRule.h + CSSPageRule.idl + CSSParser.cpp + CSSParser.h + CSSParserValues.cpp + CSSParserValues.h + CSSPrimitiveValue.cpp + CSSPrimitiveValue.h + CSSPrimitiveValue.idl + CSSPrimitiveValueMappings.h + CSSProperty.cpp + CSSProperty.h + CSSPropertyLonghand.cpp + CSSPropertyLonghand.h + CSSPropertyNames.in + CSSQuirkPrimitiveValue.h + CSSReflectionDirection.h + CSSReflectValue.cpp + CSSReflectValue.h + CSSRule.cpp + CSSRule.h + CSSRule.idl + CSSRuleList.cpp + CSSRuleList.h + CSSRuleList.idl + CSSSegmentedFontFace.cpp + CSSSegmentedFontFace.h + CSSSelector.cpp + CSSSelector.h + CSSSelectorList.cpp + CSSSelectorList.h + CSSStyleDeclaration.cpp + CSSStyleDeclaration.h + CSSStyleDeclaration.idl + CSSStyleRule.cpp + CSSStyleRule.h + CSSStyleRule.idl + CSSStyleSelector.cpp + CSSStyleSelector.h + CSSStyleSheet.cpp + CSSStyleSheet.h + CSSStyleSheet.idl + CSSTimingFunctionValue.cpp + CSSTimingFunctionValue.h + CSSUnicodeRangeValue.cpp + CSSUnicodeRangeValue.h + CSSUnknownRule.h + CSSUnknownRule.idl + CSSValue.h + CSSValue.idl + CSSValueKeywords.in + CSSValueList.cpp + CSSValueList.h + CSSValueList.idl + CSSVariableDependentValue.cpp + CSSVariableDependentValue.h + CSSVariablesDeclaration.cpp + CSSVariablesDeclaration.h + CSSVariablesDeclaration.idl + CSSVariablesRule.cpp + CSSVariablesRule.h + CSSVariablesRule.idl + DashboardRegion.h + DashboardSupportCSSPropertyNames.in + FontFamilyValue.cpp + FontFamilyValue.h + FontValue.cpp + FontValue.h + html.css + make-css-file-arrays.pl + makegrammar.pl + makeprop.pl + maketokenizer + makevalues.pl + mathml.css + mediaControlsChromium.css + mediaControls.css + mediaControlsQt.css + mediaControlsQuickTime.css + Media.cpp + MediaFeatureNames.cpp + MediaFeatureNames.h + Media.h + Media.idl + MediaList.cpp + MediaList.h + MediaList.idl + MediaQuery.cpp + MediaQueryEvaluator.cpp + MediaQueryEvaluator.h + MediaQueryExp.cpp + MediaQueryExp.h + MediaQuery.h + Pair.h + quirks.css + Rect.h + Rect.idl + RGBColor.cpp + RGBColor.h + RGBColor.idl + ShadowValue.cpp + ShadowValue.h + StyleBase.cpp + StyleBase.h + StyleList.cpp + StyleList.h + StyleSheet.cpp + StyleSheet.h + StyleSheet.idl + StyleSheetList.cpp + StyleSheetList.h + StyleSheetList.idl + svg.css + SVGCSSComputedStyleDeclaration.cpp + SVGCSSParser.cpp + SVGCSSPropertyNames.in + SVGCSSStyleSelector.cpp + SVGCSSValueKeywords.in + themeChromiumLinux.css + themeWin.css + themeWinQuirks.css + tokenizer.flex + view-source.css + WCSSPropertyNames.in + WCSSValueKeywords.in + WebKitCSSKeyframeRule.cpp + WebKitCSSKeyframeRule.h + WebKitCSSKeyframeRule.idl + WebKitCSSKeyframesRule.cpp + WebKitCSSKeyframesRule.h + WebKitCSSKeyframesRule.idl + WebKitCSSMatrix.cpp + WebKitCSSMatrix.h + WebKitCSSMatrix.idl + WebKitCSSTransformValue.cpp + WebKitCSSTransformValue.h + WebKitCSSTransformValue.idl + wml.css +2 DerivedSources.cpp + dom/ +0 ActiveDOMObject.cpp + ActiveDOMObject.h + Attr.cpp + Attr.h + Attribute.cpp + Attribute.h + Attr.idl + BeforeLoadEvent.h + BeforeLoadEvent.idl + BeforeTextInsertedEvent.cpp + BeforeTextInsertedEvent.h + BeforeUnloadEvent.cpp + BeforeUnloadEvent.h + CDATASection.cpp + CDATASection.h + CDATASection.idl + CharacterData.cpp + CharacterData.h + CharacterData.idl + CheckedRadioButtons.cpp + CheckedRadioButtons.h + ChildNodeList.cpp + ChildNodeList.h + ClassNames.cpp + ClassNames.h + ClassNodeList.cpp + ClassNodeList.h + ClientRect.cpp + ClientRect.h + ClientRect.idl + ClientRectList.cpp + ClientRectList.h + ClientRectList.idl + ClipboardAccessPolicy.h + Clipboard.cpp + ClipboardEvent.cpp + ClipboardEvent.h + Clipboard.h + Clipboard.idl + Comment.cpp + Comment.h + Comment.idl + ContainerNodeAlgorithms.h + ContainerNode.cpp + ContainerNode.h + CSSMappedAttributeDeclaration.cpp + CSSMappedAttributeDeclaration.h + default/ +0 PlatformMessagePortChannel.cpp + PlatformMessagePortChannel.h +2 Document.cpp + DocumentFragment.cpp + DocumentFragment.h + DocumentFragment.idl + Document.h + Document.idl + DocumentMarker.h + DocumentType.cpp + DocumentType.h + DocumentType.idl + DOMCoreException.h + DOMCoreException.idl + DOMImplementation.cpp + DOMImplementation.h + DOMImplementation.idl + DynamicNodeList.cpp + DynamicNodeList.h + EditingText.cpp + EditingText.h + Element.cpp + Element.h + Element.idl + ElementRareData.h + Entity.cpp + Entity.h + Entity.idl + EntityReference.cpp + EntityReference.h + EntityReference.idl + ErrorEvent.cpp + ErrorEvent.h + ErrorEvent.idl + Event.cpp + EventException.h + EventException.idl + Event.h + Event.idl + EventListener.h + EventListener.idl + EventNames.cpp + EventNames.h + EventTarget.cpp + EventTarget.h + EventTarget.idl + ExceptionBase.cpp + ExceptionBase.h + ExceptionCode.cpp + ExceptionCode.h + InputElement.cpp + InputElement.h + KeyboardEvent.cpp + KeyboardEvent.h + KeyboardEvent.idl + make_names.pl + MappedAttribute.cpp + MappedAttributeEntry.h + MappedAttribute.h + MessageChannel.cpp + MessageChannel.h + MessageChannel.idl + MessageEvent.cpp + MessageEvent.h + MessageEvent.idl + MessagePortChannel.cpp + MessagePortChannel.h + MessagePort.cpp + MessagePort.h + MessagePort.idl + MouseEvent.cpp + MouseEvent.h + MouseEvent.idl + MouseRelatedEvent.cpp + MouseRelatedEvent.h + MutationEvent.cpp + MutationEvent.h + MutationEvent.idl + NamedAttrMap.cpp + NamedAttrMap.h + NamedMappedAttrMap.cpp + NamedMappedAttrMap.h + NamedNodeMap.h + NamedNodeMap.idl + NameNodeList.cpp + NameNodeList.h + Node.cpp + NodeFilterCondition.cpp + NodeFilterCondition.h + NodeFilter.cpp + NodeFilter.h + NodeFilter.idl + Node.h + Node.idl + NodeIterator.cpp + NodeIterator.h + NodeIterator.idl + NodeList.h + NodeList.idl + NodeRareData.h + NodeRenderStyle.h + NodeWithIndex.h + Notation.cpp + Notation.h + Notation.idl + OptionElement.cpp + OptionElement.h + OptionGroupElement.cpp + OptionGroupElement.h + OverflowEvent.cpp + OverflowEvent.h + OverflowEvent.idl + PageTransitionEvent.cpp + PageTransitionEvent.h + PageTransitionEvent.idl + Position.cpp + PositionCreationFunctions.h + Position.h + PositionIterator.cpp + PositionIterator.h + ProcessingInstruction.cpp + ProcessingInstruction.h + ProcessingInstruction.idl + ProgressEvent.cpp + ProgressEvent.h + ProgressEvent.idl + QualifiedName.cpp + QualifiedName.h + RangeBoundaryPoint.h + Range.cpp + RangeException.h + RangeException.idl + Range.h + Range.idl + RegisteredEventListener.cpp + RegisteredEventListener.h + ScriptElement.cpp + ScriptElement.h + ScriptExecutionContext.cpp + ScriptExecutionContext.h + SelectElement.cpp + SelectElement.h + SelectorNodeList.cpp + SelectorNodeList.h + StaticNodeList.cpp + StaticNodeList.h + StyledElement.cpp + StyledElement.h + StyleElement.cpp + StyleElement.h + TagNodeList.cpp + TagNodeList.h + Text.cpp + TextEvent.cpp + TextEvent.h + TextEvent.idl + Text.h + Text.idl + Tokenizer.h + TransformSource.h + TransformSourceLibxslt.cpp + TransformSourceQt.cpp + Traversal.cpp + Traversal.h + TreeWalker.cpp + TreeWalker.h + TreeWalker.idl + UIEvent.cpp + UIEvent.h + UIEvent.idl + UIEventWithKeyState.cpp + UIEventWithKeyState.h + WebKitAnimationEvent.cpp + WebKitAnimationEvent.h + WebKitAnimationEvent.idl + WebKitTransitionEvent.cpp + WebKitTransitionEvent.h + WebKitTransitionEvent.idl + WheelEvent.cpp + WheelEvent.h + WheelEvent.idl + XMLTokenizer.cpp + XMLTokenizer.h + XMLTokenizerLibxml2.cpp + XMLTokenizerQt.cpp + XMLTokenizerScope.cpp + XMLTokenizerScope.h +2 editing/ +0 android/ +0 EditorAndroid.cpp +2 AppendNodeCommand.cpp + AppendNodeCommand.h + ApplyStyleCommand.cpp + ApplyStyleCommand.h + BreakBlockquoteCommand.cpp + BreakBlockquoteCommand.h + chromium/ +0 EditorChromium.cpp +2 CompositeEditCommand.cpp + CompositeEditCommand.h + CreateLinkCommand.cpp + CreateLinkCommand.h + DeleteButtonController.cpp + DeleteButtonController.h + DeleteButton.cpp + DeleteButton.h + DeleteFromTextNodeCommand.cpp + DeleteFromTextNodeCommand.h + DeleteSelectionCommand.cpp + DeleteSelectionCommand.h + EditAction.h + EditCommand.cpp + EditCommand.h + EditorCommand.cpp + Editor.cpp + EditorDeleteAction.h + Editor.h + EditorInsertAction.h + FormatBlockCommand.cpp + FormatBlockCommand.h + gtk/ +0 SelectionControllerGtk.cpp +2 htmlediting.cpp + htmlediting.h + HTMLInterchange.cpp + HTMLInterchange.h + IndentOutdentCommand.cpp + IndentOutdentCommand.h + InsertIntoTextNodeCommand.cpp + InsertIntoTextNodeCommand.h + InsertLineBreakCommand.cpp + InsertLineBreakCommand.h + InsertListCommand.cpp + InsertListCommand.h + InsertNodeBeforeCommand.cpp + InsertNodeBeforeCommand.h + InsertParagraphSeparatorCommand.cpp + InsertParagraphSeparatorCommand.h + InsertTextCommand.cpp + InsertTextCommand.h + JoinTextNodesCommand.cpp + JoinTextNodesCommand.h + markup.cpp + markup.h + MergeIdenticalElementsCommand.cpp + MergeIdenticalElementsCommand.h + ModifySelectionListLevel.cpp + ModifySelectionListLevel.h + MoveSelectionCommand.cpp + MoveSelectionCommand.h + qt/ +0 EditorQt.cpp +2 RemoveCSSPropertyCommand.cpp + RemoveCSSPropertyCommand.h + RemoveFormatCommand.cpp + RemoveFormatCommand.h + RemoveNodeCommand.cpp + RemoveNodeCommand.h + RemoveNodePreservingChildrenCommand.cpp + RemoveNodePreservingChildrenCommand.h + ReplaceNodeWithSpanCommand.cpp + ReplaceNodeWithSpanCommand.h + ReplaceSelectionCommand.cpp + ReplaceSelectionCommand.h + SelectionController.cpp + SelectionController.h + SetNodeAttributeCommand.cpp + SetNodeAttributeCommand.h + SmartReplaceCF.cpp + SmartReplace.cpp + SmartReplace.h + SmartReplaceICU.cpp + SplitElementCommand.cpp + SplitElementCommand.h + SplitTextNodeCommand.cpp + SplitTextNodeCommand.h + SplitTextNodeContainingElementCommand.cpp + SplitTextNodeContainingElementCommand.h + TextAffinity.h + TextGranularity.h + TextIterator.cpp + TextIterator.h + TypingCommand.cpp + TypingCommand.h + UnlinkCommand.cpp + UnlinkCommand.h + VisiblePosition.cpp + VisiblePosition.h + VisibleSelection.cpp + VisibleSelection.h + visible_units.cpp + visible_units.h + WrapContentsInDummySpanCommand.cpp + WrapContentsInDummySpanCommand.h +2 ForwardingHeaders/ +0 debugger/ +0 DebuggerActivation.h + DebuggerCallFrame.h + Debugger.h +2 interpreter/ +0 CallFrame.h + Interpreter.h +2 jit/ +0 JITCode.h +2 masm/ +0 X86Assembler.h +2 parser/ +0 SourceCode.h + SourceProvider.h +2 pcre/ +0 pcre.h +2 profiler/ +0 Profile.h + ProfileNode.h + Profiler.h +2 runtime/ +0 ArgList.h + ArrayPrototype.h + BooleanObject.h + CallData.h + Collector.h + Completion.h + ConstructData.h + DateInstance.h + Error.h + ExceptionHelpers.h + FunctionConstructor.h + FunctionPrototype.h + Identifier.h + InitializeThreading.h + InternalFunction.h + JSAPIValueWrapper.h + JSArray.h + JSByteArray.h + JSCell.h + JSFunction.h + JSGlobalData.h + JSGlobalObject.h + JSLock.h + JSNumberCell.h + JSObject.h + JSString.h + JSValue.h + Lookup.h + ObjectPrototype.h + Operations.h + PropertyMap.h + PropertyNameArray.h + Protect.h + PrototypeFunction.h + StringObject.h + StringObjectThatMasqueradesAsUndefined.h + StringPrototype.h + StructureChain.h + Structure.h + SymbolTable.h + UString.h +2 wrec/ +0 WREC.h +2 wtf/ +0 AlwaysInline.h + ASCIICType.h + Assertions.h + ByteArray.h + CrossThreadRefCounted.h + CurrentTime.h + DateInstanceCache.h + DateMath.h + Deque.h + DisallowCType.h + dtoa.h + FastAllocBase.h + FastMalloc.h + Forward.h + GetPtr.h + HashCountedSet.h + HashFunctions.h + HashMap.h + HashSet.h + HashTable.h + HashTraits.h + ListHashSet.h + ListRefPtr.h + Locker.h + MainThread.h + MathExtras.h + MessageQueue.h + Noncopyable.h + NotFound.h + OwnArrayPtr.h + OwnFastMallocPtr.h + OwnPtrCommon.h + OwnPtr.h + PassOwnPtr.h + PassRefPtr.h + Platform.h + PossiblyNull.h + PtrAndFlags.h + RandomNumber.h + RefCounted.h + RefCountedLeakCounter.h + RefPtr.h + RetainPtr.h + StdLibExtras.h + StringExtras.h + Threading.h + ThreadSpecific.h + TypeTraits.h + unicode/ +0 Collator.h + icu/ +0 UnicodeIcu.h +2 Unicode.h + UTF8.h +2 UnusedParam.h + Vector.h + VectorTraits.h + VMTags.h +3 generated/ +0 ArrayPrototype.lut.h + chartables.c + ColorData.c + CSSGrammar.cpp + CSSGrammar.h + CSSPropertyNames.cpp + CSSPropertyNames.h + CSSValueKeywords.c + CSSValueKeywords.h + DatePrototype.lut.h + DocTypeStrings.cpp + Grammar.cpp + Grammar.h + HTMLElementFactory.cpp + HTMLElementFactory.h + HTMLEntityNames.c + HTMLNames.cpp + HTMLNames.h + JSAbstractWorker.cpp + JSAbstractWorker.h + JSAttr.cpp + JSAttr.h + JSBarInfo.cpp + JSBarInfo.h + JSBeforeLoadEvent.cpp + JSBeforeLoadEvent.h + JSCanvasArrayBuffer.cpp + JSCanvasArrayBuffer.h + JSCanvasArray.cpp + JSCanvasArray.h + JSCanvasByteArray.cpp + JSCanvasByteArray.h + JSCanvasFloatArray.cpp + JSCanvasFloatArray.h + JSCanvasGradient.cpp + JSCanvasGradient.h + JSCanvasIntArray.cpp + JSCanvasIntArray.h + JSCanvasPattern.cpp + JSCanvasPattern.h + JSCanvasRenderingContext2D.cpp + JSCanvasRenderingContext2D.h + JSCanvasRenderingContext3D.cpp + JSCanvasRenderingContext3D.h + JSCanvasRenderingContext.cpp + JSCanvasRenderingContext.h + JSCanvasShortArray.cpp + JSCanvasShortArray.h + JSCanvasUnsignedByteArray.cpp + JSCanvasUnsignedByteArray.h + JSCanvasUnsignedIntArray.cpp + JSCanvasUnsignedIntArray.h + JSCanvasUnsignedShortArray.cpp + JSCanvasUnsignedShortArray.h + JSCDATASection.cpp + JSCDATASection.h + JSCharacterData.cpp + JSCharacterData.h + JSClientRect.cpp + JSClientRect.h + JSClientRectList.cpp + JSClientRectList.h + JSClipboard.cpp + JSClipboard.h + JSComment.cpp + JSComment.h + JSConsole.cpp + JSConsole.h + JSCoordinates.cpp + JSCoordinates.h + JSCounter.cpp + JSCounter.h + JSCSSCharsetRule.cpp + JSCSSCharsetRule.h + JSCSSFontFaceRule.cpp + JSCSSFontFaceRule.h + JSCSSImportRule.cpp + JSCSSImportRule.h + JSCSSMediaRule.cpp + JSCSSMediaRule.h + JSCSSPageRule.cpp + JSCSSPageRule.h + JSCSSPrimitiveValue.cpp + JSCSSPrimitiveValue.h + JSCSSRule.cpp + JSCSSRule.h + JSCSSRuleList.cpp + JSCSSRuleList.h + JSCSSStyleDeclaration.cpp + JSCSSStyleDeclaration.h + JSCSSStyleRule.cpp + JSCSSStyleRule.h + JSCSSStyleSheet.cpp + JSCSSStyleSheet.h + JSCSSValue.cpp + JSCSSValue.h + JSCSSValueList.cpp + JSCSSValueList.h + JSCSSVariablesDeclaration.cpp + JSCSSVariablesDeclaration.h + JSCSSVariablesRule.cpp + JSCSSVariablesRule.h + JSDatabase.cpp + JSDatabase.h + JSDataGridColumn.cpp + JSDataGridColumn.h + JSDataGridColumnList.cpp + JSDataGridColumnList.h + JSDedicatedWorkerContext.cpp + JSDedicatedWorkerContext.h + JSDocument.cpp + JSDocumentFragment.cpp + JSDocumentFragment.h + JSDocument.h + JSDocumentType.cpp + JSDocumentType.h + JSDOMApplicationCache.cpp + JSDOMApplicationCache.h + JSDOMCoreException.cpp + JSDOMCoreException.h + JSDOMImplementation.cpp + JSDOMImplementation.h + JSDOMParser.cpp + JSDOMParser.h + JSDOMSelection.cpp + JSDOMSelection.h + JSDOMWindowBase.lut.h + JSDOMWindow.cpp + JSDOMWindow.h + JSElement.cpp + JSElement.h + JSEntity.cpp + JSEntity.h + JSEntityReference.cpp + JSEntityReference.h + JSErrorEvent.cpp + JSErrorEvent.h + JSEvent.cpp + JSEventException.cpp + JSEventException.h + JSEvent.h + JSEventSource.cpp + JSEventSource.h + JSFile.cpp + JSFile.h + JSFileList.cpp + JSFileList.h + JSGeolocation.cpp + JSGeolocation.h + JSGeoposition.cpp + JSGeoposition.h + JSHistory.cpp + JSHistory.h + JSHTMLAllCollection.cpp + JSHTMLAllCollection.h + JSHTMLAnchorElement.cpp + JSHTMLAnchorElement.h + JSHTMLAppletElement.cpp + JSHTMLAppletElement.h + JSHTMLAreaElement.cpp + JSHTMLAreaElement.h + JSHTMLAudioElement.cpp + JSHTMLAudioElement.h + JSHTMLBaseElement.cpp + JSHTMLBaseElement.h + JSHTMLBaseFontElement.cpp + JSHTMLBaseFontElement.h + JSHTMLBlockquoteElement.cpp + JSHTMLBlockquoteElement.h + JSHTMLBodyElement.cpp + JSHTMLBodyElement.h + JSHTMLBRElement.cpp + JSHTMLBRElement.h + JSHTMLButtonElement.cpp + JSHTMLButtonElement.h + JSHTMLCanvasElement.cpp + JSHTMLCanvasElement.h + JSHTMLCollection.cpp + JSHTMLCollection.h + JSHTMLDataGridCellElement.cpp + JSHTMLDataGridCellElement.h + JSHTMLDataGridColElement.cpp + JSHTMLDataGridColElement.h + JSHTMLDataGridElement.cpp + JSHTMLDataGridElement.h + JSHTMLDataGridRowElement.cpp + JSHTMLDataGridRowElement.h + JSHTMLDataListElement.cpp + JSHTMLDataListElement.h + JSHTMLDirectoryElement.cpp + JSHTMLDirectoryElement.h + JSHTMLDivElement.cpp + JSHTMLDivElement.h + JSHTMLDListElement.cpp + JSHTMLDListElement.h + JSHTMLDocument.cpp + JSHTMLDocument.h + JSHTMLElement.cpp + JSHTMLElement.h + JSHTMLElementWrapperFactory.cpp + JSHTMLElementWrapperFactory.h + JSHTMLEmbedElement.cpp + JSHTMLEmbedElement.h + JSHTMLFieldSetElement.cpp + JSHTMLFieldSetElement.h + JSHTMLFontElement.cpp + JSHTMLFontElement.h + JSHTMLFormElement.cpp + JSHTMLFormElement.h + JSHTMLFrameElement.cpp + JSHTMLFrameElement.h + JSHTMLFrameSetElement.cpp + JSHTMLFrameSetElement.h + JSHTMLHeadElement.cpp + JSHTMLHeadElement.h + JSHTMLHeadingElement.cpp + JSHTMLHeadingElement.h + JSHTMLHRElement.cpp + JSHTMLHRElement.h + JSHTMLHtmlElement.cpp + JSHTMLHtmlElement.h + JSHTMLIFrameElement.cpp + JSHTMLIFrameElement.h + JSHTMLImageElement.cpp + JSHTMLImageElement.h + JSHTMLInputElement.cpp + JSHTMLInputElement.h + JSHTMLIsIndexElement.cpp + JSHTMLIsIndexElement.h + JSHTMLLabelElement.cpp + JSHTMLLabelElement.h + JSHTMLLegendElement.cpp + JSHTMLLegendElement.h + JSHTMLLIElement.cpp + JSHTMLLIElement.h + JSHTMLLinkElement.cpp + JSHTMLLinkElement.h + JSHTMLMapElement.cpp + JSHTMLMapElement.h + JSHTMLMarqueeElement.cpp + JSHTMLMarqueeElement.h + JSHTMLMediaElement.cpp + JSHTMLMediaElement.h + JSHTMLMenuElement.cpp + JSHTMLMenuElement.h + JSHTMLMetaElement.cpp + JSHTMLMetaElement.h + JSHTMLModElement.cpp + JSHTMLModElement.h + JSHTMLObjectElement.cpp + JSHTMLObjectElement.h + JSHTMLOListElement.cpp + JSHTMLOListElement.h + JSHTMLOptGroupElement.cpp + JSHTMLOptGroupElement.h + JSHTMLOptionElement.cpp + JSHTMLOptionElement.h + JSHTMLOptionsCollection.cpp + JSHTMLOptionsCollection.h + JSHTMLParagraphElement.cpp + JSHTMLParagraphElement.h + JSHTMLParamElement.cpp + JSHTMLParamElement.h + JSHTMLPreElement.cpp + JSHTMLPreElement.h + JSHTMLQuoteElement.cpp + JSHTMLQuoteElement.h + JSHTMLScriptElement.cpp + JSHTMLScriptElement.h + JSHTMLSelectElement.cpp + JSHTMLSelectElement.h + JSHTMLSourceElement.cpp + JSHTMLSourceElement.h + JSHTMLStyleElement.cpp + JSHTMLStyleElement.h + JSHTMLTableCaptionElement.cpp + JSHTMLTableCaptionElement.h + JSHTMLTableCellElement.cpp + JSHTMLTableCellElement.h + JSHTMLTableColElement.cpp + JSHTMLTableColElement.h + JSHTMLTableElement.cpp + JSHTMLTableElement.h + JSHTMLTableRowElement.cpp + JSHTMLTableRowElement.h + JSHTMLTableSectionElement.cpp + JSHTMLTableSectionElement.h + JSHTMLTextAreaElement.cpp + JSHTMLTextAreaElement.h + JSHTMLTitleElement.cpp + JSHTMLTitleElement.h + JSHTMLUListElement.cpp + JSHTMLUListElement.h + JSHTMLVideoElement.cpp + JSHTMLVideoElement.h + JSImageData.cpp + JSImageData.h + JSInspectorBackend.cpp + JSInspectorBackend.h + JSJavaScriptCallFrame.cpp + JSJavaScriptCallFrame.h + JSKeyboardEvent.cpp + JSKeyboardEvent.h + JSLocation.cpp + JSLocation.h + JSMedia.cpp + JSMediaError.cpp + JSMediaError.h + JSMedia.h + JSMediaList.cpp + JSMediaList.h + JSMessageChannel.cpp + JSMessageChannel.h + JSMessageEvent.cpp + JSMessageEvent.h + JSMessagePort.cpp + JSMessagePort.h + JSMimeTypeArray.cpp + JSMimeTypeArray.h + JSMimeType.cpp + JSMimeType.h + JSMouseEvent.cpp + JSMouseEvent.h + JSMutationEvent.cpp + JSMutationEvent.h + JSNamedNodeMap.cpp + JSNamedNodeMap.h + JSNavigator.cpp + JSNavigator.h + JSNode.cpp + JSNodeFilter.cpp + JSNodeFilter.h + JSNode.h + JSNodeIterator.cpp + JSNodeIterator.h + JSNodeList.cpp + JSNodeList.h + JSNotation.cpp + JSNotation.h + JSONObject.lut.h + JSOverflowEvent.cpp + JSOverflowEvent.h + JSPageTransitionEvent.cpp + JSPageTransitionEvent.h + JSPluginArray.cpp + JSPluginArray.h + JSPlugin.cpp + JSPlugin.h + JSPositionError.cpp + JSPositionError.h + JSProcessingInstruction.cpp + JSProcessingInstruction.h + JSProgressEvent.cpp + JSProgressEvent.h + JSRange.cpp + JSRangeException.cpp + JSRangeException.h + JSRange.h + JSRect.cpp + JSRect.h + JSRGBColor.cpp + JSRGBColor.h + JSScreen.cpp + JSScreen.h + JSSharedWorkerContext.cpp + JSSharedWorkerContext.h + JSSharedWorker.cpp + JSSharedWorker.h + JSSQLError.cpp + JSSQLError.h + JSSQLResultSet.cpp + JSSQLResultSet.h + JSSQLResultSetRowList.cpp + JSSQLResultSetRowList.h + JSSQLTransaction.cpp + JSSQLTransaction.h + JSStorage.cpp + JSStorageEvent.cpp + JSStorageEvent.h + JSStorage.h + JSStyleSheet.cpp + JSStyleSheet.h + JSStyleSheetList.cpp + JSStyleSheetList.h + JSSVGAElement.cpp + JSSVGAElement.h + JSSVGAltGlyphElement.cpp + JSSVGAltGlyphElement.h + JSSVGAngle.cpp + JSSVGAngle.h + JSSVGAnimateColorElement.cpp + JSSVGAnimateColorElement.h + JSSVGAnimatedAngle.cpp + JSSVGAnimatedAngle.h + JSSVGAnimatedBoolean.cpp + JSSVGAnimatedBoolean.h + JSSVGAnimatedEnumeration.cpp + JSSVGAnimatedEnumeration.h + JSSVGAnimatedInteger.cpp + JSSVGAnimatedInteger.h + JSSVGAnimatedLength.cpp + JSSVGAnimatedLength.h + JSSVGAnimatedLengthList.cpp + JSSVGAnimatedLengthList.h + JSSVGAnimatedNumber.cpp + JSSVGAnimatedNumber.h + JSSVGAnimatedNumberList.cpp + JSSVGAnimatedNumberList.h + JSSVGAnimatedPreserveAspectRatio.cpp + JSSVGAnimatedPreserveAspectRatio.h + JSSVGAnimatedRect.cpp + JSSVGAnimatedRect.h + JSSVGAnimatedString.cpp + JSSVGAnimatedString.h + JSSVGAnimatedTransformList.cpp + JSSVGAnimatedTransformList.h + JSSVGAnimateElement.cpp + JSSVGAnimateElement.h + JSSVGAnimateTransformElement.cpp + JSSVGAnimateTransformElement.h + JSSVGAnimationElement.cpp + JSSVGAnimationElement.h + JSSVGCircleElement.cpp + JSSVGCircleElement.h + JSSVGClipPathElement.cpp + JSSVGClipPathElement.h + JSSVGColor.cpp + JSSVGColor.h + JSSVGComponentTransferFunctionElement.cpp + JSSVGComponentTransferFunctionElement.h + JSSVGCursorElement.cpp + JSSVGCursorElement.h + JSSVGDefsElement.cpp + JSSVGDefsElement.h + JSSVGDescElement.cpp + JSSVGDescElement.h + JSSVGDocument.cpp + JSSVGDocument.h + JSSVGElement.cpp + JSSVGElement.h + JSSVGElementInstance.cpp + JSSVGElementInstance.h + JSSVGElementInstanceList.cpp + JSSVGElementInstanceList.h + JSSVGElementWrapperFactory.cpp + JSSVGElementWrapperFactory.h + JSSVGEllipseElement.cpp + JSSVGEllipseElement.h + JSSVGException.cpp + JSSVGException.h + JSSVGFEBlendElement.cpp + JSSVGFEBlendElement.h + JSSVGFEColorMatrixElement.cpp + JSSVGFEColorMatrixElement.h + JSSVGFEComponentTransferElement.cpp + JSSVGFEComponentTransferElement.h + JSSVGFECompositeElement.cpp + JSSVGFECompositeElement.h + JSSVGFEDiffuseLightingElement.cpp + JSSVGFEDiffuseLightingElement.h + JSSVGFEDisplacementMapElement.cpp + JSSVGFEDisplacementMapElement.h + JSSVGFEDistantLightElement.cpp + JSSVGFEDistantLightElement.h + JSSVGFEFloodElement.cpp + JSSVGFEFloodElement.h + JSSVGFEFuncAElement.cpp + JSSVGFEFuncAElement.h + JSSVGFEFuncBElement.cpp + JSSVGFEFuncBElement.h + JSSVGFEFuncGElement.cpp + JSSVGFEFuncGElement.h + JSSVGFEFuncRElement.cpp + JSSVGFEFuncRElement.h + JSSVGFEGaussianBlurElement.cpp + JSSVGFEGaussianBlurElement.h + JSSVGFEImageElement.cpp + JSSVGFEImageElement.h + JSSVGFEMergeElement.cpp + JSSVGFEMergeElement.h + JSSVGFEMergeNodeElement.cpp + JSSVGFEMergeNodeElement.h + JSSVGFEMorphologyElement.cpp + JSSVGFEMorphologyElement.h + JSSVGFEOffsetElement.cpp + JSSVGFEOffsetElement.h + JSSVGFEPointLightElement.cpp + JSSVGFEPointLightElement.h + JSSVGFESpecularLightingElement.cpp + JSSVGFESpecularLightingElement.h + JSSVGFESpotLightElement.cpp + JSSVGFESpotLightElement.h + JSSVGFETileElement.cpp + JSSVGFETileElement.h + JSSVGFETurbulenceElement.cpp + JSSVGFETurbulenceElement.h + JSSVGFilterElement.cpp + JSSVGFilterElement.h + JSSVGFontElement.cpp + JSSVGFontElement.h + JSSVGFontFaceElement.cpp + JSSVGFontFaceElement.h + JSSVGFontFaceFormatElement.cpp + JSSVGFontFaceFormatElement.h + JSSVGFontFaceNameElement.cpp + JSSVGFontFaceNameElement.h + JSSVGFontFaceSrcElement.cpp + JSSVGFontFaceSrcElement.h + JSSVGFontFaceUriElement.cpp + JSSVGFontFaceUriElement.h + JSSVGForeignObjectElement.cpp + JSSVGForeignObjectElement.h + JSSVGGElement.cpp + JSSVGGElement.h + JSSVGGlyphElement.cpp + JSSVGGlyphElement.h + JSSVGGradientElement.cpp + JSSVGGradientElement.h + JSSVGHKernElement.cpp + JSSVGHKernElement.h + JSSVGImageElement.cpp + JSSVGImageElement.h + JSSVGLength.cpp + JSSVGLength.h + JSSVGLengthList.cpp + JSSVGLengthList.h + JSSVGLinearGradientElement.cpp + JSSVGLinearGradientElement.h + JSSVGLineElement.cpp + JSSVGLineElement.h + JSSVGMarkerElement.cpp + JSSVGMarkerElement.h + JSSVGMaskElement.cpp + JSSVGMaskElement.h + JSSVGMatrix.cpp + JSSVGMatrix.h + JSSVGMetadataElement.cpp + JSSVGMetadataElement.h + JSSVGMissingGlyphElement.cpp + JSSVGMissingGlyphElement.h + JSSVGNumber.cpp + JSSVGNumber.h + JSSVGNumberList.cpp + JSSVGNumberList.h + JSSVGPaint.cpp + JSSVGPaint.h + JSSVGPathElement.cpp + JSSVGPathElement.h + JSSVGPathSegArcAbs.cpp + JSSVGPathSegArcAbs.h + JSSVGPathSegArcRel.cpp + JSSVGPathSegArcRel.h + JSSVGPathSegClosePath.cpp + JSSVGPathSegClosePath.h + JSSVGPathSeg.cpp + JSSVGPathSegCurvetoCubicAbs.cpp + JSSVGPathSegCurvetoCubicAbs.h + JSSVGPathSegCurvetoCubicRel.cpp + JSSVGPathSegCurvetoCubicRel.h + JSSVGPathSegCurvetoCubicSmoothAbs.cpp + JSSVGPathSegCurvetoCubicSmoothAbs.h + JSSVGPathSegCurvetoCubicSmoothRel.cpp + JSSVGPathSegCurvetoCubicSmoothRel.h + JSSVGPathSegCurvetoQuadraticAbs.cpp + JSSVGPathSegCurvetoQuadraticAbs.h + JSSVGPathSegCurvetoQuadraticRel.cpp + JSSVGPathSegCurvetoQuadraticRel.h + JSSVGPathSegCurvetoQuadraticSmoothAbs.cpp + JSSVGPathSegCurvetoQuadraticSmoothAbs.h + JSSVGPathSegCurvetoQuadraticSmoothRel.cpp + JSSVGPathSegCurvetoQuadraticSmoothRel.h + JSSVGPathSeg.h + JSSVGPathSegLinetoAbs.cpp + JSSVGPathSegLinetoAbs.h + JSSVGPathSegLinetoHorizontalAbs.cpp + JSSVGPathSegLinetoHorizontalAbs.h + JSSVGPathSegLinetoHorizontalRel.cpp + JSSVGPathSegLinetoHorizontalRel.h + JSSVGPathSegLinetoRel.cpp + JSSVGPathSegLinetoRel.h + JSSVGPathSegLinetoVerticalAbs.cpp + JSSVGPathSegLinetoVerticalAbs.h + JSSVGPathSegLinetoVerticalRel.cpp + JSSVGPathSegLinetoVerticalRel.h + JSSVGPathSegList.cpp + JSSVGPathSegList.h + JSSVGPathSegMovetoAbs.cpp + JSSVGPathSegMovetoAbs.h + JSSVGPathSegMovetoRel.cpp + JSSVGPathSegMovetoRel.h + JSSVGPatternElement.cpp + JSSVGPatternElement.h + JSSVGPoint.cpp + JSSVGPoint.h + JSSVGPointList.cpp + JSSVGPointList.h + JSSVGPolygonElement.cpp + JSSVGPolygonElement.h + JSSVGPolylineElement.cpp + JSSVGPolylineElement.h + JSSVGPreserveAspectRatio.cpp + JSSVGPreserveAspectRatio.h + JSSVGRadialGradientElement.cpp + JSSVGRadialGradientElement.h + JSSVGRect.cpp + JSSVGRectElement.cpp + JSSVGRectElement.h + JSSVGRect.h + JSSVGRenderingIntent.cpp + JSSVGRenderingIntent.h + JSSVGScriptElement.cpp + JSSVGScriptElement.h + JSSVGSetElement.cpp + JSSVGSetElement.h + JSSVGStopElement.cpp + JSSVGStopElement.h + JSSVGStringList.cpp + JSSVGStringList.h + JSSVGStyleElement.cpp + JSSVGStyleElement.h + JSSVGSVGElement.cpp + JSSVGSVGElement.h + JSSVGSwitchElement.cpp + JSSVGSwitchElement.h + JSSVGSymbolElement.cpp + JSSVGSymbolElement.h + JSSVGTextContentElement.cpp + JSSVGTextContentElement.h + JSSVGTextElement.cpp + JSSVGTextElement.h + JSSVGTextPathElement.cpp + JSSVGTextPathElement.h + JSSVGTextPositioningElement.cpp + JSSVGTextPositioningElement.h + JSSVGTitleElement.cpp + JSSVGTitleElement.h + JSSVGTransform.cpp + JSSVGTransform.h + JSSVGTransformList.cpp + JSSVGTransformList.h + JSSVGTRefElement.cpp + JSSVGTRefElement.h + JSSVGTSpanElement.cpp + JSSVGTSpanElement.h + JSSVGUnitTypes.cpp + JSSVGUnitTypes.h + JSSVGUseElement.cpp + JSSVGUseElement.h + JSSVGViewElement.cpp + JSSVGViewElement.h + JSSVGZoomEvent.cpp + JSSVGZoomEvent.h + JSText.cpp + JSTextEvent.cpp + JSTextEvent.h + JSText.h + JSTextMetrics.cpp + JSTextMetrics.h + JSTimeRanges.cpp + JSTimeRanges.h + JSTreeWalker.cpp + JSTreeWalker.h + JSUIEvent.cpp + JSUIEvent.h + JSValidityState.cpp + JSValidityState.h + JSVoidCallback.cpp + JSVoidCallback.h + JSWebKitAnimationEvent.cpp + JSWebKitAnimationEvent.h + JSWebKitCSSKeyframeRule.cpp + JSWebKitCSSKeyframeRule.h + JSWebKitCSSKeyframesRule.cpp + JSWebKitCSSKeyframesRule.h + JSWebKitCSSMatrix.cpp + JSWebKitCSSMatrix.h + JSWebKitCSSTransformValue.cpp + JSWebKitCSSTransformValue.h + JSWebKitPoint.cpp + JSWebKitPoint.h + JSWebKitTransitionEvent.cpp + JSWebKitTransitionEvent.h + JSWebSocket.cpp + JSWebSocket.h + JSWheelEvent.cpp + JSWheelEvent.h + JSWorkerContextBase.lut.h + JSWorkerContext.cpp + JSWorkerContext.h + JSWorker.cpp + JSWorker.h + JSWorkerLocation.cpp + JSWorkerLocation.h + JSWorkerNavigator.cpp + JSWorkerNavigator.h + JSXMLHttpRequest.cpp + JSXMLHttpRequestException.cpp + JSXMLHttpRequestException.h + JSXMLHttpRequest.h + JSXMLHttpRequestProgressEvent.cpp + JSXMLHttpRequestProgressEvent.h + JSXMLHttpRequestUpload.cpp + JSXMLHttpRequestUpload.h + JSXMLSerializer.cpp + JSXMLSerializer.h + JSXPathEvaluator.cpp + JSXPathEvaluator.h + JSXPathException.cpp + JSXPathException.h + JSXPathExpression.cpp + JSXPathExpression.h + JSXPathNSResolver.cpp + JSXPathNSResolver.h + JSXPathResult.cpp + JSXPathResult.h + JSXSLTProcessor.cpp + JSXSLTProcessor.h + Lexer.lut.h + MathObject.lut.h + NumberConstructor.lut.h + RegExpConstructor.lut.h + RegExpObject.lut.h + StringPrototype.lut.h + SVGElementFactory.cpp + SVGElementFactory.h + SVGNames.cpp + SVGNames.h + tokenizer.cpp + UserAgentStyleSheetsData.cpp + UserAgentStyleSheets.h + WebKitVersion.h + XLinkNames.cpp + XLinkNames.h + XMLNames.cpp + XMLNames.h + XPathGrammar.cpp + XPathGrammar.h +2 history/ +0 BackForwardListChromium.cpp + BackForwardList.cpp + BackForwardList.h + CachedFrame.cpp + CachedFrame.h + CachedFramePlatformData.h + CachedPage.cpp + CachedPage.h + cf/ +0 HistoryPropertyList.cpp + HistoryPropertyList.h +2 HistoryItem.cpp + HistoryItem.h + PageCache.cpp + PageCache.h + qt/ +0 HistoryItemQt.cpp +3 html/ +0 canvas/ +0 CanvasActiveInfo.h + CanvasActiveInfo.idl + CanvasArrayBuffer.cpp + CanvasArrayBuffer.h + CanvasArrayBuffer.idl + CanvasArray.cpp + CanvasArray.h + CanvasArray.idl + CanvasBuffer.cpp + CanvasBuffer.h + CanvasBuffer.idl + CanvasByteArray.cpp + CanvasByteArray.h + CanvasByteArray.idl + CanvasFloatArray.cpp + CanvasFloatArray.h + CanvasFloatArray.idl + CanvasFramebuffer.cpp + CanvasFramebuffer.h + CanvasFramebuffer.idl + CanvasGradient.cpp + CanvasGradient.h + CanvasGradient.idl + CanvasIntArray.cpp + CanvasIntArray.h + CanvasIntArray.idl + CanvasNumberArray.cpp + CanvasNumberArray.h + CanvasNumberArray.idl + CanvasObject.cpp + CanvasObject.h + CanvasPattern.cpp + CanvasPattern.h + CanvasPattern.idl + CanvasPixelArray.cpp + CanvasPixelArray.h + CanvasPixelArray.idl + CanvasProgram.cpp + CanvasProgram.h + CanvasProgram.idl + CanvasRenderbuffer.cpp + CanvasRenderbuffer.h + CanvasRenderbuffer.idl + CanvasRenderingContext2D.cpp + CanvasRenderingContext2D.h + CanvasRenderingContext2D.idl + CanvasRenderingContext3D.cpp + CanvasRenderingContext3D.h + CanvasRenderingContext3D.idl + CanvasRenderingContext.cpp + CanvasRenderingContext.h + CanvasRenderingContext.idl + CanvasShader.cpp + CanvasShader.h + CanvasShader.idl + CanvasShortArray.cpp + CanvasShortArray.h + CanvasShortArray.idl + CanvasStyle.cpp + CanvasStyle.h + CanvasTexture.cpp + CanvasTexture.h + CanvasTexture.idl + CanvasUnsignedByteArray.cpp + CanvasUnsignedByteArray.h + CanvasUnsignedByteArray.idl + CanvasUnsignedIntArray.cpp + CanvasUnsignedIntArray.h + CanvasUnsignedIntArray.idl + CanvasUnsignedShortArray.cpp + CanvasUnsignedShortArray.h + CanvasUnsignedShortArray.idl +2 CollectionCache.cpp + CollectionCache.h + CollectionType.h + DataGridColumn.cpp + DataGridColumn.h + DataGridColumn.idl + DataGridColumnList.cpp + DataGridColumnList.h + DataGridColumnList.idl + DataGridDataSource.h + DocTypeStrings.gperf + DOMDataGridDataSource.cpp + DOMDataGridDataSource.h + File.cpp + File.h + File.idl + FileList.cpp + FileList.h + FileList.idl + FormDataList.cpp + FormDataList.h + HTMLAllCollection.cpp + HTMLAllCollection.h + HTMLAllCollection.idl + HTMLAnchorElement.cpp + HTMLAnchorElement.h + HTMLAnchorElement.idl + HTMLAppletElement.cpp + HTMLAppletElement.h + HTMLAppletElement.idl + HTMLAreaElement.cpp + HTMLAreaElement.h + HTMLAreaElement.idl + HTMLAttributeNames.in + HTMLAudioElement.cpp + HTMLAudioElement.h + HTMLAudioElement.idl + HTMLBaseElement.cpp + HTMLBaseElement.h + HTMLBaseElement.idl + HTMLBaseFontElement.cpp + HTMLBaseFontElement.h + HTMLBaseFontElement.idl + HTMLBlockquoteElement.cpp + HTMLBlockquoteElement.h + HTMLBlockquoteElement.idl + HTMLBodyElement.cpp + HTMLBodyElement.h + HTMLBodyElement.idl + HTMLBRElement.cpp + HTMLBRElement.h + HTMLBRElement.idl + HTMLButtonElement.cpp + HTMLButtonElement.h + HTMLButtonElement.idl + HTMLCanvasElement.cpp + HTMLCanvasElement.h + HTMLCanvasElement.idl + HTMLCollection.cpp + HTMLCollection.h + HTMLCollection.idl + HTMLDataGridCellElement.cpp + HTMLDataGridCellElement.h + HTMLDataGridCellElement.idl + HTMLDataGridColElement.cpp + HTMLDataGridColElement.h + HTMLDataGridColElement.idl + HTMLDataGridElement.cpp + HTMLDataGridElement.h + HTMLDataGridElement.idl + HTMLDataGridRowElement.cpp + HTMLDataGridRowElement.h + HTMLDataGridRowElement.idl + HTMLDataListElement.cpp + HTMLDataListElement.h + HTMLDataListElement.idl + HTMLDirectoryElement.cpp + HTMLDirectoryElement.h + HTMLDirectoryElement.idl + HTMLDivElement.cpp + HTMLDivElement.h + HTMLDivElement.idl + HTMLDListElement.cpp + HTMLDListElement.h + HTMLDListElement.idl + HTMLDocument.cpp + HTMLDocument.h + HTMLDocument.idl + HTMLElement.cpp + HTMLElement.h + HTMLElement.idl + HTMLElementsAllInOne.cpp + HTMLEmbedElement.cpp + HTMLEmbedElement.h + HTMLEmbedElement.idl + HTMLEntityNames.gperf + HTMLFieldSetElement.cpp + HTMLFieldSetElement.h + HTMLFieldSetElement.idl + HTMLFontElement.cpp + HTMLFontElement.h + HTMLFontElement.idl + HTMLFormCollection.cpp + HTMLFormCollection.h + HTMLFormControlElement.cpp + HTMLFormControlElement.h + HTMLFormElement.cpp + HTMLFormElement.h + HTMLFormElement.idl + HTMLFrameElementBase.cpp + HTMLFrameElementBase.h + HTMLFrameElement.cpp + HTMLFrameElement.h + HTMLFrameElement.idl + HTMLFrameOwnerElement.cpp + HTMLFrameOwnerElement.h + HTMLFrameSetElement.cpp + HTMLFrameSetElement.h + HTMLFrameSetElement.idl + HTMLHeadElement.cpp + HTMLHeadElement.h + HTMLHeadElement.idl + HTMLHeadingElement.cpp + HTMLHeadingElement.h + HTMLHeadingElement.idl + HTMLHRElement.cpp + HTMLHRElement.h + HTMLHRElement.idl + HTMLHtmlElement.cpp + HTMLHtmlElement.h + HTMLHtmlElement.idl + HTMLIFrameElement.cpp + HTMLIFrameElement.h + HTMLIFrameElement.idl + HTMLImageElement.cpp + HTMLImageElement.h + HTMLImageElement.idl + HTMLImageLoader.cpp + HTMLImageLoader.h + HTMLInputElement.cpp + HTMLInputElement.h + HTMLInputElement.idl + HTMLIsIndexElement.cpp + HTMLIsIndexElement.h + HTMLIsIndexElement.idl + HTMLKeygenElement.cpp + HTMLKeygenElement.h + HTMLLabelElement.cpp + HTMLLabelElement.h + HTMLLabelElement.idl + HTMLLegendElement.cpp + HTMLLegendElement.h + HTMLLegendElement.idl + HTMLLIElement.cpp + HTMLLIElement.h + HTMLLIElement.idl + HTMLLinkElement.cpp + HTMLLinkElement.h + HTMLLinkElement.idl + HTMLMapElement.cpp + HTMLMapElement.h + HTMLMapElement.idl + HTMLMarqueeElement.cpp + HTMLMarqueeElement.h + HTMLMarqueeElement.idl + HTMLMediaElement.cpp + HTMLMediaElement.h + HTMLMediaElement.idl + HTMLMenuElement.cpp + HTMLMenuElement.h + HTMLMenuElement.idl + HTMLMetaElement.cpp + HTMLMetaElement.h + HTMLMetaElement.idl + HTMLModElement.cpp + HTMLModElement.h + HTMLModElement.idl + HTMLNameCollection.cpp + HTMLNameCollection.h + HTMLNoScriptElement.cpp + HTMLNoScriptElement.h + HTMLObjectElement.cpp + HTMLObjectElement.h + HTMLObjectElement.idl + HTMLOListElement.cpp + HTMLOListElement.h + HTMLOListElement.idl + HTMLOptGroupElement.cpp + HTMLOptGroupElement.h + HTMLOptGroupElement.idl + HTMLOptionElement.cpp + HTMLOptionElement.h + HTMLOptionElement.idl + HTMLOptionsCollection.cpp + HTMLOptionsCollection.h + HTMLOptionsCollection.idl + HTMLParagraphElement.cpp + HTMLParagraphElement.h + HTMLParagraphElement.idl + HTMLParamElement.cpp + HTMLParamElement.h + HTMLParamElement.idl + HTMLParser.cpp + HTMLParserErrorCodes.cpp + HTMLParserErrorCodes.h + HTMLParser.h + HTMLParserQuirks.h + HTMLPlugInElement.cpp + HTMLPlugInElement.h + HTMLPlugInImageElement.cpp + HTMLPlugInImageElement.h + HTMLPreElement.cpp + HTMLPreElement.h + HTMLPreElement.idl + HTMLQuoteElement.cpp + HTMLQuoteElement.h + HTMLQuoteElement.idl + HTMLScriptElement.cpp + HTMLScriptElement.h + HTMLScriptElement.idl + HTMLSelectElement.cpp + HTMLSelectElement.h + HTMLSelectElement.idl + HTMLSourceElement.cpp + HTMLSourceElement.h + HTMLSourceElement.idl + HTMLStyleElement.cpp + HTMLStyleElement.h + HTMLStyleElement.idl + HTMLTableCaptionElement.cpp + HTMLTableCaptionElement.h + HTMLTableCaptionElement.idl + HTMLTableCellElement.cpp + HTMLTableCellElement.h + HTMLTableCellElement.idl + HTMLTableColElement.cpp + HTMLTableColElement.h + HTMLTableColElement.idl + HTMLTableElement.cpp + HTMLTableElement.h + HTMLTableElement.idl + HTMLTablePartElement.cpp + HTMLTablePartElement.h + HTMLTableRowElement.cpp + HTMLTableRowElement.h + HTMLTableRowElement.idl + HTMLTableRowsCollection.cpp + HTMLTableRowsCollection.h + HTMLTableSectionElement.cpp + HTMLTableSectionElement.h + HTMLTableSectionElement.idl + HTMLTagNames.in + HTMLTextAreaElement.cpp + HTMLTextAreaElement.h + HTMLTextAreaElement.idl + HTMLTitleElement.cpp + HTMLTitleElement.h + HTMLTitleElement.idl + HTMLTokenizer.cpp + HTMLTokenizer.h + HTMLUListElement.cpp + HTMLUListElement.h + HTMLUListElement.idl + HTMLVideoElement.cpp + HTMLVideoElement.h + HTMLVideoElement.idl + HTMLViewSourceDocument.cpp + HTMLViewSourceDocument.h + ImageData.cpp + ImageData.h + ImageData.idl + MediaError.h + MediaError.idl + PreloadScanner.cpp + PreloadScanner.h + TextMetrics.h + TextMetrics.idl + TimeRanges.cpp + TimeRanges.h + TimeRanges.idl + ValidityState.cpp + ValidityState.h + ValidityState.idl + VoidCallback.h + VoidCallback.idl +2 Info.plist + inspector/ +0 ConsoleMessage.cpp + ConsoleMessage.h + front-end/ +0 AbstractTimelinePanel.js + BottomUpProfileDataGridTree.js + Breakpoint.js + BreakpointsSidebarPane.js + Callback.js + CallStackSidebarPane.js + ChangesView.js + Color.js + ConsoleView.js + CookieItemsView.js + Database.js + DatabaseQueryView.js + DatabaseTableView.js + DataGrid.js + DOMAgent.js + DOMStorageDataGrid.js + DOMStorageItemsView.js + DOMStorage.js + Drawer.js + ElementsPanel.js + ElementsTreeOutline.js + EventListenersSidebarPane.js + FontView.js + Images/ +0 back.png + checker.png + clearConsoleButtonGlyph.png + closeButtons.png + consoleButtonGlyph.png + cookie.png + database.png + databaseTable.png + debuggerContinue.png + debuggerPause.png + debuggerStepInto.png + debuggerStepOut.png + debuggerStepOver.png + disclosureTriangleSmallDownBlack.png + disclosureTriangleSmallDown.png + disclosureTriangleSmallDownWhite.png + disclosureTriangleSmallRightBlack.png + disclosureTriangleSmallRightDownBlack.png + disclosureTriangleSmallRightDown.png + disclosureTriangleSmallRightDownWhite.png + disclosureTriangleSmallRight.png + disclosureTriangleSmallRightWhite.png + dockButtonGlyph.png + elementsIcon.png + enableOutlineButtonGlyph.png + enableSolidButtonGlyph.png + errorIcon.png + errorMediumIcon.png + errorRedDot.png + excludeButtonGlyph.png + focusButtonGlyph.png + forward.png + glossyHeader.png + glossyHeaderPressed.png + glossyHeaderSelected.png + glossyHeaderSelectedPressed.png + goArrow.png + graphLabelCalloutLeft.png + graphLabelCalloutRight.png + grayConnectorPoint.png + largerResourcesButtonGlyph.png + localStorage.png + nodeSearchButtonGlyph.png + paneBottomGrowActive.png + paneBottomGrow.png + paneGrowHandleLine.png + paneSettingsButtons.png + pauseOnExceptionButtonGlyph.png + percentButtonGlyph.png + profileGroupIcon.png + profileIcon.png + profilesIcon.png + profileSmallIcon.png + profilesSilhouette.png + radioDot.png + recordButtonGlyph.png + recordToggledButtonGlyph.png + reloadButtonGlyph.png + resourceCSSIcon.png + resourceDocumentIcon.png + resourceDocumentIconSmall.png + resourceJSIcon.png + resourcePlainIcon.png + resourcePlainIconSmall.png + resourcesIcon.png + resourcesSilhouette.png + resourcesSizeGraphIcon.png + resourcesTimeGraphIcon.png + scriptsIcon.png + scriptsSilhouette.png + searchSmallBlue.png + searchSmallBrightBlue.png + searchSmallGray.png + searchSmallWhite.png + segmentEnd.png + segmentHoverEnd.png + segmentHover.png + segment.png + segmentSelectedEnd.png + segmentSelected.png + sessionStorage.png + splitviewDimple.png + splitviewDividerBackground.png + statusbarBackground.png + statusbarBottomBackground.png + statusbarButtons.png + statusbarMenuButton.png + statusbarMenuButtonSelected.png + statusbarResizerHorizontal.png + statusbarResizerVertical.png + storageIcon.png + successGreenDot.png + timelineBarBlue.png + timelineBarGray.png + timelineBarGreen.png + timelineBarOrange.png + timelineBarPurple.png + timelineBarRed.png + timelineBarYellow.png + timelineCheckmarks.png + timelineDots.png + timelineHollowPillBlue.png + timelineHollowPillGray.png + timelineHollowPillGreen.png + timelineHollowPillOrange.png + timelineHollowPillPurple.png + timelineHollowPillRed.png + timelineHollowPillYellow.png + timelineIcon.png + timelinePillBlue.png + timelinePillGray.png + timelinePillGreen.png + timelinePillOrange.png + timelinePillPurple.png + timelinePillRed.png + timelinePillYellow.png + tipBalloonBottom.png + tipBalloon.png + tipIcon.png + tipIconPressed.png + toolbarItemSelected.png + treeDownTriangleBlack.png + treeDownTriangleWhite.png + treeRightTriangleBlack.png + treeRightTriangleWhite.png + treeUpTriangleBlack.png + treeUpTriangleWhite.png + undockButtonGlyph.png + userInputIcon.png + userInputPreviousIcon.png + userInputResultIcon.png + warningIcon.png + warningMediumIcon.png + warningOrangeDot.png + warningsErrors.png + whiteConnectorPoint.png +2 ImageView.js + InjectedScriptAccess.js + InjectedScript.js + InspectorControllerStub.js + inspector.css + inspector.html + inspector.js + inspectorSyntaxHighlight.css + KeyboardShortcut.js + MetricsSidebarPane.js + Object.js + ObjectPropertiesSection.js + ObjectProxy.js + PanelEnablerView.js + Panel.js + Placard.js + Popup.js + ProfileDataGridTree.js + ProfilesPanel.js + ProfileView.js + PropertiesSection.js + PropertiesSidebarPane.js + ResourceCategory.js + Resource.js + ResourcesPanel.js + ResourceView.js + ScopeChainSidebarPane.js + Script.js + ScriptsPanel.js + ScriptView.js + SidebarPane.js + SidebarTreeElement.js + SourceFrame.js + SourceView.js + StatusBarButton.js + StoragePanel.js + StylesSidebarPane.js + SummaryBar.js + TestController.js + TextPrompt.js + TimelineAgent.js + TimelinePanel.js + TopDownProfileDataGridTree.js + treeoutline.js + utilities.js + View.js + WatchExpressionsSidebarPane.js + WebKit.qrc +2 InspectorBackend.cpp + InspectorBackend.h + InspectorBackend.idl + InspectorClient.h + InspectorController.cpp + InspectorController.h + InspectorDatabaseResource.cpp + InspectorDatabaseResource.h + InspectorDOMAgent.cpp + InspectorDOMAgent.h + InspectorDOMStorageResource.cpp + InspectorDOMStorageResource.h + InspectorFrontend.cpp + InspectorFrontend.h + InspectorResource.cpp + InspectorResource.h + InspectorTimelineAgent.cpp + InspectorTimelineAgent.h + JavaScriptCallFrame.cpp + JavaScriptCallFrame.h + JavaScriptCallFrame.idl + JavaScriptDebugListener.h + JavaScriptDebugServer.cpp + JavaScriptDebugServer.h + JavaScriptProfile.cpp + JavaScriptProfile.h + JavaScriptProfileNode.cpp + JavaScriptProfileNode.h + TimelineRecordFactory.cpp + TimelineRecordFactory.h +2 LICENSE-APPLE + LICENSE-LGPL-2 +0 .1 +2 loader/ +0 appcache/ +0 ApplicationCache.cpp + ApplicationCacheGroup.cpp + ApplicationCacheGroup.h + ApplicationCache.h + ApplicationCacheHost.cpp + ApplicationCacheHost.h + ApplicationCacheResource.cpp + ApplicationCacheResource.h + ApplicationCacheStorage.cpp + ApplicationCacheStorage.h + DOMApplicationCache.cpp + DOMApplicationCache.h + DOMApplicationCache.idl + ManifestParser.cpp + ManifestParser.h +2 archive/ +0 ArchiveFactory.cpp + ArchiveFactory.h + Archive.h + ArchiveResourceCollection.cpp + ArchiveResourceCollection.h + ArchiveResource.cpp + ArchiveResource.h + cf/ +0 LegacyWebArchive.cpp + LegacyWebArchive.h + LegacyWebArchiveMac.mm +3 Cache.cpp + CachedCSSStyleSheet.cpp + CachedCSSStyleSheet.h + CachedFont.cpp + CachedFont.h + CachedImage.cpp + CachedImage.h + CachedResourceClient.h + CachedResourceClientWalker.cpp + CachedResourceClientWalker.h + CachedResource.cpp + CachedResource.h + CachedResourceHandle.cpp + CachedResourceHandle.h + CachedScript.cpp + CachedScript.h + CachedXBLDocument.cpp + CachedXBLDocument.h + CachedXSLStyleSheet.cpp + CachedXSLStyleSheet.h + Cache.h + CachePolicy.h + cf/ +0 ResourceLoaderCFNet.cpp +2 CrossOriginAccessControl.cpp + CrossOriginAccessControl.h + CrossOriginPreflightResultCache.cpp + CrossOriginPreflightResultCache.h + DocLoader.cpp + DocLoader.h + DocumentLoader.cpp + DocumentLoader.h + DocumentThreadableLoader.cpp + DocumentThreadableLoader.h + EmptyClients.h + FormState.cpp + FormState.h + FrameLoaderClient.h + FrameLoader.cpp + FrameLoader.h + FrameLoaderTypes.h + FTPDirectoryDocument.cpp + FTPDirectoryDocument.h + FTPDirectoryParser.cpp + FTPDirectoryParser.h + HistoryController.cpp + HistoryController.h + icon/ +0 IconDatabaseClient.h + IconDatabase.cpp + IconDatabase.h + IconDatabaseNone.cpp + IconFetcher.cpp + IconFetcher.h + IconLoader.cpp + IconLoader.h + IconRecord.cpp + IconRecord.h + PageURLRecord.cpp + PageURLRecord.h +2 ImageDocument.cpp + ImageDocument.h + ImageLoader.cpp + ImageLoader.h + loader.cpp + loader.h + MainResourceLoader.cpp + MainResourceLoader.h + MediaDocument.cpp + MediaDocument.h + NavigationAction.cpp + NavigationAction.h + NetscapePlugInStreamLoader.cpp + NetscapePlugInStreamLoader.h + PlaceholderDocument.cpp + PlaceholderDocument.h + PluginDocument.cpp + PluginDocument.h + PolicyCallback.cpp + PolicyCallback.h + PolicyChecker.cpp + PolicyChecker.h + ProgressTracker.cpp + ProgressTracker.h + RedirectScheduler.cpp + RedirectScheduler.h + Request.cpp + Request.h + ResourceLoader.cpp + ResourceLoader.h + ResourceLoadNotifier.cpp + ResourceLoadNotifier.h + SubresourceLoaderClient.h + SubresourceLoader.cpp + SubresourceLoader.h + SubstituteData.h + SubstituteResource.h + TextDocument.cpp + TextDocument.h + TextResourceDecoder.cpp + TextResourceDecoder.h + ThreadableLoaderClient.h + ThreadableLoaderClientWrapper.h + ThreadableLoader.cpp + ThreadableLoader.h + WorkerThreadableLoader.cpp + WorkerThreadableLoader.h +2 make-generated-sources.sh + mathml/ +0 MathMLElement.cpp + MathMLElement.h + MathMLInlineContainerElement.cpp + MathMLInlineContainerElement.h + MathMLMathElement.cpp + MathMLMathElement.h + mathtags.in +2 move-js-headers.sh + notifications/ +0 NotificationCenter.cpp + NotificationCenter.h + NotificationCenter.idl + NotificationContents.h + Notification.cpp + Notification.h + Notification.idl + NotificationPresenter.h +2 page/ +0 AbstractView.idl + android/ +0 DragControllerAndroid.cpp + EventHandlerAndroid.cpp + InspectorControllerAndroid.cpp +2 animation/ +0 AnimationBase.cpp + AnimationBase.h + AnimationController.cpp + AnimationController.h + AnimationControllerPrivate.h + CompositeAnimation.cpp + CompositeAnimation.h + ImplicitAnimation.cpp + ImplicitAnimation.h + KeyframeAnimation.cpp + KeyframeAnimation.h +2 BarInfo.cpp + BarInfo.h + BarInfo.idl + ChromeClient.h + Chrome.cpp + Chrome.h + Console.cpp + Console.h + Console.idl + ContextMenuClient.h + ContextMenuController.cpp + ContextMenuController.h + Coordinates.h + Coordinates.idl + DOMSelection.cpp + DOMSelection.h + DOMSelection.idl + DOMTimer.cpp + DOMTimer.h + DOMWindow.cpp + DOMWindow.h + DOMWindow.idl + DragActions.h + DragClient.h + DragController.cpp + DragController.h + EditorClient.h + EventHandler.cpp + EventHandler.h + EventSource.cpp + EventSource.h + EventSource.idl + FocusController.cpp + FocusController.h + FocusDirection.h + Frame.cpp + Frame.h + FrameLoadRequest.h + FrameTree.cpp + FrameTree.h + FrameView.cpp + FrameView.h + Geolocation.cpp + Geolocation.h + Geolocation.idl + Geoposition.h + Geoposition.idl + HaltablePlugin.h + History.cpp + History.h + History.idl + Location.cpp + Location.h + Location.idl + MouseEventWithHitTestResults.cpp + MouseEventWithHitTestResults.h + NavigatorBase.cpp + NavigatorBase.h + Navigator.cpp + Navigator.h + Navigator.idl + OriginAccessEntry.cpp + OriginAccessEntry.h + Page.cpp + PageGroup.cpp + PageGroup.h + PageGroupLoadDeferrer.cpp + PageGroupLoadDeferrer.h + Page.h + PluginHalterClient.h + PluginHalter.cpp + PluginHalter.h + PositionCallback.h + PositionErrorCallback.h + PositionError.h + PositionError.idl + PositionOptions.h + PrintContext.cpp + PrintContext.h + qt/ +0 DragControllerQt.cpp + EventHandlerQt.cpp + FrameQt.cpp +2 Screen.cpp + Screen.h + Screen.idl + SecurityOrigin.cpp + SecurityOrigin.h + SecurityOriginHash.h + Settings.cpp + Settings.h + UserContentURLPattern.cpp + UserContentURLPattern.h + UserScript.h + UserScriptTypes.h + UserStyleSheet.h + UserStyleSheetTypes.h + WebKitPoint.h + WebKitPoint.idl + win/ + WindowFeatures.cpp + WindowFeatures.h + win/DragControllerWin.cpp + win/EventHandlerWin.cpp + win/FrameCairoWin.cpp + win/FrameCGWin.cpp + win/FrameWin.cpp + win/FrameWin.h + win/PageWin.cpp + WorkerNavigator.cpp + WorkerNavigator.h + WorkerNavigator.idl + XSSAuditor.cpp + XSSAuditor.h +2 platform/ +0 android/ +0 ClipboardAndroid.cpp + ClipboardAndroid.h + CursorAndroid.cpp + DragDataAndroid.cpp + EventLoopAndroid.cpp + FileChooserAndroid.cpp + FileSystemAndroid.cpp + KeyboardCodes.h + KeyEventAndroid.cpp + LocalizedStringsAndroid.cpp + PopupMenuAndroid.cpp + RenderThemeAndroid.cpp + RenderThemeAndroid.h + ScreenAndroid.cpp + ScrollViewAndroid.cpp + SearchPopupMenuAndroid.cpp + SystemTimeAndroid.cpp + TemporaryLinkStubs.cpp + WidgetAndroid.cpp +2 animation/ +0 Animation.cpp + Animation.h + AnimationList.cpp + AnimationList.h + TimingFunction.h +2 Arena.cpp + Arena.h + AutodrainedPool.h + ColorData.gperf + ContentType.cpp + ContentType.h + ContextMenu.cpp + ContextMenu.h + ContextMenuItem.h + Cookie.h + CookieJar.h + CrossThreadCopier.cpp + CrossThreadCopier.h + Cursor.h + DeprecatedPtrList.h + DeprecatedPtrListImpl.cpp + DeprecatedPtrListImpl.h + DragData.cpp + DragData.h + DragImage.cpp + DragImage.h + EventLoop.h + FileChooser.cpp + FileChooser.h + FileSystem.h + FloatConversion.h + GeolocationService.cpp + GeolocationService.h + graphics/ +0 BitmapImage.cpp + BitmapImage.h + Color.cpp + Color.h + DashArray.h + filters/ +0 FEBlend.cpp + FEBlend.h + FEColorMatrix.cpp + FEColorMatrix.h + FEComponentTransfer.cpp + FEComponentTransfer.h + FEComposite.cpp + FEComposite.h + FEGaussianBlur.cpp + FEGaussianBlur.h + FilterEffect.cpp + FilterEffect.h + Filter.h + SourceAlpha.cpp + SourceAlpha.h + SourceGraphic.cpp + SourceGraphic.h +2 FloatPoint3D.cpp + FloatPoint3D.h + FloatPoint.cpp + FloatPoint.h + FloatQuad.cpp + FloatQuad.h + FloatRect.cpp + FloatRect.h + FloatSize.cpp + FloatSize.h + FontCache.cpp + FontCache.h + Font.cpp + FontData.cpp + FontData.h + FontDescription.cpp + FontDescription.h + FontFallbackList.cpp + FontFallbackList.h + FontFamily.cpp + FontFamily.h + FontFastPath.cpp + Font.h + FontRenderingMode.h + FontSelector.h + FontSmoothingMode.h + FontTraitsMask.h + GeneratedImage.cpp + GeneratedImage.h + Generator.h + GlyphBuffer.h + GlyphPageTreeNode.cpp + GlyphPageTreeNode.h + GlyphWidthMap.cpp + GlyphWidthMap.h + Gradient.cpp + Gradient.h + GraphicsContext3D.h + GraphicsContext.cpp + GraphicsContext.h + GraphicsContextPrivate.h + GraphicsLayerClient.h + GraphicsLayer.cpp + GraphicsLayer.h + GraphicsTypes.cpp + GraphicsTypes.h + Icon.h + ImageBuffer.cpp + ImageBuffer.h + Image.cpp + Image.h + ImageObserver.h + ImageSource.cpp + ImageSource.h + IntPoint.h + IntRect.cpp + IntRect.h + IntSize.h + IntSizeHash.h + MediaPlayer.cpp + MediaPlayer.h + MediaPlayerPrivate.h + opentype/ +0 OpenTypeUtilities.cpp + OpenTypeUtilities.h +2 Path.cpp + Path.h + PathTraversalState.cpp + PathTraversalState.h + Pattern.cpp + Pattern.h + Pen.cpp + Pen.h + qt/ +0 ColorQt.cpp + FloatPointQt.cpp + FloatRectQt.cpp + FontCacheQt.cpp + FontCustomPlatformData.cpp + FontCustomPlatformData.h + FontFallbackListQt.cpp + FontPlatformData.h + FontPlatformDataQt.cpp + FontQt43.cpp + FontQt.cpp + GlyphPageTreeNodeQt.cpp + GradientQt.cpp + GraphicsContextQt.cpp + IconQt.cpp + ImageBufferData.h + ImageBufferQt.cpp + ImageDecoderQt.cpp + ImageDecoderQt.h + ImageQt.cpp + IntPointQt.cpp + IntRectQt.cpp + IntSizeQt.cpp + MediaPlayerPrivatePhonon.cpp + MediaPlayerPrivatePhonon.h + PathQt.cpp + PatternQt.cpp + SimpleFontDataQt.cpp + StillImageQt.cpp + StillImageQt.h + TransformationMatrixQt.cpp +2 SegmentedFontData.cpp + SegmentedFontData.h + SimpleFontData.cpp + SimpleFontData.h + StringTruncator.cpp + StringTruncator.h + StrokeStyleApplier.h + TextRenderingMode.h + TextRun.h + transforms/ +0 IdentityTransformOperation.h + Matrix3DTransformOperation.cpp + Matrix3DTransformOperation.h + MatrixTransformOperation.cpp + MatrixTransformOperation.h + PerspectiveTransformOperation.cpp + PerspectiveTransformOperation.h + RotateTransformOperation.cpp + RotateTransformOperation.h + ScaleTransformOperation.cpp + ScaleTransformOperation.h + SkewTransformOperation.cpp + SkewTransformOperation.h + TransformationMatrix.cpp + TransformationMatrix.h + TransformOperation.h + TransformOperations.cpp + TransformOperations.h + TranslateTransformOperation.cpp + TranslateTransformOperation.h +2 UnitBezier.h + WidthIterator.cpp + WidthIterator.h +2 HostWindow.h + image-decoders/ +0 cairo/ +0 ImageDecoderCairo.cpp +2 ImageDecoder.cpp + ImageDecoder.h + qt/ +0 RGBA32BufferQt.cpp +2 wx/ +0 ImageDecoderWx.cpp +3 KeyboardCodes.h + KURL.cpp + KURLGoogle.cpp + KURLGooglePrivate.h + KURL.h + KURLHash.h + Language.h + LengthBox.h + Length.cpp + Length.h + LengthSize.h + LinkHash.cpp + LinkHash.h + LocalizedStrings.h + Logging.cpp + Logging.h + mac/ +0 AutodrainedPool.mm + BlockExceptions.h + BlockExceptions.mm + ClipboardMac.h + ClipboardMac.mm + ContextMenuItemMac.mm + ContextMenuMac.mm + CookieJar.mm + CursorMac.mm + DragDataMac.mm + DragImageMac.mm + EventLoopMac.mm + FileChooserMac.mm + FileSystemMac.mm + FoundationExtras.h + GeolocationServiceMac.h + GeolocationServiceMac.mm + KeyEventMac.mm + KURLMac.mm + Language.mm + LocalCurrentGraphicsContext.h + LocalCurrentGraphicsContext.mm + LocalizedStringsMac.mm + LoggingMac.mm + MIMETypeRegistryMac.mm + PasteboardHelper.h + PasteboardMac.mm + PlatformMouseEventMac.mm + PlatformScreenMac.mm + PopupMenuMac.mm + PurgeableBufferMac.cpp + RuntimeApplicationChecks.h + RuntimeApplicationChecks.mm + SchedulePairMac.mm + ScrollbarThemeMac.h + ScrollbarThemeMac.mm + ScrollViewMac.mm + SearchPopupMenuMac.mm + SharedBufferMac.mm + SharedTimerMac.mm + SoftLinking.h + SoundMac.mm + SSLKeyGeneratorMac.mm + SuddenTermination.mm + SystemTimeMac.cpp + ThemeMac.h + ThemeMac.mm + ThreadCheck.mm + WebCoreKeyGenerator.h + WebCoreKeyGenerator.m + WebCoreNSStringExtras.h + WebCoreNSStringExtras.mm + WebCoreObjCExtras.h + WebCoreObjCExtras.mm + WebCoreSystemInterface.h + WebCoreSystemInterface.mm + WebCoreView.h + WebCoreView.m + WebFontCache.h + WebFontCache.mm + WheelEventMac.mm + WidgetMac.mm +2 MIMETypeRegistry.cpp + MIMETypeRegistry.h + mock/ +0 GeolocationServiceMock.cpp + GeolocationServiceMock.h +2 network/ +0 AuthenticationChallengeBase.cpp + AuthenticationChallengeBase.h + Credential.cpp + Credential.h + CredentialStorage.cpp + CredentialStorage.h + DNS.h + FormDataBuilder.cpp + FormDataBuilder.h + FormData.cpp + FormData.h + HTTPHeaderMap.cpp + HTTPHeaderMap.h + HTTPParsers.cpp + HTTPParsers.h + NetworkStateNotifier.cpp + NetworkStateNotifier.h + ProtectionSpace.cpp + ProtectionSpace.h + ProtectionSpaceHash.h + qt/ +0 AuthenticationChallenge.h + DnsPrefetchHelper.cpp + DnsPrefetchHelper.h + QNetworkReplyHandler.cpp + QNetworkReplyHandler.h + ResourceError.h + ResourceHandleQt.cpp + ResourceRequest.h + ResourceRequestQt.cpp + ResourceResponse.h + SocketStreamError.h + SocketStreamHandle.h + SocketStreamHandleSoup.cpp +2 ResourceErrorBase.cpp + ResourceErrorBase.h + ResourceHandleClient.h + ResourceHandle.cpp + ResourceHandle.h + ResourceHandleInternal.h + ResourceRequestBase.cpp + ResourceRequestBase.h + ResourceResponseBase.cpp + ResourceResponseBase.h + SocketStreamErrorBase.cpp + SocketStreamErrorBase.h + SocketStreamHandleBase.cpp + SocketStreamHandleBase.h + SocketStreamHandleClient.h +2 NotImplemented.h + Pasteboard.h + PlatformKeyboardEvent.h + PlatformMenuDescription.h + PlatformMouseEvent.h + PlatformScreen.h + PlatformWheelEvent.h + PopupMenuClient.h + PopupMenu.h + PopupMenuStyle.h + posix/ +0 FileSystemPOSIX.cpp +2 PurgeableBuffer.h + qt/ +0 ClipboardQt.cpp + ClipboardQt.h + ContextMenuItemQt.cpp + ContextMenuQt.cpp + CookieJarQt.cpp + CursorQt.cpp + DragDataQt.cpp + DragImageQt.cpp + EventLoopQt.cpp + FileChooserQt.cpp + FileSystemQt.cpp + KURLQt.cpp + Localizations.cpp + LoggingQt.cpp + MIMETypeRegistryQt.cpp + PasteboardQt.cpp + PlatformKeyboardEventQt.cpp + PlatformMouseEventQt.cpp + PlatformScreenQt.cpp + PopupMenuQt.cpp + QWebPageClient.h + QWebPopup.cpp + QWebPopup.h + RenderThemeQt.cpp + RenderThemeQt.h + ScreenQt.cpp + ScrollbarQt.cpp + ScrollbarThemeQt.cpp + ScrollbarThemeQt.h + ScrollViewQt.cpp + SearchPopupMenuQt.cpp + SharedBufferQt.cpp + SharedTimerQt.cpp + SoundQt.cpp + TemporaryLinkStubs.cpp + WheelEventQt.cpp + WidgetQt.cpp +2 RunLoopTimer.h + ScrollbarClient.h + Scrollbar.cpp + Scrollbar.h + ScrollbarThemeComposite.cpp + ScrollbarThemeComposite.h + ScrollbarTheme.h + ScrollTypes.h + ScrollView.cpp + ScrollView.h + SearchPopupMenu.h + SharedBuffer.cpp + SharedBuffer.h + SharedTimer.h + Sound.h + sql/ +0 SQLiteAuthorizer.cpp + SQLiteDatabase.cpp + SQLiteDatabase.h + SQLiteFileSystem.cpp + SQLiteFileSystem.h + SQLiteStatement.cpp + SQLiteStatement.h + SQLiteTransaction.cpp + SQLiteTransaction.h + SQLValue.cpp + SQLValue.h +2 SSLKeyGenerator.h + StaticConstructors.h + SuddenTermination.h + SystemTime.h + text/ +0 android/ +0 TextBreakIteratorInternalICU.cpp +2 AtomicString.cpp + AtomicString.h + AtomicStringHash.h + AtomicStringImpl.h + Base64.cpp + Base64.h + BidiContext.cpp + BidiContext.h + BidiResolver.h + cf/ +0 StringCF.cpp + StringImplCF.cpp +2 CharacterNames.h + CString.cpp + CString.h + mac/ +0 character-sets.txt + CharsetData.h + mac-encodings.txt + make-charset-table.pl + ShapeArabic.c + ShapeArabic.h + StringImplMac.mm + StringMac.mm + TextBoundaries.mm + TextBreakIteratorInternalICUMac.mm + TextCodecMac.cpp + TextCodecMac.h +2 ParserUtilities.h + PlatformString.h + qt/ +0 StringQt.cpp + TextBoundaries.cpp + TextBreakIteratorQt.cpp + TextCodecQt.cpp + TextCodecQt.h +2 RegularExpression.cpp + RegularExpression.h + SegmentedString.cpp + SegmentedString.h + StringBuffer.h + StringBuilder.cpp + StringBuilder.h + String.cpp + StringHash.h + StringImpl.cpp + StringImpl.h + TextBoundaries.h + TextBoundariesICU.cpp + TextBreakIterator.h + TextBreakIteratorICU.cpp + TextBreakIteratorInternalICU.h + TextCodec.cpp + TextCodec.h + TextCodecICU.cpp + TextCodecICU.h + TextCodecLatin1.cpp + TextCodecLatin1.h + TextCodecUserDefined.cpp + TextCodecUserDefined.h + TextCodecUTF16.cpp + TextCodecUTF16.h + TextDirection.h + TextEncoding.cpp + TextEncodingDetector.h + TextEncodingDetectorICU.cpp + TextEncodingDetectorNone.cpp + TextEncoding.h + TextEncodingRegistry.cpp + TextEncodingRegistry.h + TextStream.cpp + TextStream.h + UnicodeRange.cpp + UnicodeRange.h + win/ +0 TextBreakIteratorInternalICUWin.cpp +3 Theme.cpp + Theme.h + ThemeTypes.h + ThreadCheck.h + ThreadGlobalData.cpp + ThreadGlobalData.h + ThreadTimers.cpp + ThreadTimers.h + Timer.cpp + Timer.h + TreeShared.h + Widget.cpp + Widget.h + win/ +0 BitmapInfo.cpp + BitmapInfo.h + SystemTimeWin.cpp +3 plugins/ +0 mac/ +0 PluginDataMac.mm + PluginPackageMac.cpp + PluginViewMac.cpp +2 MimeTypeArray.cpp + MimeTypeArray.h + MimeTypeArray.idl + MimeType.cpp + MimeType.h + MimeType.idl + npapi.cpp + npfunctions.h + PluginArray.cpp + PluginArray.h + PluginArray.idl + Plugin.cpp + PluginDatabaseClient.h + PluginDatabase.cpp + PluginDatabase.h + PluginData.cpp + PluginData.h + PluginDataNone.cpp + PluginDebug.cpp + PluginDebug.h + Plugin.h + Plugin.idl + PluginInfoStore.cpp + PluginInfoStore.h + PluginMainThreadScheduler.cpp + PluginMainThreadScheduler.h + PluginPackage.cpp + PluginPackage.h + PluginPackageNone.cpp + PluginQuirkSet.h + PluginStream.cpp + PluginStream.h + PluginView.cpp + PluginView.h + PluginViewNone.cpp + qt/ +0 PluginContainerQt.cpp + PluginContainerQt.h + PluginDataQt.cpp + PluginPackageQt.cpp + PluginViewQt.cpp +2 symbian/ +0 npinterface.h + PluginContainerSymbian.cpp + PluginContainerSymbian.h + PluginDatabaseSymbian.cpp + PluginPackageSymbian.cpp + PluginViewSymbian.cpp +2 win/ +0 PaintHooks.asm + PluginDatabaseWin.cpp + PluginDataWin.cpp + PluginMessageThrottlerWin.cpp + PluginMessageThrottlerWin.h + PluginPackageWin.cpp + PluginViewWin.cpp +3 rendering/ +0 AutoTableLayout.cpp + AutoTableLayout.h + break_lines.cpp + break_lines.h + CounterNode.cpp + CounterNode.h + EllipsisBox.cpp + EllipsisBox.h + FixedTableLayout.cpp + FixedTableLayout.h + GapRects.h + HitTestRequest.h + HitTestResult.cpp + HitTestResult.h + InlineBox.cpp + InlineBox.h + InlineFlowBox.cpp + InlineFlowBox.h + InlineRunBox.h + InlineTextBox.cpp + InlineTextBox.h + LayoutState.cpp + LayoutState.h + MediaControlElements.cpp + MediaControlElements.h + OverlapTestRequestClient.h + PointerEventsHitRules.cpp + PointerEventsHitRules.h + RenderApplet.cpp + RenderApplet.h + RenderArena.cpp + RenderArena.h + RenderBlock.cpp + RenderBlock.h + RenderBlockLineLayout.cpp + RenderBox.cpp + RenderBox.h + RenderBoxModelObject.cpp + RenderBoxModelObject.h + RenderBR.cpp + RenderBR.h + RenderButton.cpp + RenderButton.h + RenderCounter.cpp + RenderCounter.h + RenderDataGrid.cpp + RenderDataGrid.h + RenderFieldset.cpp + RenderFieldset.h + RenderFileUploadControl.cpp + RenderFileUploadControl.h + RenderFlexibleBox.cpp + RenderFlexibleBox.h + RenderForeignObject.cpp + RenderForeignObject.h + RenderFrame.cpp + RenderFrame.h + RenderFrameSet.cpp + RenderFrameSet.h + RenderHTMLCanvas.cpp + RenderHTMLCanvas.h + RenderImage.cpp + RenderImageGeneratedContent.cpp + RenderImageGeneratedContent.h + RenderImage.h + RenderInline.cpp + RenderInline.h + RenderLayerBacking.cpp + RenderLayerBacking.h + RenderLayerCompositor.cpp + RenderLayerCompositor.h + RenderLayer.cpp + RenderLayer.h + RenderLineBoxList.cpp + RenderLineBoxList.h + RenderListBox.cpp + RenderListBox.h + RenderListItem.cpp + RenderListItem.h + RenderListMarker.cpp + RenderListMarker.h + RenderMarquee.cpp + RenderMarquee.h + RenderMediaControlsChromium.cpp + RenderMediaControlsChromium.h + RenderMediaControls.cpp + RenderMediaControls.h + RenderMedia.cpp + RenderMedia.h + RenderMenuList.cpp + RenderMenuList.h + RenderObjectChildList.cpp + RenderObjectChildList.h + RenderObject.cpp + RenderObject.h + RenderOverflow.h + RenderPart.cpp + RenderPart.h + RenderPartObject.cpp + RenderPartObject.h + RenderPath.cpp + RenderPath.h + RenderReplaced.cpp + RenderReplaced.h + RenderReplica.cpp + RenderReplica.h + RenderScrollbar.cpp + RenderScrollbar.h + RenderScrollbarPart.cpp + RenderScrollbarPart.h + RenderScrollbarTheme.cpp + RenderScrollbarTheme.h + RenderSelectionInfo.h + RenderSlider.cpp + RenderSlider.h + RenderSVGBlock.cpp + RenderSVGBlock.h + RenderSVGContainer.cpp + RenderSVGContainer.h + RenderSVGGradientStop.cpp + RenderSVGGradientStop.h + RenderSVGHiddenContainer.cpp + RenderSVGHiddenContainer.h + RenderSVGImage.cpp + RenderSVGImage.h + RenderSVGInline.cpp + RenderSVGInline.h + RenderSVGInlineText.cpp + RenderSVGInlineText.h + RenderSVGModelObject.cpp + RenderSVGModelObject.h + RenderSVGRoot.cpp + RenderSVGRoot.h + RenderSVGText.cpp + RenderSVGText.h + RenderSVGTextPath.cpp + RenderSVGTextPath.h + RenderSVGTransformableContainer.cpp + RenderSVGTransformableContainer.h + RenderSVGTSpan.cpp + RenderSVGTSpan.h + RenderSVGViewportContainer.cpp + RenderSVGViewportContainer.h + RenderTableCell.cpp + RenderTableCell.h + RenderTableCol.cpp + RenderTableCol.h + RenderTable.cpp + RenderTable.h + RenderTableRow.cpp + RenderTableRow.h + RenderTableSection.cpp + RenderTableSection.h + RenderTextControl.cpp + RenderTextControl.h + RenderTextControlMultiLine.cpp + RenderTextControlMultiLine.h + RenderTextControlSingleLine.cpp + RenderTextControlSingleLine.h + RenderText.cpp + RenderTextFragment.cpp + RenderTextFragment.h + RenderText.h + RenderThemeChromiumLinux.cpp + RenderThemeChromiumLinux.h + RenderThemeChromiumMac.h + RenderThemeChromiumMac.mm + RenderThemeChromiumSkia.cpp + RenderThemeChromiumSkia.h + RenderThemeChromiumWin.cpp + RenderThemeChromiumWin.h + RenderTheme.cpp + RenderTheme.h + RenderThemeMac.h + RenderThemeSafari.cpp + RenderThemeSafari.h + RenderThemeWince.cpp + RenderThemeWince.h + RenderThemeWin.cpp + RenderThemeWin.h + RenderTreeAsText.cpp + RenderTreeAsText.h + RenderVideo.cpp + RenderVideo.h + RenderView.cpp + RenderView.h + RenderWidget.cpp + RenderWidget.h + RenderWidgetProtector.h + RenderWordBreak.cpp + RenderWordBreak.h + RootInlineBox.cpp + RootInlineBox.h + ScrollBehavior.cpp + ScrollBehavior.h + style/ +0 BindingURI.cpp + BindingURI.h + BorderData.h + BorderValue.h + CollapsedBorderValue.h + ContentData.cpp + ContentData.h + CounterContent.h + CounterDirectives.cpp + CounterDirectives.h + CursorData.h + CursorList.h + DataRef.h + FillLayer.cpp + FillLayer.h + KeyframeList.cpp + KeyframeList.h + NinePieceImage.cpp + NinePieceImage.h + OutlineValue.h + RenderStyleConstants.h + RenderStyle.cpp + RenderStyle.h + ShadowData.cpp + ShadowData.h + StyleBackgroundData.cpp + StyleBackgroundData.h + StyleBoxData.cpp + StyleBoxData.h + StyleCachedImage.cpp + StyleCachedImage.h + StyleDashboardRegion.h + StyleFlexibleBoxData.cpp + StyleFlexibleBoxData.h + StyleGeneratedImage.cpp + StyleGeneratedImage.h + StyleImage.h + StyleInheritedData.cpp + StyleInheritedData.h + StyleMarqueeData.cpp + StyleMarqueeData.h + StyleMultiColData.cpp + StyleMultiColData.h + StyleRareInheritedData.cpp + StyleRareInheritedData.h + StyleRareNonInheritedData.cpp + StyleRareNonInheritedData.h + StyleReflection.h + StyleSurroundData.cpp + StyleSurroundData.h + StyleTransformData.cpp + StyleTransformData.h + StyleVisualData.cpp + StyleVisualData.h + SVGRenderStyle.cpp + SVGRenderStyleDefs.cpp + SVGRenderStyleDefs.h + SVGRenderStyle.h +2 SVGCharacterLayoutInfo.cpp + SVGCharacterLayoutInfo.h + SVGInlineFlowBox.cpp + SVGInlineFlowBox.h + SVGInlineTextBox.cpp + SVGInlineTextBox.h + SVGRenderSupport.cpp + SVGRenderSupport.h + SVGRenderTreeAsText.cpp + SVGRenderTreeAsText.h + SVGRootInlineBox.cpp + SVGRootInlineBox.h + TableLayout.h + TextControlInnerElements.cpp + TextControlInnerElements.h + TransformState.cpp + TransformState.h +2 Resources/ +0 aliasCursor.png + cellCursor.png + contextMenuCursor.png + copyCursor.png + crossHairCursor.png + deleteButton.png + deleteButtonPressed.png + deleteButtonPressed.tiff + deleteButton.tiff + eastResizeCursor.png + eastWestResizeCursor.png + helpCursor.png + linkCursor.png + missingImage.png + missingImage.tiff + moveCursor.png + noDropCursor.png + noneCursor.png + northEastResizeCursor.png + northEastSouthWestResizeCursor.png + northResizeCursor.png + northSouthResizeCursor.png + northWestResizeCursor.png + northWestSouthEastResizeCursor.png + notAllowedCursor.png + nullPlugin.png + panIcon.png + progressCursor.png + southEastResizeCursor.png + southResizeCursor.png + southWestResizeCursor.png + textAreaResizeCorner.png + textAreaResizeCorner.tiff + urlIcon.png + verticalTextCursor.png + waitCursor.png + westResizeCursor.png + zoomInCursor.png + zoomOutCursor.png +2 storage/ +0 ChangeVersionWrapper.cpp + ChangeVersionWrapper.h + DatabaseAuthorizer.cpp + DatabaseAuthorizer.h + Database.cpp + DatabaseDetails.h + Database.h + Database.idl + DatabaseTask.cpp + DatabaseTask.h + DatabaseThread.cpp + DatabaseThread.h + DatabaseTrackerClient.h + DatabaseTracker.cpp + DatabaseTracker.h + LocalStorageTask.cpp + LocalStorageTask.h + LocalStorageThread.cpp + LocalStorageThread.h + OriginQuotaManager.cpp + OriginQuotaManager.h + OriginUsageRecord.cpp + OriginUsageRecord.h + SQLError.h + SQLError.idl + SQLResultSet.cpp + SQLResultSet.h + SQLResultSet.idl + SQLResultSetRowList.cpp + SQLResultSetRowList.h + SQLResultSetRowList.idl + SQLStatementCallback.h + SQLStatement.cpp + SQLStatementErrorCallback.h + SQLStatement.h + SQLTransactionCallback.h + SQLTransactionClient.cpp + SQLTransactionClient.h + SQLTransactionCoordinator.cpp + SQLTransactionCoordinator.h + SQLTransaction.cpp + SQLTransactionErrorCallback.h + SQLTransaction.h + SQLTransaction.idl + StorageArea.h + StorageAreaImpl.cpp + StorageAreaImpl.h + StorageAreaSync.cpp + StorageAreaSync.h + Storage.cpp + StorageEvent.cpp + StorageEventDispatcher.cpp + StorageEventDispatcher.h + StorageEvent.h + StorageEvent.idl + Storage.h + Storage.idl + StorageMap.cpp + StorageMap.h + StorageNamespace.cpp + StorageNamespace.h + StorageNamespaceImpl.cpp + StorageNamespaceImpl.h + StorageSyncManager.cpp + StorageSyncManager.h +2 svg/ +0 animation/ +0 SMILTimeContainer.cpp + SMILTimeContainer.h + SMILTime.cpp + SMILTime.h + SVGSMILElement.cpp + SVGSMILElement.h +2 ColorDistance.cpp + ColorDistance.h + ElementTimeControl.h + ElementTimeControl.idl + GradientAttributes.h + graphics/ +0 filters/ +0 SVGDistantLightSource.h + SVGFEConvolveMatrix.cpp + SVGFEConvolveMatrix.h + SVGFEDiffuseLighting.cpp + SVGFEDiffuseLighting.h + SVGFEDisplacementMap.cpp + SVGFEDisplacementMap.h + SVGFEFlood.cpp + SVGFEFlood.h + SVGFEImage.cpp + SVGFEImage.h + SVGFEMerge.cpp + SVGFEMerge.h + SVGFEMorphology.cpp + SVGFEMorphology.h + SVGFEOffset.cpp + SVGFEOffset.h + SVGFESpecularLighting.cpp + SVGFESpecularLighting.h + SVGFETile.cpp + SVGFETile.h + SVGFETurbulence.cpp + SVGFETurbulence.h + SVGFilterBuilder.cpp + SVGFilterBuilder.h + SVGFilter.cpp + SVGFilter.h + SVGLightSource.cpp + SVGLightSource.h + SVGPointLightSource.h + SVGSpotLightSource.h +2 SVGImage.cpp + SVGImage.h + SVGPaintServer.cpp + SVGPaintServerGradient.cpp + SVGPaintServerGradient.h + SVGPaintServer.h + SVGPaintServerLinearGradient.cpp + SVGPaintServerLinearGradient.h + SVGPaintServerPattern.cpp + SVGPaintServerPattern.h + SVGPaintServerRadialGradient.cpp + SVGPaintServerRadialGradient.h + SVGPaintServerSolid.cpp + SVGPaintServerSolid.h + SVGResourceClipper.cpp + SVGResourceClipper.h + SVGResource.cpp + SVGResourceFilter.cpp + SVGResourceFilter.h + SVGResource.h + SVGResourceListener.h + SVGResourceMarker.cpp + SVGResourceMarker.h + SVGResourceMasker.cpp + SVGResourceMasker.h +2 LinearGradientAttributes.h + PatternAttributes.h + RadialGradientAttributes.h + SVGAElement.cpp + SVGAElement.h + SVGAElement.idl + SVGAllInOne.cpp + SVGAltGlyphElement.cpp + SVGAltGlyphElement.h + SVGAltGlyphElement.idl + SVGAngle.cpp + SVGAngle.h + SVGAngle.idl + SVGAnimateColorElement.cpp + SVGAnimateColorElement.h + SVGAnimateColorElement.idl + SVGAnimatedAngle.idl + SVGAnimatedBoolean.idl + SVGAnimatedEnumeration.idl + SVGAnimatedInteger.idl + SVGAnimatedLength.idl + SVGAnimatedLengthList.idl + SVGAnimatedNumber.idl + SVGAnimatedNumberList.idl + SVGAnimatedPathData.cpp + SVGAnimatedPathData.h + SVGAnimatedPathData.idl + SVGAnimatedPoints.cpp + SVGAnimatedPoints.h + SVGAnimatedPoints.idl + SVGAnimatedPreserveAspectRatio.idl + SVGAnimatedProperty.h + SVGAnimatedRect.idl + SVGAnimatedString.idl + SVGAnimatedTemplate.h + SVGAnimatedTransformList.idl + SVGAnimateElement.cpp + SVGAnimateElement.h + SVGAnimateElement.idl + SVGAnimateMotionElement.cpp + SVGAnimateMotionElement.h + SVGAnimateTransformElement.cpp + SVGAnimateTransformElement.h + SVGAnimateTransformElement.idl + SVGAnimationElement.cpp + SVGAnimationElement.h + SVGAnimationElement.idl + svgattrs.in + SVGCircleElement.cpp + SVGCircleElement.h + SVGCircleElement.idl + SVGClipPathElement.cpp + SVGClipPathElement.h + SVGClipPathElement.idl + SVGColor.cpp + SVGColor.h + SVGColor.idl + SVGComponentTransferFunctionElement.cpp + SVGComponentTransferFunctionElement.h + SVGComponentTransferFunctionElement.idl + SVGCursorElement.cpp + SVGCursorElement.h + SVGCursorElement.idl + SVGDefsElement.cpp + SVGDefsElement.h + SVGDefsElement.idl + SVGDescElement.cpp + SVGDescElement.h + SVGDescElement.idl + SVGDocument.cpp + SVGDocumentExtensions.cpp + SVGDocumentExtensions.h + SVGDocument.h + SVGDocument.idl + SVGElement.cpp + SVGElement.h + SVGElement.idl + SVGElementInstance.cpp + SVGElementInstance.h + SVGElementInstance.idl + SVGElementInstanceList.cpp + SVGElementInstanceList.h + SVGElementInstanceList.idl + SVGEllipseElement.cpp + SVGEllipseElement.h + SVGEllipseElement.idl + SVGException.h + SVGException.idl + SVGExternalResourcesRequired.cpp + SVGExternalResourcesRequired.h + SVGExternalResourcesRequired.idl + SVGFEBlendElement.cpp + SVGFEBlendElement.h + SVGFEBlendElement.idl + SVGFEColorMatrixElement.cpp + SVGFEColorMatrixElement.h + SVGFEColorMatrixElement.idl + SVGFEComponentTransferElement.cpp + SVGFEComponentTransferElement.h + SVGFEComponentTransferElement.idl + SVGFECompositeElement.cpp + SVGFECompositeElement.h + SVGFECompositeElement.idl + SVGFEDiffuseLightingElement.cpp + SVGFEDiffuseLightingElement.h + SVGFEDiffuseLightingElement.idl + SVGFEDisplacementMapElement.cpp + SVGFEDisplacementMapElement.h + SVGFEDisplacementMapElement.idl + SVGFEDistantLightElement.cpp + SVGFEDistantLightElement.h + SVGFEDistantLightElement.idl + SVGFEFloodElement.cpp + SVGFEFloodElement.h + SVGFEFloodElement.idl + SVGFEFuncAElement.cpp + SVGFEFuncAElement.h + SVGFEFuncAElement.idl + SVGFEFuncBElement.cpp + SVGFEFuncBElement.h + SVGFEFuncBElement.idl + SVGFEFuncGElement.cpp + SVGFEFuncGElement.h + SVGFEFuncGElement.idl + SVGFEFuncRElement.cpp + SVGFEFuncRElement.h + SVGFEFuncRElement.idl + SVGFEGaussianBlurElement.cpp + SVGFEGaussianBlurElement.h + SVGFEGaussianBlurElement.idl + SVGFEImageElement.cpp + SVGFEImageElement.h + SVGFEImageElement.idl + SVGFELightElement.cpp + SVGFELightElement.h + SVGFEMergeElement.cpp + SVGFEMergeElement.h + SVGFEMergeElement.idl + SVGFEMergeNodeElement.cpp + SVGFEMergeNodeElement.h + SVGFEMergeNodeElement.idl + SVGFEMorphologyElement.cpp + SVGFEMorphologyElement.h + SVGFEMorphologyElement.idl + SVGFEOffsetElement.cpp + SVGFEOffsetElement.h + SVGFEOffsetElement.idl + SVGFEPointLightElement.cpp + SVGFEPointLightElement.h + SVGFEPointLightElement.idl + SVGFESpecularLightingElement.cpp + SVGFESpecularLightingElement.h + SVGFESpecularLightingElement.idl + SVGFESpotLightElement.cpp + SVGFESpotLightElement.h + SVGFESpotLightElement.idl + SVGFETileElement.cpp + SVGFETileElement.h + SVGFETileElement.idl + SVGFETurbulenceElement.cpp + SVGFETurbulenceElement.h + SVGFETurbulenceElement.idl + SVGFilterElement.cpp + SVGFilterElement.h + SVGFilterElement.idl + SVGFilterPrimitiveStandardAttributes.cpp + SVGFilterPrimitiveStandardAttributes.h + SVGFilterPrimitiveStandardAttributes.idl + SVGFitToViewBox.cpp + SVGFitToViewBox.h + SVGFitToViewBox.idl + SVGFont.cpp + SVGFontData.cpp + SVGFontData.h + SVGFontElement.cpp + SVGFontElement.h + SVGFontElement.idl + SVGFontFaceElement.cpp + SVGFontFaceElement.h + SVGFontFaceElement.idl + SVGFontFaceFormatElement.cpp + SVGFontFaceFormatElement.h + SVGFontFaceFormatElement.idl + SVGFontFaceNameElement.cpp + SVGFontFaceNameElement.h + SVGFontFaceNameElement.idl + SVGFontFaceSrcElement.cpp + SVGFontFaceSrcElement.h + SVGFontFaceSrcElement.idl + SVGFontFaceUriElement.cpp + SVGFontFaceUriElement.h + SVGFontFaceUriElement.idl + SVGForeignObjectElement.cpp + SVGForeignObjectElement.h + SVGForeignObjectElement.idl + SVGGElement.cpp + SVGGElement.h + SVGGElement.idl + SVGGlyphElement.cpp + SVGGlyphElement.h + SVGGlyphElement.idl + SVGGlyphMap.h + SVGGradientElement.cpp + SVGGradientElement.h + SVGGradientElement.idl + SVGHKernElement.cpp + SVGHKernElement.h + SVGHKernElement.idl + SVGImageElement.cpp + SVGImageElement.h + SVGImageElement.idl + SVGImageLoader.cpp + SVGImageLoader.h + SVGLangSpace.cpp + SVGLangSpace.h + SVGLangSpace.idl + SVGLength.cpp + SVGLength.h + SVGLength.idl + SVGLengthList.cpp + SVGLengthList.h + SVGLengthList.idl + SVGLinearGradientElement.cpp + SVGLinearGradientElement.h + SVGLinearGradientElement.idl + SVGLineElement.cpp + SVGLineElement.h + SVGLineElement.idl + SVGList.h + SVGListTraits.h + SVGLocatable.cpp + SVGLocatable.h + SVGLocatable.idl + SVGMarkerElement.cpp + SVGMarkerElement.h + SVGMarkerElement.idl + SVGMaskElement.cpp + SVGMaskElement.h + SVGMaskElement.idl + SVGMatrix.idl + SVGMetadataElement.cpp + SVGMetadataElement.h + SVGMetadataElement.idl + SVGMissingGlyphElement.cpp + SVGMissingGlyphElement.h + SVGMissingGlyphElement.idl + SVGMPathElement.cpp + SVGMPathElement.h + SVGNumber.idl + SVGNumberList.cpp + SVGNumberList.h + SVGNumberList.idl + SVGPaint.cpp + SVGPaint.h + SVGPaint.idl + SVGParserUtilities.cpp + SVGParserUtilities.h + SVGPathElement.cpp + SVGPathElement.h + SVGPathElement.idl + SVGPathSegArcAbs.idl + SVGPathSegArc.cpp + SVGPathSegArc.h + SVGPathSegArcRel.idl + SVGPathSegClosePath.cpp + SVGPathSegClosePath.h + SVGPathSegClosePath.idl + SVGPathSegCurvetoCubicAbs.idl + SVGPathSegCurvetoCubic.cpp + SVGPathSegCurvetoCubic.h + SVGPathSegCurvetoCubicRel.idl + SVGPathSegCurvetoCubicSmoothAbs.idl + SVGPathSegCurvetoCubicSmooth.cpp + SVGPathSegCurvetoCubicSmooth.h + SVGPathSegCurvetoCubicSmoothRel.idl + SVGPathSegCurvetoQuadraticAbs.idl + SVGPathSegCurvetoQuadratic.cpp + SVGPathSegCurvetoQuadratic.h + SVGPathSegCurvetoQuadraticRel.idl + SVGPathSegCurvetoQuadraticSmoothAbs.idl + SVGPathSegCurvetoQuadraticSmooth.cpp + SVGPathSegCurvetoQuadraticSmooth.h + SVGPathSegCurvetoQuadraticSmoothRel.idl + SVGPathSeg.h + SVGPathSeg.idl + SVGPathSegLinetoAbs.idl + SVGPathSegLineto.cpp + SVGPathSegLineto.h + SVGPathSegLinetoHorizontalAbs.idl + SVGPathSegLinetoHorizontal.cpp + SVGPathSegLinetoHorizontal.h + SVGPathSegLinetoHorizontalRel.idl + SVGPathSegLinetoRel.idl + SVGPathSegLinetoVerticalAbs.idl + SVGPathSegLinetoVertical.cpp + SVGPathSegLinetoVertical.h + SVGPathSegLinetoVerticalRel.idl + SVGPathSegList.cpp + SVGPathSegList.h + SVGPathSegList.idl + SVGPathSegMovetoAbs.idl + SVGPathSegMoveto.cpp + SVGPathSegMoveto.h + SVGPathSegMovetoRel.idl + SVGPatternElement.cpp + SVGPatternElement.h + SVGPatternElement.idl + SVGPoint.idl + SVGPointList.cpp + SVGPointList.h + SVGPointList.idl + SVGPolyElement.cpp + SVGPolyElement.h + SVGPolygonElement.cpp + SVGPolygonElement.h + SVGPolygonElement.idl + SVGPolylineElement.cpp + SVGPolylineElement.h + SVGPolylineElement.idl + SVGPreserveAspectRatio.cpp + SVGPreserveAspectRatio.h + SVGPreserveAspectRatio.idl + SVGRadialGradientElement.cpp + SVGRadialGradientElement.h + SVGRadialGradientElement.idl + SVGRectElement.cpp + SVGRectElement.h + SVGRectElement.idl + SVGRect.idl + SVGRenderingIntent.h + SVGRenderingIntent.idl + SVGScriptElement.cpp + SVGScriptElement.h + SVGScriptElement.idl + SVGSetElement.cpp + SVGSetElement.h + SVGSetElement.idl + SVGStopElement.cpp + SVGStopElement.h + SVGStopElement.idl + SVGStringList.cpp + SVGStringList.h + SVGStringList.idl + SVGStylable.cpp + SVGStylable.h + SVGStylable.idl + SVGStyledElement.cpp + SVGStyledElement.h + SVGStyledLocatableElement.cpp + SVGStyledLocatableElement.h + SVGStyledTransformableElement.cpp + SVGStyledTransformableElement.h + SVGStyleElement.cpp + SVGStyleElement.h + SVGStyleElement.idl + SVGSVGElement.cpp + SVGSVGElement.h + SVGSVGElement.idl + SVGSwitchElement.cpp + SVGSwitchElement.h + SVGSwitchElement.idl + SVGSymbolElement.cpp + SVGSymbolElement.h + SVGSymbolElement.idl + svgtags.in + SVGTests.cpp + SVGTests.h + SVGTests.idl + SVGTextContentElement.cpp + SVGTextContentElement.h + SVGTextContentElement.idl + SVGTextElement.cpp + SVGTextElement.h + SVGTextElement.idl + SVGTextPathElement.cpp + SVGTextPathElement.h + SVGTextPathElement.idl + SVGTextPositioningElement.cpp + SVGTextPositioningElement.h + SVGTextPositioningElement.idl + SVGTitleElement.cpp + SVGTitleElement.h + SVGTitleElement.idl + SVGTransformable.cpp + SVGTransformable.h + SVGTransformable.idl + SVGTransform.cpp + SVGTransformDistance.cpp + SVGTransformDistance.h + SVGTransform.h + SVGTransform.idl + SVGTransformList.cpp + SVGTransformList.h + SVGTransformList.idl + SVGTRefElement.cpp + SVGTRefElement.h + SVGTRefElement.idl + SVGTSpanElement.cpp + SVGTSpanElement.h + SVGTSpanElement.idl + SVGUnitTypes.h + SVGUnitTypes.idl + SVGURIReference.cpp + SVGURIReference.h + SVGURIReference.idl + SVGUseElement.cpp + SVGUseElement.h + SVGUseElement.idl + SVGViewElement.cpp + SVGViewElement.h + SVGViewElement.idl + SVGViewSpec.cpp + SVGViewSpec.h + SVGViewSpec.idl + SVGZoomAndPan.cpp + SVGZoomAndPan.h + SVGZoomAndPan.idl + SVGZoomEvent.cpp + SVGZoomEvent.h + SVGZoomEvent.idl + SynchronizablePropertyController.cpp + SynchronizablePropertyController.h + SynchronizableTypeWrapper.h + xlinkattrs.in +2 WebCore.3DRendering.exp + WebCore.DashboardSupport.exp + WebCore.gypi + WebCore.JNI.exp + WebCore.NPAPI.exp + WebCore.order + WebCorePrefix.cpp + WebCorePrefix.h + WebCore.pro + WebCore.qrc + WebCore.SVG.Animation.exp + WebCore.SVG.exp + WebCore.SVG.Filters.exp + WebCore.SVG.ForeignObject.exp + WebCore.Tiger.exp + WebCore.Video.exp + WebCore.VideoProxy.exp + websockets/ +0 WebSocketChannelClient.h + WebSocketChannel.cpp + WebSocketChannel.h + WebSocket.cpp + WebSocket.h + WebSocketHandshake.cpp + WebSocketHandshake.h + WebSocket.idl +2 wml/ +0 WMLAccessElement.cpp + WMLAccessElement.h + WMLAElement.cpp + WMLAElement.h + WMLAnchorElement.cpp + WMLAnchorElement.h + WMLAttributeNames.in + WMLBRElement.cpp + WMLBRElement.h + WMLCardElement.cpp + WMLCardElement.h + WMLDocument.cpp + WMLDocument.h + WMLDoElement.cpp + WMLDoElement.h + WMLElement.cpp + WMLElement.h + WMLErrorHandling.cpp + WMLErrorHandling.h + WMLEventHandlingElement.cpp + WMLEventHandlingElement.h + WMLFieldSetElement.cpp + WMLFieldSetElement.h + WMLFormControlElement.cpp + WMLFormControlElement.h + WMLGoElement.cpp + WMLGoElement.h + WMLImageElement.cpp + WMLImageElement.h + WMLImageLoader.cpp + WMLImageLoader.h + WMLInputElement.cpp + WMLInputElement.h + WMLInsertedLegendElement.cpp + WMLInsertedLegendElement.h + WMLIntrinsicEvent.cpp + WMLIntrinsicEvent.h + WMLIntrinsicEventHandler.cpp + WMLIntrinsicEventHandler.h + WMLMetaElement.cpp + WMLMetaElement.h + WMLNoopElement.cpp + WMLNoopElement.h + WMLOnEventElement.cpp + WMLOnEventElement.h + WMLOptGroupElement.cpp + WMLOptGroupElement.h + WMLOptionElement.cpp + WMLOptionElement.h + WMLPageState.cpp + WMLPageState.h + WMLPElement.cpp + WMLPElement.h + WMLPostfieldElement.cpp + WMLPostfieldElement.h + WMLPrevElement.cpp + WMLPrevElement.h + WMLRefreshElement.cpp + WMLRefreshElement.h + WMLSelectElement.cpp + WMLSelectElement.h + WMLSetvarElement.cpp + WMLSetvarElement.h + WMLTableElement.cpp + WMLTableElement.h + WMLTagNames.in + WMLTaskElement.cpp + WMLTaskElement.h + WMLTemplateElement.cpp + WMLTemplateElement.h + WMLTimerElement.cpp + WMLTimerElement.h + WMLVariables.cpp + WMLVariables.h +2 workers/ +0 AbstractWorker.cpp + AbstractWorker.h + AbstractWorker.idl + DedicatedWorkerContext.cpp + DedicatedWorkerContext.h + DedicatedWorkerContext.idl + DedicatedWorkerThread.cpp + DedicatedWorkerThread.h + DefaultSharedWorkerRepository.cpp + DefaultSharedWorkerRepository.h + GenericWorkerTask.h + SharedWorkerContext.cpp + SharedWorkerContext.h + SharedWorkerContext.idl + SharedWorker.cpp + SharedWorker.h + SharedWorker.idl + SharedWorkerRepository.h + SharedWorkerThread.cpp + SharedWorkerThread.h + WorkerContext.cpp + WorkerContext.h + WorkerContext.idl + WorkerContextProxy.h + Worker.cpp + Worker.h + Worker.idl + WorkerLoaderProxy.h + WorkerLocation.cpp + WorkerLocation.h + WorkerLocation.idl + WorkerMessagingProxy.cpp + WorkerMessagingProxy.h + WorkerObjectProxy.h + WorkerReportingProxy.h + WorkerRunLoop.cpp + WorkerRunLoop.h + WorkerScriptLoaderClient.h + WorkerScriptLoader.cpp + WorkerScriptLoader.h + WorkerThread.cpp + WorkerThread.h +2 xml/ +0 DOMParser.cpp + DOMParser.h + DOMParser.idl + NativeXPathNSResolver.cpp + NativeXPathNSResolver.h + xmlattrs.in + XMLHttpRequest.cpp + XMLHttpRequestException.h + XMLHttpRequestException.idl + XMLHttpRequest.h + XMLHttpRequest.idl + XMLHttpRequestProgressEvent.h + XMLHttpRequestProgressEvent.idl + XMLHttpRequestUpload.cpp + XMLHttpRequestUpload.h + XMLHttpRequestUpload.idl + XMLSerializer.cpp + XMLSerializer.h + XMLSerializer.idl + XPathEvaluator.cpp + XPathEvaluator.h + XPathEvaluator.idl + XPathException.h + XPathException.idl + XPathExpression.cpp + XPathExpression.h + XPathExpression.idl + XPathExpressionNode.cpp + XPathExpressionNode.h + XPathFunctions.cpp + XPathFunctions.h + XPathGrammar.y + XPathNamespace.cpp + XPathNamespace.h + XPathNodeSet.cpp + XPathNodeSet.h + XPathNSResolver.cpp + XPathNSResolver.h + XPathNSResolver.idl + XPathParser.cpp + XPathParser.h + XPathPath.cpp + XPathPath.h + XPathPredicate.cpp + XPathPredicate.h + XPathResult.cpp + XPathResult.h + XPathResult.idl + XPathStep.cpp + XPathStep.h + XPathUtil.cpp + XPathUtil.h + XPathValue.cpp + XPathValue.h + XPathVariableReference.cpp + XPathVariableReference.h + XSLImportRule.cpp + XSLImportRule.h + XSLStyleSheet.h + XSLStyleSheetLibxslt.cpp + XSLStyleSheetQt.cpp + XSLTExtensions.cpp + XSLTExtensions.h + XSLTProcessor.cpp + XSLTProcessor.h + XSLTProcessor.idl + XSLTProcessorLibxslt.cpp + XSLTProcessorQt.cpp + XSLTUnicodeSort.cpp + XSLTUnicodeSort.h +3 WebKit/ +0 ChangeLog + LICENSE + mac/ +0 Configurations/ +0 Version.xcconfig +2 Workers/ +0 WebWorkersPrivate.h + WebWorkersPrivate.mm +4 WebKit.pri + WebKit/qt/ +0 Api/ +0 headers.pri + qgraphicswebview.cpp + qgraphicswebview.h + qwebdatabase.cpp + qwebdatabase.h + qwebdatabase_p.h + qwebelement.cpp + qwebelement.h + qwebframe.cpp + qwebframe.h + qwebframe_p.h + qwebhistory.cpp + qwebhistory.h + qwebhistoryinterface.cpp + qwebhistoryinterface.h + qwebhistory_p.h + qwebinspector.cpp + qwebinspector.h + qwebinspector_p.h + qwebkitglobal.h + qwebkitversion.cpp + qwebkitversion.h + qwebpage.cpp + qwebpage.h + qwebpage_p.h + qwebplugindatabase.cpp + qwebplugindatabase_p.h + qwebpluginfactory.cpp + qwebpluginfactory.h + qwebsecurityorigin.cpp + qwebsecurityorigin.h + qwebsecurityorigin_p.h + qwebsettings.cpp + qwebsettings.h + qwebview.cpp + qwebview.h +2 ChangeLog + docs/ +0 docs.pri + qtwebkit.qdoc +0 conf +2 qwebview-diagram.png + webkitsnippets/ +0 qtwebkit_build_snippet.qdoc + qtwebkit_qwebinspector_snippet.cpp + qtwebkit_qwebview_snippet.cpp + simple/ +0 main.cpp + simple.pro +2 webelement/ +0 main.cpp + webelement.pro +2 webpage/ +0 main.cpp + webpage.pro +4 tests/ +0 benchmarks/ +0 loading/ +0 tst_loading.cpp + tst_loading.pro +2 painting/ +0 tst_painting.cpp + tst_painting.pro +3 qgraphicswebview/ +0 qgraphicswebview.pro + tst_qgraphicswebview.cpp +2 qwebelement/ +0 image.png + qwebelement.pro + qwebelement.qrc + style2.css + style.css + tst_qwebelement.cpp +2 qwebframe/ +0 image.png + qwebframe.pro + qwebframe.qrc + resources/ +0 image2.png +2 style.css + test1.html + test2.html + tst_qwebframe.cpp +2 qwebhistory/ +0 data/ +0 page1.html + page2.html + page3.html + page4.html + page5.html + page6.html +3 qwebhistoryinterface/ +0 qwebhistoryinterface.pro + tst_qwebhistoryinterface.cpp +2 qwebhistory/qwebhistory.pro + qwebhistory/tst_qwebhistory.cpp + qwebhistory/tst_qwebhistory.qrc + qwebpage/ +0 frametest/ +0 frame_a.html + iframe2.html + iframe3.html + iframe.html + index.html +2 qwebpage.pro + tst_qwebpage.cpp + tst_qwebpage.qrc +2 qwebplugindatabase/ +0 qwebplugindatabase.pro + tst_qwebplugindatabase.cpp +2 qwebview/ +0 data/ +0 frame_a.html + index.html +2 .gitignore + qwebview.pro + tst_qwebview.cpp + tst_qwebview.qrc +2 resources/ +0 test.swf +2 tests.pro + util.h +2 WebCoreSupport/ +0 ChromeClientQt.cpp + ChromeClientQt.h + ContextMenuClientQt.cpp + ContextMenuClientQt.h + DragClientQt.cpp + DragClientQt.h + EditCommandQt.cpp + EditCommandQt.h + EditorClientQt.cpp + EditorClientQt.h + FrameLoaderClientQt.cpp + FrameLoaderClientQt.h + InspectorClientQt.cpp + InspectorClientQt.h +2 WebKit_pch.h +2 WebKit/scripts/ +0 generate-webkitversion.pl +2 WebKit/StringsNotToBeLocalized.txt +2 wintab/ +0 pktdef.h + wintab.h +2 xorg/ +0 wacomcfg.h +2 zlib/ +0 adler32.c + algorithm.txt + ChangeLog + compress.c + configure + crc32.c + crc32.h + deflate.c + deflate.h + example.c + examples/ +0 fitblk.c + gun.c + gzappend.c + gzjoin.c + gzlog.c + gzlog.h + README.examples + zlib_how.html + zpipe.c + zran.c +2 FAQ + gzio.c + INDEX + infback.c + inffast.c + inffast.h + inffixed.h + inflate.c + inflate.h + inftrees.c + inftrees.h + Makefile +0 .in +2 make_vms.com + minigzip.c + projects/ +0 README.projects + visualc6/ +0 example.dsp + minigzip.dsp + README.txt + zlib.dsp + zlib.dsw +3 README + trees.c + trees.h + uncompr.c + win32/ +0 DLL_FAQ.txt + Makefile.bor + Makefile.emx + Makefile.gcc + Makefile.msc + VisualC.txt + zlib1.rc + zlib.def +2 zconf.h + zconf.in.h + zlib.3 + zlib.h + zutil.c + zutil.h +3 activeqt/ +0 activeqt.pro + container/ +0 container.pro + qaxbase.cpp + qaxbase.h + qaxdump.cpp + qaxobject.cpp + qaxobject.h + qaxscript.cpp + qaxscript.h + qaxscriptwrapper.cpp + qaxselect.cpp + qaxselect.h + qaxselect.ui + qaxwidget.cpp + qaxwidget.h +2 control/ +0 control.pro + qaxaggregated.h + qaxbindable.cpp + qaxbindable.h + qaxfactory.cpp + qaxfactory.h + qaxmain.cpp + qaxserverbase.cpp + qaxserver.cpp + qaxserver.def + qaxserverdll.cpp + qaxserver.ico + qaxservermain.cpp + qaxserver.rc +2 shared/ +0 qaxtypes.cpp + qaxtypes.h +3 corelib/ +0 animation/ +0 animation.pri + qabstractanimation.cpp + qabstractanimation.h + qabstractanimation_p.h + qanimationgroup.cpp + qanimationgroup.h + qanimationgroup_p.h + qparallelanimationgroup.cpp + qparallelanimationgroup.h + qparallelanimationgroup_p.h + qpauseanimation.cpp + qpauseanimation.h + qpropertyanimation.cpp + qpropertyanimation.h + qpropertyanimation_p.h + qsequentialanimationgroup.cpp + qsequentialanimationgroup.h + qsequentialanimationgroup_p.h + qvariantanimation.cpp + qvariantanimation.h + qvariantanimation_p.h +2 arch/ +0 alpha/ +0 arch.pri + qatomic_alpha.s +2 arch.pri + arm/ +0 arch.pri + qatomic_arm.cpp +2 armv6/ +0 arch.pri + qatomic_generic_armv6.cpp +2 avr32/ +0 arch.pri +2 bfin/ +0 arch.pri +2 generic/ +0 arch.pri + qatomic_generic_unix.cpp + qatomic_generic_windows.cpp +2 i386/ +0 arch.pri + qatomic_i386.s +2 ia64/ +0 arch.pri + qatomic_ia64.s +2 macosx/ +0 arch.pri + qatomic32_ppc.s +2 mips/ +0 arch.pri + qatomic_mips32.s + qatomic_mips64.s +2 parisc/ +0 arch.pri + qatomic_parisc.cpp + q_ldcw.s +2 powerpc/ +0 arch.pri + qatomic32.s + qatomic64.s +2 qatomic_alpha.h + qatomic_arch.h + qatomic_arm.h + qatomic_armv6.h + qatomic_avr32.h + qatomic_bfin.h + qatomic_bootstrap.h + qatomic_generic.h + qatomic_i386.h + qatomic_ia64.h + qatomic_macosx.h + qatomic_mips.h + qatomic_parisc.h + qatomic_powerpc.h + qatomic_s390.h + qatomic_sh4a.h + qatomic_sh.h + qatomic_sparc.h + qatomic_symbian.h + qatomic_vxworks.h + qatomic_windowsce.h + qatomic_windows.h + qatomic_x86_64.h + s390/ +0 arch.pri +2 sh/ + sh4a/ +0 arch.pri +2 sh/arch.pri + sh/qatomic_sh.cpp + sparc/ +0 arch.pri + qatomic32.s + qatomic64.s + qatomic_sparc.cpp +2 symbian/ +0 arch.pri + qatomic_symbian.cpp +2 vxworks/ +0 arch.pri + qatomic_ppc.s +2 windows/ +0 arch.pri +2 x86_64/ +0 arch.pri + qatomic_sun.s +3 codecs/ +0 codecs.pri + codecs.qdoc + qfontlaocodec.cpp + qfontlaocodec_p.h + qiconvcodec.cpp + qiconvcodec_p.h + qisciicodec.cpp + qisciicodec_p.h + qlatincodec.cpp + qlatincodec_p.h + qsimplecodec.cpp + qsimplecodec_p.h + qtextcodec.cpp + qtextcodec.h + qtextcodec_p.h + qtextcodecplugin.cpp + qtextcodecplugin.h + qtsciicodec.cpp + qtsciicodec_p.h + qutfcodec.cpp + qutfcodec_p.h +2 concurrent/ +0 concurrent.pri + qfuture.cpp + qfuture.h + qfutureinterface.cpp + qfutureinterface.h + qfutureinterface_p.h + qfuturesynchronizer.cpp + qfuturesynchronizer.h + qfuturewatcher.cpp + qfuturewatcher.h + qfuturewatcher_p.h + qrunnable.cpp + qrunnable.h + qtconcurrentcompilertest.h + qtconcurrentexception.cpp + qtconcurrentexception.h + qtconcurrentfilter.cpp + qtconcurrentfilter.h + qtconcurrentfilterkernel.h + qtconcurrentfunctionwrappers.h + qtconcurrentiteratekernel.cpp + qtconcurrentiteratekernel.h + qtconcurrentmap.cpp + qtconcurrentmap.h + qtconcurrentmapkernel.h + qtconcurrentmedian.h + qtconcurrentreducekernel.h + qtconcurrentresultstore.cpp + qtconcurrentresultstore.h + qtconcurrentrunbase.h + qtconcurrentrun.cpp + qtconcurrentrun.h + qtconcurrentstoredfunctioncall.h + qtconcurrentthreadengine.cpp + qtconcurrentthreadengine.h + qthreadpool.cpp + qthreadpool.h + qthreadpool_p.h +2 corelib.pro + eval.pri + global/ +0 global.pri + qconfig-dist.h + qconfig-large.h + qconfig-medium.h + qconfig-minimal.h + qconfig-small.h + qendian.h + qendian.qdoc + qfeatures.h + qfeatures.txt + qglobal.cpp + qglobal.h + qlibraryinfo.cpp + qlibraryinfo.h + qmalloc.cpp + qnamespace.h + qnamespace.qdoc + qnumeric.cpp + qnumeric.h + qnumeric_p.h + qt_pch.h + qt_windows.h +2 io/ +0 io.pri + qabstractfileengine.cpp + qabstractfileengine.h + qabstractfileengine_p.h + qbuffer.cpp + qbuffer.h + qdatastream.cpp + qdatastream.h + qdatastream_p.h + qdebug.cpp + qdebug.h + qdir.cpp + qdir.h + qdiriterator.cpp + qdiriterator.h + qfile.cpp + qfile.h + qfileinfo.cpp + qfileinfo.h + qfileinfo_p.h + qfile_p.h + qfilesystemwatcher.cpp + qfilesystemwatcher_dnotify.cpp + qfilesystemwatcher_dnotify_p.h + qfilesystemwatcher_fsevents.cpp + qfilesystemwatcher_fsevents_p.h + qfilesystemwatcher.h + qfilesystemwatcher_inotify.cpp + qfilesystemwatcher_inotify_p.h + qfilesystemwatcher_kqueue.cpp + qfilesystemwatcher_kqueue_p.h + qfilesystemwatcher_p.h + qfilesystemwatcher_symbian.cpp + qfilesystemwatcher_symbian_p.h + qfilesystemwatcher_win.cpp + qfilesystemwatcher_win_p.h + qfsfileengine.cpp + qfsfileengine.h + qfsfileengine_iterator.cpp + qfsfileengine_iterator_p.h + qfsfileengine_iterator_unix.cpp + qfsfileengine_iterator_win.cpp + qfsfileengine_p.h + qfsfileengine_unix.cpp + qfsfileengine_win.cpp + qiodevice.cpp + qiodevice.h + qiodevice_p.h + qnoncontiguousbytedevice.cpp + qnoncontiguousbytedevice_p.h + qprocess.cpp + qprocess.h + qprocess_p.h + qprocess_symbian.cpp + qprocess_unix.cpp + qprocess_win.cpp + qresource.cpp + qresource.h + qresource_iterator.cpp + qresource_iterator_p.h + qresource_p.h + qsettings.cpp + qsettings.h + qsettings_mac.cpp + qsettings_p.h + qsettings_win.cpp + qtemporaryfile.cpp + qtemporaryfile.h + qtextstream.cpp + qtextstream.h + qurl.cpp + qurl.h + qwindowspipewriter.cpp + qwindowspipewriter_p.h +2 kernel/ +0 kernel.pri + qabstracteventdispatcher.cpp + qabstracteventdispatcher.h + qabstracteventdispatcher_p.h + qabstractitemmodel.cpp + qabstractitemmodel.h + qabstractitemmodel_p.h + qbasictimer.cpp + qbasictimer.h + qcoreapplication.cpp + qcoreapplication.h + qcoreapplication_mac.cpp + qcoreapplication_p.h + qcoreapplication_win.cpp + qcorecmdlineargs_p.h + qcoreevent.cpp + qcoreevent.h + qcoreglobaldata.cpp + qcoreglobaldata_p.h + qcore_mac.cpp + qcore_mac_p.h + qcore_symbian_p.cpp + qcore_symbian_p.h + qcore_unix.cpp + qcore_unix_p.h + qcrashhandler.cpp + qcrashhandler_p.h + qeventdispatcher_glib.cpp + qeventdispatcher_glib_p.h + qeventdispatcher_symbian.cpp + qeventdispatcher_symbian_p.h + qeventdispatcher_unix.cpp + qeventdispatcher_unix_p.h + qeventdispatcher_win.cpp + qeventdispatcher_win_p.h + qeventloop.cpp + qeventloop.h + qfunctions_p.h + qfunctions_vxworks.cpp + qfunctions_vxworks.h + qfunctions_wince.cpp + qfunctions_wince.h + qguard_p.h + qmath.cpp + qmath.h + qmetaobject.cpp + qmetaobject.h + qmetaobject_p.h + qmetatype.cpp + qmetatype.h + qmimedata.cpp + qmimedata.h + qobjectcleanuphandler.cpp + qobjectcleanuphandler.h + qobject.cpp + qobjectdefs.h + qobject.h + qobject_p.h + qpointer.cpp + qpointer.h + qsharedmemory.cpp + qsharedmemory.h + qsharedmemory_p.h + qsharedmemory_symbian.cpp + qsharedmemory_unix.cpp + qsharedmemory_win.cpp + qsignalmapper.cpp + qsignalmapper.h + qsocketnotifier.cpp + qsocketnotifier.h + qsystemsemaphore.cpp + qsystemsemaphore.h + qsystemsemaphore_p.h + qsystemsemaphore_symbian.cpp + qsystemsemaphore_unix.cpp + qsystemsemaphore_win.cpp + qtcore_eval.cpp + qtimer.cpp + qtimer.h + qtranslator.cpp + qtranslator.h + qtranslator_p.h + qvariant.cpp + qvariant.h + qvariant_p.h + qwineventnotifier_p.cpp + qwineventnotifier_p.h +2 plugin/ +0 plugin.pri + qfactoryinterface.h + qfactoryloader.cpp + qfactoryloader_p.h + qlibrary.cpp + qlibrary.h + qlibrary_p.h + qlibrary_unix.cpp + qlibrary_win.cpp + qplugin.h + qpluginloader.cpp + qpluginloader.h + qplugin.qdoc + quuid.cpp + quuid.h +2 QtCore.dynlist + statemachine/ +0 qabstractstate.cpp + qabstractstate.h + qabstractstate_p.h + qabstracttransition.cpp + qabstracttransition.h + qabstracttransition_p.h + qeventtransition.cpp + qeventtransition.h + qeventtransition_p.h + qfinalstate.cpp + qfinalstate.h + qhistorystate.cpp + qhistorystate.h + qhistorystate_p.h + qsignaleventgenerator_p.h + qsignaltransition.cpp + qsignaltransition.h + qsignaltransition_p.h + qstate.cpp + qstate.h + qstatemachine.cpp + qstatemachine.h + qstatemachine_p.h + qstate_p.h + statemachine.pri +2 thread/ +0 qatomic.cpp + qatomic.h + qbasicatomic.h + qmutex.cpp + qmutex.h + qmutex_p.h + qmutexpool.cpp + qmutexpool_p.h + qmutex_unix.cpp + qmutex_win.cpp + qorderedmutexlocker_p.h + qreadwritelock.cpp + qreadwritelock.h + qreadwritelock_p.h + qsemaphore.cpp + qsemaphore.h + qthread.cpp + qthread.h + qthread_p.h + qthreadstorage.cpp + qthreadstorage.h + qthread_unix.cpp + qthread_win.cpp + qwaitcondition.h + qwaitcondition.qdoc + qwaitcondition_unix.cpp + qwaitcondition_win.cpp + thread.pri +2 tools/ +0 qalgorithms.h + qalgorithms.qdoc + qbitarray.cpp + qbitarray.h + qbytearray.cpp + qbytearray.h + qbytearraymatcher.cpp + qbytearraymatcher.h + qbytedata_p.h + qcache.h + qcache.qdoc + qchar.cpp + qchar.h + qcontainerfwd.h + qcontiguouscache.cpp + qcontiguouscache.h + qcryptographichash.cpp + qcryptographichash.h + qdatetime.cpp + qdatetime.h + qdatetime_p.h + qeasingcurve.cpp + qeasingcurve.h + qharfbuzz.cpp + qharfbuzz_p.h + qhash.cpp + qhash.h + qiterator.h + qiterator.qdoc + qline.cpp + qline.h + qlinkedlist.cpp + qlinkedlist.h + qlist.cpp + qlist.h + qlocale.cpp + qlocale_data_p.h + qlocale.h + qlocale_p.h + qlocale_symbian.cpp + qmap.cpp + qmap.h + qmargins.cpp + qmargins.h + qpair.h + qpair.qdoc + qpodlist_p.h + qpoint.cpp + qpoint.h + qqueue.cpp + qqueue.h + qrect.cpp + qrect.h + qregexp.cpp + qregexp.h + qringbuffer_p.h + qscopedpointer.cpp + qscopedpointer.h + qscopedpointer_p.h + qset.h + qset.qdoc + qshareddata.cpp + qshareddata.h + qsharedpointer.cpp + qsharedpointer.h + qsharedpointer_impl.h + qsize.cpp + qsize.h + qstack.cpp + qstack.h + qstringbuilder.cpp + qstringbuilder.h + qstring.cpp + qstring.h + qstringlist.cpp + qstringlist.h + qstringmatcher.cpp + qstringmatcher.h + qtextboundaryfinder.cpp + qtextboundaryfinder.h + qtimeline.cpp + qtimeline.h + qtools_p.h + qunicodetables.cpp + qunicodetables_p.h + qvarlengtharray.h + qvarlengtharray.qdoc + qvector.cpp + qvector.h + qvsnprintf.cpp + tools.pri +2 xml/ +0 .gitignore + make-parser.sh + qxmlstream.cpp + qxmlstream.g + qxmlstream.h + qxmlstream_p.h + qxmlutils.cpp + qxmlutils_p.h + xml.pri +3 dbus/ +0 dbus.pro + qdbusabstractadaptor.cpp + qdbusabstractadaptor.h + qdbusabstractadaptor_p.h + qdbusabstractinterface.cpp + qdbusabstractinterface.h + qdbusabstractinterface_p.h + qdbusargument.cpp + qdbusargument.h + qdbusargument_p.h + qdbusconnection.cpp + qdbusconnection.h + qdbusconnectioninterface.cpp + qdbusconnectioninterface.h + qdbusconnection_p.h + qdbuscontext.cpp + qdbuscontext.h + qdbuscontext_p.h + qdbusdemarshaller.cpp + qdbuserror.cpp + qdbuserror.h + qdbusextratypes.cpp + qdbusextratypes.h + qdbusintegrator.cpp + qdbusintegrator_p.h + qdbusinterface.cpp + qdbusinterface.h + qdbusinterface_p.h + qdbusinternalfilters.cpp + qdbusintrospection.cpp + qdbusintrospection_p.h + qdbusmacros.h + qdbusmarshaller.cpp + qdbusmessage.cpp + qdbusmessage.h + qdbusmessage_p.h + qdbusmetaobject.cpp + qdbusmetaobject_p.h + qdbusmetatype.cpp + qdbusmetatype.h + qdbusmetatype_p.h + qdbusmisc.cpp + qdbuspendingcall.cpp + qdbuspendingcall.h + qdbuspendingcall_p.h + qdbuspendingreply.cpp + qdbuspendingreply.h + qdbusreply.cpp + qdbusreply.h + qdbusserver.cpp + qdbusserver.h + qdbusservicewatcher.cpp + qdbusservicewatcher.h + qdbus_symbols.cpp + qdbus_symbols_p.h + qdbusthreaddebug_p.h + qdbusutil.cpp + qdbusutil_p.h + qdbusxmlgenerator.cpp + qdbusxmlparser.cpp + qdbusxmlparser_p.h +2 gui/ +0 accessible/ +0 accessible.pri + qaccessible2.cpp + qaccessible2.h + qaccessiblebridge.cpp + qaccessiblebridge.h + qaccessible.cpp + qaccessible.h + qaccessible_mac_carbon.cpp + qaccessible_mac_cocoa.mm + qaccessible_mac.mm + qaccessible_mac_p.h + qaccessibleobject.cpp + qaccessibleobject.h + qaccessibleplugin.cpp + qaccessibleplugin.h + qaccessible_unix.cpp + qaccessiblewidget.cpp + qaccessiblewidget.h + qaccessible_win.cpp +2 animation/ +0 animation.pri + qguivariantanimation.cpp +2 dialogs/ +0 dialogs.pri + images/ +0 fit-page-24.png + fit-page-32.png + fit-width-24.png + fit-width-32.png + go-first-24.png + go-first-32.png + go-last-24.png + go-last-32.png + go-next-24.png + go-next-32.png + go-previous-24.png + go-previous-32.png + layout-landscape-24.png + layout-landscape-32.png + layout-portrait-24.png + layout-portrait-32.png + page-setup-24.png + page-setup-32.png + print-24.png + print-32.png + qtlogo-64.png + status-color.png + status-gray-scale.png + view-page-multi-24.png + view-page-multi-32.png + view-page-one-24.png + view-page-one-32.png + view-page-sided-24.png + view-page-sided-32.png + zoom-in-24.png + zoom-in-32.png + zoom-out-24.png + zoom-out-32.png +2 qabstractpagesetupdialog.cpp + qabstractpagesetupdialog.h + qabstractpagesetupdialog_p.h + qabstractprintdialog.cpp + qabstractprintdialog.h + qabstractprintdialog_p.h + qcolordialog.cpp + qcolordialog.h + qcolordialog_mac.mm + qcolordialog_p.h + qdialog.cpp + qdialog.h + qdialog_p.h + qdialogsbinarycompat_win.cpp + qerrormessage.cpp + qerrormessage.h + qfiledialog.cpp + qfiledialog_embedded.ui + qfiledialog.h + qfiledialog_mac.mm + qfiledialog_p.h + qfiledialog.ui + qfiledialog_win.cpp + qfileinfogatherer.cpp + qfileinfogatherer_p.h + qfilesystemmodel.cpp + qfilesystemmodel.h + qfilesystemmodel_p.h + qfontdialog.cpp + qfontdialog.h + qfontdialog_mac.mm + qfontdialog_p.h + qfscompleter_p.h + qinputdialog.cpp + qinputdialog.h + qmessagebox.cpp + qmessagebox.h + qmessagebox.qrc + qnspanelproxy_mac.mm + qpagesetupdialog.cpp + qpagesetupdialog.h + qpagesetupdialog_mac.mm + qpagesetupdialog_unix.cpp + qpagesetupdialog_unix_p.h + qpagesetupdialog_win.cpp + qpagesetupwidget.ui + qprintdialog.h + qprintdialog_mac.mm + qprintdialog.qdoc + qprintdialog.qrc + qprintdialog_qws.cpp + qprintdialog_unix.cpp + qprintdialog_win.cpp + qprintpreviewdialog.cpp + qprintpreviewdialog.h + qprintpropertieswidget.ui + qprintsettingsoutput.ui + qprintwidget.ui + qprogressdialog.cpp + qprogressdialog.h + qsidebar.cpp + qsidebar_p.h + qwizard.cpp + qwizard.h + qwizard_win.cpp + qwizard_win_p.h +2 effects/ +0 effects.pri + qgraphicseffect.cpp + qgraphicseffect.h + qgraphicseffect_p.h +2 egl/ +0 egl.pri + qegl.cpp + qegl_p.h + qeglproperties.cpp + qeglproperties_p.h + qegl_qws.cpp + qegl_symbian.cpp + qegl_wince.cpp + qegl_x11.cpp +2 embedded/ +0 directfb.pri + embedded.pri + qcopchannel_qws.cpp + qcopchannel_qws.h + qdecorationdefault_qws.cpp + qdecorationdefault_qws.h + qdecorationfactory_qws.cpp + qdecorationfactory_qws.h + qdecorationplugin_qws.cpp + qdecorationplugin_qws.h + qdecoration_qws.cpp + qdecoration_qws.h + qdecorationstyled_qws.cpp + qdecorationstyled_qws.h + qdecorationwindows_qws.cpp + qdecorationwindows_qws.h + qdirectpainter_qws.cpp + qdirectpainter_qws.h + qkbd_defaultmap_qws_p.h + qkbddriverfactory_qws.cpp + qkbddriverfactory_qws.h + qkbddriverplugin_qws.cpp + qkbddriverplugin_qws.h + qkbdlinuxinput_qws.cpp + qkbdlinuxinput_qws.h + qkbdqnx_qws.cpp + qkbdqnx_qws.h + qkbd_qws.cpp + qkbd_qws.h + qkbd_qws_p.h + qkbdtty_qws.cpp + qkbdtty_qws.h + qkbdum_qws.cpp + qkbdum_qws.h + qkbdvfb_qws.cpp + qkbdvfb_qws.h + qlock.cpp + qlock_p.h + qmousedriverfactory_qws.cpp + qmousedriverfactory_qws.h + qmousedriverplugin_qws.cpp + qmousedriverplugin_qws.h + qmouselinuxinput_qws.cpp + qmouselinuxinput_qws.h + qmouselinuxtp_qws.cpp + qmouselinuxtp_qws.h + qmousepc_qws.cpp + qmousepc_qws.h + qmouseqnx_qws.cpp + qmouseqnx_qws.h + qmouse_qws.cpp + qmouse_qws.h + qmousetslib_qws.cpp + qmousetslib_qws.h + qmousevfb_qws.cpp + qmousevfb_qws.h + qscreendriverfactory_qws.cpp + qscreendriverfactory_qws.h + qscreendriverplugin_qws.cpp + qscreendriverplugin_qws.h + qscreenlinuxfb_qws.cpp + qscreenlinuxfb_qws.h + qscreenmulti_qws.cpp + qscreenmulti_qws_p.h + qscreenproxy_qws.cpp + qscreenproxy_qws.h + qscreenqnx_qws.cpp + qscreenqnx_qws.h + qscreen_qws.cpp + qscreen_qws.h + qscreentransformed_qws.cpp + qscreentransformed_qws.h + qscreenvfb_qws.cpp + qscreenvfb_qws.h + qsoundqss_qws.cpp + qsoundqss_qws.h + qtransportauthdefs_qws.h + qtransportauth_qws.cpp + qtransportauth_qws.h + qtransportauth_qws_p.h + qunixsocket.cpp + qunixsocket_p.h + qunixsocketserver.cpp + qunixsocketserver_p.h + qvfbhdr.h + qwindowsystem_p.h + qwindowsystem_qws.cpp + qwindowsystem_qws.h + qwscommand_qws.cpp + qwscommand_qws_p.h + qwscursor_qws.cpp + qwscursor_qws.h + qwsdisplay_qws.h + qwsdisplay_qws_p.h + qwsembedwidget.cpp + qwsembedwidget.h + qwsevent_qws.cpp + qwsevent_qws.h + qwslock.cpp + qwslock_p.h + qwsmanager_p.h + qwsmanager_qws.cpp + qwsmanager_qws.h + qwsproperty_qws.cpp + qwsproperty_qws.h + qwsprotocolitem_qws.h + qwssharedmemory.cpp + qwssharedmemory_p.h + qwssignalhandler.cpp + qwssignalhandler_p.h + qwssocket_qws.cpp + qwssocket_qws.h + qwsutils_qws.h +2 graphicsview/ +0 graphicsview.pri + qgraphicsanchorlayout.cpp + qgraphicsanchorlayout.h + qgraphicsanchorlayout_p.cpp + qgraphicsanchorlayout_p.h + qgraphicsgridlayout.cpp + qgraphicsgridlayout.h + qgraphicsitemanimation.cpp + qgraphicsitemanimation.h + qgraphicsitem.cpp + qgraphicsitem.h + qgraphicsitem_p.h + qgraphicslayout.cpp + qgraphicslayout.h + qgraphicslayoutitem.cpp + qgraphicslayoutitem.h + qgraphicslayoutitem_p.h + qgraphicslayout_p.cpp + qgraphicslayout_p.h + qgraphicslinearlayout.cpp + qgraphicslinearlayout.h + qgraphicsproxywidget.cpp + qgraphicsproxywidget.h + qgraphicsproxywidget_p.h + qgraphicsscene_bsp.cpp + qgraphicsscene_bsp_p.h + qgraphicsscenebsptreeindex.cpp + qgraphicsscenebsptreeindex_p.h + qgraphicsscene.cpp + qgraphicssceneevent.cpp + qgraphicssceneevent.h + qgraphicsscene.h + qgraphicssceneindex.cpp + qgraphicssceneindex_p.h + qgraphicsscenelinearindex.cpp + qgraphicsscenelinearindex_p.h + qgraphicsscene_p.h + qgraphicstransform.cpp + qgraphicstransform.h + qgraphicstransform_p.h + qgraphicsview.cpp + qgraphicsview.h + qgraphicsview_p.h + qgraphicswidget.cpp + qgraphicswidget.h + qgraphicswidget_p.cpp + qgraphicswidget_p.h + qgraph_p.h + qgridlayoutengine.cpp + qgridlayoutengine_p.h + qsimplex_p.cpp + qsimplex_p.h +2 gui.pro + image/ +0 image.pri + qbitmap.cpp + qbitmap.h + qbmphandler.cpp + qbmphandler_p.h + qicon.cpp + qiconengine.cpp + qiconengine.h + qiconengineplugin.cpp + qiconengineplugin.h + qicon.h + qiconloader.cpp + qiconloader_p.h + qicon_p.h + qimage.cpp + qimage.h + qimageiohandler.cpp + qimageiohandler.h + qimage_p.h + qimagepixmapcleanuphooks.cpp + qimagepixmapcleanuphooks_p.h + qimagereader.cpp + qimagereader.h + qimagewriter.cpp + qimagewriter.h + qmovie.cpp + qmovie.h + qnativeimage.cpp + qnativeimage_p.h + qpaintengine_pic.cpp + qpaintengine_pic_p.h + qpicture.cpp + qpictureformatplugin.cpp + qpictureformatplugin.h + qpicture.h + qpicture_p.h + qpixmapcache.cpp + qpixmapcache.h + qpixmapcache_p.h + qpixmap.cpp + qpixmapdata.cpp + qpixmapdatafactory.cpp + qpixmapdatafactory_p.h + qpixmapdata_p.h + qpixmapfilter.cpp + qpixmapfilter_p.h + qpixmap.h + qpixmap_mac.cpp + qpixmap_mac_p.h + qpixmap_qws.cpp + qpixmap_raster.cpp + qpixmap_raster_p.h + qpixmap_s60.cpp + qpixmap_s60_p.h + qpixmap_win.cpp + qpixmap_x11.cpp + qpixmap_x11_p.h + qpnghandler.cpp + qpnghandler_p.h + qppmhandler.cpp + qppmhandler_p.h + qxbmhandler.cpp + qxbmhandler_p.h + qxpmhandler.cpp + qxpmhandler_p.h +2 inputmethod/ +0 inputmethod.pri + qcoefepinputcontext_p.h + qcoefepinputcontext_s60.cpp + qinputcontext.cpp + qinputcontextfactory.cpp + qinputcontextfactory.h + qinputcontext.h + qinputcontext_p.h + qinputcontextplugin.cpp + qinputcontextplugin.h + qmacinputcontext_mac.cpp + qmacinputcontext_p.h + qwininputcontext_p.h + qwininputcontext_win.cpp + qwsinputcontext_p.h + qwsinputcontext_qws.cpp + qximinputcontext_p.h + qximinputcontext_x11.cpp +2 itemviews/ +0 itemviews.pri + qabstractitemdelegate.cpp + qabstractitemdelegate.h + qabstractitemview.cpp + qabstractitemview.h + qabstractitemview_p.h + qabstractproxymodel.cpp + qabstractproxymodel.h + qabstractproxymodel_p.h + qbsptree.cpp + qbsptree_p.h + qcolumnview.cpp + qcolumnviewgrip.cpp + qcolumnviewgrip_p.h + qcolumnview.h + qcolumnview_p.h + qdatawidgetmapper.cpp + qdatawidgetmapper.h + qdirmodel.cpp + qdirmodel.h + qfileiconprovider.cpp + qfileiconprovider.h + qheaderview.cpp + qheaderview.h + qheaderview_p.h + qitemdelegate.cpp + qitemdelegate.h + qitemeditorfactory.cpp + qitemeditorfactory.h + qitemeditorfactory_p.h + qitemselectionmodel.cpp + qitemselectionmodel.h + qitemselectionmodel_p.h + qlistview.cpp + qlistview.h + qlistview_p.h + qlistwidget.cpp + qlistwidget.h + qlistwidget_p.h + qproxymodel.cpp + qproxymodel.h + qproxymodel_p.h + qsortfilterproxymodel.cpp + qsortfilterproxymodel.h + qstandarditemmodel.cpp + qstandarditemmodel.h + qstandarditemmodel_p.h + qstringlistmodel.cpp + qstringlistmodel.h + qstyleditemdelegate.cpp + qstyleditemdelegate.h + qtableview.cpp + qtableview.h + qtableview_p.h + qtablewidget.cpp + qtablewidget.h + qtablewidget_p.h + qtreeview.cpp + qtreeview.h + qtreeview_p.h + qtreewidget.cpp + qtreewidget.h + qtreewidgetitemiterator.cpp + qtreewidgetitemiterator.h + qtreewidgetitemiterator_p.h + qtreewidget_p.h + qwidgetitemdata_p.h +2 kernel/ +0 kernel.pri + mac.pri + qaction.cpp + qactiongroup.cpp + qactiongroup.h + qaction.h + qaction_p.h + qapplication.cpp + qapplication.h + qapplication_mac.mm + qapplication_p.h + qapplication_qws.cpp + qapplication_s60.cpp + qapplication_win.cpp + qapplication_x11.cpp + qboxlayout.cpp + qboxlayout.h + qclipboard.cpp + qclipboard.h + qclipboard_mac.cpp + qclipboard_p.h + qclipboard_qws.cpp + qclipboard_s60.cpp + qclipboard_win.cpp + qclipboard_x11.cpp + qcocoaapplicationdelegate_mac.mm + qcocoaapplicationdelegate_mac_p.h + qcocoaapplication_mac.mm + qcocoaapplication_mac_p.h + qcocoamenuloader_mac.mm + qcocoamenuloader_mac_p.h + qcocoapanel_mac.mm + qcocoapanel_mac_p.h + qcocoaview_mac.mm + qcocoaview_mac_p.h + qcocoawindowcustomthemeframe_mac.mm + qcocoawindowcustomthemeframe_mac_p.h + qcocoawindowdelegate_mac.mm + qcocoawindowdelegate_mac_p.h + qcocoawindow_mac.mm + qcocoawindow_mac_p.h + qcursor.cpp + qcursor.h + qcursor_mac.mm + qcursor_p.h + qcursor_qws.cpp + qcursor_s60.cpp + qcursor_win.cpp + qcursor_x11.cpp + qdesktopwidget.cpp + qdesktopwidget.h + qdesktopwidget_mac.mm + qdesktopwidget_mac_p.h + qdesktopwidget.qdoc + qdesktopwidget_qws.cpp + qdesktopwidget_s60.cpp + qdesktopwidget_win.cpp + qdesktopwidget_x11.cpp + qdnd.cpp + qdnd_mac.mm + qdnd_p.h + qdnd_qws.cpp + qdnd_s60.cpp + qdnd_win.cpp + qdnd_x11.cpp + qdrag.cpp + qdrag.h + qevent.cpp + qeventdispatcher_glib_qws.cpp + qeventdispatcher_glib_qws_p.h + qeventdispatcher_mac.mm + qeventdispatcher_mac_p.h + qeventdispatcher_qws.cpp + qeventdispatcher_qws_p.h + qeventdispatcher_s60.cpp + qeventdispatcher_s60_p.h + qeventdispatcher_x11.cpp + qeventdispatcher_x11_p.h + qevent.h + qevent_p.h + qformlayout.cpp + qformlayout.h + qgesture.cpp + qgesture.h + qgesturemanager.cpp + qgesturemanager_p.h + qgesture_p.h + qgesturerecognizer.cpp + qgesturerecognizer.h + qgridlayout.cpp + qgridlayout.h + qguieventdispatcher_glib.cpp + qguieventdispatcher_glib_p.h + qguifunctions_wince.cpp + qguifunctions_wince.h + qguiplatformplugin.cpp + qguiplatformplugin_p.h + qguivariant.cpp + qkde.cpp + qkde_p.h + qkeymapper.cpp + qkeymapper_mac.cpp + qkeymapper_p.h + qkeymapper_qws.cpp + qkeymapper_s60.cpp + qkeymapper_win.cpp + qkeymapper_x11.cpp + qkeymapper_x11_p.cpp + qkeysequence.cpp + qkeysequence.h + qkeysequence_p.h + qlayout.cpp + qlayoutengine.cpp + qlayoutengine_p.h + qlayout.h + qlayoutitem.cpp + qlayoutitem.h + qlayout_p.h + qmacdefines_mac.h + qmacgesturerecognizer_mac.mm + qmacgesturerecognizer_mac_p.h + qmime.cpp + qmime.h + qmime_mac.cpp + qmime_win.cpp + qmotifdnd_x11.cpp + qmultitouch_mac.mm + qmultitouch_mac_p.h + qnsframeview_mac_p.h + qnsthemeframe_mac_p.h + qnstitledframe_mac_p.h + qole_win.cpp + qpalette.cpp + qpalette.h + qsessionmanager.h + qsessionmanager_qws.cpp + qshortcut.cpp + qshortcut.h + qshortcutmap.cpp + qshortcutmap_p.h + qsizepolicy.h + qsizepolicy.qdoc + qsoftkeymanager.cpp + qsoftkeymanager_p.h + qsound.cpp + qsound.h + qsound_mac.mm + qsound_p.h + qsound_qws.cpp + qsound_s60.cpp + qsound_win.cpp + qsound_x11.cpp + qstackedlayout.cpp + qstackedlayout.h + qstandardgestures.cpp + qstandardgestures_p.h + qt_cocoa_helpers_mac.mm + qt_cocoa_helpers_mac_p.h + qt_gui_pch.h + qt_mac.cpp + qt_mac_p.h + qtooltip.cpp + qtooltip.h + qt_s60_p.h + qt_x11_p.h + qwhatsthis.cpp + qwhatsthis.h + qwidgetaction.cpp + qwidgetaction.h + qwidgetaction_p.h + qwidget.cpp + qwidgetcreate_x11.cpp + qwidget.h + qwidget_mac.mm + qwidget_p.h + qwidget_qws.cpp + qwidget_s60.cpp + qwidget_wince.cpp + qwidget_win.cpp + qwidget_x11.cpp + qwindowdefs.h + qwindowdefs_win.h + qwinnativepangesturerecognizer_win.cpp + qwinnativepangesturerecognizer_win_p.h + qx11embed_x11.cpp + qx11embed_x11.h + qx11info_x11.cpp + qx11info_x11.h + symbian.pri + win.pri + x11.pri +2 mac/ +0 images/ +0 copyarrowcursor.png + forbiddencursor.png + leopard-unified-toolbar-on.png + pluscursor.png + spincursor.png + waitcursor.png +2 macresources.qrc + qt_menu.nib/ +0 classes.nib + info.nib + keyedobjects.nib +3 math3d/ +0 math3d.pri + qgenericmatrix.cpp + qgenericmatrix.h + qmatrix4x4.cpp + qmatrix4x4.h + qquaternion.cpp + qquaternion.h + qvector2d.cpp + qvector2d.h + qvector3d.cpp + qvector3d.h + qvector4d.cpp + qvector4d.h +2 painting/ +0 makepsheader.pl + painting.pri + qbackingstore.cpp + qbackingstore_p.h + qbezier.cpp + qbezier_p.h + qblendfunctions_armv6_rvct.s + qblendfunctions.cpp + qbrush.cpp + qbrush.h + qcolor.cpp + qcolor.h + qcolormap.h + qcolormap_mac.cpp + qcolormap.qdoc + qcolormap_qws.cpp + qcolormap_s60.cpp + qcolormap_win.cpp + qcolormap_x11.cpp + qcolor_p.cpp + qcolor_p.h + qcssutil.cpp + qcssutil_p.h + qcups.cpp + qcups_p.h + qdatabuffer_p.h + qdrawhelper_armv6_p.h + qdrawhelper_armv6_rvct.inc + qdrawhelper_armv6_rvct.s + qdrawhelper.cpp + qdrawhelper_iwmmxt.cpp + qdrawhelper_mmx3dnow.cpp + qdrawhelper_mmx.cpp + qdrawhelper_mmx_p.h + qdrawhelper_p.h + qdrawhelper_sse2.cpp + qdrawhelper_sse3dnow.cpp + qdrawhelper_sse.cpp + qdrawhelper_sse_p.h + qdrawhelper_x86_p.h + qdrawutil.cpp + qdrawutil.h + qemulationpaintengine.cpp + qemulationpaintengine_p.h + qfixed_p.h + qgraphicssystem.cpp + qgraphicssystemfactory.cpp + qgraphicssystemfactory_p.h + qgraphicssystem_mac.cpp + qgraphicssystem_mac_p.h + qgraphicssystem_p.h + qgraphicssystemplugin.cpp + qgraphicssystemplugin_p.h + qgraphicssystem_qws.cpp + qgraphicssystem_qws_p.h + qgraphicssystem_raster.cpp + qgraphicssystem_raster_p.h + qgrayraster.c + qgrayraster_p.h + qimagescale.cpp + qimagescale_p.h + qmath_p.h + qmatrix.cpp + qmatrix.h + qmemrotate.cpp + qmemrotate_p.h + qoutlinemapper.cpp + qoutlinemapper_p.h + qpaintbuffer.cpp + qpaintbuffer_p.h + qpaintdevice.cpp + qpaintdevice.h + qpaintdevice_mac.cpp + qpaintdevice.qdoc + qpaintdevice_qws.cpp + qpaintdevice_win.cpp + qpaintdevice_x11.cpp + qpaintengine_alpha.cpp + qpaintengine_alpha_p.h + qpaintengine.cpp + qpaintengineex.cpp + qpaintengineex_p.h + qpaintengine.h + qpaintengine_mac.cpp + qpaintengine_mac_p.h + qpaintengine_p.h + qpaintengine_preview.cpp + qpaintengine_preview_p.h + qpaintengine_raster.cpp + qpaintengine_raster_p.h + qpaintengine_s60.cpp + qpaintengine_s60_p.h + qpaintengine_x11.cpp + qpaintengine_x11_p.h + qpainter.cpp + qpainter.h + qpainterpath.cpp + qpainterpath.h + qpainterpath_p.h + qpainter_p.h + qpathclipper.cpp + qpathclipper_p.h + qpdf.cpp + qpdf_p.h + qpen.cpp + qpen.h + qpen_p.h + qpolygonclipper_p.h + qpolygon.cpp + qpolygon.h + qprintengine.h + qprintengine_mac.mm + qprintengine_mac_p.h + qprintengine_pdf.cpp + qprintengine_pdf_p.h + qprintengine_ps.cpp + qprintengine_ps_p.h + qprintengine_qws.cpp + qprintengine_qws_p.h + qprintengine_win.cpp + qprintengine_win_p.h + qprinter.cpp + qprinter.h + qprinterinfo.h + qprinterinfo_mac.cpp + qprinterinfo.qdoc + qprinterinfo_unix.cpp + qprinterinfo_unix_p.h + qprinterinfo_win.cpp + qprinter_p.h + qpsprinter.agl + qpsprinter.ps + qrasterdefs_p.h + qrasterizer.cpp + qrasterizer_p.h + qregion.cpp + qregion.h + qregion_mac.cpp + qregion_qws.cpp + qregion_s60.cpp + qregion_win.cpp + qregion_x11.cpp + qrgb.h + qstroker.cpp + qstroker_p.h + qstylepainter.cpp + qstylepainter.h + qtessellator.cpp + qtessellator_p.h + qtextureglyphcache.cpp + qtextureglyphcache_p.h + qtransform.cpp + qtransform.h + qvectorpath_p.h + qwindowsurface.cpp + qwindowsurface_mac.cpp + qwindowsurface_mac_p.h + qwindowsurface_p.h + qwindowsurface_qws.cpp + qwindowsurface_qws_p.h + qwindowsurface_raster.cpp + qwindowsurface_raster_p.h + qwindowsurface_s60.cpp + qwindowsurface_s60_p.h + qwindowsurface_x11.cpp + qwindowsurface_x11_p.h + qwmatrix.h +2 QtGui.dynlist + s60framework/ +0 qs60mainapplication.cpp + qs60mainapplication.h + qs60mainapplication_p.h + qs60mainappui.cpp + qs60mainappui.h + qs60maindocument.cpp + qs60maindocument.h + s60framework.pri + s60main.rss +2 statemachine/ +0 qbasickeyeventtransition.cpp + qbasickeyeventtransition_p.h + qbasicmouseeventtransition.cpp + qbasicmouseeventtransition_p.h + qguistatemachine.cpp + qkeyeventtransition.cpp + qkeyeventtransition.h + qmouseeventtransition.cpp + qmouseeventtransition.h + statemachine.pri +2 styles/ +0 images/ +0 cdr-128.png + cdr-16.png + cdr-32.png + closedock-16.png + closedock-down-16.png + computer-16.png + computer-32.png + defaults60theme.blob + desktop-16.png + desktop-32.png + dirclosed-128.png + dirclosed-16.png + dirclosed-32.png + dirlink-128.png + dirlink-16.png + dirlink-32.png + diropen-128.png + diropen-16.png + diropen-32.png + dockdock-16.png + dockdock-down-16.png + down-128.png + down-16.png + down-32.png + dvd-128.png + dvd-16.png + dvd-32.png + file-128.png + file-16.png + file-32.png + filecontents-128.png + filecontents-16.png + filecontents-32.png + fileinfo-128.png + fileinfo-16.png + fileinfo-32.png + filelink-128.png + filelink-16.png + filelink-32.png + floppy-128.png + floppy-16.png + floppy-32.png + fontbitmap-16.png + fonttruetype-16.png + harddrive-128.png + harddrive-16.png + harddrive-32.png + left-128.png + left-16.png + left-32.png + media-pause-16.png + media-pause-32.png + media-play-16.png + media-play-32.png + media-seek-backward-16.png + media-seek-backward-32.png + media-seek-forward-16.png + media-seek-forward-32.png + media-skip-backward-16.png + media-skip-backward-32.png + media-skip-forward-16.png + media-skip-forward-32.png + media-stop-16.png + media-stop-32.png + media-volume-16.png + media-volume-muted-16.png + networkdrive-128.png + networkdrive-16.png + networkdrive-32.png + newdirectory-128.png + newdirectory-16.png + newdirectory-32.png + parentdir-128.png + parentdir-16.png + parentdir-32.png + refresh-24.png + refresh-32.png + right-128.png + right-16.png + right-32.png + standardbutton-apply-128.png + standardbutton-apply-16.png + standardbutton-apply-32.png + standardbutton-cancel-128.png + standardbutton-cancel-16.png + standardbutton-cancel-32.png + standardbutton-clear-128.png + standardbutton-clear-16.png + standardbutton-clear-32.png + standardbutton-close-128.png + standardbutton-close-16.png + standardbutton-close-32.png + standardbutton-closetab-16.png + standardbutton-closetab-down-16.png + standardbutton-closetab-hover-16.png + standardbutton-delete-128.png + standardbutton-delete-16.png + standardbutton-delete-32.png + standardbutton-help-128.png + standardbutton-help-16.png + standardbutton-help-32.png + standardbutton-no-128.png + standardbutton-no-16.png + standardbutton-no-32.png + standardbutton-ok-128.png + standardbutton-ok-16.png + standardbutton-ok-32.png + standardbutton-open-128.png + standardbutton-open-16.png + standardbutton-open-32.png + standardbutton-save-128.png + standardbutton-save-16.png + standardbutton-save-32.png + standardbutton-yes-128.png + standardbutton-yes-16.png + standardbutton-yes-32.png + stop-24.png + stop-32.png + trash-128.png + trash-16.png + trash-32.png + up-128.png + up-16.png + up-32.png + viewdetailed-128.png + viewdetailed-16.png + viewdetailed-32.png + viewlist-128.png + viewlist-16.png + viewlist-32.png +2 qcdestyle.cpp + qcdestyle.h + qcleanlooksstyle.cpp + qcleanlooksstyle.h + qcleanlooksstyle_p.h + qcommonstyle.cpp + qcommonstyle.h + qcommonstyle_p.h + qcommonstylepixmaps_p.h + qgtkpainter.cpp + qgtkpainter_p.h + qgtkstyle.cpp + qgtkstyle.h + qgtkstyle_p.cpp + qgtkstyle_p.h + qmacstyle_mac.h + qmacstyle_mac.mm + qmacstylepixmaps_mac_p.h + qmacstyle.qdoc + qmotifstyle.cpp + qmotifstyle.h + qmotifstyle_p.h + qplastiquestyle.cpp + qplastiquestyle.h + qproxystyle.cpp + qproxystyle.h + qproxystyle_p.h + qs60style.cpp + qs60style.h + qs60style_p.h + qs60style_s60.cpp + qs60style_simulated.cpp + qstyle.cpp + qstylefactory.cpp + qstylefactory.h + qstyle.h + qstylehelper.cpp + qstylehelper_p.h + qstyleoption.cpp + qstyleoption.h + qstyle_p.h + qstyleplugin.cpp + qstyleplugin.h + qstyle.qrc + qstyle_s60_simulated.qrc + qstylesheetstyle.cpp + qstylesheetstyle_default.cpp + qstylesheetstyle_p.h + qstyle_wince.qrc + qwindowscestyle.cpp + qwindowscestyle.h + qwindowscestyle_p.h + qwindowsmobilestyle.cpp + qwindowsmobilestyle.h + qwindowsmobilestyle_p.h + qwindowsstyle.cpp + qwindowsstyle.h + qwindowsstyle_p.h + qwindowsvistastyle.cpp + qwindowsvistastyle.h + qwindowsvistastyle_p.h + qwindowsxpstyle.cpp + qwindowsxpstyle.h + qwindowsxpstyle_p.h + styles.pri +2 symbian/ +0 images/ +0 blank.png + busy12.png + busy3.png + busy6.png + busy9.png + closehand.png + cross.png + forbidden.png + handpoint.png + ibeam.png + openhand.png + pointer.png + sizeall.png + sizebdiag.png + sizefdiag.png + sizehor.png + sizever.png + splith.png + splitv.png + uparrow.png + wait10.png + wait11.png + wait12.png + wait1.png + wait2.png + wait3.png + wait4.png + wait5.png + wait6.png + wait7.png + wait8.png + wait9.png + whatsthis.png +2 qsymbianevent.cpp + qsymbianevent.h + symbianresources.qrc +2 text/ +0 qabstractfontengine_p.h + qabstractfontengine_qws.cpp + qabstractfontengine_qws.h + qabstracttextdocumentlayout.cpp + qabstracttextdocumentlayout.h + qabstracttextdocumentlayout_p.h + qcssparser.cpp + qcssparser_p.h + qcssscanner.cpp + qfont.cpp + qfontdatabase.cpp + qfontdatabase.h + qfontdatabase_mac.cpp + qfontdatabase_qws.cpp + qfontdatabase_s60.cpp + qfontdatabase_win.cpp + qfontdatabase_x11.cpp + qfontengine.cpp + qfontengine_ft.cpp + qfontengine_ft_p.h + qfontengineglyphcache_p.h + qfontengine_mac.mm + qfontengine_p.h + qfontengine_qpf.cpp + qfontengine_qpf_p.h + qfontengine_qws.cpp + qfontengine_s60.cpp + qfontengine_s60_p.h + qfontengine_win.cpp + qfontengine_win_p.h + qfontengine_x11.cpp + qfontengine_x11_p.h + qfont.h + qfontinfo.h + qfont_mac.cpp + qfontmetrics.cpp + qfontmetrics.h + qfont_p.h + qfont_qws.cpp + qfont_s60.cpp + qfontsubset.cpp + qfontsubset_p.h + qfont_win.cpp + qfont_x11.cpp + qfragmentmap.cpp + qfragmentmap_p.h + qpfutil.cpp + qsyntaxhighlighter.cpp + qsyntaxhighlighter.h + qtextcontrol.cpp + qtextcontrol_p.h + qtextcontrol_p_p.h + qtextcursor.cpp + qtextcursor.h + qtextcursor_p.h + qtextdocument.cpp + qtextdocumentfragment.cpp + qtextdocumentfragment.h + qtextdocumentfragment_p.h + qtextdocument.h + qtextdocumentlayout.cpp + qtextdocumentlayout_p.h + qtextdocument_p.cpp + qtextdocument_p.h + qtextdocumentwriter.cpp + qtextdocumentwriter.h + qtextengine.cpp + qtextengine_mac.cpp + qtextengine_p.h + qtextformat.cpp + qtextformat.h + qtextformat_p.h + qtexthtmlparser.cpp + qtexthtmlparser_p.h + qtextimagehandler.cpp + qtextimagehandler_p.h + qtextlayout.cpp + qtextlayout.h + qtextlist.cpp + qtextlist.h + qtextobject.cpp + qtextobject.h + qtextobject_p.h + qtextodfwriter.cpp + qtextodfwriter_p.h + qtextoption.cpp + qtextoption.h + qtexttable.cpp + qtexttable.h + qtexttable_p.h + qzip.cpp + qzipreader_p.h + qzipwriter_p.h + text.pri +2 util/ +0 qcompleter.cpp + qcompleter.h + qcompleter_p.h + qdesktopservices.cpp + qdesktopservices.h + qdesktopservices_mac.cpp + qdesktopservices_qws.cpp + qdesktopservices_s60.cpp + qdesktopservices_win.cpp + qdesktopservices_x11.cpp + qsystemtrayicon.cpp + qsystemtrayicon.h + qsystemtrayicon_mac.mm + qsystemtrayicon_p.h + qsystemtrayicon_qws.cpp + qsystemtrayicon_win.cpp + qsystemtrayicon_x11.cpp + qundogroup.cpp + qundogroup.h + qundostack.cpp + qundostack.h + qundostack_p.h + qundoview.cpp + qundoview.h + util.pri +2 widgets/ +0 qabstractbutton.cpp + qabstractbutton.h + qabstractbutton_p.h + qabstractscrollarea.cpp + qabstractscrollarea.h + qabstractscrollarea_p.h + qabstractslider.cpp + qabstractslider.h + qabstractslider_p.h + qabstractspinbox.cpp + qabstractspinbox.h + qabstractspinbox_p.h + qbuttongroup.cpp + qbuttongroup.h + qcalendartextnavigator_p.h + qcalendarwidget.cpp + qcalendarwidget.h + qcheckbox.cpp + qcheckbox.h + qcocoamenu_mac.mm + qcocoamenu_mac_p.h + qcocoatoolbardelegate_mac.mm + qcocoatoolbardelegate_mac_p.h + qcombobox.cpp + qcombobox.h + qcombobox_p.h + qcommandlinkbutton.cpp + qcommandlinkbutton.h + qdatetimeedit.cpp + qdatetimeedit.h + qdatetimeedit_p.h + qdial.cpp + qdial.h + qdialogbuttonbox.cpp + qdialogbuttonbox.h + qdockarealayout.cpp + qdockarealayout_p.h + qdockwidget.cpp + qdockwidget.h + qdockwidget_p.h + qeffects.cpp + qeffects_p.h + qfocusframe.cpp + qfocusframe.h + qfontcombobox.cpp + qfontcombobox.h + qframe.cpp + qframe.h + qframe_p.h + qgroupbox.cpp + qgroupbox.h + qlabel.cpp + qlabel.h + qlabel_p.h + qlcdnumber.cpp + qlcdnumber.h + qlinecontrol.cpp + qlinecontrol_p.h + qlineedit.cpp + qlineedit.h + qlineedit_p.cpp + qlineedit_p.h + qmaccocoaviewcontainer_mac.h + qmaccocoaviewcontainer_mac.mm + qmacnativewidget_mac.h + qmacnativewidget_mac.mm + qmainwindow.cpp + qmainwindow.h + qmainwindowlayout.cpp + qmainwindowlayout_mac.mm + qmainwindowlayout_p.h + qmdiarea.cpp + qmdiarea.h + qmdiarea_p.h + qmdisubwindow.cpp + qmdisubwindow.h + qmdisubwindow_p.h + qmenubar.cpp + qmenubar.h + qmenubar_p.h + qmenu.cpp + qmenudata.cpp + qmenudata.h + qmenu.h + qmenu_mac.mm + qmenu_p.h + qmenu_symbian.cpp + qmenu_wince.cpp + qmenu_wince.rc + qmenu_wince_resource_p.h + qplaintextedit.cpp + qplaintextedit.h + qplaintextedit_p.h + qprintpreviewwidget.cpp + qprintpreviewwidget.h + qprogressbar.cpp + qprogressbar.h + qpushbutton.cpp + qpushbutton.h + qpushbutton_p.h + qradiobutton.cpp + qradiobutton.h + qrubberband.cpp + qrubberband.h + qscrollarea.cpp + qscrollarea.h + qscrollarea_p.h + qscrollbar.cpp + qscrollbar.h + qsizegrip.cpp + qsizegrip.h + qslider.cpp + qslider.h + qspinbox.cpp + qspinbox.h + qsplashscreen.cpp + qsplashscreen.h + qsplitter.cpp + qsplitter.h + qsplitter_p.h + qstackedwidget.cpp + qstackedwidget.h + qstatusbar.cpp + qstatusbar.h + qtabbar.cpp + qtabbar.h + qtabbar_p.h + qtabwidget.cpp + qtabwidget.h + qtextbrowser.cpp + qtextbrowser.h + qtextedit.cpp + qtextedit.h + qtextedit_p.h + qtoolbararealayout.cpp + qtoolbararealayout_p.h + qtoolbar.cpp + qtoolbarextension.cpp + qtoolbarextension_p.h + qtoolbar.h + qtoolbarlayout.cpp + qtoolbarlayout_p.h + qtoolbar_p.h + qtoolbarseparator.cpp + qtoolbarseparator_p.h + qtoolbox.cpp + qtoolbox.h + qtoolbutton.cpp + qtoolbutton.h + qvalidator.cpp + qvalidator.h + qwidgetanimator.cpp + qwidgetanimator_p.h + qwidgetresizehandler.cpp + qwidgetresizehandler_p.h + qworkspace.cpp + qworkspace.h + widgets.pri +3 multimedia/ +0 audio/ +0 audio.pri + qaudio.cpp + qaudiodevicefactory.cpp + qaudiodevicefactory_p.h + qaudiodeviceinfo_alsa_p.cpp + qaudiodeviceinfo_alsa_p.h + qaudiodeviceinfo.cpp + qaudiodeviceinfo.h + qaudiodeviceinfo_mac_p.cpp + qaudiodeviceinfo_mac_p.h + qaudiodeviceinfo_win32_p.cpp + qaudiodeviceinfo_win32_p.h + qaudioengine.cpp + qaudioengine.h + qaudioengineplugin.cpp + qaudioengineplugin.h + qaudioformat.cpp + qaudioformat.h + qaudio.h + qaudioinput_alsa_p.cpp + qaudioinput_alsa_p.h + qaudioinput.cpp + qaudioinput.h + qaudioinput_mac_p.cpp + qaudioinput_mac_p.h + qaudioinput_win32_p.cpp + qaudioinput_win32_p.h + qaudio_mac.cpp + qaudio_mac_p.h + qaudiooutput_alsa_p.cpp + qaudiooutput_alsa_p.h + qaudiooutput.cpp + qaudiooutput.h + qaudiooutput_mac_p.cpp + qaudiooutput_mac_p.h + qaudiooutput_win32_p.cpp + qaudiooutput_win32_p.h +2 multimedia.pro + video/ +0 qabstractvideobuffer.cpp + qabstractvideobuffer.h + qabstractvideobuffer_p.h + qabstractvideosurface.cpp + qabstractvideosurface.h + qabstractvideosurface_p.h + qimagevideobuffer.cpp + qimagevideobuffer_p.h + qmemoryvideobuffer.cpp + qmemoryvideobuffer_p.h + qvideoframe.cpp + qvideoframe.h + qvideosurfaceformat.cpp + qvideosurfaceformat.h + video.pri +3 network/ +0 access/ +0 access.pri + qabstractnetworkcache.cpp + qabstractnetworkcache.h + qabstractnetworkcache_p.h + qftp.cpp + qftp.h + qhttp.cpp + qhttp.h + qhttpnetworkconnectionchannel.cpp + qhttpnetworkconnectionchannel_p.h + qhttpnetworkconnection.cpp + qhttpnetworkconnection_p.h + qhttpnetworkheader.cpp + qhttpnetworkheader_p.h + qhttpnetworkreply.cpp + qhttpnetworkreply_p.h + qhttpnetworkrequest.cpp + qhttpnetworkrequest_p.h + qnetworkaccessbackend.cpp + qnetworkaccessbackend_p.h + qnetworkaccesscachebackend.cpp + qnetworkaccesscachebackend_p.h + qnetworkaccesscache.cpp + qnetworkaccesscache_p.h + qnetworkaccessdatabackend.cpp + qnetworkaccessdatabackend_p.h + qnetworkaccessdebugpipebackend.cpp + qnetworkaccessdebugpipebackend_p.h + qnetworkaccessfilebackend.cpp + qnetworkaccessfilebackend_p.h + qnetworkaccessftpbackend.cpp + qnetworkaccessftpbackend_p.h + qnetworkaccesshttpbackend.cpp + qnetworkaccesshttpbackend_p.h + qnetworkaccessmanager.cpp + qnetworkaccessmanager.h + qnetworkaccessmanager_p.h + qnetworkcookie.cpp + qnetworkcookie.h + qnetworkcookiejar.cpp + qnetworkcookiejar.h + qnetworkcookiejar_p.h + qnetworkcookie_p.h + qnetworkdiskcache.cpp + qnetworkdiskcache.h + qnetworkdiskcache_p.h + qnetworkreply.cpp + qnetworkreply.h + qnetworkreplyimpl.cpp + qnetworkreplyimpl_p.h + qnetworkreply_p.h + qnetworkrequest.cpp + qnetworkrequest.h + qnetworkrequest_p.h +2 kernel/ +0 kernel.pri + qauthenticator.cpp + qauthenticator.h + qauthenticator_p.h + qhostaddress.cpp + qhostaddress.h + qhostaddress_p.h + qhostinfo.cpp + qhostinfo.h + qhostinfo_p.h + qhostinfo_unix.cpp + qhostinfo_win.cpp + qnetworkinterface.cpp + qnetworkinterface.h + qnetworkinterface_p.h + qnetworkinterface_symbian.cpp + qnetworkinterface_unix.cpp + qnetworkinterface_win.cpp + qnetworkinterface_win_p.h + qnetworkproxy.cpp + qnetworkproxy_generic.cpp + qnetworkproxy.h + qnetworkproxy_mac.cpp + qnetworkproxy_p.h + qnetworkproxy_win.cpp + qurlinfo.cpp + qurlinfo.h +2 network.pro + network.qrc + socket/ +0 qabstractsocket.cpp + qabstractsocketengine.cpp + qabstractsocketengine_p.h + qabstractsocket.h + qabstractsocket_p.h + qhttpsocketengine.cpp + qhttpsocketengine_p.h + qlocalserver.cpp + qlocalserver.h + qlocalserver_p.h + qlocalserver_tcp.cpp + qlocalserver_unix.cpp + qlocalserver_win.cpp + qlocalsocket.cpp + qlocalsocket.h + qlocalsocket_p.h + qlocalsocket_tcp.cpp + qlocalsocket_unix.cpp + qlocalsocket_win.cpp + qnativesocketengine.cpp + qnativesocketengine_p.h + qnativesocketengine_unix.cpp + qnativesocketengine_win.cpp + qnet_unix_p.h + qsocks5socketengine.cpp + qsocks5socketengine_p.h + qtcpserver.cpp + qtcpserver.h + qtcpsocket.cpp + qtcpsocket.h + qtcpsocket_p.h + qudpsocket.cpp + qudpsocket.h + socket.pri +2 ssl/ +0 qsslcertificate.cpp + qsslcertificate.h + qsslcertificate_p.h + qsslcipher.cpp + qsslcipher.h + qsslcipher_p.h + qsslconfiguration.cpp + qsslconfiguration.h + qsslconfiguration_p.h + qssl.cpp + qsslerror.cpp + qsslerror.h + qssl.h + qsslkey.cpp + qsslkey.h + qsslkey_p.h + qsslsocket.cpp + qsslsocket.h + qsslsocket_openssl.cpp + qsslsocket_openssl_p.h + qsslsocket_openssl_symbols.cpp + qsslsocket_openssl_symbols_p.h + qsslsocket_p.h + qt-ca-bundle.crt + ssl.pri +3 opengl/ +0 gl2paintengineex/ +0 qgl2pexvertexarray.cpp + qgl2pexvertexarray_p.h + qglcustomshaderstage.cpp + qglcustomshaderstage_p.h + qglengineshadermanager.cpp + qglengineshadermanager_p.h + qglengineshadersource_p.h + qglgradientcache.cpp + qglgradientcache_p.h + qpaintengineex_opengl2.cpp + qpaintengineex_opengl2_p.h + qtriangulatingstroker.cpp + qtriangulatingstroker_p.h +2 opengl.pro + qgl_cl_p.h + qglcolormap.cpp + qglcolormap.h + qgl.cpp + qgl_egl.cpp + qgl_egl_p.h + qglextensions.cpp + qglextensions_p.h + qglframebufferobject.cpp + qglframebufferobject.h + qglframebufferobject_p.h + qgl.h + qgl_mac.mm + qglpaintdevice.cpp + qglpaintdevice_p.h + qgl_p.h + qglpixelbuffer.cpp + qglpixelbuffer_egl.cpp + qglpixelbuffer.h + qglpixelbuffer_mac.mm + qglpixelbuffer_p.h + qglpixelbuffer_win.cpp + qglpixelbuffer_x11.cpp + qglpixmapfilter.cpp + qglpixmapfilter_p.h + qgl_qws.cpp + qglscreen_qws.cpp + qglscreen_qws.h + qglshaderprogram.cpp + qglshaderprogram.h + qgl_wince.cpp + qgl_win.cpp + qglwindowsurface_qws.cpp + qglwindowsurface_qws_p.h + qgl_x11.cpp + qgl_x11egl.cpp + qgraphicsshadereffect.cpp + qgraphicsshadereffect_p.h + qgraphicssystem_gl.cpp + qgraphicssystem_gl_p.h + qpaintengine_opengl.cpp + qpaintengine_opengl_p.h + qpixmapdata_gl.cpp + qpixmapdata_gl_p.h + qpixmapdata_x11gl_egl.cpp + qpixmapdata_x11gl_p.h + qwindowsurface_gl.cpp + qwindowsurface_gl_p.h + qwindowsurface_x11gl.cpp + qwindowsurface_x11gl_p.h + util/ +0 brushes.conf + brush_painter.glsl + composition_mode_colorburn.glsl + composition_mode_colordodge.glsl + composition_mode_darken.glsl + composition_mode_difference.glsl + composition_mode_exclusion.glsl + composition_mode_hardlight.glsl + composition_mode_lighten.glsl + composition_mode_multiply.glsl + composition_mode_overlay.glsl + composition_modes.conf + composition_mode_screen.glsl + composition_mode_softlight.glsl + conical_brush.glsl + ellipse_aa.glsl + fast_painter.glsl + fragmentprograms_p.h + generator.cpp + generator.pro + glsl_to_include.sh + linear_brush.glsl + masks.conf + painter.glsl + painter_nomask.glsl + pattern_brush.glsl + radial_brush.glsl + README-GLSL + simple_porter_duff.glsl + solid_brush.glsl + texture_brush.glsl + trap_exact_aa.glsl +3 openvg/ +0 openvg.pro + qpaintengine_vg.cpp + qpaintengine_vg_p.h + qpixmapdata_vg.cpp + qpixmapdata_vg_p.h + qpixmapfilter_vg.cpp + qpixmapfilter_vg_p.h + qvgcompositionhelper_p.h + qvg.h + qvg_p.h + qwindowsurface_vg.cpp + qwindowsurface_vgegl.cpp + qwindowsurface_vgegl_p.h + qwindowsurface_vg_p.h +2 phonon/ +0 phonon.pro +2 plugins/ +0 accessible/ +0 accessible.pro + compat/ +0 compat.pro + main.cpp + q3complexwidgets.cpp + q3complexwidgets.h + q3simplewidgets.cpp + q3simplewidgets.h + qaccessiblecompat.cpp + qaccessiblecompat.h +2 qaccessiblebase.pri + widgets/ +0 complexwidgets.cpp + complexwidgets.h + main.cpp + qaccessiblemenu.cpp + qaccessiblemenu.h + qaccessiblewidgets.cpp + qaccessiblewidgets.h + rangecontrols.cpp + rangecontrols.h + simplewidgets.cpp + simplewidgets.h + widgets.pro +3 audio/ +0 audio.pro +2 codecs/ +0 cn/ +0 cn.pro + main.cpp + qgb18030codec.cpp + qgb18030codec.h +2 codecs.pro + jp/ +0 jp.pro + main.cpp + qeucjpcodec.cpp + qeucjpcodec.h + qfontjpcodec.cpp + qfontjpcodec.h + qjiscodec.cpp + qjiscodec.h + qjpunicode.cpp + qjpunicode.h + qsjiscodec.cpp + qsjiscodec.h +2 kr/ +0 cp949codetbl.h + kr.pro + main.cpp + qeuckrcodec.cpp + qeuckrcodec.h +2 tw/ +0 main.cpp + qbig5codec.cpp + qbig5codec.h + tw.pro +3 decorations/ +0 decorations.pro + default/ +0 default.pro + main.cpp +2 styled/ +0 main.cpp + styled.pro +2 windows/ +0 main.cpp + windows.pro +3 gfxdrivers/ +0 ahi/ +0 ahi.pro + qscreenahiplugin.cpp + qscreenahi_qws.cpp + qscreenahi_qws.h +2 directfb/ +0 directfb.pro + qdirectfbkeyboard.cpp + qdirectfbkeyboard.h + qdirectfbmouse.cpp + qdirectfbmouse.h + qdirectfbpaintdevice.cpp + qdirectfbpaintdevice.h + qdirectfbpaintengine.cpp + qdirectfbpaintengine.h + qdirectfbpixmap.cpp + qdirectfbpixmap.h + qdirectfbscreen.cpp + qdirectfbscreen.h + qdirectfbscreenplugin.cpp + qdirectfbwindowsurface.cpp + qdirectfbwindowsurface.h +2 gfxdrivers.pro + linuxfb/ +0 linuxfb.pro + main.cpp +2 powervr/ +0 powervr.pri + powervr.pro + pvreglscreen/ +0 pvreglscreen.cpp + pvreglscreen.h + pvreglscreenplugin.cpp + pvreglscreen.pro + pvreglwindowsurface.cpp + pvreglwindowsurface.h +2 QWSWSEGL/ +0 pvrqwsdrawable.c + pvrqwsdrawable.h + pvrqwsdrawable_p.h + pvrqwswsegl.c + QWSWSEGL.pro +2 README +2 qvfb/ +0 main.cpp + qvfb.pro +2 transformed/ +0 main.cpp + transformed.pro +2 vnc/ +0 main.cpp + qscreenvnc_p.h + qscreenvnc_qws.cpp + qscreenvnc_qws.h + vnc.pro +3 graphicssystems/ +0 graphicssystems.pro + opengl/ +0 main.cpp + opengl.pro +2 openvg/ +0 main.cpp + openvg.pro + qgraphicssystem_vg.cpp + qgraphicssystem_vg_p.h +2 shivavg/ +0 main.cpp + README + shivavggraphicssystem.cpp + shivavggraphicssystem.h + shivavg.pro + shivavgwindowsurface.cpp + shivavgwindowsurface.h +2 trace/ +0 main.cpp + qgraphicssystem_trace.cpp + qgraphicssystem_trace_p.h + trace.pro +3 iconengines/ +0 iconengines.pro + svgiconengine/ +0 main.cpp + qsvgiconengine.cpp + qsvgiconengine.h + svgiconengine.pro +3 imageformats/ +0 gif/ +0 gif.pro + main.cpp + qgifhandler.cpp + qgifhandler.h +2 ico/ +0 ico.pro + main.cpp + qicohandler.cpp + qicohandler.h +2 imageformats.pro + jpeg/ +0 jpeg.pro + main.cpp + qjpeghandler.cpp + qjpeghandler.h +2 mng/ +0 main.cpp + mng.pro + qmnghandler.cpp + qmnghandler.h +2 svg/ +0 main.cpp + qsvgiohandler.cpp + qsvgiohandler.h + svg.pro +2 tiff/ +0 main.cpp + qtiffhandler.cpp + qtiffhandler.h + tiff.pro +3 inputmethods/ +0 imsw-multi/ +0 imsw-multi.pro + qmultiinputcontext.cpp + qmultiinputcontext.h + qmultiinputcontextplugin.cpp + qmultiinputcontextplugin.h +2 inputmethods.pro +2 kbddrivers/ +0 kbddrivers.pro + linuxinput/ +0 linuxinput.pro + main.cpp +3 mousedrivers/ +0 linuxtp/ +0 linuxtp.pro + main.cpp +2 mousedrivers.pro + pc/ +0 main.cpp + pc.pro +2 tslib/ +0 main.cpp + tslib.pro +3 phonon/ +0 ds9/ +0 ds9.pro +2 gstreamer/ +0 gstreamer.pro +2 mmf/ +0 mmf.pro +2 phonon.pro + qt7/ +0 qt7.pro +2 waveout/ +0 waveout.pro +3 plugins.pro + qpluginbase.pri + s60/ +0 3_1/ +0 3_1.pro +2 3_2/ +0 3_2.pro +2 5_0/ +0 5_0.pro +2 bwins/ +0 qts60pluginu.def +2 eabi/ +0 qts60pluginu.def +2 s60pluginbase.pri + s60.pro + src/ +0 qcoreapplication_3_1.cpp + qcoreapplication_3_2.cpp + qdesktopservices_3_1.cpp + qdesktopservices_3_2.cpp + qlocale_3_1.cpp + qlocale_3_2.cpp +3 script/ +0 qtdbus/ +0 main.cpp + main.h + qtdbus.pro +2 script.pro +2 sqldrivers/ +0 db2/ +0 db2.pro + main.cpp + README +2 ibase/ +0 ibase.pro + main.cpp +2 mysql/ +0 main.cpp + mysql.pro + README +2 oci/ +0 main.cpp + oci.pro + README +2 odbc/ +0 main.cpp + odbc.pro + README +2 psql/ +0 main.cpp + psql.pro + README +2 qsqldriverbase.pri + README + sqldrivers.pro + sqlite/ + sqlite2/ +0 README + smain.cpp + sqlite2.pro +2 sqlite/README + sqlite/smain.cpp + sqlite/sqlite.pro + sqlite_symbian/ +0 SQLite3_v9.2.zip + sqlite_symbian.pro +2 tds/ +0 main.cpp + README + tds.pro +4 qbase.pri + qt3support/ +0 canvas/ +0 canvas.pri + q3canvas.cpp + q3canvas.h +2 dialogs/ +0 dialogs.pri + q3filedialog.cpp + q3filedialog.h + q3filedialog_mac.cpp + q3filedialog_win.cpp + q3progressdialog.cpp + q3progressdialog.h + q3tabdialog.cpp + q3tabdialog.h + q3wizard.cpp + q3wizard.h +2 itemviews/ +0 itemviews.pri + q3iconview.cpp + q3iconview.h + q3listbox.cpp + q3listbox.h + q3listview.cpp + q3listview.h + q3table.cpp + q3table.h +2 network/ +0 network.pri + q3dns.cpp + q3dns.h + q3ftp.cpp + q3ftp.h + q3http.cpp + q3http.h + q3localfs.cpp + q3localfs.h + q3network.cpp + q3network.h + q3networkprotocol.cpp + q3networkprotocol.h + q3serversocket.cpp + q3serversocket.h + q3socket.cpp + q3socketdevice.cpp + q3socketdevice.h + q3socketdevice_unix.cpp + q3socketdevice_win.cpp + q3socket.h + q3url.cpp + q3url.h + q3urloperator.cpp + q3urloperator.h +2 other/ +0 other.pri + q3accel.cpp + q3accel.h + q3boxlayout.cpp + q3boxlayout.h + q3dragobject.cpp + q3dragobject.h + q3dropsite.cpp + q3dropsite.h + q3gridlayout.h + q3membuf.cpp + q3membuf_p.h + q3mimefactory.cpp + q3mimefactory.h + q3polygonscanner.cpp + q3polygonscanner.h + q3process.cpp + q3process.h + q3process_unix.cpp + q3process_win.cpp + qiconset.h + qt_compat_pch.h +2 painting/ +0 painting.pri + q3paintdevicemetrics.cpp + q3paintdevicemetrics.h + q3paintengine_svg.cpp + q3paintengine_svg_p.h + q3painter.cpp + q3painter.h + q3picture.cpp + q3picture.h + q3pointarray.cpp + q3pointarray.h +2 qt3support.pro + sql/ +0 q3databrowser.cpp + q3databrowser.h + q3datatable.cpp + q3datatable.h + q3dataview.cpp + q3dataview.h + q3editorfactory.cpp + q3editorfactory.h + q3sqlcursor.cpp + q3sqlcursor.h + q3sqleditorfactory.cpp + q3sqleditorfactory.h + q3sqlfieldinfo.h + q3sqlfieldinfo.qdoc + q3sqlform.cpp + q3sqlform.h + q3sqlmanager_p.cpp + q3sqlmanager_p.h + q3sqlpropertymap.cpp + q3sqlpropertymap.h + q3sqlrecordinfo.h + q3sqlrecordinfo.qdoc + q3sqlselectcursor.cpp + q3sqlselectcursor.h + sql.pri +2 text/ +0 q3multilineedit.cpp + q3multilineedit.h + q3richtext.cpp + q3richtext_p.cpp + q3richtext_p.h + q3simplerichtext.cpp + q3simplerichtext.h + q3stylesheet.cpp + q3stylesheet.h + q3syntaxhighlighter.cpp + q3syntaxhighlighter.h + q3syntaxhighlighter_p.h + q3textbrowser.cpp + q3textbrowser.h + q3textedit.cpp + q3textedit.h + q3textstream.cpp + q3textstream.h + q3textview.cpp + q3textview.h + text.pri +2 tools/ +0 q3asciicache.h + q3asciicache.qdoc + q3asciidict.h + q3asciidict.qdoc + q3cache.h + q3cache.qdoc + q3cleanuphandler.h + q3cstring.cpp + q3cstring.h + q3deepcopy.cpp + q3deepcopy.h + q3dict.h + q3dict.qdoc + q3garray.cpp + q3garray.h + q3gcache.cpp + q3gcache.h + q3gdict.cpp + q3gdict.h + q3glist.cpp + q3glist.h + q3gvector.cpp + q3gvector.h + q3intcache.h + q3intcache.qdoc + q3intdict.h + q3intdict.qdoc + q3memarray.h + q3memarray.qdoc + q3objectdict.h + q3ptrcollection.cpp + q3ptrcollection.h + q3ptrdict.h + q3ptrdict.qdoc + q3ptrlist.h + q3ptrlist.qdoc + q3ptrqueue.h + q3ptrqueue.qdoc + q3ptrstack.h + q3ptrstack.qdoc + q3ptrvector.h + q3ptrvector.qdoc + q3semaphore.cpp + q3semaphore.h + q3shared.cpp + q3shared.h + q3signal.cpp + q3signal.h + q3sortedlist.h + q3strlist.h + q3strvec.h + q3tl.h + q3valuelist.h + q3valuelist.qdoc + q3valuestack.h + q3valuestack.qdoc + q3valuevector.h + q3valuevector.qdoc + tools.pri +2 widgets/ +0 q3action.cpp + q3action.h + q3button.cpp + q3buttongroup.cpp + q3buttongroup.h + q3button.h + q3combobox.cpp + q3combobox.h + q3datetimeedit.cpp + q3datetimeedit.h + q3dockarea.cpp + q3dockarea.h + q3dockwindow.cpp + q3dockwindow.h + q3frame.cpp + q3frame.h + q3grid.cpp + q3grid.h + q3gridview.cpp + q3gridview.h + q3groupbox.cpp + q3groupbox.h + q3hbox.cpp + q3hbox.h + q3header.cpp + q3header.h + q3hgroupbox.cpp + q3hgroupbox.h + q3mainwindow.cpp + q3mainwindow.h + q3mainwindow_p.h + q3popupmenu.cpp + q3popupmenu.h + q3progressbar.cpp + q3progressbar.h + q3rangecontrol.cpp + q3rangecontrol.h + q3scrollview.cpp + q3scrollview.h + q3spinwidget.cpp + q3titlebar.cpp + q3titlebar_p.h + q3toolbar.cpp + q3toolbar.h + q3vbox.cpp + q3vbox.h + q3vgroupbox.cpp + q3vgroupbox.h + q3whatsthis.cpp + q3whatsthis.h + q3widgetstack.cpp + q3widgetstack.h + widgets.pri +3 qt_install.pri + qt_targets.pri + s60installs/ +0 bwins/ +0 phononu.def + QtCoreu.def + QtGuiu.def + QtMultimediau.def + QtNetworku.def + QtScriptu.def + QtSqlu.def + QtSvgu.def + QtTestu.def + QtWebKitu.def + QtXmlPatternsu.def + QtXmlu.def +2 eabi/ +0 phononu.def + QtCoreu.def + QtGuiu.def + QtMultimediau.def + QtNetworku.def + QtOpenVGu.def + QtScriptu.def + QtSqlu.def + QtSvgu.def + QtTestu.def + QtWebKitu.def + QtXmlPatternsu.def + QtXmlu.def +2 .gitignore + qtdemoapps.iby + qt.iby + qt.svg + s60installs.pro + selfsigned.cer + selfsigned.key +2 s60main/ +0 qts60main.cpp + qts60main_mcrt0.cpp + s60main.pro +2 script/ +0 api/ +0 api.pri + qscriptable.cpp + qscriptable.h + qscriptable_p.h + qscriptclass.cpp + qscriptclass.h + qscriptclasspropertyiterator.cpp + qscriptclasspropertyiterator.h + qscriptcontext.cpp + qscriptcontext.h + qscriptcontextinfo.cpp + qscriptcontextinfo.h + qscriptcontext_p.h + qscriptengineagent.cpp + qscriptengineagent.h + qscriptengineagent_p.h + qscriptengine.cpp + qscriptengine.h + qscriptengine_p.h + qscriptextensioninterface.h + qscriptextensionplugin.cpp + qscriptextensionplugin.h + qscriptprogram.cpp + qscriptprogram.h + qscriptprogram_p.h + qscriptstring.cpp + qscriptstring.h + qscriptstring_p.h + qscriptvalue.cpp + qscriptvalue.h + qscriptvalueiterator.cpp + qscriptvalueiterator.h + qscriptvalue_p.h +2 bridge/ +0 bridge.pri + qscriptactivationobject.cpp + qscriptactivationobject_p.h + qscriptclassobject.cpp + qscriptclassobject_p.h + qscriptdeclarativeclass.cpp + qscriptdeclarativeclass_p.h + qscriptdeclarativeobject.cpp + qscriptdeclarativeobject_p.h + qscriptfunction.cpp + qscriptfunction_p.h + qscriptglobalobject.cpp + qscriptglobalobject_p.h + qscriptobject.cpp + qscriptobject_p.h + qscriptqobject.cpp + qscriptqobject_p.h + qscriptvariant.cpp + qscriptvariant_p.h +2 parser/ +0 parser.pri + qscriptast.cpp + qscriptastfwd_p.h + qscriptast_p.h + qscriptastvisitor.cpp + qscriptastvisitor_p.h + qscript.g + qscriptgrammar.cpp + qscriptgrammar_p.h + qscriptlexer.cpp + qscriptlexer_p.h + qscriptparser.cpp + qscriptparser_p.h + qscriptsyntaxchecker.cpp + qscriptsyntaxchecker_p.h +2 script.pri + script.pro +2 scripttools/ +0 debugging/ +0 debugging.pri + images/ +0 breakpoint.png + breakpoint.svg + d_breakpoint.png + d_breakpoint.svg + delete.png + d_interrupt.png + d_play.png + find.png + interrupt.png + location.png + location.svg + mac/ +0 closetab.png + next.png + plus.png + previous.png +2 new.png + play.png + reload.png + return.png + runtocursor.png + runtonewscript.png + stepinto.png + stepout.png + stepover.png + win/ +0 closetab.png + next.png + plus.png + previous.png +2 wrap.png +2 qscriptbreakpointdata.cpp + qscriptbreakpointdata_p.h + qscriptbreakpointsmodel.cpp + qscriptbreakpointsmodel_p.h + qscriptbreakpointswidget.cpp + qscriptbreakpointswidgetinterface.cpp + qscriptbreakpointswidgetinterface_p.h + qscriptbreakpointswidgetinterface_p_p.h + qscriptbreakpointswidget_p.h + qscriptcompletionproviderinterface_p.h + qscriptcompletiontask.cpp + qscriptcompletiontaskinterface.cpp + qscriptcompletiontaskinterface_p.h + qscriptcompletiontaskinterface_p_p.h + qscriptcompletiontask_p.h + qscriptdebuggeragent.cpp + qscriptdebuggeragent_p.h + qscriptdebuggeragent_p_p.h + qscriptdebuggerbackend.cpp + qscriptdebuggerbackend_p.h + qscriptdebuggerbackend_p_p.h + qscriptdebuggercodefinderwidget.cpp + qscriptdebuggercodefinderwidgetinterface.cpp + qscriptdebuggercodefinderwidgetinterface_p.h + qscriptdebuggercodefinderwidgetinterface_p_p.h + qscriptdebuggercodefinderwidget_p.h + qscriptdebuggercodeview.cpp + qscriptdebuggercodeviewinterface.cpp + qscriptdebuggercodeviewinterface_p.h + qscriptdebuggercodeviewinterface_p_p.h + qscriptdebuggercodeview_p.h + qscriptdebuggercodewidget.cpp + qscriptdebuggercodewidgetinterface.cpp + qscriptdebuggercodewidgetinterface_p.h + qscriptdebuggercodewidgetinterface_p_p.h + qscriptdebuggercodewidget_p.h + qscriptdebuggercommand.cpp + qscriptdebuggercommandexecutor.cpp + qscriptdebuggercommandexecutor_p.h + qscriptdebuggercommand_p.h + qscriptdebuggercommandschedulerfrontend.cpp + qscriptdebuggercommandschedulerfrontend_p.h + qscriptdebuggercommandschedulerinterface_p.h + qscriptdebuggercommandschedulerjob.cpp + qscriptdebuggercommandschedulerjob_p.h + qscriptdebuggercommandschedulerjob_p_p.h + qscriptdebuggerconsolecommand.cpp + qscriptdebuggerconsolecommandgroupdata.cpp + qscriptdebuggerconsolecommandgroupdata_p.h + qscriptdebuggerconsolecommandjob.cpp + qscriptdebuggerconsolecommandjob_p.h + qscriptdebuggerconsolecommandjob_p_p.h + qscriptdebuggerconsolecommandmanager.cpp + qscriptdebuggerconsolecommandmanager_p.h + qscriptdebuggerconsolecommand_p.h + qscriptdebuggerconsolecommand_p_p.h + qscriptdebuggerconsole.cpp + qscriptdebuggerconsoleglobalobject.cpp + qscriptdebuggerconsoleglobalobject_p.h + qscriptdebuggerconsolehistorianinterface_p.h + qscriptdebuggerconsole_p.h + qscriptdebuggerconsolewidget.cpp + qscriptdebuggerconsolewidgetinterface.cpp + qscriptdebuggerconsolewidgetinterface_p.h + qscriptdebuggerconsolewidgetinterface_p_p.h + qscriptdebuggerconsolewidget_p.h + qscriptdebugger.cpp + qscriptdebuggerevent.cpp + qscriptdebuggereventhandlerinterface_p.h + qscriptdebuggerevent_p.h + qscriptdebuggerfrontend.cpp + qscriptdebuggerfrontend_p.h + qscriptdebuggerfrontend_p_p.h + qscriptdebuggerjob.cpp + qscriptdebuggerjob_p.h + qscriptdebuggerjob_p_p.h + qscriptdebuggerjobschedulerinterface_p.h + qscriptdebuggerlocalsmodel.cpp + qscriptdebuggerlocalsmodel_p.h + qscriptdebuggerlocalswidget.cpp + qscriptdebuggerlocalswidgetinterface.cpp + qscriptdebuggerlocalswidgetinterface_p.h + qscriptdebuggerlocalswidgetinterface_p_p.h + qscriptdebuggerlocalswidget_p.h + qscriptdebuggerobjectsnapshotdelta_p.h + qscriptdebugger_p.h + qscriptdebuggerresponse.cpp + qscriptdebuggerresponsehandlerinterface_p.h + qscriptdebuggerresponse_p.h + qscriptdebuggerscriptedconsolecommand.cpp + qscriptdebuggerscriptedconsolecommand_p.h + qscriptdebuggerscriptsmodel.cpp + qscriptdebuggerscriptsmodel_p.h + qscriptdebuggerscriptswidget.cpp + qscriptdebuggerscriptswidgetinterface.cpp + qscriptdebuggerscriptswidgetinterface_p.h + qscriptdebuggerscriptswidgetinterface_p_p.h + qscriptdebuggerscriptswidget_p.h + qscriptdebuggerstackmodel.cpp + qscriptdebuggerstackmodel_p.h + qscriptdebuggerstackwidget.cpp + qscriptdebuggerstackwidgetinterface.cpp + qscriptdebuggerstackwidgetinterface_p.h + qscriptdebuggerstackwidgetinterface_p_p.h + qscriptdebuggerstackwidget_p.h + qscriptdebuggerstandardwidgetfactory.cpp + qscriptdebuggerstandardwidgetfactory_p.h + qscriptdebuggervalue.cpp + qscriptdebuggervalue_p.h + qscriptdebuggervalueproperty.cpp + qscriptdebuggervalueproperty_p.h + qscriptdebuggerwidgetfactoryinterface_p.h + qscriptdebugoutputwidget.cpp + qscriptdebugoutputwidgetinterface.cpp + qscriptdebugoutputwidgetinterface_p.h + qscriptdebugoutputwidgetinterface_p_p.h + qscriptdebugoutputwidget_p.h + qscriptedit.cpp + qscriptedit_p.h + qscriptenginedebugger.cpp + qscriptenginedebuggerfrontend.cpp + qscriptenginedebuggerfrontend_p.h + qscriptenginedebugger.h + qscripterrorlogwidget.cpp + qscripterrorlogwidgetinterface.cpp + qscripterrorlogwidgetinterface_p.h + qscripterrorlogwidgetinterface_p_p.h + qscripterrorlogwidget_p.h + qscriptmessagehandlerinterface_p.h + qscriptobjectsnapshot.cpp + qscriptobjectsnapshot_p.h + qscriptscriptdata.cpp + qscriptscriptdata_p.h + qscriptstdmessagehandler.cpp + qscriptstdmessagehandler_p.h + qscriptsyntaxhighlighter.cpp + qscriptsyntaxhighlighter_p.h + qscripttooltipproviderinterface_p.h + qscriptvalueproperty.cpp + qscriptvalueproperty_p.h + qscriptxmlparser.cpp + qscriptxmlparser_p.h + scripts/ +0 commands/ +0 advance.qs + backtrace.qs + break.qs + clear.qs + complete.qs + condition.qs + continue.qs + delete.qs + disable.qs + down.qs + enable.qs + eval.qs + finish.qs + frame.qs + help.qs + ignore.qs + info.qs + interrupt.qs + list.qs + next.qs + print.qs + return.qs + step.qs + tbreak.qs + up.qs +3 scripttools_debugging.qrc +2 scripttools.pro +2 script/utils/ +0 qscriptdate.cpp + qscriptdate_p.h + utils.pri +2 sql/ +0 drivers/ +0 db2/ +0 qsql_db2.cpp + qsql_db2.h +2 drivers.pri + ibase/ +0 qsql_ibase.cpp + qsql_ibase.h +2 mysql/ +0 qsql_mysql.cpp + qsql_mysql.h +2 oci/ +0 qsql_oci.cpp + qsql_oci.h +2 odbc/ +0 qsql_odbc.cpp + qsql_odbc.h +2 psql/ +0 qsql_psql.cpp + qsql_psql.h +2 sqlite/ + sqlite2/ +0 qsql_sqlite2.cpp + qsql_sqlite2.h +2 sqlite/qsql_sqlite.cpp + sqlite/qsql_sqlite.h + tds/ +0 qsql_tds.cpp + qsql_tds.h +3 kernel/ +0 kernel.pri + qsqlcachedresult.cpp + qsqlcachedresult_p.h + qsqldatabase.cpp + qsqldatabase.h + qsqldriver.cpp + qsqldriver.h + qsqldriverplugin.cpp + qsqldriverplugin.h + qsqlerror.cpp + qsqlerror.h + qsqlfield.cpp + qsqlfield.h + qsql.h + qsqlindex.cpp + qsqlindex.h + qsqlnulldriver_p.h + qsql.qdoc + qsqlquery.cpp + qsqlquery.h + qsqlrecord.cpp + qsqlrecord.h + qsqlresult.cpp + qsqlresult.h +2 models/ +0 models.pri + qsqlquerymodel.cpp + qsqlquerymodel.h + qsqlquerymodel_p.h + qsqlrelationaldelegate.cpp + qsqlrelationaldelegate.h + qsqlrelationaltablemodel.cpp + qsqlrelationaltablemodel.h + qsqltablemodel.cpp + qsqltablemodel.h + qsqltablemodel_p.h +2 README.module + sql.pro +2 src.pro + svg/ +0 qgraphicssvgitem.cpp + qgraphicssvgitem.h + qsvgfont.cpp + qsvgfont_p.h + qsvggenerator.cpp + qsvggenerator.h + qsvggraphics.cpp + qsvggraphics_p.h + qsvghandler.cpp + qsvghandler_p.h + qsvgnode.cpp + qsvgnode_p.h + qsvgrenderer.cpp + qsvgrenderer.h + qsvgstructure.cpp + qsvgstructure_p.h + qsvgstyle.cpp + qsvgstyle_p.h + qsvgtinydocument.cpp + qsvgtinydocument_p.h + qsvgwidget.cpp + qsvgwidget.h + svg.pro +2 testlib/ +0 3rdparty/ +0 callgrind_p.h + cycle_p.h + valgrind_p.h +2 qabstracttestlogger.cpp + qabstracttestlogger_p.h + qasciikey.cpp + qbenchmark.cpp + qbenchmarkevent.cpp + qbenchmarkevent_p.h + qbenchmark.h + qbenchmarkmeasurement.cpp + qbenchmarkmeasurement_p.h + qbenchmark_p.h + qbenchmarkvalgrind.cpp + qbenchmarkvalgrind_p.h + qplaintestlogger.cpp + qplaintestlogger_p.h + qsignaldumper.cpp + qsignaldumper_p.h + qsignalspy.h + qsignalspy.qdoc + qtestaccessible.h + qtestassert.h + qtestbasicstreamer.cpp + qtestbasicstreamer.h + qtestcase.cpp + qtestcase.h + qtestcoreelement.h + qtestcorelist.h + qtestdata.cpp + qtestdata.h + qtestelementattribute.cpp + qtestelementattribute.h + qtestelement.cpp + qtestelement.h + qtestevent.h + qtesteventloop.h + qtestevent.qdoc + qtestfilelogger.cpp + qtestfilelogger.h + qtest_global.h + qtest_gui.h + qtest.h + qtestkeyboard.h + qtestlightxmlstreamer.cpp + qtestlightxmlstreamer.h + qtestlog.cpp + qtestlogger.cpp + qtestlogger_p.h + qtestlog_p.h + qtestmouse.h + qtestresult.cpp + qtestresult_p.h + qtestspontaneevent.h + qtestsystem.h + qtesttable.cpp + qtesttable_p.h + qtesttouch.h + qtestxmlstreamer.cpp + qtestxmlstreamer.h + qtestxunitstreamer.cpp + qtestxunitstreamer.h + qxmltestlogger.cpp + qxmltestlogger_p.h + testlib.pro +2 tools/ +0 bootstrap/ +0 bootstrap.pri + bootstrap.pro +2 idc/ +0 idc.pro + main.cpp +2 moc/ +0 generator.cpp + generator.h + keywords.cpp + main.cpp + moc.cpp + moc.h + moc.pri + moc.pro + mwerks_mac.cpp + mwerks_mac.h + outputrevision.h + parser.cpp + parser.h + ppkeywords.cpp + preprocessor.cpp + preprocessor.h + symbols.h + token.cpp + token.h + util/ +0 generate_keywords.cpp + generate_keywords.pro + generate.sh + licenseheader.txt +2 utils.h +2 rcc/ +0 main.cpp + rcc.cpp + rcc.h + rcc.pri + rcc.pro +2 tools.pro + uic/ + uic3/ +0 converter.cpp + deps.cpp + domtool.cpp + domtool.h + embed.cpp + form.cpp + main.cpp + object.cpp + parser.cpp + parser.h + qt3to4.cpp + qt3to4.h + subclassing.cpp + ui3reader.cpp + ui3reader.h + uic3.pro + uic.cpp + uic.h + widgetinfo.cpp + widgetinfo.h +2 uic/cpp/ +0 cppextractimages.cpp + cppextractimages.h + cpp.pri + cppwritedeclaration.cpp + cppwritedeclaration.h + cppwriteicondata.cpp + cppwriteicondata.h + cppwriteicondeclaration.cpp + cppwriteicondeclaration.h + cppwriteiconinitialization.cpp + cppwriteiconinitialization.h + cppwriteincludes.cpp + cppwriteincludes.h + cppwriteinitialization.cpp + cppwriteinitialization.h +2 uic/customwidgetsinfo.cpp + uic/customwidgetsinfo.h + uic/databaseinfo.cpp + uic/databaseinfo.h + uic/driver.cpp + uic/driver.h + uic/globaldefs.h + uic/main.cpp + uic/option.h + uic/treewalker.cpp + uic/treewalker.h + uic/ui4.cpp + uic/ui4.h + uic/uic.cpp + uic/uic.h + uic/uic.pri + uic/uic.pro + uic/utils.h + uic/validator.cpp + uic/validator.h +2 winmain/ +0 qtmain_win.cpp + winmain.pro +2 xml/ +0 dom/ +0 dom.pri + qdom.cpp + qdom.h +3 xmlpatterns/ +0 acceltree/ +0 acceltree.pri + qacceliterators.cpp + qacceliterators_p.h + qacceltreebuilder.cpp + qacceltreebuilder_p.h + qacceltree.cpp + qacceltree_p.h + qacceltreeresourceloader.cpp + qacceltreeresourceloader_p.h + qcompressedwhitespace.cpp + qcompressedwhitespace_p.h +2 api/ +0 api.pri + qabstractmessagehandler.cpp + qabstractmessagehandler.h + qabstracturiresolver.cpp + qabstracturiresolver.h + qabstractxmlforwarditerator.cpp + qabstractxmlforwarditerator_p.h + qabstractxmlnodemodel.cpp + qabstractxmlnodemodel.h + qabstractxmlnodemodel_p.h + qabstractxmlpullprovider.cpp + qabstractxmlpullprovider_p.h + qabstractxmlreceiver.cpp + qabstractxmlreceiver.h + qabstractxmlreceiver_p.h + qdeviceresourceloader_p.h + qiodevicedelegate.cpp + qiodevicedelegate_p.h + qnetworkaccessdelegator.cpp + qnetworkaccessdelegator_p.h + qpullbridge.cpp + qpullbridge_p.h + qreferencecountedvalue_p.h + qresourcedelegator.cpp + qresourcedelegator_p.h + qsimplexmlnodemodel.cpp + qsimplexmlnodemodel.h + qsourcelocation.cpp + qsourcelocation.h + quriloader.cpp + quriloader_p.h + qvariableloader.cpp + qvariableloader_p.h + qxmlformatter.cpp + qxmlformatter.h + qxmlname.cpp + qxmlname.h + qxmlnamepool.cpp + qxmlnamepool.h + qxmlquery.cpp + qxmlquery.h + qxmlquery_p.h + qxmlresultitems.cpp + qxmlresultitems.h + qxmlresultitems_p.h + qxmlschema.cpp + qxmlschema.h + qxmlschema_p.cpp + qxmlschema_p.h + qxmlschemavalidator.cpp + qxmlschemavalidator.h + qxmlschemavalidator_p.h + qxmlserializer.cpp + qxmlserializer.h + qxmlserializer_p.h +2 common.pri + data/ +0 data.pri + qabstractdatetime.cpp + qabstractdatetime_p.h + qabstractduration.cpp + qabstractduration_p.h + qabstractfloatcasters.cpp + qabstractfloatcasters_p.h + qabstractfloat.cpp + qabstractfloatmathematician.cpp + qabstractfloatmathematician_p.h + qabstractfloat_p.h + qanyuri.cpp + qanyuri_p.h + qatomiccaster.cpp + qatomiccaster_p.h + qatomiccasters.cpp + qatomiccasters_p.h + qatomiccomparator.cpp + qatomiccomparator_p.h + qatomiccomparators.cpp + qatomiccomparators_p.h + qatomicmathematician.cpp + qatomicmathematician_p.h + qatomicmathematicians.cpp + qatomicmathematicians_p.h + qatomicstring.cpp + qatomicstring_p.h + qatomicvalue.cpp + qbase64binary.cpp + qbase64binary_p.h + qboolean.cpp + qboolean_p.h + qcommonvalues.cpp + qcommonvalues_p.h + qcomparisonfactory.cpp + qcomparisonfactory_p.h + qdate.cpp + qdate_p.h + qdaytimeduration.cpp + qdaytimeduration_p.h + qdecimal.cpp + qdecimal_p.h + qderivedinteger_p.h + qderivedstring_p.h + qduration.cpp + qduration_p.h + qgday.cpp + qgday_p.h + qgmonth.cpp + qgmonthday.cpp + qgmonthday_p.h + qgmonth_p.h + qgyear.cpp + qgyearmonth.cpp + qgyearmonth_p.h + qgyear_p.h + qhexbinary.cpp + qhexbinary_p.h + qinteger.cpp + qinteger_p.h + qitem.cpp + qitem_p.h + qnodebuilder.cpp + qnodebuilder_p.h + qnodemodel.cpp + qqnamevalue.cpp + qqnamevalue_p.h + qresourceloader.cpp + qresourceloader_p.h + qschemadatetime.cpp + qschemadatetime_p.h + qschemanumeric.cpp + qschemanumeric_p.h + qschematime.cpp + qschematime_p.h + qsequencereceiver.cpp + qsequencereceiver_p.h + qsorttuple.cpp + qsorttuple_p.h + quntypedatomic.cpp + quntypedatomic_p.h + qvalidationerror.cpp + qvalidationerror_p.h + qvaluefactory.cpp + qvaluefactory_p.h + qyearmonthduration.cpp + qyearmonthduration_p.h +2 documentationGroups.dox + Doxyfile + environment/ +0 createReportContext.sh + createReportContext.xsl + environment.pri + qcurrentitemcontext.cpp + qcurrentitemcontext_p.h + qdelegatingdynamiccontext.cpp + qdelegatingdynamiccontext_p.h + qdelegatingstaticcontext.cpp + qdelegatingstaticcontext_p.h + qdynamiccontext.cpp + qdynamiccontext_p.h + qfocus.cpp + qfocus_p.h + qgenericdynamiccontext.cpp + qgenericdynamiccontext_p.h + qgenericstaticcontext.cpp + qgenericstaticcontext_p.h + qreceiverdynamiccontext.cpp + qreceiverdynamiccontext_p.h + qreportcontext.cpp + qreportcontext_p.h + qstackcontextbase.cpp + qstackcontextbase_p.h + qstaticbaseuricontext.cpp + qstaticbaseuricontext_p.h + qstaticcompatibilitycontext.cpp + qstaticcompatibilitycontext_p.h + qstaticcontext.cpp + qstaticcontext_p.h + qstaticcurrentcontext.cpp + qstaticcurrentcontext_p.h + qstaticfocuscontext.cpp + qstaticfocuscontext_p.h + qstaticnamespacecontext.cpp + qstaticnamespacecontext_p.h +2 expr/ +0 expr.pri + qandexpression.cpp + qandexpression_p.h + qapplytemplate.cpp + qapplytemplate_p.h + qargumentreference.cpp + qargumentreference_p.h + qarithmeticexpression.cpp + qarithmeticexpression_p.h + qattributeconstructor.cpp + qattributeconstructor_p.h + qattributenamevalidator.cpp + qattributenamevalidator_p.h + qaxisstep.cpp + qaxisstep_p.h + qcachecells_p.h + qcallsite.cpp + qcallsite_p.h + qcalltargetdescription.cpp + qcalltargetdescription_p.h + qcalltemplate.cpp + qcalltemplate_p.h + qcastableas.cpp + qcastableas_p.h + qcastas.cpp + qcastas_p.h + qcastingplatform.cpp + qcastingplatform_p.h + qcollationchecker.cpp + qcollationchecker_p.h + qcombinenodes.cpp + qcombinenodes_p.h + qcommentconstructor.cpp + qcommentconstructor_p.h + qcomparisonplatform.cpp + qcomparisonplatform_p.h + qcomputednamespaceconstructor.cpp + qcomputednamespaceconstructor_p.h + qcontextitem.cpp + qcontextitem_p.h + qcopyof.cpp + qcopyof_p.h + qcurrentitemstore.cpp + qcurrentitemstore_p.h + qdocumentconstructor.cpp + qdocumentconstructor_p.h + qdocumentcontentvalidator.cpp + qdocumentcontentvalidator_p.h + qdynamiccontextstore.cpp + qdynamiccontextstore_p.h + qelementconstructor.cpp + qelementconstructor_p.h + qemptycontainer.cpp + qemptycontainer_p.h + qemptysequence.cpp + qemptysequence_p.h + qevaluationcache.cpp + qevaluationcache_p.h + qexpression.cpp + qexpressiondispatch_p.h + qexpressionfactory.cpp + qexpressionfactory_p.h + qexpression_p.h + qexpressionsequence.cpp + qexpressionsequence_p.h + qexpressionvariablereference.cpp + qexpressionvariablereference_p.h + qexternalvariableloader.cpp + qexternalvariableloader_p.h + qexternalvariablereference.cpp + qexternalvariablereference_p.h + qfirstitempredicate.cpp + qfirstitempredicate_p.h + qforclause.cpp + qforclause_p.h + qgeneralcomparison.cpp + qgeneralcomparison_p.h + qgenericpredicate.cpp + qgenericpredicate_p.h + qifthenclause.cpp + qifthenclause_p.h + qinstanceof.cpp + qinstanceof_p.h + qletclause.cpp + qletclause_p.h + qliteral.cpp + qliteral_p.h + qliteralsequence.cpp + qliteralsequence_p.h + qnamespaceconstructor.cpp + qnamespaceconstructor_p.h + qncnameconstructor.cpp + qncnameconstructor_p.h + qnodecomparison.cpp + qnodecomparison_p.h + qnodesort.cpp + qnodesort_p.h + qoperandsiterator_p.h + qoptimizationpasses.cpp + qoptimizationpasses_p.h + qoptimizerblocks.cpp + qoptimizerblocks_p.h + qoptimizerframework.cpp + qoptimizerframework_p.h + qorderby.cpp + qorderby_p.h + qorexpression.cpp + qorexpression_p.h + qpaircontainer.cpp + qpaircontainer_p.h + qparentnodeaxis.cpp + qparentnodeaxis_p.h + qpath.cpp + qpath_p.h + qpositionalvariablereference.cpp + qpositionalvariablereference_p.h + qprocessinginstructionconstructor.cpp + qprocessinginstructionconstructor_p.h + qqnameconstructor.cpp + qqnameconstructor_p.h + qquantifiedexpression.cpp + qquantifiedexpression_p.h + qrangeexpression.cpp + qrangeexpression_p.h + qrangevariablereference.cpp + qrangevariablereference_p.h + qreturnorderby.cpp + qreturnorderby_p.h + qsimplecontentconstructor.cpp + qsimplecontentconstructor_p.h + qsinglecontainer.cpp + qsinglecontainer_p.h + qsourcelocationreflection.cpp + qsourcelocationreflection_p.h + qstaticbaseuristore.cpp + qstaticbaseuristore_p.h + qstaticcompatibilitystore.cpp + qstaticcompatibilitystore_p.h + qtemplate.cpp + qtemplateinvoker.cpp + qtemplateinvoker_p.h + qtemplatemode.cpp + qtemplatemode_p.h + qtemplateparameterreference.cpp + qtemplateparameterreference_p.h + qtemplatepattern_p.h + qtemplate_p.h + qtextnodeconstructor.cpp + qtextnodeconstructor_p.h + qtreatas.cpp + qtreatas_p.h + qtriplecontainer.cpp + qtriplecontainer_p.h + qtruthpredicate.cpp + qtruthpredicate_p.h + qunaryexpression.cpp + qunaryexpression_p.h + qunlimitedcontainer.cpp + qunlimitedcontainer_p.h + qunresolvedvariablereference.cpp + qunresolvedvariablereference_p.h + quserfunctioncallsite.cpp + quserfunctioncallsite_p.h + quserfunction.cpp + quserfunction_p.h + qvalidate.cpp + qvalidate_p.h + qvaluecomparison.cpp + qvaluecomparison_p.h + qvariabledeclaration.cpp + qvariabledeclaration_p.h + qvariablereference.cpp + qvariablereference_p.h + qwithparam_p.h + qxsltsimplecontentconstructor.cpp + qxsltsimplecontentconstructor_p.h +2 functions/ +0 functions.pri + qabstractfunctionfactory.cpp + qabstractfunctionfactory_p.h + qaccessorfns.cpp + qaccessorfns_p.h + qaggregatefns.cpp + qaggregatefns_p.h + qaggregator.cpp + qaggregator_p.h + qassemblestringfns.cpp + qassemblestringfns_p.h + qbooleanfns.cpp + qbooleanfns_p.h + qcomparescaseaware.cpp + qcomparescaseaware_p.h + qcomparestringfns.cpp + qcomparestringfns_p.h + qcomparingaggregator.cpp + qcomparingaggregator_p.h + qconstructorfunctionsfactory.cpp + qconstructorfunctionsfactory_p.h + qcontextfns.cpp + qcontextfns_p.h + qcontextnodechecker.cpp + qcontextnodechecker_p.h + qcurrentfn.cpp + qcurrentfn_p.h + qdatetimefn.cpp + qdatetimefn_p.h + qdatetimefns.cpp + qdatetimefns_p.h + qdeepequalfn.cpp + qdeepequalfn_p.h + qdocumentfn.cpp + qdocumentfn_p.h + qelementavailablefn.cpp + qelementavailablefn_p.h + qerrorfn.cpp + qerrorfn_p.h + qfunctionargument.cpp + qfunctionargument_p.h + qfunctionavailablefn.cpp + qfunctionavailablefn_p.h + qfunctioncall.cpp + qfunctioncall_p.h + qfunctionfactorycollection.cpp + qfunctionfactorycollection_p.h + qfunctionfactory.cpp + qfunctionfactory_p.h + qfunctionsignature.cpp + qfunctionsignature_p.h + qgenerateidfn.cpp + qgenerateidfn_p.h + qnodefns.cpp + qnodefns_p.h + qnumericfns.cpp + qnumericfns_p.h + qpatternmatchingfns.cpp + qpatternmatchingfns_p.h + qpatternplatform.cpp + qpatternplatform_p.h + qqnamefns.cpp + qqnamefns_p.h + qresolveurifn.cpp + qresolveurifn_p.h + qsequencefns.cpp + qsequencefns_p.h + qsequencegeneratingfns.cpp + qsequencegeneratingfns_p.h + qstaticbaseuricontainer_p.h + qstaticnamespacescontainer.cpp + qstaticnamespacescontainer_p.h + qstringvaluefns.cpp + qstringvaluefns_p.h + qsubstringfns.cpp + qsubstringfns_p.h + qsystempropertyfn.cpp + qsystempropertyfn_p.h + qtimezonefns.cpp + qtimezonefns_p.h + qtracefn.cpp + qtracefn_p.h + qtypeavailablefn.cpp + qtypeavailablefn_p.h + qunparsedentitypublicidfn.cpp + qunparsedentitypublicidfn_p.h + qunparsedentityurifn.cpp + qunparsedentityurifn_p.h + qunparsedtextavailablefn.cpp + qunparsedtextavailablefn_p.h + qunparsedtextfn.cpp + qunparsedtextfn_p.h + qxpath10corefunctions.cpp + qxpath10corefunctions_p.h + qxpath20corefunctions.cpp + qxpath20corefunctions_p.h + qxslt20corefunctions.cpp + qxslt20corefunctions_p.h +2 .gitignore + iterators/ +0 iterators.pri + qcachingiterator.cpp + qcachingiterator_p.h + qdeduplicateiterator.cpp + qdeduplicateiterator_p.h + qdistinctiterator.cpp + qdistinctiterator_p.h + qemptyiterator_p.h + qexceptiterator.cpp + qexceptiterator_p.h + qindexofiterator.cpp + qindexofiterator_p.h + qinsertioniterator.cpp + qinsertioniterator_p.h + qintersectiterator.cpp + qintersectiterator_p.h + qitemmappingiterator_p.h + qrangeiterator.cpp + qrangeiterator_p.h + qremovaliterator.cpp + qremovaliterator_p.h + qsequencemappingiterator_p.h + qsingletoniterator_p.h + qsubsequenceiterator.cpp + qsubsequenceiterator_p.h + qtocodepointsiterator.cpp + qtocodepointsiterator_p.h + qunioniterator.cpp + qunioniterator_p.h +2 janitors/ +0 janitors.pri + qargumentconverter.cpp + qargumentconverter_p.h + qatomizer.cpp + qatomizer_p.h + qcardinalityverifier.cpp + qcardinalityverifier_p.h + qebvextractor.cpp + qebvextractor_p.h + qitemverifier.cpp + qitemverifier_p.h + quntypedatomicconverter.cpp + quntypedatomicconverter_p.h +2 Mainpage.dox + parser/ +0 createParser.sh + createTokenLookup.sh + createXSLTTokenLookup.sh + .gitattributes + .gitignore + parser.pri + qmaintainingreader.cpp + qmaintainingreader_p.h + qparsercontext.cpp + qparsercontext_p.h + qquerytransformparser.cpp + qquerytransformparser_p.h + qtokenizer_p.h + qtokenlookup.cpp + qtokenrevealer.cpp + qtokenrevealer_p.h + qtokensource.cpp + qtokensource_p.h + querytransformparser.ypp + qxquerytokenizer.cpp + qxquerytokenizer_p.h + qxslttokenizer.cpp + qxslttokenizer_p.h + qxslttokenlookup.cpp + qxslttokenlookup_p.h + qxslttokenlookup.xml + TokenLookup.gperf + trolltechHeader.txt + winCEWorkaround.sed +2 projection/ +0 projection.pri + qdocumentprojector.cpp + qdocumentprojector_p.h + qprojectedexpression_p.h +2 qtokenautomaton/ +0 exampleFile.xml + qautomaton2cpp.xsl + qtokenautomaton.xsd + README +2 query.pri + schema/ +0 builtinschemas.qrc + doc/ +0 All_diagram.dot + Alternative_diagram.dot + Annotation_diagram.dot + AnyAttribute_diagram.dot + Any_diagram.dot + Assert_diagram.dot + Choice_diagram.dot + ComplexContent_diagram.dot + ComplexContentExtension_diagram.dot + ComplexContentRestriction_diagram.dot + DefaultOpenContent_diagram.dot + EnumerationFacet_diagram.dot + Field_diagram.dot + FractionDigitsFacet_diagram.dot + GlobalAttribute_diagram.dot + GlobalComplexType_diagram.dot + GlobalElement_diagram.dot + GlobalSimpleType_diagram.dot + Import_diagram.dot + Include_diagram.dot + Key_diagram.dot + KeyRef_diagram.dot + legend.dot + LengthFacet_diagram.dot + List_diagram.dot + LocalAll_diagram.dot + LocalAttribute_diagram.dot + LocalChoice_diagram.dot + LocalComplexType_diagram.dot + LocalElement_diagram.dot + LocalSequence_diagram.dot + LocalSimpleType_diagram.dot + MaxExclusiveFacet_diagram.dot + MaxInclusiveFacet_diagram.dot + MaxLengthFacet_diagram.dot + MinExclusiveFacet_diagram.dot + MinInclusiveFacet_diagram.dot + MinLengthFacet_diagram.dot + NamedAttributeGroup_diagram.dot + NamedGroup_diagram.dot + Notation_diagram.dot + Override_diagram.dot + PatternFacet_diagram.dot + Redefine_diagram.dot + ReferredAttributeGroup_diagram.dot + ReferredGroup_diagram.dot + Schema_diagram.dot + Selector_diagram.dot + Sequence_diagram.dot + SimpleContent_diagram.dot + SimpleContentExtension_diagram.dot + SimpleContentRestriction_diagram.dot + SimpleRestriction_diagram.dot + TotalDigitsFacet_diagram.dot + Union_diagram.dot + Unique_diagram.dot + WhiteSpaceFacet_diagram.dot +2 .gitignore + qnamespacesupport.cpp + qnamespacesupport_p.h + qxsdalternative.cpp + qxsdalternative_p.h + qxsdannotated.cpp + qxsdannotated_p.h + qxsdannotation.cpp + qxsdannotation_p.h + qxsdapplicationinformation.cpp + qxsdapplicationinformation_p.h + qxsdassertion.cpp + qxsdassertion_p.h + qxsdattribute.cpp + qxsdattributegroup.cpp + qxsdattributegroup_p.h + qxsdattribute_p.h + qxsdattributereference.cpp + qxsdattributereference_p.h + qxsdattributeterm.cpp + qxsdattributeterm_p.h + qxsdattributeuse.cpp + qxsdattributeuse_p.h + qxsdcomplextype.cpp + qxsdcomplextype_p.h + qxsddocumentation.cpp + qxsddocumentation_p.h + qxsdelement.cpp + qxsdelement_p.h + qxsdfacet.cpp + qxsdfacet_p.h + qxsdidcache.cpp + qxsdidcache_p.h + qxsdidchelper.cpp + qxsdidchelper_p.h + qxsdidentityconstraint.cpp + qxsdidentityconstraint_p.h + qxsdinstancereader.cpp + qxsdinstancereader_p.h + qxsdmodelgroup.cpp + qxsdmodelgroup_p.h + qxsdnotation.cpp + qxsdnotation_p.h + qxsdparticlechecker.cpp + qxsdparticlechecker_p.h + qxsdparticle.cpp + qxsdparticle_p.h + qxsdreference.cpp + qxsdreference_p.h + qxsdschemachecker.cpp + qxsdschemachecker_helper.cpp + qxsdschemachecker_p.h + qxsdschemachecker_setup.cpp + qxsdschemacontext.cpp + qxsdschemacontext_p.h + qxsdschema.cpp + qxsdschemadebugger.cpp + qxsdschemadebugger_p.h + qxsdschemahelper.cpp + qxsdschemahelper_p.h + qxsdschemamerger.cpp + qxsdschemamerger_p.h + qxsdschemaparsercontext.cpp + qxsdschemaparsercontext_p.h + qxsdschemaparser.cpp + qxsdschemaparser_p.h + qxsdschemaparser_setup.cpp + qxsdschema_p.h + qxsdschemaresolver.cpp + qxsdschemaresolver_p.h + qxsdschematoken.cpp + qxsdschematoken_p.h + qxsdschematypesfactory.cpp + qxsdschematypesfactory_p.h + qxsdsimpletype.cpp + qxsdsimpletype_p.h + qxsdstatemachinebuilder.cpp + qxsdstatemachinebuilder_p.h + qxsdstatemachine.cpp + qxsdstatemachine_p.h + qxsdterm.cpp + qxsdterm_p.h + qxsdtypechecker.cpp + qxsdtypechecker_p.h + qxsduserschematype.cpp + qxsduserschematype_p.h + qxsdvalidatedxmlnodemodel.cpp + qxsdvalidatedxmlnodemodel_p.h + qxsdvalidatinginstancereader.cpp + qxsdvalidatinginstancereader_p.h + qxsdwildcard.cpp + qxsdwildcard_p.h + qxsdxpathexpression.cpp + qxsdxpathexpression_p.h + schema.pri + schemas/ +0 xml.xsd +0 -LICENSE +3 tokens.xml +2 type/ +0 qabstractnodetest.cpp + qabstractnodetest_p.h + qanyitemtype.cpp + qanyitemtype_p.h + qanynodetype.cpp + qanynodetype_p.h + qanysimpletype.cpp + qanysimpletype_p.h + qanytype.cpp + qanytype_p.h + qatomiccasterlocator.cpp + qatomiccasterlocator_p.h + qatomiccasterlocators.cpp + qatomiccasterlocators_p.h + qatomiccomparatorlocator.cpp + qatomiccomparatorlocator_p.h + qatomiccomparatorlocators.cpp + qatomiccomparatorlocators_p.h + qatomicmathematicianlocator.cpp + qatomicmathematicianlocator_p.h + qatomicmathematicianlocators.cpp + qatomicmathematicianlocators_p.h + qatomictype.cpp + qatomictypedispatch_p.h + qatomictype_p.h + qbasictypesfactory.cpp + qbasictypesfactory_p.h + qbuiltinatomictype.cpp + qbuiltinatomictype_p.h + qbuiltinatomictypes.cpp + qbuiltinatomictypes_p.h + qbuiltinnodetype.cpp + qbuiltinnodetype_p.h + qbuiltintypes.cpp + qbuiltintypes_p.h + qcardinality.cpp + qcardinality_p.h + qcommonsequencetypes.cpp + qcommonsequencetypes_p.h + qebvtype.cpp + qebvtype_p.h + qemptysequencetype.cpp + qemptysequencetype_p.h + qgenericsequencetype.cpp + qgenericsequencetype_p.h + qitemtype.cpp + qitemtype_p.h + qlocalnametest.cpp + qlocalnametest_p.h + qmultiitemtype.cpp + qmultiitemtype_p.h + qnamedschemacomponent.cpp + qnamedschemacomponent_p.h + qnamespacenametest.cpp + qnamespacenametest_p.h + qnonetype.cpp + qnonetype_p.h + qnumerictype.cpp + qnumerictype_p.h + qprimitives_p.h + qqnametest.cpp + qqnametest_p.h + qschemacomponent.cpp + qschemacomponent_p.h + qschematype.cpp + qschematypefactory.cpp + qschematypefactory_p.h + qschematype_p.h + qsequencetype.cpp + qsequencetype_p.h + qtypechecker.cpp + qtypechecker_p.h + quntyped.cpp + quntyped_p.h + qxsltnodetest.cpp + qxsltnodetest_p.h + type.pri +2 utils/ +0 qautoptr.cpp + qautoptr_p.h + qcommonnamespaces_p.h + qcppcastinghelper_p.h + qdebug_p.h + qdelegatingnamespaceresolver.cpp + qdelegatingnamespaceresolver_p.h + qgenericnamespaceresolver.cpp + qgenericnamespaceresolver_p.h + qnamepool.cpp + qnamepool_p.h + qnamespacebinding_p.h + qnamespaceresolver.cpp + qnamespaceresolver_p.h + qnodenamespaceresolver.cpp + qnodenamespaceresolver_p.h + qoutputvalidator.cpp + qoutputvalidator_p.h + qpatternistlocale.cpp + qpatternistlocale_p.h + qxpathhelper.cpp + qxpathhelper_p.h + utils.pri +2 xmlpatterns.pro +2 xml/sax/ +0 qxml.cpp + qxml.h + sax.pri +2 xml/stream/ +0 qxmlstream.h + stream.pri +2 xml/xml.pro diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,173 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite module 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include "../../../../../shared/filesystem.h" + +class bench_QDir_tree + : public QObject +{ + Q_OBJECT + +public: + bench_QDir_tree() + : prefix("./test-tree/") + { + } + +private: + QByteArray prefix; + +private slots: + void initTestCase() + { + QFile list(":/4.6.0-list.txt"); + QVERIFY(list.open(QIODevice::ReadOnly | QIODevice::Text)); + + QVERIFY(fs.createDirectory(prefix)); + + QStack stack; + QByteArray line; + Q_FOREVER { + char ch; + if (!list.getChar(&ch)) + break; + if (ch != ' ') { + line.append(ch); + continue; + } + + int pop = 1; + if (!line.isEmpty()) + pop = line.toInt(); + + while (pop) { + stack.pop(); + --pop; + } + + line = list.readLine(); + line.chop(1); + stack.push(line); + + line = prefix; + Q_FOREACH(const QByteArray &pathElement, stack) + line += pathElement; + + if (line.endsWith('/')) + QVERIFY(fs.createDirectory(line)); + else + QVERIFY(fs.createFile(line)); + + line.clear(); + } + } + + void fileSearch_data() const + { + QTest::addColumn("nameFilters"); + QTest::addColumn("filter"); + QTest::addColumn("entryCount"); + + QTest::newRow("*.cpp") << QStringList("*.cpp") + << int(QDir::Files) + << 3813; + + QTest::newRow("executables") << QStringList("*") + << int(QDir::Executable | QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot) + << 543; + } + + void fileSearch() const + { + QFETCH(QStringList, nameFilters); + QFETCH(int, filter); + QFETCH(int, entryCount); + + int count = 0; + QBENCHMARK { + // Recursive directory iteration + QDirIterator iterator(prefix, nameFilters, QDir::Filter(filter), + QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); + + count = 0; + while (iterator.hasNext()) { + iterator.next(); + ++count; + } + + QCOMPARE(count, entryCount); + } + + QCOMPARE(count, entryCount); + } + + void traverseDirectory() const + { + int count = 0; + QBENCHMARK { + QDirIterator iterator(prefix, + QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System, + QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); + + while (iterator.hasNext()) { + iterator.next(); + ++count; + } + + QCOMPARE(count, 11963); + } + + QCOMPARE(count, 11963); + } + +private: + FileSystem fs; +}; + +QTEST_MAIN(bench_QDir_tree) +#include "bench_qdir_tree.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/benchmarks/corelib/io/qdir/tree/bench_qdir_tree.qrc Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,5 @@ + + + 4.6.0-list.txt + + diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/io/qdir/tree/tree.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/benchmarks/corelib/io/qdir/tree/tree.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,11 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = bench_qdir_tree +DEPENDPATH += . +INCLUDEPATH += . + +# Input +SOURCES += bench_qdir_tree.cpp +RESOURCES += bench_qdir_tree.qrc + +QT -= gui diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/io/qfile/main.cpp --- a/tests/benchmarks/corelib/io/qfile/main.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/corelib/io/qfile/main.cpp Mon May 03 13:17:34 2010 +0300 @@ -175,7 +175,10 @@ void tst_qfile::readBigFile_QFile() { readBigFile(); } void tst_qfile::readBigFile_QFSFileEngine() { readBigFile(); } -void tst_qfile::readBigFile_posix() { readBigFile(); } +void tst_qfile::readBigFile_posix() +{ + readBigFile(); +} void tst_qfile::readBigFile_Win32() { readBigFile(); } void tst_qfile::readBigFile_QFile_data() @@ -476,8 +479,14 @@ void tst_qfile::readSmallFiles_QFile() { readSmallFiles(); } void tst_qfile::readSmallFiles_QFSFileEngine() { readSmallFiles(); } -void tst_qfile::readSmallFiles_posix() { readSmallFiles(); } -void tst_qfile::readSmallFiles_Win32() { readSmallFiles(); } +void tst_qfile::readSmallFiles_posix() +{ + readSmallFiles(); +} +void tst_qfile::readSmallFiles_Win32() +{ + readSmallFiles(); +} void tst_qfile::readSmallFiles_QFile_data() { @@ -534,7 +543,7 @@ dir.cd("tst"); tmpDirName = dir.absolutePath(); -#ifdef Q_OS_SYMBIAN +#if defined(Q_OS_SYMBIAN) || defined(Q_WS_WINCE) for (int i = 0; i < 100; ++i) #else for (int i = 0; i < 1000; ++i) diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/tools/containers-sequential/main.cpp --- a/tests/benchmarks/corelib/tools/containers-sequential/main.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/corelib/tools/containers-sequential/main.cpp Mon May 03 13:17:34 2010 +0300 @@ -133,7 +133,7 @@ }; // Symbian devices typically have limited memory -#ifdef Q_OS_SYMBIAN +#if defined(Q_OS_SYMBIAN) || defined(Q_WS_WINCE) # define LARGE_MAX_SIZE 2000 #else # define LARGE_MAX_SIZE 20000 diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/tools/qstringlist/.gitignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/benchmarks/corelib/tools/qstringlist/.gitignore Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,1 @@ +tst_qstringlist diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/corelib/tools/qstringlist/main.cpp --- a/tests/benchmarks/corelib/tools/qstringlist/main.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/corelib/tools/qstringlist/main.cpp Mon May 03 13:17:34 2010 +0300 @@ -147,6 +147,7 @@ void tst_QStringList::split_std() const { +#ifndef QT_NO_STL QFETCH(QString, input); const char split_char = ':'; std::string stdinput = input.toStdString(); @@ -159,10 +160,12 @@ token.push_back(each)) ; } +#endif } void tst_QStringList::split_stdw() const { +#ifndef QT_NO_STL QFETCH(QString, input); const wchar_t split_char = ':'; std::wstring stdinput = input.toStdWString(); @@ -175,6 +178,7 @@ token.push_back(each)) ; } +#endif } void tst_QStringList::split_ba() const diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/main.cpp --- a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/main.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/main.cpp Mon May 03 13:17:34 2010 +0300 @@ -751,7 +751,7 @@ aargv[aargc++] = argv[i]; } - QApplication app(argc, argv); + QApplication app(aargc, aargv); int returnValue = 0; if (settings.options() & Settings::ManualTest) { diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp --- a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp Mon May 03 13:17:34 2010 +0300 @@ -414,6 +414,9 @@ void tst_QGraphicsView::chipTester() { +#ifdef Q_WS_WINCE_WM +QSKIP("WinCE WM: Fails on Windows Mobile w/o OpenGL", SkipAll); +#endif QFETCH(bool, antialias); QFETCH(bool, opengl); QFETCH(int, operation); diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro --- a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro Mon May 03 13:17:34 2010 +0300 @@ -1,6 +1,6 @@ load(qttest_p4) TEMPLATE = app -TARGET = tst_qfile_vs_qnetworkaccessmanager +TARGET = tst_bench_qfile_vs_qnetworkaccessmanager DEPENDPATH += . INCLUDEPATH += . diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp --- a/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp Mon May 03 13:17:34 2010 +0300 @@ -555,7 +555,7 @@ void tst_qnetworkreply::httpUploadPerformance() { -#ifdef Q_OS_SYMBIAN +#if defined(Q_OS_SYMBIAN) || defined(Q_WS_WINCE_WM) // SHow some mercy for non-desktop platform/s enum {UploadSize = 4*1024*1024}; // 4 MB #else @@ -626,7 +626,7 @@ { QFETCH(bool, serverSendsContentLength); QFETCH(bool, chunkedEncoding); -#ifdef Q_OS_SYMBIAN +#if defined(Q_OS_SYMBIAN) || defined(Q_WS_WINCE_WM) // Show some mercy to non-desktop platform/s enum {UploadSize = 4*1024*1024}; // 4 MB #else diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/network/kernel/qhostinfo/main.cpp --- a/tests/benchmarks/network/kernel/qhostinfo/main.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/network/kernel/qhostinfo/main.cpp Mon May 03 13:17:34 2010 +0300 @@ -48,10 +48,15 @@ #include #include +#include "private/qhostinfo_p.h" + class tst_qhostinfo : public QObject { Q_OBJECT +public slots: + void init(); private slots: + void lookupSpeed_data(); void lookupSpeed(); }; @@ -70,14 +75,33 @@ } }; +void tst_qhostinfo::init() +{ + // delete the cache so inidividual testcase results are independant from each other + qt_qhostinfo_clear_cache(); +} + +void tst_qhostinfo::lookupSpeed_data() +{ + QTest::addColumn("cache"); + QTest::newRow("WithCache") << true; + QTest::newRow("WithoutCache") << false; +} + void tst_qhostinfo::lookupSpeed() { + QFETCH(bool, cache); + qt_qhostinfo_enable_cache(cache); + QStringList hostnameList; hostnameList << "www.ovi.com" << "www.nokia.com" << "qt.nokia.com" << "www.trolltech.com" << "troll.no" << "www.qtcentre.org" << "forum.nokia.com" << "www.forum.nokia.com" << "wiki.forum.nokia.com" << "www.nokia.no" << "nokia.de" << "127.0.0.1" << "----"; // also add some duplicates: hostnameList << "www.nokia.com" << "127.0.0.1" << "www.trolltech.com"; + // and some more + hostnameList << hostnameList; + const int COUNT = hostnameList.size(); SignalReceiver receiver(COUNT); diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/network/network.pro --- a/tests/benchmarks/network/network.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/network/network.pro Mon May 03 13:17:34 2010 +0300 @@ -1,5 +1,5 @@ TEMPLATE = subdirs SUBDIRS = \ access \ - kernel \ +# kernel \ socket diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp --- a/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp Mon May 03 13:17:34 2010 +0300 @@ -175,6 +175,9 @@ QFETCH_GLOBAL(bool, setProxy); if (setProxy) return; +#if defined(Q_WS_WINCE_WM) + QSKIP("WinCE WM: Not yet supported", SkipAll); +#endif #if defined(Q_OS_SYMBIAN) QSKIP("Symbian: IPv6 is not yet supported", SkipAll); diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/plugins/imageformats/jpeg/jpeg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/benchmarks/plugins/imageformats/jpeg/jpeg.cpp Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(Q_OS_SYMBIAN) +# define SRCDIR "" +#endif + +class tst_jpeg : public QObject +{ + Q_OBJECT +private slots: + void jpegDecodingQtWebkitStyle(); +}; + +void tst_jpeg::jpegDecodingQtWebkitStyle() +{ + // QtWebkit currently calls size() to get the image size for layouting purposes. + // Then when it is in the viewport (we assume that here) it actually gets decoded. + QFile inputJpeg(SRCDIR "n900.jpeg"); + QVERIFY(inputJpeg.exists()); + inputJpeg.open(QIODevice::ReadOnly); + QByteArray imageData = inputJpeg.readAll(); + QBuffer buffer; + buffer.setData(imageData); + buffer.open(QBuffer::ReadOnly); + QCOMPARE(buffer.size(), qint64(19016)); + + + QBENCHMARK{ + for (int i = 0; i < 50; i++) { + QImageReader reader(&buffer, "jpeg"); + QSize size = reader.size(); + QVERIFY(!size.isNull()); + QByteArray format = reader.format(); + QVERIFY(!format.isEmpty()); + QImage img = reader.read(); + QVERIFY(!img.isNull()); + buffer.reset(); + } + } +} + +QTEST_MAIN(tst_jpeg) + +#include "jpeg.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,18 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = jpeg +DEPENDPATH += . +INCLUDEPATH += . + +CONFIG += release + +wince*: { + DEFINES += SRCDIR=\\\"\\\" +} else:symbian { + # SRCDIR and SVGFILE defined in code in symbian +}else { + DEFINES += SRCDIR=\\\"$$PWD/\\\" +} + +# Input +SOURCES += jpeg.cpp diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/plugins/imageformats/jpeg/n900.jpeg Binary file tests/benchmarks/plugins/imageformats/jpeg/n900.jpeg has changed diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/script/qscriptvalue/tst_qscriptvalue.cpp --- a/tests/benchmarks/script/qscriptvalue/tst_qscriptvalue.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/script/qscriptvalue/tst_qscriptvalue.cpp Mon May 03 13:17:34 2010 +0300 @@ -69,6 +69,8 @@ void property(); void setProperty(); void propertyFlags(); + void readMetaProperty(); + void writeMetaProperty(); }; tst_QScriptValue::tst_QScriptValue() @@ -201,5 +203,28 @@ } } +void tst_QScriptValue::readMetaProperty() +{ + QScriptEngine engine; + QScriptValue object = engine.newQObject(QCoreApplication::instance()); + QScriptString propertyName = engine.toStringHandle("objectName"); + QBENCHMARK { + for (int i = 0; i < 10000; ++i) + object.property(propertyName); + } +} + +void tst_QScriptValue::writeMetaProperty() +{ + QScriptEngine engine; + QScriptValue object = engine.newQObject(QCoreApplication::instance()); + QScriptString propertyName = engine.toStringHandle("objectName"); + QScriptValue value(&engine, "foo"); + QBENCHMARK { + for (int i = 0; i < 10000; ++i) + object.setProperty(propertyName, value); + } +} + QTEST_MAIN(tst_QScriptValue) #include "tst_qscriptvalue.moc" diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/uimodels/GraphicsViewBenchmark/testautom/testautom.pro --- a/tests/benchmarks/uimodels/GraphicsViewBenchmark/testautom/testautom.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/uimodels/GraphicsViewBenchmark/testautom/testautom.pro Mon May 03 13:17:34 2010 +0300 @@ -40,3 +40,8 @@ OTHER_FILES = testscript.js \ testautom.pri + +# Causes crashing on Symbian if paging is enabled. +symbian { + MMP_RULES -= PAGED +} \ No newline at end of file diff -r 2f34d5167611 -r fcece45ef507 tests/benchmarks/uimodels/GraphicsViewBenchmark/testmanual/testmanual.pro --- a/tests/benchmarks/uimodels/GraphicsViewBenchmark/testmanual/testmanual.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/benchmarks/uimodels/GraphicsViewBenchmark/testmanual/testmanual.pro Mon May 03 13:17:34 2010 +0300 @@ -25,3 +25,8 @@ } DEPLOYMENT_PLUGIN += resourcemonplugin + +# Causes crashing on Symbian if paging is enabled. +symbian { + MMP_RULES -= PAGED +} \ No newline at end of file diff -r 2f34d5167611 -r fcece45ef507 tests/qtp/qtp_anomaly/qtp_anomaly.pro --- a/tests/qtp/qtp_anomaly/qtp_anomaly.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tests/qtp/qtp_anomaly/qtp_anomaly.pro Mon May 03 13:17:34 2010 +0300 @@ -35,7 +35,7 @@ TARGET.UID3 = 0xED83EC04 include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) HEADERS += $$QT_SOURCE_TREE/examples/network/qftp/sym_iap_util.h - LIBS += -lesock -linsock -lconnmon + LIBS += -lesock -linsock -lconnmon -lcommdb TARGET.CAPABILITY = NetworkServices TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 } diff -r 2f34d5167611 -r fcece45ef507 tests/shared/filesystem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/shared/filesystem.h Mon May 03 13:17:34 2010 +0300 @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +// Helper functions for creating file-system hierarchies and cleaning up. + +#ifndef QT_TESTS_SHARED_FILESYSTEM_H_INCLUDED +#define QT_TESTS_SHARED_FILESYSTEM_H_INCLUDED + +#include +#include +#include +#include + +struct FileSystem +{ + ~FileSystem() + { + Q_FOREACH(QString fileName, createdFiles) + QFile::remove(fileName); + + Q_FOREACH(QString dirName, createdDirectories) + currentDir.rmdir(dirName); + } + + bool createDirectory(const QString &dirName) + { + if (currentDir.mkdir(dirName)) { + createdDirectories.prepend(dirName); + return true; + } + return false; + } + + bool createFile(const QString &fileName) + { + QFile file(fileName); + if (file.open(QIODevice::WriteOnly)) { + createdFiles << fileName; + return true; + } + return false; + } + + bool createLink(const QString &destination, const QString &linkName) + { + if (QFile::link(destination, linkName)) { + createdFiles << linkName; + return true; + } + return false; + } + +private: + QDir currentDir; + + QStringList createdDirectories; + QStringList createdFiles; +}; + +#endif // include guard diff -r 2f34d5167611 -r fcece45ef507 tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp --- a/tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp Mon May 03 13:17:34 2010 +0300 @@ -585,7 +585,7 @@ this->m_indexFilesFolder = indexFilesFolder; mutex.unlock(); - start(QThread::NormalPriority); + start(QThread::LowestPriority); } void QHelpSearchIndexWriter::optimizeIndex() diff -r 2f34d5167611 -r fcece45ef507 tools/assistant/lib/qhelpsearchindexwriter_default.cpp --- a/tools/assistant/lib/qhelpsearchindexwriter_default.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/assistant/lib/qhelpsearchindexwriter_default.cpp Mon May 03 13:17:34 2010 +0300 @@ -191,7 +191,7 @@ this->m_collectionFile = collectionFile; this->m_indexFilesFolder = indexFilesFolder; - start(QThread::NormalPriority); + start(QThread::LowestPriority); } void QHelpSearchIndexWriter::run() diff -r 2f34d5167611 -r fcece45ef507 tools/configure/configureapp.cpp --- a/tools/configure/configureapp.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/configure/configureapp.cpp Mon May 03 13:17:34 2010 +0300 @@ -969,6 +969,10 @@ if(i==argCount) break; dictionary[ "QT_LIBINFIX" ] = configCmdLine.at(i); + if (dictionary.contains("XQMAKESPEC") && dictionary["XQMAKESPEC"].startsWith("symbian")) { + dictionary[ "QT_INSTALL_PLUGINS" ] = + QString("\\resource\\qt%1\\plugins").arg(dictionary[ "QT_LIBINFIX" ]); + } } else if( configCmdLine.at(i) == "-D" ) { ++i; if (i==argCount) @@ -1487,6 +1491,7 @@ dictionary[ "QT_HOST_PREFIX" ] = dictionary[ "QT_INSTALL_PREFIX" ]; dictionary[ "QT_INSTALL_PREFIX" ] = ""; dictionary[ "QT_INSTALL_PLUGINS" ] = "\\resource\\qt\\plugins"; + dictionary[ "QT_INSTALL_TRANSLATIONS" ] = "\\resource\\qt\\translations"; dictionary[ "ARM_FPU_TYPE" ] = "softvfp"; dictionary[ "SQL_SQLITE" ] = "yes"; dictionary[ "SQL_SQLITE_LIB" ] = "system"; @@ -3025,6 +3030,8 @@ qconfigList += "QT_NO_CRASHHANDLER"; qconfigList += "QT_NO_PRINTER"; qconfigList += "QT_NO_SYSTEMTRAYICON"; + if (dictionary.contains("QT_LIBINFIX")) + tmpStream << QString("#define QT_LIBINFIX \"%1\"").arg(dictionary["QT_LIBINFIX"]) << endl; } qconfigList.sort(); @@ -3703,7 +3710,7 @@ QTextStream txt(&file); txt << "all:\n"; txt << "\t" << args.join(" ") << "\n"; - txt << "\t" << dictionary[ "MAKE" ] << " -f " << it->target << "\n"; + txt << "\t\"$(MAKE)\" -$(MAKEFLAGS) -f " << it->target << "\n"; txt << "first: all\n"; txt << "qmake:\n"; txt << "\t" << args.join(" ") << "\n"; diff -r 2f34d5167611 -r fcece45ef507 tools/linguist/linguist/mainwindow.cpp --- a/tools/linguist/linguist/mainwindow.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/linguist/linguist/mainwindow.cpp Mon May 03 13:17:34 2010 +0300 @@ -2370,7 +2370,7 @@ // because we get a lot of false positives. if (c != '&' && c != ' ' && QChar(c).isPrint()) { const ushort *pp = p; - for (; ::isalpha(*p); p++) ; + for (; *p < 256 && ::isalpha(*p); p++) ; if (pp == p || *p != ';') return true; // This looks like a HTML &entity;, so ignore it. As a HTML string diff -r 2f34d5167611 -r fcece45ef507 tools/linguist/lupdate/cpp.cpp --- a/tools/linguist/lupdate/cpp.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/linguist/lupdate/cpp.cpp Mon May 03 13:17:34 2010 +0300 @@ -260,6 +260,8 @@ bool qualifyOneCallbackOwn(const Namespace *ns, void *context) const; bool qualifyOneCallbackUsing(const Namespace *ns, void *context) const; bool qualifyOne(const NamespaceList &namespaces, int nsCnt, const HashString &segment, + NamespaceList *resolved, QSet *visitedUsings) const; + bool qualifyOne(const NamespaceList &namespaces, int nsCnt, const HashString &segment, NamespaceList *resolved) const; bool fullyQualify(const NamespaceList &namespaces, int nsCnt, const QList &segments, bool isDeclaration, @@ -1036,15 +1038,16 @@ } struct QualifyOneData { - QualifyOneData(const NamespaceList &ns, int nsc, const HashString &seg, NamespaceList *rslvd) - : namespaces(ns), nsCount(nsc), segment(seg), resolved(rslvd) + QualifyOneData(const NamespaceList &ns, int nsc, const HashString &seg, NamespaceList *rslvd, + QSet *visited) + : namespaces(ns), nsCount(nsc), segment(seg), resolved(rslvd), visitedUsings(visited) {} const NamespaceList &namespaces; int nsCount; const HashString &segment; NamespaceList *resolved; - QSet visitedUsings; + QSet *visitedUsings; }; bool CppParser::qualifyOneCallbackOwn(const Namespace *ns, void *context) const @@ -1078,18 +1081,19 @@ { QualifyOneData *data = (QualifyOneData *)context; foreach (const HashStringList &use, ns->usings) - if (!data->visitedUsings.contains(use)) { - data->visitedUsings.insert(use); - if (qualifyOne(use.value(), use.value().count(), data->segment, data->resolved)) + if (!data->visitedUsings->contains(use)) { + data->visitedUsings->insert(use); + if (qualifyOne(use.value(), use.value().count(), data->segment, data->resolved, + data->visitedUsings)) return true; } return false; } bool CppParser::qualifyOne(const NamespaceList &namespaces, int nsCnt, const HashString &segment, - NamespaceList *resolved) const + NamespaceList *resolved, QSet *visitedUsings) const { - QualifyOneData data(namespaces, nsCnt, segment, resolved); + QualifyOneData data(namespaces, nsCnt, segment, resolved, visitedUsings); if (visitNamespace(namespaces, nsCnt, &CppParser::qualifyOneCallbackOwn, &data)) return true; @@ -1097,6 +1101,14 @@ return visitNamespace(namespaces, nsCnt, &CppParser::qualifyOneCallbackUsing, &data); } +bool CppParser::qualifyOne(const NamespaceList &namespaces, int nsCnt, const HashString &segment, + NamespaceList *resolved) const +{ + QSet visitedUsings; + + return qualifyOne(namespaces, nsCnt, segment, resolved, &visitedUsings); +} + bool CppParser::fullyQualify(const NamespaceList &namespaces, int nsCnt, const QList &segments, bool isDeclaration, NamespaceList *resolved, QStringList *unresolved) const diff -r 2f34d5167611 -r fcece45ef507 tools/linguist/phrasebooks/russian.qph --- a/tools/linguist/phrasebooks/russian.qph Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/linguist/phrasebooks/russian.qph Mon May 03 13:17:34 2010 +0300 @@ -1164,4 +1164,44 @@ Table of Contents Оглавление + + parse + разобрать + + + parsing + разбор + + + phrasebook + глоссарий + + + phrase book + глоссарий + + + In use + Используется + + + Access denied + Доступ запрещён + + + No error + Нет ошибки + + + Not supported + Не поддерживается + + + Already exists + Уже существует + + + Permission denied + Доступ запрещён + diff -r 2f34d5167611 -r fcece45ef507 tools/qtestlib/wince/cetest/cetest.pro --- a/tools/qtestlib/wince/cetest/cetest.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/qtestlib/wince/cetest/cetest.pro Mon May 03 13:17:34 2010 +0300 @@ -19,9 +19,12 @@ $$QT_SOURCE_TREE/tools/qtestlib/ce/cetest \ $$QT_SOURCE_TREE/qmake \ $$QT_SOURCE_TREE/qmake/generators/symbian \ + $$QT_SOURCE_TREE/tools/shared \ $$QT_BUILD_TREE/include \ $$QT_BUILD_TREE/include/QtCore \ $$QT_BUILD_TREE/src/corelib/global + +VPATH += $$QT_SOURCE_TREE/tools/shared DEPENDPATH += $$QT_BUILD_TREE/src/corelib/tools $$QT_BUILD_TREE/src/corelib/io @@ -33,6 +36,8 @@ SOURCES += \ remoteconnection.cpp \ deployment.cpp \ + symbian/epocroot.cpp \ + windows/registry.cpp \ main.cpp LIBS += ole32.lib advapi32.lib diff -r 2f34d5167611 -r fcece45ef507 tools/qtestlib/wince/cetest/qmake_include.pri --- a/tools/qtestlib/wince/cetest/qmake_include.pri Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/qtestlib/wince/cetest/qmake_include.pri Mon May 03 13:17:34 2010 +0300 @@ -5,5 +5,7 @@ $$QT_SOURCE_TREE/qmake/option.cpp \ $$QT_SOURCE_TREE/qmake/project.cpp \ $$QT_SOURCE_TREE/qmake/property.cpp \ - $$QT_SOURCE_TREE/qmake/generators/symbian/initprojectdeploy_symbian.cpp + $$QT_SOURCE_TREE/qmake/generators/symbian/initprojectdeploy_symbian.cpp \ + $$QT_SOURCE_TREE/tools/shared/symbian/epocroot.cpp \ + $$QT_SOURCE_TREE/tools/shared/windows/registry.cpp diff -r 2f34d5167611 -r fcece45ef507 tools/runonphone/main.cpp --- a/tools/runonphone/main.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/runonphone/main.cpp Mon May 03 13:17:34 2010 +0300 @@ -44,9 +44,9 @@ #include #include #include -#include "trkutils.h" -#include "trkdevice.h" -#include "launcher.h" +#include "symbianutils/trkutils.h" +#include "symbianutils/trkdevice.h" +#include "symbianutils/launcher.h" #include "trksignalhandler.h" #include "serenum.h" @@ -133,28 +133,28 @@ return 1; } - if(serialPortName.isEmpty()) { - if(loglevel > 0) + if (serialPortName.isEmpty()) { + if (loglevel > 0) outstream << "Detecting serial ports" << endl; QList ports = enumerateSerialPorts(); foreach(SerialPortId id, ports) { - if(loglevel > 0) + if (loglevel > 0) outstream << "Port Name: " << id.portName << ", " << "Friendly Name:" << id.friendlyName << endl; - if(serialPortName.isEmpty()) { - if(!id.friendlyName.isEmpty() && - serialPortFriendlyName.isEmpty() && - (id.friendlyName.contains("symbian", Qt::CaseInsensitive) || - id.friendlyName.contains("s60", Qt::CaseInsensitive) || - id.friendlyName.contains("nokia", Qt::CaseInsensitive))) + if (serialPortName.isEmpty()) { + if (!id.friendlyName.isEmpty() + && serialPortFriendlyName.isEmpty() + && (id.friendlyName.contains("symbian", Qt::CaseInsensitive) + || id.friendlyName.contains("s60", Qt::CaseInsensitive) + || id.friendlyName.contains("nokia", Qt::CaseInsensitive))) serialPortName = id.portName; - else if (!id.friendlyName.isEmpty() && - !serialPortFriendlyName.isEmpty() && - id.friendlyName.contains(serialPortFriendlyName)) - serialPortName = id.portName; + else if (!id.friendlyName.isEmpty() + && !serialPortFriendlyName.isEmpty() + && id.friendlyName.contains(serialPortFriendlyName)) + serialPortName = id.portName; } } - if(serialPortName.isEmpty()) { + if (serialPortName.isEmpty()) { errstream << "No phone found, ensure USB cable is connected or specify manually with -p" << endl; return 1; } @@ -162,7 +162,7 @@ QScopedPointer launcher; - if(sisFile.isEmpty()) { + if (sisFile.isEmpty()) { launcher.reset(new trk::Launcher(trk::Launcher::ActionCopyRun)); launcher->setCopyFileName(exeFile, QString("c:\\sys\\bin\\") + exeFile); errstream << "System TRK required to copy EXE, use --sis if using Application TRK" << endl; @@ -172,14 +172,14 @@ launcher->setCopyFileName(sisFile, "c:\\data\\testtemp.sis"); launcher->setInstallFileName("c:\\data\\testtemp.sis"); } - if(loglevel > 0) + if (loglevel > 0) outstream << "Connecting to target via " << serialPortName << endl; launcher->setTrkServerName(serialPortName); launcher->setFileName(QString("c:\\sys\\bin\\") + exeFile); launcher->setCommandLineArgs(cmdLine); - if(loglevel > 1) + if (loglevel > 1) launcher->setVerbose(1); TrkSignalHandler handler; @@ -212,7 +212,7 @@ } QString errorMessage; - if(!launcher->startServer(&errorMessage)) { + if (!launcher->startServer(&errorMessage)) { errstream << errorMessage << endl; return 1; } diff -r 2f34d5167611 -r fcece45ef507 tools/runonphone/serenum_stub.cpp --- a/tools/runonphone/serenum_stub.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/runonphone/serenum_stub.cpp Mon May 03 13:17:34 2010 +0300 @@ -47,7 +47,7 @@ QList enumerateSerialPorts() { QList list; - qWarning() << "enumerateSerialPorts not implemented" << endl; + qWarning() << "enumerateSerialPorts not implemented"; return list; } diff -r 2f34d5167611 -r fcece45ef507 tools/runonphone/serenum_unix.cpp --- a/tools/runonphone/serenum_unix.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/runonphone/serenum_unix.cpp Mon May 03 13:17:34 2010 +0300 @@ -51,7 +51,7 @@ QList list; QDir dir("/dev/serial/by-id/"); QFileInfoList ports(dir.entryInfoList()); - foreach(QFileInfo info, ports) { + foreach (const QFileInfo &info, ports) { if (!info.isDir()) { SerialPortId id; id.friendlyName = info.fileName(); diff -r 2f34d5167611 -r fcece45ef507 tools/runonphone/trksignalhandler.cpp --- a/tools/runonphone/trksignalhandler.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/tools/runonphone/trksignalhandler.cpp Mon May 03 13:17:34 2010 +0300 @@ -58,13 +58,13 @@ void TrkSignalHandler::copyingStarted() { - if(d->loglevel > 0) + if (d->loglevel > 0) d->out << "Copying..." << endl; } void TrkSignalHandler::canNotConnect(const QString &errorMessage) { - d->err << "Cannot Connect - " << errorMessage << endl; + d->err << "Cannot connect - " << errorMessage << endl; } void TrkSignalHandler::canNotCreateFile(const QString &filename, const QString &errorMessage) @@ -84,7 +84,7 @@ void TrkSignalHandler::installingStarted() { - if(d->loglevel > 0) + if (d->loglevel > 0) d->out << "Installing..." << endl; } @@ -95,19 +95,19 @@ void TrkSignalHandler::installingFinished() { - if(d->loglevel > 0) + if (d->loglevel > 0) d->out << "Installing finished" << endl; } void TrkSignalHandler::startingApplication() { - if(d->loglevel > 0) + if (d->loglevel > 0) d->out << "Starting app..." << endl; } void TrkSignalHandler::applicationRunning(uint pid) { - if(d->loglevel > 0) + if (d->loglevel > 0) d->out << "Running..." << endl; } @@ -118,29 +118,29 @@ void TrkSignalHandler::finished() { - if(d->loglevel > 0) + if (d->loglevel > 0) d->out << "Done." << endl; QCoreApplication::quit(); } void TrkSignalHandler::applicationOutputReceived(const QString &output) { - d->out << output; + d->out << output << flush; } void TrkSignalHandler::copyProgress(int percent) { - if(d->loglevel > 0) { + if (d->loglevel > 0) { d->out << percent << "% "; d->out.flush(); - if(percent==100) + if (percent==100) d->out << endl; } } void TrkSignalHandler::stateChanged(int state) { - if(d->loglevel > 1) + if (d->loglevel > 1) d->out << "State" << state << endl; } @@ -164,10 +164,10 @@ emit terminate(); } -TrkSignalHandlerPrivate::TrkSignalHandlerPrivate() : - out(stdout), - err(stderr), - loglevel(0) +TrkSignalHandlerPrivate::TrkSignalHandlerPrivate() + : out(stdout), + err(stderr), + loglevel(0) { } @@ -179,8 +179,8 @@ } TrkSignalHandler::TrkSignalHandler() + : d(new TrkSignalHandlerPrivate()) { - d = new TrkSignalHandlerPrivate(); } TrkSignalHandler::~TrkSignalHandler() diff -r 2f34d5167611 -r fcece45ef507 translations/assistant_adp_ru.ts --- a/translations/assistant_adp_ru.ts Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/assistant_adp_ru.ts Mon May 03 13:17:34 2010 +0300 @@ -73,63 +73,62 @@ HelpDialog - + &Index &Указатель - + &Look For: &Искать: - + &New &Новая - - + &Search &Поиск - + <b>Enter a keyword.</b><p>The list will select an item that matches the entered string best.</p> <b>Указание ключевого слова.</b><p>Список заполняется элементами, лучше соответствующими указанному ключевому слову.</p> - + <b>Enter search word(s).</b><p>Enter here the word(s) you are looking for. The words may contain wildcards (*). For a sequence of words quote them.</p> <b>Указание слов для поиска.</b><p>Введите одно или несколько слов, по которым требуется осуществить поиск. Слова могут содержкать символы-заменители (*). Если требуется найти сочетание слов, заключите искомую фразу в кавычки.</p> - + <b>Found documents</b><p>This list contains all found documents from the last search. The documents are ordered, i.e. the first document has the most matches.</p> <b>Найденные документы</b><p>В данном списке представлены все найденные при последнем поиске документы. Документы упорядочены по релевантности, т.е. чем выше в списке, тем чаще в нём встречаются искомые слова.</p> - + <b>Help topics organized by category.</b><p>Double-click an item to see the topics in that category. To view a topic, just double-click it.</p> <b>Разделы справки, распределённые по категориям.</b><p>Дважды щёлкните по одному из пунктов для отображения разделов в данной категории. Для открытия раздела дважды щёлкните по нему.</p> - + <b>Help</b><p>Choose the topic you want help on from the contents list, or search the index for keywords.</p> <b>Справка</b><p>Выберите раздел справки из оглавления или воспользуйтесь поиском по предметному указателю.</p> - + <b>List of available help topics.</b><p>Double-click on an item to open its help page. If more than one is found, you must specify which page you want.</p> <b>Список доступных разделов справки.</b><p>Дважды щёлкните по одному из пунктов для открытия страницы справки. Если найдено более одной страницы, выберите желаемую.</p> - + Add new bookmark Добавить закладку - + Add the currently displayed page as a new bookmark. Добавить отображаемую страницу в закладки. @@ -139,47 +138,47 @@ Не удаётся открыть файл индекса %1 - + Con&tents &Оглавление - + Delete bookmark Удалить закладку - + Delete the selected bookmark. Удалить выбранную закладку. - + Enter searchword(s) Введите одно или несколько слов для поиска - + Display the help page Показать страницу справки - + Display the help page for the full text search. Показать справку по полнотекстовому поиску. - + Start searching Начать поиск - + Displays help topics organized by category, index or bookmarks. Another tab inherits the full text search. Отображает список разделов, распредёленных по категориям, указатель или закладки. Последняя вкладка содержит панель полнотекстового поиска. - + Displays the list of bookmarks. Отображает список закладок. @@ -205,7 +204,7 @@ Готово - + Enter keyword Введите ключевое слово @@ -224,7 +223,7 @@ Qt Assistant не будет работать! - + Found &Documents: Найденные &документы: @@ -235,12 +234,12 @@ Полнотекстовый поиск - + He&lp &Справка - + Help Справка @@ -272,12 +271,12 @@ Подготовка... - + Preparing... Подготовка... - + Pressing this button starts the search. Нажатие на эту кнопку запустит процесс поиска. @@ -294,7 +293,7 @@ Чтение каталога... - + Searching f&or: &Искать: @@ -316,8 +315,7 @@ Предупреждение - - + column 1 столбец 1 @@ -336,12 +334,12 @@ - + &Bookmarks &Закладки - + &Delete &Удалить @@ -407,73 +405,72 @@ MainWindow - - + "What's This?" context sensitive help. Контекстная справка "Что это?". - + &Add Bookmark &Добавить закладку - + &Close &Закрыть - + &Copy &Копировать - + &Edit &Правка - + &File &Файл - + &Find in Text... П&оиск по тексту... - + &Go &Перейти - + &Help &Справка - + &Home &Домой - + &Next Сл&едующий - + &Previous &Предыдущий - + &Print... &Печать... - + &View &Вид @@ -488,27 +485,27 @@ ... - + About Qt О Qt - + About Qt Assistant О Qt Assistant - + Add Tab Добавить вкладку - + Add the currently displayed page as a new bookmark. Добавить отображаемую страницу в закладки. - + Boo&kmarks &Закладки @@ -518,17 +515,17 @@ Не удалось открыть файл для записи! - + Close Tab Закрыть вкладку - + Close the current window. Закрыть текущее окно. - + Display further information about Qt Assistant. Показать дополнительную информацию о Qt Assistant. @@ -538,7 +535,7 @@ Открывает стартовую страницу выбранного набора документации. - + E&xit В&ыход @@ -548,32 +545,32 @@ Не удалось получить информацию о приложении из файла: '%1' - + Find &Next Найти &следующее - + Find &Previous Найти &предыдущее - + Font Settings... Настройки шрифта... - + Go Перейти - + Go to the home page. Qt Assistant's home page is the Qt Reference Documentation. Перейти на домашнюю страницу. Домашная страница Qt Assistant - Справочная документация по Qt. - + Go to the next page. Переход на следующую страницу. @@ -588,32 +585,32 @@ Свернуть - + New Window Новое окно - + Next Tab Следующая вкладка - + Open a new window. Открыть новое окно. - + Open the Find dialog. Qt Assistant will search the currently displayed page for the text you enter. Открыть окно поиска. Qt Assistant произведёт поиск введённого текста на отображаемой странице. - + Previous Tab Предыдущая вкладка - + Print the currently displayed page. Печатать отображаемую страницу. @@ -624,17 +621,17 @@ Qt Assistant - + Qt Assistant Manual Руководство по Qt Assistant - + Qt Assistant by Nokia Qt Assistant от Nokia - + Quit Qt Assistant. Выйти из Qt Assistant. @@ -645,12 +642,12 @@ Сохранить страницу - + Save Page As... Сохранить страницу как... - + Select the page in contents tab. Выбрать страницу во вкладке оглавления. @@ -660,12 +657,12 @@ Боковая панель - + Sync with Table of Contents Синхронизировать с оглавлением - + Toolbar Панель инструментов @@ -675,27 +672,27 @@ Виды - + What's This? Что это? - + Zoom &in У&величить - + Zoom &out У&меньшить - + Zoom in on the document, i.e. increase the font size. Увеличить размер шрифта. - + Zoom out on the document, i.e. decrease the font size. Уменьшить размер шрифта. @@ -740,112 +737,112 @@ - + Ctrl+P - + Ctrl+Q - + Copy the selected text to the clipboard. Скопировать выделенный текст в буфер обмена. - + Ctrl+C - + Ctrl+F - + F3 - + Shift+F3 - + Ctrl+Home - + Go to the previous page. Переход на предыдущую страницу. - + Alt+Left - + Alt+Right - + Ctrl++ - + Ctrl+- - + Ctrl+N - + Ctrl+W - + Shift+F1 - + Ctrl+Alt+N - + Ctrl+Alt+Right - + Ctrl+Alt+Left - + Ctrl+Alt+Q - + F1 - + Ctrl+Alt+S @@ -866,7 +863,7 @@ ... - + <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Search wrapped <img src=":/trolltech/assistant/images/wrap.png">&nbsp;Поиск с начала @@ -876,7 +873,7 @@ Добавить вкладку - + Case Sensitive Учитывать регистр @@ -901,50 +898,50 @@ Новая вкладка - + Next Следующее - + Previous Предыдущее - + Untitled Безымянный - + Whole words Слова целиком - + TabbedBrowser - + TabbedBrowser TopicChooser - + &Close &Закрыть - + &Display &Показать - + &Topics &Разделы - + Choose Topic Выбор раздела @@ -954,22 +951,22 @@ Выберите раздел для <b>%1</b> - + Close the Dialog. Закрыть диалог. - + Displays a list of available help topics for the keyword. Показывает список доступных разделов справки, найденных по ключевому слову. - + Open the topic selected in the list. Открыть выбранный раздел. - + Select a topic from the list and click the <b>Display</b>-button to open the online help. Выберите раздел из списка и нажмите на кнопку <b>Показать</b> для открытия онлайн справки. diff -r 2f34d5167611 -r fcece45ef507 translations/assistant_ru.ts --- a/translations/assistant_ru.ts Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/assistant_ru.ts Mon May 03 13:17:34 2010 +0300 @@ -32,41 +32,41 @@ BookmarkDialog - + Add Bookmark Добавление закладки - + Bookmark: Закладка: - + Add in Folder: Добавить в папку: - + + + - + New Folder Новая папка - + - + Bookmarks Закладки - + Delete Folder Удалить папку @@ -79,7 +79,7 @@ BookmarkManager - + Bookmarks Закладки @@ -103,7 +103,7 @@ BookmarkWidget - + Delete Folder Удалить папку @@ -151,7 +151,7 @@ CentralWidget - + Add new page Открыть новую страницу @@ -166,7 +166,7 @@ Печать документа - + unknown безымянная вкладка @@ -192,7 +192,7 @@ Добавить закладку для этой страницы... - + Search Поиск @@ -213,12 +213,12 @@ FilterNameDialogClass - + Add Filter Name Добавление фильтра - + Filter Name: Название фильтра: @@ -226,7 +226,7 @@ FindWidget - + Previous Предыдущее @@ -282,7 +282,7 @@ HelpViewer - + Open Link in New Tab Открыть ссылку в новой вкладке @@ -327,7 +327,7 @@ &Искать: - + Open Link Открыть ссылку @@ -340,7 +340,7 @@ InstallDialog - + Install Documentation Установка документации @@ -407,32 +407,32 @@ %1 - + Available Documentation: Доступная документация: - + Install Установить - + Cancel Отмена - + Close Закрыть - + Installation Path: Путь установки: - + ... ... @@ -441,31 +441,31 @@ MainWindow - + Index Указатель - - + + Contents Содержание - - + + Bookmarks Закладки - - - + + + Qt Assistant Qt Assistant - + Unfiltered Без фильтрации @@ -526,7 +526,12 @@ П&оиск в тексте... - + + &Find + &Поиск + + + Find &Next Найти &следующее @@ -621,7 +626,12 @@ Синхронизировать с оглавлением - + + Sync + Синхронизировать + + + Next Page Следующая страница @@ -706,7 +716,7 @@ Отфильтровано по: - + Address Toolbar Панель адреса @@ -783,118 +793,117 @@ PreferencesDialogClass - + Preferences Настройки - + Fonts Шрифты - + Font settings: Настройки шрифта: - + Browser Обозреватель - + Application Приложение - + Filters Фильтры - + Filter: Фильтр: - + Attributes: Атрибуты: - + 1 1 - + Add Добавить - - + Remove Удалить - + Documentation Документация - + Registered Documentation: Зарегистрированная документация: - + Add... Добавить... - + Options Параметры - + Homepage Стартовая страница - + Current Page Текущая страница - + Restore to default Страница по умолчанию - + On help start: При запуске: - + Show my home page Отобразить стартовую страницу - + Show a blank page Отобразить пустую страницу - + Show my tabs from last session Восстановить предыдущую сессиию - + Blank Page Пустая страница @@ -964,7 +973,7 @@ Qt Assistant - + Could not register documentation file %1 @@ -1026,7 +1035,7 @@ SearchWidget - + &Copy &Копировать @@ -1054,22 +1063,22 @@ Выберите раздел для <b>%1</b>: - + Choose Topic Выбор раздела - + &Topics &Разделы - + &Display &Показать - + &Close &Закрыть diff -r 2f34d5167611 -r fcece45ef507 translations/designer_ru.ts --- a/translations/designer_ru.ts Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/designer_ru.ts Mon May 03 13:17:34 2010 +0300 @@ -32,17 +32,17 @@ AddLinkDialog - + Insert Link Вставить ссылку - + Title: Заголовок: - + URL: URL: @@ -149,12 +149,12 @@ AppearanceOptionsWidget - + Form Форма - + User Interface Mode Режим пользовательского интерфейса @@ -585,7 +585,7 @@ Изменить компоновку '%1' с %2 на %3 - + Set action text Установить текст действия @@ -596,12 +596,12 @@ - + Move action Переместить действие - + Change Title Изменить заголовок @@ -680,24 +680,22 @@ ConnectDialog - + Configure Connection Настройка соединения - - + GroupBox GroupBox - - + Edit... Изменить... - + Show signals and slots inherited from QWidget Показывать сигналы и слоты, унаследованные от QWidget @@ -705,7 +703,7 @@ ConnectionDelegate - + <object> <объект> @@ -761,12 +759,12 @@ Invalid UI file: The root element <ui> is missing. - Некорректный файл UI: Отсутствует корневой элемент <ui>. + Некорректный файл UI: Отсутствует корневой элемент <ui>. An error has occurred while reading the UI file at line %1, column %2: %3 - При чтении файла UI в строке %1 позиции %2 возникла ошибка: %3 + При чтении файла UI в строке %1 позиции %2 возникла ошибка: %3 @@ -808,7 +806,7 @@ This file cannot be read because the extra info extension failed to load. - Не удалось прочитать файл, так как возникла ошибка при загрузке расширения дополнительной информации. + Не удалось прочитать файл, так как возникла ошибка при загрузке расширения дополнительной информации. @@ -869,27 +867,27 @@ DeviceProfileDialog - + &Family &Шрифт - + &Point Size &Размер - + Style Начертание - + Device DPI DPI устройства - + Name Название @@ -1030,7 +1028,7 @@ FormBuilder - + Invalid stretch value for '%1': '%2' Parsing layout stretch values Некорректный коэффициент растяжения для '%1': '%2' @@ -1074,38 +1072,38 @@ FormLayoutRowDialog - + Add Form Layout Row нелепица какая-то Добавление строки компоновки компоновщика формы - + &Label text: Текст &метки: - + Field &type: &Тип поля: - + &Field name: Имя п&оля: - + &Buddy: П&артнёр: - + &Row: &Строка: - + Label &name: Имя м&етки: @@ -1126,62 +1124,62 @@ FormWindowSettings - + Form Settings Настройки формы - + Layout &Default Компоновка по &умолчанию - + &Spacing: &Отступ: - + &Margin: &Границы: - + &Layout Function &Функция компоновки - + Ma&rgin: Г&раницы: - + Spa&cing: О&тступ: - + &Author &Автор - + &Include Hints &Подключить подсказки - + &Pixmap Function &Загрузчик изображений - + Grid Сетка - + Embedded Design Оформление портативных устройств @@ -1329,12 +1327,12 @@ PluginDialog - + Plugin Information Информация о модуле - + 1 1 @@ -1342,7 +1340,7 @@ PreferencesDialog - + Preferences Настройки @@ -1350,34 +1348,32 @@ PreviewConfigurationWidget - + Form Форма - + Print/Preview Configuration Настройка печати/предпросмотра - + Style Стиль - + Style sheet Таблица стилей - - - + ... ... - + Device skin Обложка устройства @@ -1410,15 +1406,15 @@ An error has occurred while reading the UI file at line %1, column %2: %3 - Возникла ошибка при чтении файла UI в строке %1 позиции %2: %3 + Возникла ошибка при чтении файла UI в строке %1 позиции %2: %3 Invalid UI file: The root element <ui> is missing. - Неверный файл UI: Отсутствует корневой элемент <ui>. - - - + Некорректный файл UI: отсутствует корневой элемент <ui>. + + + The creation of a widget of the class '%1' failed. Не удалось создание виджета класса '%1'. @@ -1932,7 +1928,7 @@ Reset control - Сбросить элемент управления + Сбросить элемент управления @@ -1994,7 +1990,7 @@ QDesignerMenu - + Type Here Пишите здесь @@ -2020,7 +2016,7 @@ - + Add separator Добавить разделитель @@ -2283,7 +2279,7 @@ QFormBuilder - + An empty class name was passed on to %1 (object name: '%2'). Empty class name passed to widget factory method Методу %1 (объекта '%2') было передано пустое имя класса. @@ -2323,6 +2319,16 @@ The property %1 could not be written. The type %2 is not supported yet. Не удалось записать свойство %1. Тип %2 ещё не поддерживается. + + + The enumeration-value '%1' is invalid. The default value '%2' will be used instead. + Значение '%1' перечисляемого типа некорректно. Будет использовано значение '%2'. + + + + The flag-value '%1' is invalid. Zero will be used instead. + Значение флага '%1' перечисляемого типа некорректно. Будет использовано значение '0' (нуль). + QStackedWidgetEventFilter @@ -2456,36 +2462,36 @@ QtBoolEdit - + True - Вкл. + Вкл. False - Выкл. + Выкл. QtBoolPropertyManager - + True - Да + Вкл. False - Нет + Выкл. QtCharEdit - + Clear Char Стереть символ @@ -2501,7 +2507,7 @@ QtColorPropertyManager - + Red Красный @@ -2524,7 +2530,7 @@ QtCursorDatabase - + Arrow Arrow @@ -2673,7 +2679,7 @@ QtGradientDialog - + Edit Gradient Правка градиента @@ -2763,234 +2769,222 @@ Зеркальная - + Form Форма - + Gradient Editor Редактор градиента - + This area shows a preview of the gradient being edited. It also allows you to edit parameters specific to the gradient's type such as start and final point, radius, etc. by drag & drop. Эта область отображает предварительный вариант настраиваемого градиента. Также она позволяет менять с помощью перетаскивания характерные для градиента параметры, такие как: начальная и конечная точки, радиус и пр. - + 1 1 - + 2 2 - + 3 3 - + 4 4 - + 5 5 - + Gradient Stops Editor Редактор опорных точек градиента - + This area allows you to edit gradient stops. Double click on the existing stop handle to duplicate it. Double click outside of the existing stop handles to create a new stop. Drag & drop the handle to reposition it. Use right mouse button to popup context menu with extra actions. Эта область позволяет редактировать опорные точки градиента. Двойной щелчок на существующей точке создаст её копию. Двойной клик вне существующей точки создаст новую. Точки можно перемещать путем удерживания левой кнопки. По правой кнопке можно получить контекстное меню дополнительных действий. - + Zoom Масштаб - - + Reset Zoom 100% - + Position Положение - - - + Hue Оттенок - + H H - - + Saturation Насыщенность - + S S - + Sat Насыщение - - + Value Значение - + V V - + Val Значение - - - + Alpha Альфа - + A A - + Type Тип - + Spread Заливка - + Color Цвет - + Current stop's color Цвет текущей точки - + Show HSV specification Настройки в виде HSV - + HSV HSV - + Show RGB specification Настройки в виде RGB - + RGB RGB - + Current stop's position Положение текущей точки - + % % - + Zoom In Увеличить - + Zoom Out Уменьшить - + Toggle details extension Показать/скрыть детальные настройки - + > > - + Linear Type Линейный тип - - - - - - + ... ... - + Radial Type Радиальный тип - + Conical Type Конический тип - + Pad Spread Равномерная заливка - + Repeat Spread Цикличная заливка - + Reflect Spread Зеркальная заливка @@ -3015,7 +3009,7 @@ Select All - Выделить все + Выделить всё @@ -3038,7 +3032,7 @@ Grad - Градиент + Градиент @@ -3051,31 +3045,31 @@ Вы действительно желаете удалить выбранный градиент? - + New... Новый... - + Edit... Правка... - + Rename Переименовать - + Remove Удалить - + Gradient View Просмотр градиента @@ -3083,7 +3077,8 @@ QtGradientViewDialog - + + Select Gradient Выбрать градиент @@ -3091,7 +3086,7 @@ QtKeySequenceEdit - + Clear Shortcut Удалить комбинацию горячих клавиш @@ -3153,7 +3148,7 @@ QtPropertyBrowserUtils - + [%1, %2, %3] (%4) [%1, %2, %3] (%4) @@ -3269,7 +3264,7 @@ newPrefix - + newPrefix @@ -3460,49 +3455,47 @@ Предупреждение - + Dialog Диалог - + New File Новый файл - - + N N - + Remove File Удалить файл - - + R R - + I I - + New Resource Новый ресурс - + A A - + Remove Resource or File Удалить ресурс или файл @@ -3623,97 +3616,97 @@ < Р А З Д Е Л И Т Е Л Ь > - + Customize Toolbars Настройка панелей инструментов - + 1 1 - + Actions Действия - + Toolbars Панель инструментов - + Add new toolbar Добавить новую панель инструментов - + New Новая - + Remove selected toolbar Удалить выбранную панель инструментов - + Remove Удалить - + Rename toolbar Переименовать панель инструментов - + Rename Переименовать - + Move action up Переместить действие вверх - + Up Вверх - + Remove action from toolbar Удалить действие из панели инструментов - + <- <- - + Add action to toolbar Добавить действие на панель инструментов - + -> -> - + Move action down Переместить действие вниз - + Down Вниз - + Current Toolbar Actions Текущие действия панели инструментов @@ -3781,17 +3774,17 @@ Выберите каталог для сохранения шаблонов - + Save Form As Template Сохранить форму как шаблон - + &Category: &Категория: - + &Name: &Имя: @@ -3809,22 +3802,22 @@ SelectSignalDialog - + Go to slot Переход к слоту - + Select signal Выбор сигнала - + signal сигнал - + class класс @@ -3840,37 +3833,32 @@ SignalSlotDialogClass - + Signals and slots Сигналы и слоты - + Slots Слоты - - + Add Добавить - - - - + ... ... - - + Delete Удалить - + Signals Сигналы @@ -3934,7 +3922,7 @@ VersionDialog - + <h3>%1</h3><br/><br/>Version %2 <h3>%1</h3><br/><br/>Версия %2 @@ -4053,7 +4041,7 @@ qdesigner_internal::ActionModel - + Name Имя @@ -4609,57 +4597,57 @@ qdesigner_internal::Dialog - + Dialog Диалог - + StringList Список строк - + New String Новая строка - + &New &Новая - + Delete String Удалить строку - + &Delete &Удалить - + &Value: &Значение: - + Move String Up Переместить строку вверх - + Up Вверх - + Move String Down Переместить строку вниз - + Down Вниз @@ -4828,7 +4816,7 @@ Выбрать предка - + Lay out Компоновка @@ -4860,7 +4848,7 @@ qdesigner_internal::FormWindowManager - + Cu&t &Вырезать @@ -5074,38 +5062,37 @@ qdesigner_internal::GridPanel - + Form Форма - + Grid Сетка - + Visible Видимая - + Grid &X Сетка &X - - + Snap Прилипать - + Reset Сбросить - + Grid &Y Сетка &Y @@ -5227,53 +5214,53 @@ Свойства &<< - + Properties &>> Свойства &>> - + Items List Список элементов - + New Item Новый элемент - + &New &Новый - + Delete Item Удалить элемент - + &Delete &Удалить - + Move Item Up Переместить элемент вверх - + U U - + Move Item Down Переместить элемент вниз - + D D @@ -5380,43 +5367,42 @@ qdesigner_internal::NewActionDialog - + New Action... Новое действие... - + &Text: &Текст: - + Object &name: &Имя объекта: - + &Icon: &Значок: - + Shortcut: Горячая клавиша: - + Checkable: Триггерное: - + ToolTip: Подсказка: - - + ... ... @@ -5443,22 +5429,22 @@ Укажите другое имя. - + Create Dynamic Property Создание динамического свойства - + Property Name Имя свойства - + horizontalSpacer - + Property Type Тип свойства @@ -5522,27 +5508,27 @@ Внутренняя ошибка: Шаблон не выбран. - + 0 0 - + Choose a template for a preview Выберите шаблон для предпросмотра - + Embedded Design Оформление портативных устройств - + Device: Устройство: - + Screen Size: Размер экрана: @@ -5592,9 +5578,6 @@ &Find in Text... &Найти в тексте... - - - qdesigner_internal::ObjectInspector::ObjectInspectorPrivate Change Current Page @@ -5614,22 +5597,22 @@ %1 %2 - + Change Page Order Изменение порядка страниц - + Page Order Порядок страниц - + Move page up Переместить страницу выше - + Move page down Переместить страницу ниже @@ -5637,47 +5620,47 @@ qdesigner_internal::PaletteEditor - + Edit Palette Правка палитры - + Tune Palette Настройка палитры - + Show Details Показывать детали - + Compute Details Расчитывать детали - + Quick Быстрый - + Preview Предпросмотр - + Disabled Выключенная - + Inactive Неактивная - + Active Активная @@ -5813,9 +5796,6 @@ Browse... Обзор... - - - qdesigner_internal::PreviewConfigurationWidget::PreviewConfigurationWidgetPrivate Load Custom Device Skin @@ -5895,57 +5875,57 @@ qdesigner_internal::PreviewWidget - + Preview Window Окно предпросмотра - + LineEdit LineEdit - + ComboBox ComboBox - + PushButton PushButton - + ButtonGroup2 ButtonGroup2 - + CheckBox1 CheckBox1 - + CheckBox2 CheckBox2 - + ButtonGroup ButtonGroup - + RadioButton1 RadioButton1 - + RadioButton2 RadioButton2 - + RadioButton3 RadioButton3 @@ -6628,23 +6608,23 @@ qdesigner_internal::TableWidgetEditor - + Properties &>> Свойства &>> - + Edit Table Widget Правка табличного виджета - + &Items &Элементы - + Table Items Элементы таблицы @@ -6690,18 +6670,17 @@ Выберите каталог для сохранения шаблонов - + Form Форма - + Additional Template Paths Дополнительные пути к шаблонам - - + ... ... @@ -6803,13 +6782,13 @@ Общие свойства - + New Item Новый элемент - + New Subitem Новый дочерний элемент @@ -6820,88 +6799,88 @@ Свойства &<< - + Properties &>> Свойства &>> - + Edit Tree Widget - Изменение виджета Tree - - - + Изменение виджета Дерево + + + &Items &Элементы - + Tree Items Элементы дерева - + 1 1 - + &New &Новый - + New &Subitem Новый &дочерний элемент - + Delete Item Удалить элемент - + &Delete &Удалить - + Move Item Left (before Parent Item) Переместить элемент влево (перед родительским) - + L L - + Move Item Right (as a First Subitem of the Next Sibling Item) Переместить элемент вправо (сделать первым дочерним элементом соседнего элемента) - + R - + Move Item Up Переместить элемент вверх - + U U - + Move Item Down Переместить элемент вниз - + D D diff -r 2f34d5167611 -r fcece45ef507 translations/linguist_ru.ts --- a/translations/linguist_ru.ts Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/linguist_ru.ts Mon May 03 13:17:34 2010 +0300 @@ -4,7 +4,7 @@ AboutDialog - + Qt Linguist Qt Linguist @@ -12,52 +12,52 @@ BatchTranslationDialog - + Qt Linguist - Batch Translation Qt Linguist - Пакетный перевод - + Options Параметры - + Set translated entries to finished Помечать переведенные записи как завершённые - + Retranslate entries with existing translation Переводить записи, уже имеющие перевод - + Translate also finished entries Также переводить записи с завершёнными переводами - + Phrase book preference - Предпочитаемые разговорники + Предпочитаемые глоссарии - + Move up Поднять - + Move down Опустить - + &Run &Выполнить - + Cancel Отмена @@ -91,14 +91,14 @@ - + Note that the modified entries will be reset to unfinished if 'Set translated entries to finished' above is unchecked Имейте в виду, что изменённые записи будут отмечены как незавершённые, если не включен параметр "Помечать переведенные записи как завершённые" - + The batch translator will search through the selected phrase books in the order given above - Пакетный переводчик будет искать в выбранных разговорниках в указанном выше порядке + Пакетный переводчик будет искать в выбранных глоссариях в указанном выше порядке @@ -110,11 +110,17 @@ + <p>[more duplicates omitted] <p>[остальные повторы не указаны] - + + <p>* ID: %1 + <p>* ID: %1 + + + <p>* Context: %1<br>* Source: %2 <p>* Контекст: %1<br>* Источник: %2 @@ -124,7 +130,7 @@ <br>* Комментарий: %3 - + Linguist does not know the plural rules for '%1'. Will assume a single universal form. Qt Linguist не знает правила множественных форм для '%1'. @@ -161,7 +167,7 @@ A phrase book suggestion for '%1' was ignored. - Предложение разговорника для '%1' пропущено. + Предложение глоссария для '%1' пропущено. @@ -188,92 +194,92 @@ - + Find Поиск - + This window allows you to search for some text in the translation source file. Данное окно позволяет искать текст в файле перевода. - + &Find what: &Искать: - + Type in the text to search for. Введите искомый текст. - + Options Параметры - + Source texts are searched when checked. Если отмечено, поиск будет вестись в исходных текстах. - + &Source texts &Исходные тексты - + Translations are searched when checked. Если отмечено, поиск будет вестись в переведённых текстах. - + &Translations &Переводы - + Texts such as 'TeX' and 'tex' are considered as different when checked. Если отмечено, строки "ПрИмЕр" и "пример" будет считаться разными. - + &Match case С учётом &регистра - + Comments and contexts are searched when checked. Если отмечено, поиск будет вестись по контекстам и комментариям. - + &Comments &Комментарии - + Ignore &accelerators Пропускать &акселераторы - + Click here to find the next occurrence of the text you typed in. Найти следующее совпадение для введённого текста. - + Find Next Найти далее - + Click here to close this window. Закрыть окно. - + Cancel Отмена @@ -281,7 +287,7 @@ FormMultiWidget - + Alt+Delete translate, but don't change @@ -306,23 +312,27 @@ Delete non-empty length variant? - + Удалить непустой вариант длины? LRelease - + Dropped %n message(s) which had no ID. - + Удалено %n сообщение, у которого не было ID. + Удалено %n сообщения, у которых не было ID. + Удалено %n сообщений, у которых не было ID. Excess context/disambiguation dropped from %n message(s). - + Удалён лишний контекст из %n сообщения. + Удалён лишний контекст из %n сообщений. + Удалён лишний контекст из %n сообщений. @@ -355,14 +365,14 @@ MainWindow - + This is the application's main window. Основное окно программы. - + Source text Исходный текст @@ -374,27 +384,27 @@ - + Context Контекст - + Items Записи - + This panel lists the source contexts. В данной панели перечислены исходные контексты. - + Strings Строки - + Phrases and guesses Фразы и похожие переводы @@ -415,7 +425,7 @@ ИЗМ - + Loading... Загрузка... @@ -453,7 +463,7 @@ - + Related files (%1);; Связанные файлы (%1);; @@ -469,7 +479,7 @@ Файл сохранён. - + Release @@ -586,29 +596,29 @@ Create New Phrase Book - Создать разговорник + Создать глоссарий Qt phrase books (*.qph) All files (*) - Разговорники Qt (*.qph) + Глоссарии Qt (*.qph) Все файлы (*) Phrase book created. - Разговорник создан. + Глоссарий создан. Open Phrase Book - Открыть разговорник + Открыть глоссарий Qt phrase books (*.qph);;All files (*) - Разговорники Qt (*.qph);;Все файлы (*) + Глоссарии Qt (*.qph);;Все файлы (*) @@ -624,22 +634,22 @@ Add to phrase book - Добавить в разговорник + Добавить в глоссарий No appropriate phrasebook found. - Подходящий разговорник не найден. + Подходящий глоссарий не найден. Adding entry to phrasebook %1 - Добавление записи в разговорник %1 + Добавление записи в глоссарий %1 Select phrase book to add to - Выберите разговорник, в который желаете добавить фразу + Выберите глоссарий, в который желаете добавить фразу @@ -739,15 +749,14 @@ &Сохранить - + Save &As... Сохранить &как... - - + Release As... @@ -765,7 +774,7 @@ Сохранить все - + &Release All С&компилировать все @@ -796,13 +805,13 @@ &Найти и перевести в '%1'... - + Translation File &Settings... &Параметры файла перевода... - + &Batch Translation... Пак&етный перевод... @@ -813,31 +822,31 @@ &Найти и перевести... - + File Файл - + Edit Правка - + Translation Перевод - + Validation Проверка - + Help Справка @@ -845,658 +854,655 @@ Cannot read from phrase book '%1'. - Не удалось прочитать из разговорника '%1'. + Не удалось прочитать из глоссария '%1'. Close this phrase book. - Закрыть разговорник. + Закрыть глоссарий. Enables you to add, modify, or delete entries in this phrase book. - Позволяет добавлять, изменять и удалять записи в разговорнике. + Позволяет добавлять, изменять и удалять записи в глоссарии. Print the entries in this phrase book. - Печать записей фраз разговорника. + Печать записей фраз глоссария. Cannot create phrase book '%1'. - Не удалось создать разговорник '%1'. + Не удалось создать глоссарий '%1'. Do you want to save phrase book '%1'? - Желаете сохранить разговорник '%1'? + Желаете сохранить глоссарий '%1'? - + All Все - + MainWindow Главное окно - + &Phrases Фра&зы - + &Close Phrase Book - &Закрыть разговорник + &Закрыть глоссарий - + &Edit Phrase Book - &Редактироваь разговорник + &Редактироваь глоссарий - + &Print Phrase Book - &Печатать разговорник + &Печатать глоссарий - + V&alidation П&роверка - + &View &Вид - + Vie&ws Вид&ы - + &Toolbars Пан&ели инструментов - + &Help &Справка - + &Translation П&еревод - + &File &Файл - + Recently Opened &Files Недавно открытые &файлы - + &Edit &Правка - + &Open... &Открыть... - + Open a Qt translation source file (TS file) for editing Открыть исходный файл переводов Qt (файл TS) для изменения - + Ctrl+O - + E&xit В&ыход - + Close this window and exit. Закрыть окно и выйти. - + Ctrl+Q - + Save Сохранить - + Save changes made to this Qt translation source file Сохранить изменения в данном исходном файле перевода Qt - + Save As... Сохранить как... - + Save changes made to this Qt translation source file into a new file. Сохранить изменения в данном исходном файле перевода Qt в новый файл. - + Create a Qt message file suitable for released applications from the current message file. Скомпилировать файл перевода Qt из текущего файла. - + &Print... &Печать... - + Print a list of all the translation units in the current translation source file. Печать списка всех записей перевода из текущего файла. - + Ctrl+P - + &Undo &Отменить - + Undo the last editing operation performed on the current translation. Отменить последнее изменение текущего перевода. - + Ctrl+Z - + &Redo &Повторить - + Redo an undone editing operation performed on the translation. Повторить отменённую правку перевода. - + Ctrl+Y - + Cu&t Выр&езать - + Copy the selected translation text to the clipboard and deletes it. Скопировать отмеченный текст в буфер обмена и удалить его из оригинала. - + Ctrl+X - + &Copy &Копировать - + Copy the selected translation text to the clipboard. Скопировать отмеченный текст в буфер обмена. - + Ctrl+C - + &Paste &Вставить - + Paste the clipboard text into the translation. Вставить текст из буфера обмена в перевод. - + Ctrl+V - + Select &All В&ыделить всё - + Select the whole translation text. Выделить весь текст перевода. - + Ctrl+A - + &Find... &Найти... - + Search for some text in the translation source file. Найти текст в исходном файле перевода. - + Ctrl+F - + Find &Next Найти д&алее - + Continue the search where it was left. Продолжить поиск с места, где он был остановлен. - + F3 - + &Prev Unfinished &Предыдущий незавершённый - + Create a Qt message file suitable for released applications from the current message file. The filename will automatically be determined from the name of the TS file. Создание готового файла перевода Qt из текущего файла. Имя файла будет автоматически определено из имени .ts файла. - + Length Variants - + Варианты длины - + Move to the previous unfinished item. Перейти к предыдущему незавершённому переводу. - + Ctrl+K - + &Next Unfinished &Следующий незавершённый - + Move to the next unfinished item. Перейти к следующему незавершённому переводу. - + Ctrl+J - + P&rev Пр&едыдущий - + Move to the previous item. Перейти к предыдущему переводу. - + Ctrl+Shift+K - + Ne&xt С&ледующий - + Move to the next item. Перейти к следующему переводу. - + Ctrl+Shift+J - + &Done and Next &Готово и далее - + Mark this item as done and move to the next unfinished item. Пометить перевод как завершённый и перейти к следующему незавершённому. - - + Copy from source text Скопировать из исходного текста - + Copies the source text into the translation field. Скопировать исходный текст в поле перевода. - + Ctrl+B - + &Accelerators &Акселераторы - + Toggle the validity check of accelerators, i.e. whether the number of ampersands in the source and translation text is the same. If the check fails, a message is shown in the warnings window. Переключение проверки акселераторов, т.е. совпадает ли количество амперсандов в исходном и переведённом текстах. Если выявлено несовпадение, будет показано сообщение в окне предупреждений. - + &Ending Punctuation &Знаки препинания - + Toggle the validity check of ending punctuation. If the check fails, a message is shown in the warnings window. Переключение проверки знаков препинания в конце текста. Если выявлено несовпадение, будет показано сообщение в окне предупреждений. - + &Phrase matches Совпадение &фраз - + Toggle checking that phrase suggestions are used. If the check fails, a message is shown in the warnings window. Переключение проверки использования предложений для фраз. Если выявлено несовпадение, будет показано сообщение в окне предупреждений. - + Place &Marker Matches Совпадение &маркеров - + Toggle the validity check of place markers, i.e. whether %1, %2, ... are used consistently in the source text and translation text. If the check fails, a message is shown in the warnings window. Переключение проверки маркеров форматирования, т.е. все ли маркеры (%1, %2, ...) исходного текста присутствуют в переведённом. Если выявлено несовпадение, будет показано сообщение в окне предупреждений. - + &New Phrase Book... - &Новый разговорник... + &Новый глоссарий... - + Create a new phrase book. - Создать разговорник. + Создать глоссарий. - + Ctrl+N - + &Open Phrase Book... - &Открыть разговорник... + &Открыть глоссарий... - + Open a phrase book to assist translation. - Открыть разговорник для помощи в переводе. + Открыть глоссарий для помощи в переводе. - + Ctrl+H - + &Reset Sorting &Сброс сортировки - + Sort the items back in the same order as in the message file. Упорядочить элементы в той последовательности, в которой они находятся в файле. - + &Display guesses &Предлагать похожие - + Set whether or not to display translation guesses. Определяет необходимо или нет отображать похожие переводы. - + &Statistics &Статистика - + Display translation statistics. Показать статистику перевода. - + &Manual &Руководство - + F1 - + About Qt Linguist О Qt Linguist - + About Qt О Qt - + Display information about the Qt toolkit by Trolltech. Показать информацию об инструментарии Qt от Nokia. - + &What's This? &Что это? - - + What's This? Что это? - + Enter What's This? mode. Переход в режим "Что это?". - + Shift+F1 - + &Search And Translate... &Найти и перевести... - + Replace the translation on all entries that matches the search source text. Заменить перевод всех записей, которые совпадают с искомым исходным текстом. - + Batch translate all entries using the information in the phrase books. - Перевести все записи в пакетном режиме, используя информацию из разговорника. + Перевести все записи в пакетном режиме, используя информацию из глоссария. - + Open/Refresh Form &Preview Открыть/обновить предпрос&мотр формы - - + Form Preview Tool Инструмент предпросмотра форм - + F5 - + &Add to Phrase Book - &Добавить в разговорник + &Добавить в глоссарий - + Ctrl+T - + Open Read-O&nly... Открыть только для &чтения... - + &Save All &Сохранить все - + Ctrl+S - + Close Закрыть - + &Close All &Закрыть все - + Ctrl+W - + Previous unfinished item Предыдущий незавершённый перевод - + Next unfinished item Следующий незавершённый перевод - + Move to previous item Перейти к предыдущему переводу - + Next item Следующий перевод - + Mark item as done and move to the next unfinished item Пометить перевод как завершённый и перейти к следующему незавершённому - + Copies the source text into the translation field Скопировать исходный текст в поле перевода - + Toggle the validity check of accelerators Переключение проверки акселераторов - + Toggle the validity check of ending punctuation Переключение проверки знаков препинания в конце текста - + Toggle checking that phrase suggestions are used Переключение проверки использования предложений для фраз - + Toggle the validity check of place markers Переключение проверки маркеров форматирования @@ -1541,12 +1547,12 @@ Китайский - + This whole panel allows you to view and edit the translation of some source text. Данная панель позволяет просматривать и редактировать перевод исходного текста. - + Source text Исходный текст @@ -1581,7 +1587,7 @@ Здесь вы можете оставить комментарий для собственного использования. Комментарии не влияют на перевод приложений. - + %1 translation (%2) %1 перевод (%2) @@ -1611,7 +1617,7 @@ MessageModel - + Completion status for %1 Состояние завершённости для %1 @@ -1657,90 +1663,90 @@ Cannot save phrase book '%1'. - Не удалось сохранить разговорник '%1'. + Не удалось сохранить глоссарий '%1'. - + Edit Phrase Book - Правка разговорника + Правка глоссария - + This window allows you to add, modify, or delete entries in a phrase book. - Данное окно позволяет добавлять, изменять и удалять записи в разговорнике. + Данное окно позволяет добавлять, изменять и удалять записи в глоссарии. - + &Translation: &Перевод: - + This is the phrase in the target language corresponding to the source phrase. Перевод, соответствующий исходной фразе. - + S&ource phrase: &Исходная фраза: - + This is a definition for the source phrase. Определение исходной фразы. - + This is the phrase in the source language. Фраза на исходном языке. - + &Definition: &Определение: - + Click here to add the phrase to the phrase book. - Добавить фразу в разговорник. + Добавить фразу в глоссарий. - + &New Entry Новая &запись - + Click here to remove the entry from the phrase book. - Удалить фразу из разговорника. + Удалить фразу из глоссария. - + &Remove Entry &Удалить - + Settin&gs... &Настройки... - + Click here to save the changes made. Сохранить изменения. - + &Save &Сохранить - + Click here to close this window. Закрыть окно. - + Close Закрыть @@ -1789,7 +1795,7 @@ QObject - + Translation files (%1);; Файлы перевода (%1);; @@ -1799,8 +1805,8 @@ Все файлы (*) - - + + @@ -1820,9 +1826,9 @@ Скомпилированные переводы Qt - + Qt Linguist 'Phrase Book' - 'Разговорник' Qt Linguist + 'Глоссарий' Qt Linguist @@ -1866,47 +1872,42 @@ Statistics - + Statistics Статистика - + Close Закрыть - + Translation Перевод - + Source Источник - - - - - - + 0 0 - + Words: Слов: - + Characters: Символов: - + Characters (with spaces): Символов (с пробелами): @@ -1914,73 +1915,72 @@ TranslateDialog - + This window allows you to search for some text in the translation source file. Данное окно позволяет искать текст в файле перевода. - - + Type in the text to search for. Введите искомый текст. - + Find &source text: &Найти текст: - + &Translate to: &Перевести как: - + Search options Параметры поиска - + Texts such as 'TeX' and 'tex' are considered as different when checked. Если отмечено, строки "ПрИмЕр" и "пример" будет считаться разными. - + Match &case С учётом &регистра - + Mark new translation as &finished Помечать перевод как завер&шённый - + Click here to find the next occurrence of the text you typed in. Найти следующее совпадение для введённого текста. - + Find Next Найти далее - + Translate Перевести - + Translate All Перевести все - + Click here to close this window. Закрыть окно. - + Cancel Отмена @@ -1988,34 +1988,32 @@ TranslationSettingsDialog - + Source language Исходный язык - - + Language Язык - - + Country/Region Страна/Регион - + Target language Язык перевода - + Any Country Любая страна - + Settings for '%1' - Qt Linguist Настройки для '%1' - Qt Linguist diff -r 2f34d5167611 -r fcece45ef507 translations/qt_help_ru.ts --- a/translations/qt_help_ru.ts Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/qt_help_ru.ts Mon May 03 13:17:34 2010 +0300 @@ -33,32 +33,52 @@ QHelpCollectionHandler - The collection file is not set up yet! - Файл набора ещё не установлен! + The collection file '%1' is not set up yet! + Файл набора '%1' ещё не установлен! - + Cannot load sqlite database driver! Не удалось загрузить драйвер базы данных sqlite! - + Cannot open collection file: %1 Не удалось открыть файл набора: %1 - + Cannot create tables in file %1! Не удалось создать таблицы в файле %1! - The specified collection file already exists! - Указанный файла набора уже существует! + The collection file '%1' already exists! + Файл набора '%1' уже существует! + + + + Unknown filter '%1'! + Неизвестный фильтр '%1'! - + + Invalid documentation file '%1'! + Некорректный файл документации '%1'! + + + + Cannot register namespace '%1'! + Не удалось зарегистрировать пространство имён %1! + + + + Cannot open database '%1' to optimize! + Не удалось открыть базу данных '%1' для оптимизации! + + + Cannot create directory: %1 Не удалось создать каталог: %1 @@ -68,12 +88,7 @@ Не удалось скопировать файл набора: %1 - - Unknown filter! - Неизвестный фильтр! - - - + Cannot register filter %1! Не удалось зарегистрировать фильтр %1! @@ -83,12 +98,7 @@ Не удалось открыть файл документации %1! - - Invalid documentation file! - Некорректный файл документации! - - - + The namespace %1 was not registered! Пространство имён %1 не зарегистрировано! @@ -97,16 +107,6 @@ Namespace %1 already exists! Пространство имён %1 уже существует! - - - Cannot register namespace! - Не удалось зарегистрировать пространство имён! - - - - Cannot open database to optimize! - Не удалось открыть базу данных для оптимизации! - QHelpDBReader @@ -120,7 +120,7 @@ QHelpEngineCore - + The specified namespace does not exist! Указанное пространство имён не существует! @@ -128,7 +128,7 @@ QHelpEngineCorePrivate - + Cannot open documentation file %1: %2! Не удалось открыть файл документации %1: %2! @@ -249,52 +249,52 @@ QHelpSearchQueryWidget - + Search for: Искать: - + Previous search Предыдущий запрос - + Next search Следующий запрос - + Search Поиск - + Advanced search Расширенный поиск - + words <B>similar</B> to: <B>похожие</B> слова: - + <B>without</B> the words: <B>не содержит</B> слов: - + with <B>exact phrase</B>: содержит <B>точную фразу</B>: - + with <B>all</B> of the words: содержит <B>все</B> слова: - + with <B>at least one</B> of the words: содержит <B>хотя бы одно</B> из слов: @@ -318,11 +318,6 @@ QObject - - Untitled - Безымянный - - Unknown token. Неизвестный идентификатор. diff -r 2f34d5167611 -r fcece45ef507 translations/qt_ru.ts --- a/translations/qt_ru.ts Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/qt_ru.ts Mon May 03 13:17:34 2010 +0300 @@ -4,7 +4,7 @@ CloseButton - + Close Tab Закрыть вкладку @@ -12,7 +12,7 @@ FakeReply - + Fake error ! @@ -58,7 +58,7 @@ Phonon::AudioOutput - + <html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html> <html>Звуковое устройство <b>%1</b> не работает.<br/>Будет использоваться <b>%2</b>.</html> @@ -76,7 +76,7 @@ Phonon::Gstreamer::Backend - + Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. Some video features have been disabled. Внимание: Похоже, пакет gstreamer0.10-plugins-good не установлен. @@ -96,11 +96,11 @@ Cannot start playback. -Check your Gstreamer installation and make sure you +Check your GStreamer installation and make sure you have libgstreamer-plugins-base installed. Невозможно начать воспроизведение. -Проверьте установку Gstreamer и убедитесь, +Проверьте установку GStreamer и убедитесь, что пакет libgstreamer-plugins-base установлен. @@ -109,10 +109,10 @@ Отсутствует необходимый кодек. Вам нужно установить следующие кодеки для воспроизведения данного содержимого: %0 - + - + @@ -121,12 +121,12 @@ Не удалось открыть источник медиа-данных. - + Invalid source type. Неверный тип источника медиа-данных. - + Could not locate media source. Не удалось найти источник медиа-данных. @@ -144,7 +144,7 @@ Phonon::MMF - + Audio Output Воспроизведение звука @@ -153,52 +153,334 @@ The audio output device Устройство воспроизведения звука + + + No error + Нет ошибки + + + + Not found + Не найден + + + + Out of memory + Недостаточно ресурсов + + + + Not supported + Не поддерживается + + + + Overflow + + + + + Underflow + + + + + Already exists + Уже существует + + + + Path not found + Путь не найден + + + + In use + Используется + + + + Not ready + Не готов + + + + Access denied + Доступ запрещён + + + + Could not connect + Не удалось установить соединение + + + + Disconnected + Соединение разорвано + + + + Permission denied + Доступ запрещён + + + + Insufficient bandwidth + Недостаточная ширина канала + + + + Network unavailable + Сеть недоступна + + + + Network communication error + Ошибка сетевого обмена данными + + + + Streaming not supported + + + + + Server alert + + + + + Invalid protocol + Некорректный протокол + + + + Invalid URL + Некорректный URL + + + + Multicast error + + + + + Proxy server error + Ошибка прокси-сервера + + + + Proxy server not supported + Прокси-сервер не поддерживается + + + + Audio output error + Ошибка воспроизведения звука + + + + Video output error + Ошибка воспроизведения видео + + + + Decoder error + Ошибка декодирования + + + + Audio or video components could not be played + Аудио- или видео-состовляющая не может быть воспроизведена + + + + DRM error + Ошибка DRM + + + + Unknown error (%1) + Неизвестная ошибка (%1) + + + + Phonon::MMF::AbstractMediaPlayer + + + Not ready to play + Не готов к воспроизведению + + + + + Error opening file + Ошибка открытия файла + + + + Error opening URL + Ошибка открытия URL + + + + Setting volume failed + Не удалось установить уровень громкости + + + + Playback complete + Воспроизведение завершено + Phonon::MMF::AudioEqualizer - - Frequency band, %1 Hz - Полоса частот, %1 Гц + + %1 Hz + %1 Гц + + + + Phonon::MMF::AudioPlayer + + + Getting position failed + + + + + Opening clip failed + Phonon::MMF::EffectFactory - - audio equalizer - Аудиоэквалайзер - - - - Bass boost - Усиление басов - - - - Distance Attenuation - Ослабление при отдалении - - - - - Environmental Reverb - Реверберация - - - - Loudness - Громкость - - - - Source Orientation - Ориентация источника - - - - Stereo Widening - Расширение стереобазы + + Enabled + Активно + + + + Phonon::MMF::EnvironmentalReverb + + + Decay HF ratio (%) + DecayHFRatio: Ratio of high-frequency decay time to the value specified by DecayTime. + + + + + Decay time (ms) + DecayTime: Time over which reverberation is diminished. + + + + + Density (%) + Density Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Diffusion value. + + + + + Diffusion (%) + Diffusion: Delay between first and subsequent reflections. Note that the S60 platform documentation does not make clear the distinction between this value and the Density value. + + + + + Reflections delay (ms) + ReflectionsDelay: Amount of delay between the arrival the direct path from the source and the arrival of the first reflection. + + + + + Reflections level (mB) + ReflectionsLevel: Amplitude of reflections. This value is corrected by the RoomLevel to give the final reflection amplitude. + + + + + Reverb delay (ms) + ReverbDelay: Amount of time between arrival of the first reflection and start of the late reverberation. + + + + + Reverb level (mB) + ReverbLevel Amplitude of reverberations. This value is corrected by the RoomLevel to give the final reverberation amplitude. + + + + + Room HF level + RoomHFLevel: Amplitude of low-pass filter used to attenuate the high frequency component of reflected sound. + + + + + Room level (mB) + RoomLevel: Master volume control for all reflected sound. + + + + + Phonon::MMF::MediaObject + + + Error opening source: type not supported + Ошибка открытыия источника: тип не поддерживается + + + + Error opening source: media type could not be determined + Ошибка открытыия источника: тип медиа-данных не определён + + + + Phonon::MMF::StereoWidening + + + Level (%) + Уровень (%) + + + + Phonon::MMF::VideoPlayer + + + Pause failed + + + + + Seek failed + + + + + Getting position failed + + + + + Opening clip failed + + + + + Buffering clip failed + + + + + + + + + Video display error + @@ -268,7 +550,7 @@ Q3FileDialog - + Copy or Move a File Копировать или переместить файл @@ -293,7 +575,7 @@ - + All Files (*) Все файлы (*) @@ -905,8 +1187,8 @@ QAbstractSocket - - + + Host not found @@ -925,19 +1207,20 @@ Время на соединение истекло - - + + Operation on socket is not supported Операция с сокетом не поддерживается - + + Socket operation timed out Время на операцию с сокетом истекло - + Socket is not connected Сокет не подключён @@ -950,7 +1233,7 @@ QAbstractSpinBox - + &Step up Шаг вв&ерх @@ -966,6 +1249,14 @@ + QAccessibleButton + + + Press + Нажать + + + QApplication @@ -983,7 +1274,7 @@ Ошибка совместимости библиотеки Qt - + QT_LAYOUT_DIRECTION Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout. LTR @@ -1020,7 +1311,7 @@ QCheckBox - + Uncheck Снять отметку @@ -1038,7 +1329,7 @@ QColorDialog - + Hu&e: &Тон: @@ -1078,7 +1369,7 @@ Выбор цвета - + &Basic colors &Основные цвета @@ -1165,7 +1456,7 @@ QDB2Driver - + Unable to connect Невозможно соединиться @@ -1188,7 +1479,7 @@ QDB2Result - + Unable to execute statement Невозможно выполнить выражение @@ -1263,7 +1554,7 @@ QDialog - + What's This? Что это? @@ -1276,9 +1567,9 @@ QDialogButtonBox - + - + OK ОК @@ -1390,7 +1681,7 @@ Restore Defaults - Восстановить значения + Восстановить значения @@ -1477,7 +1768,7 @@ Критическая ошибка: - + &Show this message again &Показывать это сообщение в дальнейшем @@ -1490,7 +1781,7 @@ QFile - + Destination file exists Файл существует @@ -1529,36 +1820,36 @@ QFileDialog - - + + All Files (*) Все файлы (*) - + Directories Каталоги - - + + &Open &Открыть - - + + &Save &Сохранить - + Open Открыть - + %1 already exists. Do you want to replace it? %1 уже существует. @@ -1579,7 +1870,7 @@ Мой компьютер - + &Rename &Переименовать @@ -1625,12 +1916,12 @@ - + Directory: Каталог: - + %1 Directory not found. @@ -1657,7 +1948,7 @@ Не удалось удалить каталог. - + Recent Places Недавние документы @@ -1667,12 +1958,12 @@ Все файлы (*.*) - + Save As Сохранить как - + Drive Диск @@ -1728,18 +2019,18 @@ Вперёд - + New Folder Новая папка - + &New Folder &Новая папка - - + + &Choose &Выбрать @@ -1749,8 +2040,8 @@ Удалить - - + + File &name: &Имя файла: @@ -1770,6 +2061,11 @@ QFileSystemModel + + %1 byte(s) + %1 байт + + Invalid filename Некорректное имя файла @@ -1818,7 +2114,7 @@ - + %1 TB %1 Тб @@ -1842,7 +2138,6 @@ - %1 bytes %1 байт @@ -1851,55 +2146,55 @@ QFontDatabase - + Normal Обычный - + - + Bold Жирный - - + + Demi Bold Полужирный - + - + Black Чёрный - + Demi Средний - + Light Светлый - - + + Italic Курсив - - + + Oblique Наклонный - + Any Любая @@ -1941,12 +2236,12 @@ Thaana - Таана + Таана Devanagari - Деванагири + Деванагири @@ -1956,17 +2251,17 @@ Gurmukhi - Гурмукхи + Гурмукхи Gujarati - Гуджарати + Гуджарати Oriya - Ория + Ория @@ -1976,17 +2271,17 @@ Telugu - Телугу + Телугу Kannada - Каннада + Каннада Malayalam - Малайялам + Малаяльская @@ -2011,7 +2306,7 @@ Myanmar - Мьянма + Майанмарская @@ -2026,7 +2321,7 @@ Simplified Chinese - Китайская упрощенная + Китайская упрощённая @@ -2063,6 +2358,11 @@ Runic Руническая + + + N'Ko + Нко + QFontDialog @@ -2262,7 +2562,7 @@ QHostInfo - + Unknown error Неизвестная ошибка @@ -2272,7 +2572,7 @@ - + Host not found Узел не найден @@ -2306,7 +2606,7 @@ QHttp - + @@ -2338,7 +2638,7 @@ Сервер неожиданно разорвал соединение - + Unknown authentication method Неизвестный метод авторизации @@ -2348,13 +2648,13 @@ Ошибка записи ответа на устройство - + Connection refused Отказано в соединении - + Host %1 not found @@ -2362,14 +2662,12 @@ - - HTTP request failed HTTP-запрос не удался - + Invalid HTTP response header Некорректный HTTP-заголовок ответа @@ -2408,7 +2706,7 @@ Соединение с узлом установлено - + Connection closed Соединение закрыто @@ -2424,7 +2722,7 @@ Требуется авторизация - + Connection refused (or timed out) В соединении отказано (или время ожидания истекло) @@ -2623,7 +2921,7 @@ QIODevice - + Permission denied Доступ запрещён @@ -2643,7 +2941,7 @@ Нет свободного места на устройстве - + Unknown error Неизвестная ошибка @@ -2707,7 +3005,7 @@ Не удалось выполнить unmap '%1': %2 - + The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5] Модуль '%1' использует несоместимую библиотеку Qt. (%2.%3.%4) [%5] @@ -2759,7 +3057,7 @@ QLineEdit - + &Undo &Отменить действие @@ -2769,27 +3067,27 @@ &Повторить действие - + Cu&t &Вырезать - + &Copy &Копировать - - &Paste - В&ставить - - - - Delete - Удалить - - + &Paste + В&ставить + + + + Delete + Удалить + + + Select All Выделить всё @@ -2798,7 +3096,7 @@ QLocalServer - + %1: Name error %1: Некорректное имя @@ -2836,7 +3134,7 @@ - + %1: Invalid name %1: Некорректное имя @@ -2867,7 +3165,7 @@ - + %1: Connection error %1: Ошибка соединения @@ -2892,7 +3190,7 @@ QMYSQLDriver - + Unable to open database ' Невозможно открыть базу данных ' @@ -2902,7 +3200,7 @@ Невозможно соединиться - + Unable to begin transaction Невозможно начать транзакцию @@ -2920,12 +3218,13 @@ QMYSQLResult - + + Unable to fetch data Невозможно получить данные - + Unable to execute query Невозможно выполнить запрос @@ -3103,7 +3402,7 @@ QMenuBar - + Actions Действия @@ -3129,7 +3428,7 @@ О Qt - + Show Details... Показать подробности... @@ -3139,7 +3438,7 @@ Скрыть подробности... - + <h3>About Qt</h3><p>This program uses Qt version %1.</p> <h3>О Qt</h3><p>Данная программа использует Qt версии %1.</p> @@ -3323,27 +3622,30 @@ QNetworkAccessFileBackend + Request for opening non-local file %1 Запрос на открытие файла вне файловой системы %1 - + + Error opening %1: %2 Ошибка открытия %1: %2 - + Write error writing to %1: %2 Ошибка записи в %1: %2 - + + Cannot open %1: Path is a directory Невозможно открыть %1: Указан путь к каталогу - + Read error reading from %1: %2 Ошибка чтения из %1: %2 @@ -3379,7 +3681,7 @@ QNetworkAccessHttpBackend - + No suitable proxy found Подходящий прокси-сервер не найден @@ -3387,12 +3689,12 @@ QNetworkReply - + Error downloading %1 - server replied: %2 Ошибка загрузки %1 - ответ сервера: %2 - + Protocol "%1" is unknown Неизвестный протокол "%1" @@ -3400,7 +3702,7 @@ QNetworkReplyImpl - + Operation canceled Операция отменена @@ -3409,7 +3711,7 @@ QOCIDriver - + Unable to logon Невозможно авторизоваться @@ -3438,8 +3740,8 @@ QOCIResult - - + + Unable to bind column for batch execute Невозможно привязать столбец для пакетного выполнения @@ -3483,7 +3785,7 @@ QODBCDriver - + Unable to connect Невозможно соединиться @@ -3516,14 +3818,14 @@ QODBCResult - - + + QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration QODBCResult::reset: Невозможно установить 'SQL_CURSOR_STATIC' атрибутом выражение. Проверьте настройки драйвера ODBC - - + + Unable to execute statement Невозможно выполнить выражение @@ -3543,7 +3845,7 @@ Невозможно привязать значение - + Unable to fetch last @@ -3593,7 +3895,7 @@ Удалённый узел неожиданно прервал соединение для %1 - + No host name given Имя узла не задано @@ -3602,7 +3904,7 @@ QPPDOptionsModel - + Name Имя @@ -3777,7 +4079,7 @@ QPrintDialog - + locally connected соединено локально @@ -3788,7 +4090,7 @@ Псевдонимы: %1 - + unknown неизвестно @@ -3956,7 +4258,7 @@ Печать - + Print To File ... Печать в файл ... @@ -3971,7 +4273,7 @@ Печатать все - + File %1 is not writable. Please choose a different file name. %1 недоступен для записи. @@ -4162,7 +4464,7 @@ Пользовательский - + &Options >> &Параметры >> @@ -4212,12 +4514,12 @@ Параметры страницы - + %1% %1% - + Print Preview Просмотр печати @@ -4297,7 +4599,12 @@ Параметры страницы - + + Close + Закрыть + + + Export to PDF Экспорт в PDF @@ -4474,7 +4781,7 @@ QProcess - + Could not open input redirection for reading Не удалось открыть перенаправление ввода для чтения @@ -4491,7 +4798,7 @@ Ошибка выделения ресурсов (сбой fork): %1 - + @@ -4504,7 +4811,7 @@ Время на операцию с процессом истекло - + @@ -4619,7 +4926,7 @@ QSQLite2Driver - + Error opening database Ошибка открытия базы данных @@ -4642,12 +4949,12 @@ QSQLite2Result - + Unable to fetch results Невозможно получить результаты - + Unable to execute statement Невозможно выполнить выражение @@ -4655,7 +4962,7 @@ QSQLiteDriver - + Error opening database Ошибка открытия базы данных @@ -4683,8 +4990,8 @@ QSQLiteResult - - + + Unable to fetch row Невозможно получить строку @@ -4710,7 +5017,7 @@ Количество параметров не совпадает - + No query Отсутствует запрос @@ -4725,7 +5032,7 @@ Location - Размещение + Расположение @@ -4735,17 +5042,17 @@ Ignore-count - Пропустить + Пропущено Single-shot - Один раз + Однократно Hit-count - Попаданий + Совпадений @@ -4837,12 +5144,12 @@ Run to New Script - Выполнить до нового сценария + Выполнить до нового сценария Toggle Breakpoint - Установить/убрать точку останова + Установить/убрать точку останова @@ -4974,22 +5281,22 @@ Toggle Breakpoint - Установить/убрать точку останова + Установить/убрать точку останова Disable Breakpoint - Убрать точку останова + Убрать точку останова Enable Breakpoint - Установить точку останова + Установить точку останова Breakpoint Condition: - Условие точки останова: + Условие точки останова: @@ -5163,7 +5470,7 @@ - + %1: permission denied %1: доступ запрещён @@ -5255,117 +5562,117 @@ Space - + Пробел Esc - + Esc Tab - + Tab Backtab - + Backtab Backspace - + Backspace Return - + Return Enter - + Enter Ins - + Ins Del - + Del Pause - + Pause Print - + Print SysReq - + SysReq Home - + Home End - + End Left - + Влево Up - + Вверх Right - + Вправо Down - + Вниз PgUp - + PgUp PgDown - + PgDown CapsLock - + CapsLock NumLock - + NumLock ScrollLock - + ScrollLock @@ -5378,7 +5685,7 @@ Справка - + Back Назад @@ -5415,27 +5722,27 @@ Bass Boost - + Усиление басов Bass Up - + Басы выше Bass Down - + Басы ниже Treble Up - + Высокие частоты выше Treble Down - + Высокие частоты ниже @@ -5573,39 +5880,485 @@ Запустить (F) + + Monitor Brightness Up + Яркость монитора выше + + + + Monitor Brightness Down + Яркость монитора ниже + + + + Keyboard Light On/Off + Вкл/выкл подсветку клавиатуры + + + + Keyboard Brightness Up + Подсветка клавиатуры ярче + + + + Keyboard Brightness Down + Подсветка клавиатуры бледнее + + + + Power Off + Выключение питания + + + + Wake Up + Пробуждение + + + + Eject + Извлечение + + + + Screensaver + Хранитель экрана + + + + WWW + WWW + + + + Sleep + Засыпание + + + + LightBulb + лампочка? + + + + + Shop + Магазин + + + + History + История + + + + Add Favorite + Добавить в избранное + + + + Hot Links + Горячие ссылки + + + + Adjust Brightness + Настройка яркости + + + + Finance + Финансы + + + + Community + Сообщество + + + + Audio Rewind + Перемотка + + + + Back Forward + + + + + Application Left + + + + + Application Right + + + + + Book + Книга + + + + CD + CD + + + + Calculator + Калькулятор + + + + Clear + Очистить + + + + Clear Grab + + + + + Close + Закрыть + + + + Copy + Копировать + + + + Cut + Вырезать + + + + Display + + + + + DOS + DOS + + + + Documents + Документы + + + + Spreadsheet + Электронная таблицы + + + + Browser + Обозреватель + + + + Game + Игра + + + + Go + Перейти + + + + iTouch + iTouch + + + + Logoff + Выйти из системы + + + + Market + Рынок + + + + Meeting + Встреча + + + + Keyboard Menu + Клавиатурное меню + + + + Menu PB + + + + + My Sites + Мои сайты + + + + News + Новости + + + + Home Office + Домашний офис + + + + Option + Опция + + + + Paste + Вставить + + + + Phone + Телефон + + + + Reply + Ответить + + + + Reload + Перезагрузить + + + + Rotate Windows + Повернуть окна + + + + Rotation PB + + + + + Rotation KB + + + + + Save + Сохранить + + + + Send + Отправить + + + + Spellchecker + Проверка орфографии + + + + Split Screen + Разделить экран + + + + Support + Поддержка + + + + Task Panel + Панель задач + + + + Terminal + Терминал + + + + Tools + Инструменты + + + + Travel + Путешествие + + + + Video + Видео + + + + Word Processor + Текстовый редактор + + + + XFer + + + + + Zoom In + Увеличить + + + + Zoom Out + Уменьшить + + + + Away + Ушёл + + + + Messenger + Клиент обмена мгновенными сообщениями + + + + WebCam + Вэб-камера + + + + Mail Forward + Переслать письмо + + + + Pictures + Изображения + + + + Music + Музыка + + + + Battery + Батарея + + + + Bluetooth + Bluetooth + + + + Wireless + Беспроводная сеть + + + + Ultra Wide Band + + + + + Audio Forward + + + + + Audio Repeat + + + + + Audio Random Play + + + + + Subtitle + Субтитры + + + + Audio Cycle Track + + + + + Time + Время + + + + View + Вид + + + + Top Menu + Главное меню + + + + Suspend + + + + + Hibernate + + + Print Screen - + Печать экрана Page Up - + На страницу вверх Page Down - + На страницу вниз Caps Lock - + Верний регистр Num Lock - + Цифровые клавиши Number Lock - + Цифровые клавиши Scroll Lock - + Scroll Lock @@ -5620,15 +6373,16 @@ Escape - + Escape System Request - - - - + Системный запрос + + + + Select Выбрать @@ -5665,12 +6419,12 @@ Call - + Позвонить Hangup - + Положить трубку @@ -5678,43 +6432,43 @@ - + Ctrl - + Ctrl Shift - + Shift Alt - + Alt Meta - + Meta + - + + F%1 - - - - + F%1 + + + Home Page - + Домашняя страница @@ -5813,7 +6567,7 @@ Неизвестная ошибка SOCKSv5 прокси (код 0x%1) - + Network operation timed out Время на сетевую операцию истекло @@ -5821,7 +6575,7 @@ QSoftKeyManager - + Ok ОК @@ -5846,7 +6600,7 @@ Отмена - + Exit Выход @@ -5929,7 +6683,12 @@ Невозможно записать данные: %1 - + + Unable to decrypt data: %1 + Невозможно расшифровать данные: %1 + + + Error while reading: %1 Ошибка чтения: %1 @@ -5939,7 +6698,7 @@ Ошибка квитирования SSL: %1 - + Error creating SSL context (%1) Ошибка создания контекста SSL: (%1) @@ -5949,7 +6708,12 @@ Неправильный или пустой список шифров (%1) - + + Private key does not certify public key, %1 + Закрытый ключ не соответствует открытому ключу, %1 + + + Error creating SSL session, %1 Ошибка создания сессии SSL, %1 @@ -5974,15 +6738,126 @@ Ошибка загрузки закрытого ключа, %1 - - Private key does not certificate public key, %1 - Закрытый ключ не соответствует открытому ключу, %1 + + No error + Нет ошибки + + + + The issuer certificate could not be found + издателя ? + Не удалось найти сертификат запрашивающей стороны + + + + The certificate signature could not be decrypted + Не удалось расшифровать подпись сертификата + + + + The public key in the certificate could not be read + Не удалось прочитать открытый ключ сертификата + + + + The signature of the certificate is invalid + Некорректная подпись сертификата + + + + The certificate is not yet valid + Срок действия сертификата ещё не наступил + + + + The certificate has expired + Срок действия сертификата истёк + + + + The certificate's notBefore field contains an invalid time + Поле сертификата notBefore содержит некорректное время + + + + The certificate's notAfter field contains an invalid time + Поле сертификата notAfter содержит некорректное время + + + + The certificate is self-signed, and untrusted + Самоподписанный сертификат не является заверенным + + + + The root certificate of the certificate chain is self-signed, and untrusted + Корневой сертификат цепочки сертификатов самоподписанный и не является заверенным + + + + The issuer certificate of a locally looked up certificate could not be found + + + + + No certificates could be verified + Не удалось проверить сертификаты + + + + One of the CA certificates is invalid + Один из CA сертификатов некорректный + + + + The basicConstraints path length parameter has been exceeded + Путь параметра basicConstraints слишком длинный + + + + The supplied certificate is unsuitable for this purpose + Представленный сертификат не предназначен для данного использования + + + + The root CA certificate is not trusted for this purpose + Корневой CA сертификат не является заверенным для данного использования + + + + The root CA certificate is marked to reject the specified purpose + Корневой CA сертификат отмечен как 'отказывать' для данного использования + + + + The current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate + + + + + The current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate + + + + + The peer did not present any certificate + Узел не предоставил сертификат + + + + The host name did not match any of the valid hosts for this certificate + Название узла не совпадает ни с одним из допустимых узлов данного сертификата + + + + Unknown error + Неизвестная ошибка QStateMachine - + Missing initial state in compound state '%1' @@ -6036,7 +6911,7 @@ QTDSDriver - + Unable to open connection Невозможно открыть соединение @@ -6070,7 +6945,7 @@ QTextControl - + &Undo &Отменить действие @@ -6113,7 +6988,7 @@ QToolButton - + Press Нажать @@ -6170,14 +7045,14 @@ QUnicodeControlCharacterMenu - + LRM Left-to-right mark - LRM Признак письма слева направо + LRM Индикатор написания слева направо RLM Right-to-left mark - RLM Признак письма справа налево + RLM Индикатор написания справа налево @@ -6187,7 +7062,7 @@ ZWNJ Zero width non-joiner - ZWNJ Не объединяющий символ нулевой ширины + ZWNJ Разделитель нулевой ширины @@ -6197,27 +7072,27 @@ LRE Start of left-to-right embedding - + LRE Индикатор написания слева направо внутри текста, написанного справа налево RLE Start of right-to-left embedding - + RLE Индикатор написания справа налево внутри текста, написанного слева направо LRO Start of left-to-right override - + LRO Перекрывающий индикатор написания слева направо RLO Start of right-to-left override - + RLO Перекрывающий индикатор написания справа налево PDF Pop directional formatting - + PDF Индикатор конца текста с другим направлением @@ -6228,7 +7103,7 @@ QWebFrame - + Request cancelled Запрос отменён @@ -6266,7 +7141,7 @@ Некорректный HTTP-запрос - + Submit default label for Submit buttons in forms on web pages Отправить @@ -6284,7 +7159,7 @@ Сбросить - + This is a searchable index. Enter search keywords: text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index' Индекс поиска. Введите ключевые слова для поиска: @@ -6541,19 +7416,19 @@ Audio Element Media controller element - + Аудио-элемент Video Element Media controller element - + Видео-элемент Mute Button Media controller element - + Кнопка "приглушить" @@ -6565,13 +7440,13 @@ Play Button Media controller element - + Кнопка "воспроизведение" Pause Button Media controller element - + Кнопка "пауза" @@ -6589,7 +7464,7 @@ Rewind Button Media controller element - + Кнопка "перемотать" @@ -6601,73 +7476,73 @@ Elapsed Time Media controller element - + Прошло времени Remaining Time Media controller element - + Осталось времени Status Display Media controller element - + Отображение состояния Fullscreen Button Media controller element - + Кнопка "полноэкранный режим" Seek Forward Button Media controller element - + Кнопка "перемотка вперёд" Seek Back Button Media controller element - + Кнопка "перемотка назад" Audio element playback controls and status display Media controller element - + Элементы управления воспроизведением звука и отображения состояния Video element playback controls and status display Media controller element - + Элементы управления воспроизведением видео и отображения состояния Mute audio tracks Media controller element - + Выключить звуковые дорожки Unmute audio tracks Media controller element - + Включить звуковые дорожки Begin playback Media controller element - + Начать воспроизведение Pause playback Media controller element - + Приостановить воспроизведение @@ -6685,7 +7560,7 @@ Rewind movie Media controller element - + Начать фильм сначала @@ -6697,67 +7572,67 @@ Current movie time Media controller element - + Текущее время фильма Remaining movie time Media controller element - + Осталось времени фильма Current movie status Media controller element - + Текущее состояние фильма Play movie in full-screen mode Media controller element - + Воспроизводить фильм в полноэкранном режиме Seek quickly back Media controller element - + Быстрая перемотка назад Seek quickly forward Media controller element - + Быстрая перемотка вперёд Indefinite time Media time description - + Время не определено %1 days %2 hours %3 minutes %4 seconds Media time description - + %1 дней %2 часов %3 минут %4 секунд %1 hours %2 minutes %3 seconds Media time description - + %1 часов %2 минут %3 секунд %1 minutes %2 seconds Media time description - + %1 минут %2 секунд %1 seconds Media time description - + %1 секунд @@ -6796,7 +7671,7 @@ %1 (%2x%3 px) - + Web Inspector - %2 Web-инспектор - %2 @@ -6876,7 +7751,7 @@ - + JavaScript Alert - %1 JavaScript: Предупреждение - %1 @@ -6886,7 +7761,7 @@ JavaScript: Подтверждение - %1 - + JavaScript Prompt - %1 JavaScript: Запрос - %1 @@ -6901,7 +7776,7 @@ Сбой выполнения сценария на данной странице. Желаете остановить выполение сценария? - + Move the cursor to the next character Переместить указатель к следующему символу @@ -7122,7 +7997,7 @@ QWidget - + * * @@ -7374,6 +8249,34 @@ + QXmlPatternistCLI + + + Warning in %1, at line %2, column %3: %4 + Предупреждение в %1, в строке %2, столбце %3: %4 + + + + Warning in %1: %2 + Предупреждение в %1: %2 + + + + Unknown location + Неизвестное расположение + + + + Error %1 in %2, at line %3, column %4: %5 + Ошибка %1 в %2, в строке %3, столбце %4: %5 + + + + Error %1 in %2: %3 + Ошибка %1 в %2: %3 + + + QXmlStream @@ -7588,7 +8491,7 @@ Overflow: Can't represent date %1. - Переполнение: Не удается представить дату %1. + Переполнение: Не удаётся представить дату %1. @@ -7759,7 +8662,7 @@ - The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid. + The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, %2 is invalid. Целевое имя в обрабатываемой инструкции не может быть %1 в любой комбинации нижнего и верхнего регистров. Имя %2 некорректно. @@ -7943,7 +8846,12 @@ %1 является схемой неизвестного типа. - + + A template with name %1 has already been declared. + Шаблон с именем %1 уже был объявлен. + + + Only one %1 declaration can occur in the query prolog. Только одно объявление %1 может присутствовать в прологе запроса. @@ -7953,17 +8861,12 @@ Инициализация переменной %1 зависит от себя самой - - No variable by name %1 exists - Переменная с именем %1 отсутствует - - The variable %1 is unused Переменная %1 не используется - + Version %1 is not supported. The supported XQuery version is 1.0. Версия %1 не поддерживается. Поддерживается XQuery версии 1.0. @@ -8024,37 +8927,12 @@ Возможность импорта модулей не поддерживается - - No value is available for the external variable by name %1. - Отсутствует значение для внешней переменной с именем %1. - - - - A template by name %1 has already been declared. - Шаблон с именем %1 уже был объявлен. - - - + The keyword %1 cannot occur with any other mode name. - Ключевое слово %1 не может встречаться с любым другим названием режима. - - - - The value of attribute %1 must of type %2, which %3 isn't. - Значение атрибута %1 должно быть типа %2, но %3 ему не соответствует. - - - - The prefix %1 can not be bound. By default, it is already bound to the namespace %2. - Не удается связать префикс %1. По умолчанию префикс связан с пространством имён %2. - - - - A variable by name %1 has already been declared. - Переменная с именем %1 уже объявлена. - - - + Ключевое слово %1 не может встречаться с любым другим названием режима. + + + A stylesheet function must have a prefixed name. Функция стилей должна иметь имя с префиксом. @@ -8084,8 +8962,33 @@ Внешние функции не поддерживаются. Все поддерживаемые функции могут использоваться напрямую без первоначального объявления их в качестве внешних - - An argument by name %1 has already been declared. Every argument name must be unique. + + No variable with name %1 exists + Переменная с именем %1 отсутствует + + + + The value of attribute %1 must be of type %2, which %3 isn't. + Значение атрибута %1 должно быть типа %2, но %3 не соответствует данному типу. + + + + The prefix %1 cannot be bound. By default, it is already bound to the namespace %2. + Не удаётся связать префикс %1. По умолчанию префикс связан с пространством имён %2. + + + + A variable with name %1 has already been declared. + Переменная с именем %1 уже объявлена. + + + + No value is available for the external variable with name %1. + Отсутствует значение для внешней переменной с именем %1. + + + + An argument with name %1 has already been declared. Every argument name must be unique. Аргумент с именем %1 уже объявлен. Имя каждого аргумента должно быть уникальным. @@ -8149,7 +9052,17 @@ Ось %1 не поддерживается в XQuery - + + No function with name %1 is available. + Функция с именем %1 отсутствует. + + + + An attribute with name %1 has already appeared on this element. + Атрибут с именем %1 уже существует для данного элемента. + + + %1 is not a valid name for a processing-instruction. %1 является неверным названием для инструкции обработки. @@ -8174,12 +9087,7 @@ Встречена конструкция, запрещённая для текущего языка (%1). - - No function by name %1 is available. - Функция с именем %1 отсутствует. - - - + The namespace URI cannot be the empty string when binding to a prefix, %1. URI пространства имён не может быть пустой строкой при связывании с префиксом %1. @@ -8214,12 +9122,7 @@ URI пространства имён должно быть константой и не может содержать выражений. - - An attribute by name %1 has already appeared on this element. - Атрибут с именем %1 уже существует для данного элемента. - - - + A direct element constructor is not well-formed. %1 is ended with %2. Прямой конструктор элемента составлен некорректно. %1 заканчивается на %2. @@ -8926,7 +9829,7 @@ - Derived attribute %1 does not exists in the base definition. + Derived attribute %1 does not exist in the base definition. @@ -9378,7 +10281,7 @@ - Component with id %1 has been defined previously. + Component with ID %1 has been defined previously. @@ -9792,11 +10695,16 @@ - Fixed value constrained not allowed if element is nillable. - - - - + Fixed value constraint not allowed if element is nillable. + + + + + Element %1 cannot contain other elements, as it has a fixed content. + + + + Specified type %1 is not validly substitutable with element type %2. @@ -9840,12 +10748,7 @@ - - Element %1 can not contain other elements, as it has a fixed content. - - - - + Element %1 is missing required attribute %2. diff -r 2f34d5167611 -r fcece45ef507 translations/qtconfig_ru.ts --- a/translations/qtconfig_ru.ts Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/qtconfig_ru.ts Mon May 03 13:17:34 2010 +0300 @@ -45,7 +45,7 @@ Phonon GStreamer backend not available. - Модуль Phonon поддержки GStreamer недоступен. + Модуль поддержки GStreamer недоступен. @@ -156,363 +156,347 @@ MainWindowBase - + Qt Configuration Конфигурация Qt - + Appearance Внешний вид - + GUI Style Стиль пользовательского графического интерфейса - + Select GUI &Style: &Стиль интерфейса: - + Build Palette Палитра - + &3-D Effects: Эффекты &3D: - + Window Back&ground: &Фон окна: - + &Tune Palette... &Настроить палитру... - + Please use the KDE Control Center to set the palette. Используйте Центр управления KDE для настройки цветов. - + Preview Предпросмотр - + Select &Palette: Выбор &палитры: - + Active Palette Палитра активных элементов - + Inactive Palette Палитра неактивных элементов - + Disabled Palette Палитра выключенных элементов - + Fonts Шрифты - + Default Font Шрифт по умолчанию - + &Style: &Начертание: - + &Point Size: &Размер: - + F&amily: &Шрифт: - + Sample Text Текст для примера (Sample Text) - + Font Substitution Подстановка шрифтов - + S&elect or Enter a Family: &Выберите шрифт для замены: - + Current Substitutions: Текущие замены: - - + Up Выше - - + Down Ниже - - + Remove Удалить - + Select s&ubstitute Family: &Заменять на шрифт: - - + Add Добавить - + Interface Интерфейс - + Feel Settings Настройка указателя - - + ms мс - + &Double Click Interval: &Интервал двойного щелчка: - + No blinking Без мигания - + &Cursor Flash Time: &Период мигания курсора: - + lines строк - + Wheel &Scroll Lines: &Прокручивать строк при повороте колёсика: - + Resolve symlinks in URLs Разрешать символьные ссылки в URL-ах - + GUI Effects Эффекты пользовательского интерфейса - + &Enable &Включить - + Alt+E Alt+D - + &Menu Effect: Эффект &меню: - + C&omboBox Effect: Эффект C&omboBox: - + &ToolTip Effect: Эффект &ToolTip: - + Tool&Box Effect: Эффект Tool&Box: - - - - + Disable Выключен - - - - + Animate Анимация - - + Fade Затухание - + Global Strut Специальные возможности - + Minimum &Width: Минимальная &ширина: - + Minimum Hei&ght: Минимальная в&ысота: - - + pixels пикселей - + Enhanced support for languages written right-to-left Расширенная поддержка письма справа налево - + XIM Input Style: Стиль ввода XIM: - + On The Spot - + Over The Spot - + Off The Spot - + Root - + Default Input Method: Метод ввода по умолчанию: - + Printer Принтер - + Enable Font embedding Разрешить встраивание шрифтов - + Font Paths Пути к шрифтам - + Browse... Обзор... - + Press the <b>Browse</b> button or enter a directory and press Enter to add them to the list. Нажмите кнопку <b>Обзор...</b> или укажите каталог и нажмите Ввод для добавления его в список. - + Phonon Phonon - + About Phonon О Phonon - - + Current Version: Текущая версия: - - + Not available Недоступно - - + Website: Вэб-сайт: - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -525,12 +509,12 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://phonon.kde.org"><span style=" text-decoration: underline; color:#0000ff;">http://phonon.kde.org</span></a></p></body></html> - + About GStreamer О GStreamer - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -543,22 +527,22 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://gstreamer.freedesktop.org/"><span style=" text-decoration: underline; color:#0000ff;">http://gstreamer.freedesktop.org/</span></a></p></body></html> - + GStreamer backend settings Настройки модуля GStreamer - + Preferred audio sink: Предпочитаемое звуковое устройство: - + Preferred render method: Предпочитаемый метод отрисовки: - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -571,57 +555,57 @@ <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Внимание: Изменение данных настроек может повлечь невозможность корректного запуска приложений.</span></p></body></html> - + &File &Файл - + &Help &Справка - + &Save &Сохранить - + Save Сохранить - + Ctrl+S - + E&xit В&ыход - + Exit Выход - + &About &О программе - + About О программе - + About &Qt О &Qt - + About Qt О Qt @@ -629,208 +613,207 @@ PaletteEditorAdvancedBase - + Tune Palette Настройка палитры - + <b>Edit Palette</b><p>Change the palette of the current widget or form.</p><p>Use a generated palette or select colors for each color group and each color role.</p><p>The palette can be tested with different widget layouts in the preview section.</p> <b>Изменение палитры</b><p>Изменение палитры текущего виджета или формы.</p><p>Используйте сформированную палитру или выберите цвета для каждой группы цветов и каждой их роли.</p><p>Палитру можно проверить на виджетах в разных режимах отображения в разделе предпросмотра.</p> - + Select &Palette: Выбор &палитры: - + Active Palette Палитра активных элементов - + Inactive Palette Палитра неактивных элементов - + Disabled Palette Палитра выключенных элементов - + Auto Автоматически - + Build inactive palette from active Создать неактивную палитру из активной - + Build disabled palette from active Создать выключенную палитру из активной - + Central color &roles Роли &цветов - + Choose central color role Выберите роль цвета - + <b>Select a color role.</b><p>Available central roles are: <ul> <li>Window - general background color.</li> <li>WindowText - general foreground color. </li> <li>Base - used as background color for e.g. text entry widgets, usually white or another light color. </li> <li>Text - the foreground color used with Base. Usually this is the same as WindowText, in what case it must provide good contrast both with Window and Base. </li> <li>Button - general button background color, where buttons need a background different from Window, as in the Macintosh style. </li> <li>ButtonText - a foreground color used with the Button color. </li> <li>Highlight - a color to indicate a selected or highlighted item. </li> <li>HighlightedText - a text color that contrasts to Highlight. </li> <li>BrightText - a text color that is very different from WindowText and contrasts well with e.g. black. </li> </ul> </p> <b>Выбор роли цвета.</b><p>Доступны следующие роли: <ul><li>Window - основной цвет фона.</li> <li>WindowText - основной цвет текста.</li> <li>Base - используется в качестве фона для, например, виджетов с текстовыми полями, обычно, белый или другой светлый цвет.</li> <li>Text - цвет текста используемый совместно с Base. Обычно, он совпадает с WindowText, так как в этом случае получается максимальный контраст и с Window, и с Base.</li> <li>Button - основной цвет фона кнопки, которой требуется цвет отличный от Window, например, в стиле Macintosh.</li> <li>ButtonText - цвет текста используемый совместно с Button.</li> <li>Highlight - цвет для обозначения выбранного или выделенного элемента.</li> <li>HighlightedText - цвет текста контрастирующий с Highlight.</li> <li>BrightText - цвет текста, который отличается от WindowText и хорошо контрастирует с черным.</li></ul></p> - + Window - + WindowText - + Button - + Base - + Text - + BrightText - + ButtonText - + Highlight - + HighlightedText - + &Select Color: &Выбор цвета: - - + Choose a color Выберите цвет - + Choose a color for the selected central color role. Выберите цвет для указанной роли. - + 3-D shadow &effects Эффекты т&рехмерной тени - + Build &from button color Получ&ить из цвета кнопки - + Generate shadings Создание полутонов - + Check to let 3D-effect colors be calculated from button-color. Включите, чтобы цвета эффекта трёхмерности были получены из цвета кнопки. - + Choose 3D-effect color role Выбор роли цвета дял эффекта трёхмерности - + <b>Select a color role.</b><p>Available effect roles are: <ul> <li>Light - lighter than Button color. </li> <li>Midlight - between Button and Light. </li> <li>Mid - between Button and Dark. </li> <li>Dark - darker than Button. </li> <li>Shadow - a very dark color. </li> </ul> <b>Выбор роли цвета.</b><p>Доступны следующие роли: <ul> <li>Light - светлее цвета Button. </li> <li>Midlight - среднее между Light и Button. </li> <li>Mid - среднее между Button и Dark. </li> <li>Dark - темнее цвета Button. </li> <li>Shadow - очень темный цвет. </li> </ul> - + Light - + Midlight - + Mid - + Dark - + Shadow - + Select Co&lor: Выбор &цвета: - + Choose a color for the selected effect color role. Выбор цвета для указанной роли. - + OK Принять - + Close dialog and apply all changes. Закрыть окно с применением изменений. - + Cancel Отмена - + Close dialog and discard all changes. Закрыть окно с отменой изменений. @@ -846,62 +829,62 @@ PreviewWidgetBase - + Preview Window Окно предпросмотра - + ButtonGroup ButtonGroup - + RadioButton1 RadioButton1 - + RadioButton2 RadioButton2 - + RadioButton3 RadioButton3 - + ButtonGroup2 ButtonGroup2 - + CheckBox1 CheckBox1 - + CheckBox2 CheckBox2 - + LineEdit LineEdit - + ComboBox ComboBox - + PushButton PushButton - + <p> <a href="http://qt.nokia.com">http://qt.nokia.com</a> </p> @@ -909,7 +892,7 @@ <a href="http://www.kde.org">http://www.kde.org</a> </p> <p> -<a href="http://qtsoftware.com">http://qtsoftware.com</a> +<a href="http://qt.nokia.com">http://qt.nokia.com</a> </p> <p> <a href="http://www.kde.org">http://www.kde.org</a> diff -r 2f34d5167611 -r fcece45ef507 translations/qvfb_ru.ts --- a/translations/qvfb_ru.ts Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/qvfb_ru.ts Mon May 03 13:17:34 2010 +0300 @@ -4,7 +4,7 @@ AnimationSaveWidget - + Record Записать @@ -76,191 +76,193 @@ Config - + Configure Настройка - + Size Размер - + 176x220 "SmartPhone" 176x220 "SmartPhone" - + 240x320 "PDA" 240x320 "PDA" - + 320x240 "TV" / "QVGA" 320x240 "TV" / "QVGA" - + 640x480 "VGA" 640x480 "VGA" - + + 800x480 + 800x480 + + + 800x600 800x600 - + 1024x768 1024x768 - + Custom Особый - + Depth Глубина - + 1 bit monochrome 1 бит (монохромный) - + 2 bit grayscale 2 бита (градации серого) - + 4 bit grayscale 4 бита (градации серого) - + 8 bit 8 бит - + 12 (16) bit 12 (16) бит - + 15 bit 15 бит - + 16 bit 16 бит - + 18 bit 18 бит - + 24 bit 24 бита - + 32 bit 32 бита - + 32 bit ARGB 32 бита (ARGB) - + Swap red and blue channels Поменять синий и красный каналы - + BGR format Формат BGR - + Skin Обложка - + None Нет - + Emulate touch screen (no mouse move) указателя? Эмулировать тачскрин (без перемещения мыши) - + Emulate LCD screen (Only with fixed zoom of 3.0 times magnification) Эмулировать ж/к экран (только с 3-х кратным увеличением) - + <p>Note that any applications using the virtual framebuffer will be terminated if you change the Size or Depth <i>above</i>. You may freely modify the Gamma <i>below</i>. <p>Имейте в виду, что программы, использующие фрэймбуфер, будут завершены, если изменится <i>размер</i> и/или <i>глубина</i> экрана. - + Gamma Гамма - + Blue Синий - - - - + 1.0 1.0 - + Green Зеленый - + All Все - + Red Красный - + Set all to 1.0 Выставить все в 1.0 - + &OK &ОК - + &Cancel От&мена @@ -326,12 +328,12 @@ QVFb - + Browse... Обзор... - + Load Custom Skin... Загрузить обложку пользователя... diff -r 2f34d5167611 -r fcece45ef507 translations/translations.pro --- a/translations/translations.pro Fri Apr 16 15:50:13 2010 +0300 +++ b/translations/translations.pro Mon May 03 13:17:34 2010 +0300 @@ -42,5 +42,6 @@ translations.path = $$[QT_INSTALL_TRANSLATIONS] translations.files = $$TRANSLATIONS translations.files ~= s,\\.ts$,.qm,g +translations.files ~= s,^,$$OUT_PWD/,g translations.CONFIG += no_check_exist INSTALLS += translations diff -r 2f34d5167611 -r fcece45ef507 util/s60pixelmetrics/pixel_metrics.cpp --- a/util/s60pixelmetrics/pixel_metrics.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/util/s60pixelmetrics/pixel_metrics.cpp Mon May 03 13:17:34 2010 +0300 @@ -50,7 +50,7 @@ // so that we can keep dynamic and static values inline. // Please adjust version data if correcting dynamic PM calculations. const TInt KPMMajorVersion = 1; -const TInt KPMMinorVersion = 16; +const TInt KPMMinorVersion = 17; TPixelMetricsVersion PixelMetrics::Version() { @@ -869,7 +869,7 @@ // The difference of center piece from border tell the frame width. if ( value == QStyle::PM_FocusFrameHMargin) { - //use topleft for horizontal as S60 uses different values for right and left borders + //use topleft for horizontal as S60 uses different values for right and left borders value = listSinglePaneText.TextRect().iTl.iX - highlightRect.Rect().iTl.iX; } else @@ -1003,6 +1003,13 @@ case QStyle::PM_Custom_ThinLineWidth: value = 1; break; + case QStyle::PM_Custom_MessageBoxHeight: + { + TAknLayoutRect popupRect; + popupRect.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::popup_window_general(0)); + value = popupRect.Rect().Height(); + } + break; case QStyle::PM_ButtonShiftHorizontal: case QStyle::PM_ButtonShiftVertical: value = 0; @@ -1012,12 +1019,15 @@ value = PixelMetricTabValue(QStyle::PM_TabBarScrollButtonWidth, appWindow.Rect(), landscape); break; + case QStyle::PM_MenuScrollerHeight: + value = 0; + break; + // todo: re-check if these really are not available in s60 case QStyle::PM_MenuDesktopFrameWidth: // not needed in S60 - dislocates Menu both horizontally and vertically case QStyle::PM_HeaderMarkSize: // The size of the sort indicator in a header. Not in S60 case QStyle::PM_SpinBoxSliderHeight: // The height of the optional spin box slider. Not in S60 case QStyle::PM_HeaderMargin: // not in S60 - case QStyle::PM_MenuScrollerHeight: // not in S60 case QStyle::PM_MenuTearoffHeight: // not in S60 case QStyle::PM_DockWidgetFrameWidth: // not in S60 case QStyle::PM_DockWidgetSeparatorExtent: // not in S60 diff -r 2f34d5167611 -r fcece45ef507 util/s60pixelmetrics/pixel_metrics.h --- a/util/s60pixelmetrics/pixel_metrics.h Fri Apr 16 15:50:13 2010 +0300 +++ b/util/s60pixelmetrics/pixel_metrics.h Mon May 03 13:17:34 2010 +0300 @@ -185,7 +185,9 @@ // Bold line width PM_Custom_BoldLineWidth, // Thin line width - PM_Custom_ThinLineWidth + PM_Custom_ThinLineWidth, + // Height of a popup info messagebox + PM_Custom_MessageBoxHeight }; }; diff -r 2f34d5167611 -r fcece45ef507 util/s60pixelmetrics/pm_mapperapp.cpp --- a/util/s60pixelmetrics/pm_mapperapp.cpp Fri Apr 16 15:50:13 2010 +0300 +++ b/util/s60pixelmetrics/pm_mapperapp.cpp Mon May 03 13:17:34 2010 +0300 @@ -155,7 +155,7 @@ Exit(); break; case ECmdSwitchOutput: - { + { HBufC* buffer = HBufC::NewLC( 100 ); TPtr bufferPtr = buffer->Des(); TBool last = ETrue; @@ -166,7 +166,7 @@ else bufferPtr.Append(_L("screen.")); ShowL( *buffer, last ); - } + } break; case ECmdStatus: { @@ -323,7 +323,7 @@ TInt myValue = KErrNotFound; for (;;) { - if (index==QStyle::PM_Custom_ThinLineWidth) + if (index==QStyle::PM_Custom_MessageBoxHeight) { last = ETrue; } @@ -656,6 +656,9 @@ case QStyle::PM_Custom_BoldLineWidth: bufferPtr.Append(_L("C_BoldLineWidth: ")); break; + case QStyle::PM_Custom_MessageBoxHeight: + bufferPtr.Append(_L("C_MsgBoxHeight: ")); + break; default: bufferPtr.Append(_L("Default: ")); break;