From 178b023f944b6a38c75fdced572649870d4c6258 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 4 Feb 2015 16:27:11 +0100 Subject: [PATCH] MimeDatabase: Provide access to mime magic rules Change-Id: I9d03db685200e86f71e15fe596b67db1d386eb19 Reviewed-by: David Schulz --- src/libs/utils/mimetypes/mimedatabase.cpp | 8 ++++++++ src/libs/utils/mimetypes/mimedatabase.h | 2 ++ src/libs/utils/mimetypes/mimemagicrule_p.h | 8 +++++++- src/libs/utils/mimetypes/mimeprovider.cpp | 10 ++++++++++ src/libs/utils/mimetypes/mimeprovider_p.h | 3 +++ 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp index bb20f50eaab..36e9dd30c9d 100644 --- a/src/libs/utils/mimetypes/mimedatabase.cpp +++ b/src/libs/utils/mimetypes/mimedatabase.cpp @@ -37,6 +37,7 @@ #include "mimedatabase_p.h" +#include "mimemagicrule_p.h" #include "mimeprovider_p.h" #include "mimetype_p.h" @@ -710,3 +711,10 @@ QList MimeDatabase::allMimeTypes() const \value MatchContent The file content is used to look for a match */ + +QMap > MimeDatabase::magicRulesForMimeType(const MimeType &mimeType) +{ + auto d = MimeDatabasePrivate::instance(); + QMutexLocker locker(&d->mutex); + return d->provider()->magicRulesForMimeType(mimeType); +} diff --git a/src/libs/utils/mimetypes/mimedatabase.h b/src/libs/utils/mimetypes/mimedatabase.h index 070f5653763..c029cc0d9e8 100644 --- a/src/libs/utils/mimetypes/mimedatabase.h +++ b/src/libs/utils/mimetypes/mimedatabase.h @@ -35,6 +35,7 @@ #define XMIMEDATABASE_H #include "mimetype.h" +#include "mimemagicrule_p.h" #include @@ -87,6 +88,7 @@ public: static QString allFiltersString(QString *allFilesFilter = 0); static QStringList allGlobPatterns(); static MimeType bestMatch(const QString &fileName, const QList &types); + static QMap > magicRulesForMimeType(const MimeType &mimeType); // priority -> rules private: Internal::MimeDatabasePrivate *d; diff --git a/src/libs/utils/mimetypes/mimemagicrule_p.h b/src/libs/utils/mimetypes/mimemagicrule_p.h index 46d8c9d182e..b4a96765fa2 100644 --- a/src/libs/utils/mimetypes/mimemagicrule_p.h +++ b/src/libs/utils/mimetypes/mimemagicrule_p.h @@ -45,16 +45,22 @@ // We mean it. // +#include + #include #include #include +#include namespace Utils { + +class MimeType; + namespace Internal { class MimeMagicRulePrivate; -class MimeMagicRule +class QTCREATOR_UTILS_EXPORT MimeMagicRule { public: enum Type { Invalid = 0, String, Host16, Host32, Big16, Big32, Little16, Little32, Byte }; diff --git a/src/libs/utils/mimetypes/mimeprovider.cpp b/src/libs/utils/mimetypes/mimeprovider.cpp index 52cbf9c5a44..be5f962d741 100644 --- a/src/libs/utils/mimetypes/mimeprovider.cpp +++ b/src/libs/utils/mimetypes/mimeprovider.cpp @@ -793,6 +793,16 @@ MimeType MimeXMLProvider::bestMatchByMagic(const QByteArray &data, const QList > MimeXMLProvider::magicRulesForMimeType(const MimeType &mimeType) +{ + QMap > result; + foreach (const MimeMagicRuleMatcher &matcher, m_magicMatchers) { + if (mimeType.matchesName(matcher.mimetype())) + result[matcher.priority()].append(matcher.magicRules()); + } + return result; +} + void MimeXMLProvider::ensureLoaded() { if (!m_loaded /*|| shouldCheck()*/) { diff --git a/src/libs/utils/mimetypes/mimeprovider_p.h b/src/libs/utils/mimetypes/mimeprovider_p.h index 58763d65097..04d0458c99d 100644 --- a/src/libs/utils/mimetypes/mimeprovider_p.h +++ b/src/libs/utils/mimetypes/mimeprovider_p.h @@ -46,6 +46,7 @@ // #include "mimedatabase_p.h" +#include "mimemagicrule_p.h" #include #include @@ -76,6 +77,7 @@ public: // Qt Creator additions virtual QStringList bestMatchByFileName(const QString &fileName, const QList &types) = 0; virtual MimeType bestMatchByMagic(const QByteArray &data, const QList &types, int *accuracyPtr) = 0; + virtual QMap > magicRulesForMimeType(const MimeType &mimeType) = 0; MimeDatabasePrivate *m_db; protected: @@ -156,6 +158,7 @@ public: void addFile(const QString &filePath); QStringList bestMatchByFileName(const QString &fileName, const QList &types); MimeType bestMatchByMagic(const QByteArray &data, const QList &types, int *accuracyPtr); + QMap > magicRulesForMimeType(const MimeType &mimeType); private: void ensureLoaded();