diff options
author | David Faure <faure@kde.org> | 2012-01-07 10:00:58 +0100 |
---|---|---|
committer | David Faure <faure@kde.org> | 2012-01-10 11:58:11 +0100 |
commit | 5be84d2080af421c901df735c3526053041d9ff3 (patch) | |
tree | 6644310dd724833c6dcd718f2fe301f355c65df2 | |
parent | 18a2bb7c27da5ba1f3b3945c67f965e58e8731dc (diff) |
Add findMimeTypesByFileName which returns a list of mimetypes.
This is needed in order to implement delayed mimetype determination.
If, based on the filename only, we get 0 or multiple mimetypes, then
we know findByData will be necessary later. If we get exactly 1
mimetype, then that is authoritative and we won't need findByData.
Change-Id: Ib22edb512fb45099268aafd92500109849c331c4
Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Wolf-Michael Bolle <wolf-michael.bolle@nokia.com>
-rw-r--r-- | src/mimetypes/qmimedatabase.cpp | 32 | ||||
-rw-r--r-- | src/mimetypes/qmimedatabase.h | 4 | ||||
-rw-r--r-- | tests/auto/qmimedatabase/tst_qmimedatabase.cpp | 33 | ||||
-rw-r--r-- | tests/auto/qmimedatabase/tst_qmimedatabase.h | 2 |
4 files changed, 68 insertions, 3 deletions
diff --git a/src/mimetypes/qmimedatabase.cpp b/src/mimetypes/qmimedatabase.cpp index 25ac133..c410377 100644 --- a/src/mimetypes/qmimedatabase.cpp +++ b/src/mimetypes/qmimedatabase.cpp @@ -426,15 +426,18 @@ QMimeType QMimeDatabase::findByFile(const QString &fileName) const /*! \fn QMimeType QMimeDatabase::findByName(const QString &fileName) const; - \brief Returns a MIME type for the file \a fileName. + \brief Returns a MIME type for the file name \a fileName. A valid MIME type is always returned. If the file name doesn't match any known pattern, the default MIME type (application/octet-stream) is returned. + If multiple MIME types match this file, the first one (alphabetically) is returned. This function does not try to open the file. To also use the content when determining the MIME type, use findByFile() or findByNameAndData() instead. + + \sa findMimeTypesByFileName */ QMimeType QMimeDatabase::findByName(const QString &fileName) const { @@ -456,6 +459,33 @@ QMimeType QMimeDatabase::findByName(const QString &fileName) const // ------------------------------------------------------------------------------------------------ /*! + \fn QMimeType QMimeDatabase::findMimeTypesByFileName(const QString &fileName) const; + \brief Returns the MIME types for the file name \a fileName. + + If the file name doesn't match any known pattern, an empty list is returned. + If multiple MIME types match this file, they are all returned. + + This function does not try to open the file. To also use the content + when determining the MIME type, use findByFile() or + findByNameAndData() instead. + + \sa findByName +*/ +QList<QMimeType> QMimeDatabase::findMimeTypesByFileName(const QString &fileName) const +{ + QMutexLocker locker(&d->mutex); + + QStringList matches = d->findByName(fileName); + QList<QMimeType> mimes; + matches.sort(); // Make it deterministic + foreach (const QString& mime, matches) { + mimes.append(d->mimeTypeForName(mime)); + } + return mimes; +} +// ------------------------------------------------------------------------------------------------ + +/*! Returns the suffix for the file \a fileName, as known by the MIME database. This allows to pre-select "tar.bz2" for foo.tar.bz2, but still only diff --git a/src/mimetypes/qmimedatabase.h b/src/mimetypes/qmimedatabase.h index f8e1cd8..738a1d4 100644 --- a/src/mimetypes/qmimedatabase.h +++ b/src/mimetypes/qmimedatabase.h @@ -41,11 +41,13 @@ class QMIME_EXPORT QMimeDatabase public: QMimeDatabase(); - //explicit QMimeDatabase(QMimeDatabasePrivate *theD); ~QMimeDatabase(); QMimeType mimeTypeForName(const QString &nameOrAlias) const; + QMimeType findByName(const QString &fileName) const; + QList<QMimeType> findMimeTypesByFileName(const QString &fileName) const; + QMimeType findByData(const QByteArray &data) const; QMimeType findByData(QIODevice *device) const; diff --git a/tests/auto/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/qmimedatabase/tst_qmimedatabase.cpp index 881df95..2713d55 100644 --- a/tests/auto/qmimedatabase/tst_qmimedatabase.cpp +++ b/tests/auto/qmimedatabase/tst_qmimedatabase.cpp @@ -93,7 +93,6 @@ void tst_qmimedatabase::test_findByName_data() { QTest::addColumn<QString>("fileName"); QTest::addColumn<QString>("expectedMimeType"); - // Maybe we could also add a expectedAccuracy column... QTest::newRow("text") << "textfile.txt" << "text/plain"; QTest::newRow("case-insensitive search") << "textfile.TxT" << "text/plain"; @@ -133,6 +132,38 @@ void tst_qmimedatabase::test_findByName() QMimeType mime = db.findByName(fileName); QVERIFY(mime.isValid()); QCOMPARE(mime.name(), expectedMimeType); + + QList<QMimeType> mimes = db.findMimeTypesByFileName(fileName); + if (expectedMimeType == "application/octet-stream") { + QVERIFY(mimes.isEmpty()); + } else { + QVERIFY(!mimes.isEmpty()); + QCOMPARE(mimes.count(), 1); + QCOMPARE(mimes.first().name(), expectedMimeType); + } +} + +void tst_qmimedatabase::test_findMultipleByName_data() +{ + QTest::addColumn<QString>("fileName"); + QTest::addColumn<QStringList>("expectedMimeTypes"); + + QTest::newRow("txt, 1 hit") << "foo.txt" << (QStringList() << "text/plain"); + QTest::newRow("txtfoobar, 0 hit") << "foo.foobar" << QStringList(); + QTest::newRow("m, 2 hits") << "foo.m" << (QStringList() << "text/x-matlab" << "text/x-objcsrc"); + QTest::newRow("sub, 3 hits") << "foo.sub" << (QStringList() << "text/x-microdvd" << "text/x-mpsub" << "text/x-subviewer"); +} + +void tst_qmimedatabase::test_findMultipleByName() +{ + QFETCH(QString, fileName); + QFETCH(QStringList, expectedMimeTypes); + QMimeDatabase db; + QList<QMimeType> mimes = db.findMimeTypesByFileName(fileName); + QStringList mimeNames; + foreach (const QMimeType& mime, mimes) + mimeNames.append(mime.name()); + QCOMPARE(mimeNames, expectedMimeTypes); } void tst_qmimedatabase::test_inheritance() diff --git a/tests/auto/qmimedatabase/tst_qmimedatabase.h b/tests/auto/qmimedatabase/tst_qmimedatabase.h index eaaa973..7068cef 100644 --- a/tests/auto/qmimedatabase/tst_qmimedatabase.h +++ b/tests/auto/qmimedatabase/tst_qmimedatabase.h @@ -23,6 +23,8 @@ private slots: void test_mimeTypeForName(); void test_findByName_data(); void test_findByName(); + void test_findMultipleByName_data(); + void test_findMultipleByName(); void test_inheritance(); void test_aliases(); void test_icons(); |