summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Faure <faure@kde.org>2012-01-07 10:00:58 +0100
committerDavid Faure <faure@kde.org>2012-01-10 11:58:11 +0100
commit5be84d2080af421c901df735c3526053041d9ff3 (patch)
tree6644310dd724833c6dcd718f2fe301f355c65df2
parent18a2bb7c27da5ba1f3b3945c67f965e58e8731dc (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.cpp32
-rw-r--r--src/mimetypes/qmimedatabase.h4
-rw-r--r--tests/auto/qmimedatabase/tst_qmimedatabase.cpp33
-rw-r--r--tests/auto/qmimedatabase/tst_qmimedatabase.h2
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();