diff options
author | ikause <qt-info@nokia.com> | 2009-06-05 13:23:01 (GMT) |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2009-06-08 07:00:02 (GMT) |
commit | 768cab51239a45f00d5ee3857efecd3d2cdcb99b (patch) | |
tree | 115c23175bd8547457c4e0b44d20aa7dfb7f1e63 | |
parent | 7087433fb6f77746678963b1a97fc18daab831fa (diff) | |
download | Qt-768cab51239a45f00d5ee3857efecd3d2cdcb99b.zip Qt-768cab51239a45f00d5ee3857efecd3d2cdcb99b.tar.gz Qt-768cab51239a45f00d5ee3857efecd3d2cdcb99b.tar.bz2 |
Bug fix for 251870
A correction to this defect:
251870 QPluginLoader will only look for stubs from single drive,
though plugins themselves can be located on any drive.
Now the implementation goes through all the available drives
if given path does not find corresponding stub-file in
QPluginLoader::setFileName(). Since this is Symbian specific
functionality, all the changes are behind Q_OS_SYMBIAN-flags.
Note: Updated tests now need memory card being installed
to device under test. Otherwise the test will be skipped.
In case needed, drive is easy to change to tests.
D-drive could also be a good option.
modified: src/corelib/plugin/qpluginloader.cpp
modified: tests/auto/qpluginloader/tst_qpluginloader.cpp
Reviewed-By: Miikka Heikkinen
-rw-r--r-- | src/corelib/plugin/qpluginloader.cpp | 19 | ||||
-rw-r--r-- | tests/auto/qpluginloader/tst_qpluginloader.cpp | 52 |
2 files changed, 70 insertions, 1 deletions
diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp index a911f1d..8d1c0f7 100644 --- a/src/corelib/plugin/qpluginloader.cpp +++ b/src/corelib/plugin/qpluginloader.cpp @@ -46,6 +46,7 @@ #include <qfileinfo.h> #include "qlibrary_p.h" #include "qdebug.h" +#include "qdir.h" #ifndef QT_NO_LIBRARY @@ -301,6 +302,24 @@ void QPluginLoader::setFileName(const QString &fileName) } QString fn = fi.canonicalFilePath(); + // If not found directly, check also all the available drives + if (!fn.length()) { + QString stubPath(fi.fileName().length() ? fi.absoluteFilePath() : QString()); + if (stubPath.length() > 1) { + if (stubPath.at(1).toAscii() == ':') + stubPath.remove(0,2); + QFileInfoList driveList(QDir::drives()); + foreach(const QFileInfo& drive, driveList) { + QString testFilePath(drive.absolutePath() + stubPath); + testFilePath = QDir::cleanPath(testFilePath); + if (QFile::exists(testFilePath)) { + fn = testFilePath; + break; + } + } + } + } + #else QString fn = QFileInfo(fileName).canonicalFilePath(); #endif diff --git a/tests/auto/qpluginloader/tst_qpluginloader.cpp b/tests/auto/qpluginloader/tst_qpluginloader.cpp index 20ca997..3b2cb66 100644 --- a/tests/auto/qpluginloader/tst_qpluginloader.cpp +++ b/tests/auto/qpluginloader/tst_qpluginloader.cpp @@ -122,7 +122,7 @@ private slots: void errorString(); void loadHints(); void deleteinstanceOnUnload(); - + void checkingStubsFromDifferentDrives(); }; tst_QPluginLoader::tst_QPluginLoader() @@ -297,6 +297,56 @@ void tst_QPluginLoader::deleteinstanceOnUnload() } } +void tst_QPluginLoader::checkingStubsFromDifferentDrives() +{ +#if defined(Q_OS_SYMBIAN) + + // This test needs C-drive + some additional drive (driveForStubs) + + const QString driveForStubs("E:/");// != "C:/" + const QString stubDir("system/temp/stubtest/"); + const QString stubName("dummyStub.qtplugin"); + const QString fullStubFileName(stubDir + stubName); + QDir dir(driveForStubs); + bool test1(false); bool test2(false); + + // initial clean up + QFile::remove(driveForStubs + fullStubFileName); + dir.rmdir(driveForStubs + stubDir); + + // create a stub dir and do stub drive check + if (!dir.mkpath(stubDir)) + QSKIP("Required drive not available for this test", SkipSingle); + + {// test without stub, should not be found + QPluginLoader loader("C:/" + fullStubFileName); + test1 = !loader.fileName().length(); + } + + // create a stub to defined drive + QFile tempFile(driveForStubs + fullStubFileName); + tempFile.open(QIODevice::ReadWrite); + QFileInfo fileInfo(tempFile); + + {// now should be found even tried to find from C: + QPluginLoader loader("C:/" + fullStubFileName); + test2 = (loader.fileName() == fileInfo.absoluteFilePath()); + } + + // clean up + tempFile.close(); + if (!QFile::remove(driveForStubs + fullStubFileName)) + QWARN("Could not remove stub file"); + if (!dir.rmdir(driveForStubs + stubDir)) + QWARN("Could not remove stub directory"); + + // test after cleanup + QVERIFY(test1); + QVERIFY(test2); + +#endif//Q_OS_SYMBIAN +} + QTEST_APPLESS_MAIN(tst_QPluginLoader) #include "tst_qpluginloader.moc" |