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; 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() void QMimeBinaryProvider::loadMimeTypeList()
{ {
if (!m_mimetypeListLoaded) { if (!m_mimetypeListLoaded) {
@ -815,6 +838,13 @@ void QMimeXMLProvider::addParent(const QString &child, const QString &parent)
m_parents[child].append(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) QString QMimeXMLProvider::resolveAlias(const QString &name)
{ {
ensureLoaded(); ensureLoaded();

View File

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

View File

@ -349,6 +349,22 @@ QStringList QMimeType::allAncestors() const
return allParents; 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. Returns the known suffixes for the MIME type.
No leading dot is included, so for instance this would return "jpg", "jpeg" for image/jpeg. 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 globPatterns() const;
QStringList parentMimeTypes() const; QStringList parentMimeTypes() const;
QStringList allAncestors() const; QStringList allAncestors() const;
QStringList aliases() const;
QStringList suffixes() const; QStringList suffixes() const;
QString preferredSuffix() const; QString preferredSuffix() const;

View File

@ -355,6 +355,31 @@ void tst_QMimeDatabase::aliases()
QVERIFY(!mustWriteMimeType); 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() void tst_QMimeDatabase::icons()
{ {
QMimeDatabase db; QMimeDatabase db;

View File

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