Add QMimeType::aliases().

Requested by Allan Sandfeld Jensen for QWebkit, which needs to register
upfront all the mimetypes that a given plugin can handle.

Change-Id: I64b8d39c7988adfc7db4ed8bfdc73acd16e999da
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
David Faure 2012-11-19 17:14:02 +01:00 committed by The Qt Project
parent 11afecbaa7
commit 8a83c1bb55
6 changed files with 77 additions and 0 deletions

View File

@ -494,6 +494,29 @@ QString QMimeBinaryProvider::resolveAlias(const QString &name)
return name;
}
QStringList QMimeBinaryProvider::listAliases(const QString &name)
{
checkCache();
QStringList result;
const QByteArray input = name.toLatin1();
foreach (CacheFile *cacheFile, m_cacheFiles) {
const int aliasListOffset = cacheFile->getUint32(PosAliasListOffset);
const int numEntries = cacheFile->getUint32(aliasListOffset);
for (int pos = 0; pos < numEntries; ++pos) {
const int off = aliasListOffset + 4 + 8 * pos;
const int mimeOffset = cacheFile->getUint32(off + 4);
const char *mimeType = cacheFile->getCharStar(mimeOffset);
if (input == mimeType) {
const int aliasOffset = cacheFile->getUint32(off);
const char *alias = cacheFile->getCharStar(aliasOffset);
result.append(QString::fromLatin1(alias));
}
}
}
return result;
}
void QMimeBinaryProvider::loadMimeTypeList()
{
if (!m_mimetypeListLoaded) {
@ -815,6 +838,13 @@ void QMimeXMLProvider::addParent(const QString &child, const QString &parent)
m_parents[child].append(parent);
}
QStringList QMimeXMLProvider::listAliases(const QString &name)
{
ensureLoaded();
// Iterate through the whole hash. This method is rarely used.
return m_aliases.keys(name);
}
QString QMimeXMLProvider::resolveAlias(const QString &name)
{
ensureLoaded();

View File

@ -61,6 +61,7 @@ public:
virtual QStringList findByFileName(const QString &fileName, QString *foundSuffix) = 0;
virtual QStringList parents(const QString &mime) = 0;
virtual QString resolveAlias(const QString &name) = 0;
virtual QStringList listAliases(const QString &name) = 0;
virtual QMimeType findByMagic(const QByteArray &data, int *accuracyPtr) = 0;
virtual QList<QMimeType> allMimeTypes() = 0;
virtual void loadMimeTypePrivate(QMimeTypePrivate &) {}
@ -87,6 +88,7 @@ public:
virtual QStringList findByFileName(const QString &fileName, QString *foundSuffix);
virtual QStringList parents(const QString &mime);
virtual QString resolveAlias(const QString &name);
virtual QStringList listAliases(const QString &name);
virtual QMimeType findByMagic(const QByteArray &data, int *accuracyPtr);
virtual QList<QMimeType> allMimeTypes();
virtual void loadMimeTypePrivate(QMimeTypePrivate &);
@ -128,6 +130,7 @@ public:
virtual QStringList findByFileName(const QString &fileName, QString *foundSuffix);
virtual QStringList parents(const QString &mime);
virtual QString resolveAlias(const QString &name);
virtual QStringList listAliases(const QString &name);
virtual QMimeType findByMagic(const QByteArray &data, int *accuracyPtr);
virtual QList<QMimeType> allMimeTypes();

View File

@ -349,6 +349,22 @@ QStringList QMimeType::allAncestors() const
return allParents;
}
/*!
Return the list of aliases of this mimetype.
For instance, for text/csv, the returned list would be:
text/x-csv, text/x-comma-separated-values.
Note that all QMimeType instances refer to proper mimetypes,
never to aliases directly.
The order of the aliases in the list is undefined.
*/
QStringList QMimeType::aliases() const
{
return QMimeDatabasePrivate::instance()->provider()->listAliases(d->name);
}
/*!
Returns the known suffixes for the MIME type.
No leading dot is included, so for instance this would return "jpg", "jpeg" for image/jpeg.

View File

@ -90,6 +90,7 @@ public:
QStringList globPatterns() const;
QStringList parentMimeTypes() const;
QStringList allAncestors() const;
QStringList aliases() const;
QStringList suffixes() const;
QString preferredSuffix() const;

View File

@ -355,6 +355,31 @@ void tst_QMimeDatabase::aliases()
QVERIFY(!mustWriteMimeType);
}
void tst_QMimeDatabase::listAliases_data()
{
QTest::addColumn<QString>("inputMime");
QTest::addColumn<QString>("expectedAliases");
QTest::newRow("csv") << "text/csv" << "text/x-csv,text/x-comma-separated-values";
QTest::newRow("xml") << "application/xml" << "text/xml";
QTest::newRow("xml2") << "text/xml" /* gets resolved to application/xml */ << "text/xml";
QTest::newRow("no_mime") << "message/news" << "";
}
void tst_QMimeDatabase::listAliases()
{
QFETCH(QString, inputMime);
QFETCH(QString, expectedAliases);
QMimeDatabase db;
QStringList expectedAliasesList = expectedAliases.split(',', QString::SkipEmptyParts);
expectedAliasesList.sort();
QMimeType mime = db.mimeTypeForName(inputMime);
QVERIFY(mime.isValid());
QStringList aliasList = mime.aliases();
aliasList.sort();
QCOMPARE(aliasList, expectedAliasesList);
}
void tst_QMimeDatabase::icons()
{
QMimeDatabase db;

View File

@ -62,6 +62,8 @@ private slots:
void mimeTypesForFileName();
void inheritance();
void aliases();
void listAliases_data();
void listAliases();
void icons();
void mimeTypeForFileWithContent();
void mimeTypeForUrl();