From afa2212f8dc2b20d5b0734993beba00c1c60e701 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 5 Feb 2015 14:37:16 +0100 Subject: MimeDatabase: Allow overriding pattern and magic matchers of mime types Change-Id: I1e2f59c98ab69ccee1eb2eaa8bc6ce918302c6cb Reviewed-by: David Schulz --- src/libs/utils/mimetypes/mimedatabase.cpp | 14 ++++++++++++++ src/libs/utils/mimetypes/mimedatabase.h | 3 +++ src/libs/utils/mimetypes/mimeprovider.cpp | 26 ++++++++++++++++++++++++++ src/libs/utils/mimetypes/mimeprovider_p.h | 4 ++++ 4 files changed, 47 insertions(+) (limited to 'src') diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp index 36e9dd30c9..32629a74ed 100644 --- a/src/libs/utils/mimetypes/mimedatabase.cpp +++ b/src/libs/utils/mimetypes/mimedatabase.cpp @@ -718,3 +718,17 @@ QMap > MimeDatabase::magicRulesForMimeType(const MimeT QMutexLocker locker(&d->mutex); return d->provider()->magicRulesForMimeType(mimeType); } + +void MimeDatabase::setGlobPatternsForMimeType(const MimeType &mimeType, const QStringList &patterns) +{ + auto d = MimeDatabasePrivate::instance(); + QMutexLocker locker(&d->mutex); + return d->provider()->setGlobPatternsForMimeType(mimeType, patterns); +} + +void MimeDatabase::setMagicRulesForMimeType(const MimeType &mimeType, const QMap > &rules) +{ + auto d = MimeDatabasePrivate::instance(); + QMutexLocker locker(&d->mutex); + return d->provider()->setMagicRulesForMimeType(mimeType, rules); +} diff --git a/src/libs/utils/mimetypes/mimedatabase.h b/src/libs/utils/mimetypes/mimedatabase.h index c029cc0d9e..f894933f76 100644 --- a/src/libs/utils/mimetypes/mimedatabase.h +++ b/src/libs/utils/mimetypes/mimedatabase.h @@ -89,6 +89,9 @@ public: static QStringList allGlobPatterns(); static MimeType bestMatch(const QString &fileName, const QList &types); static QMap > magicRulesForMimeType(const MimeType &mimeType); // priority -> rules + static void setGlobPatternsForMimeType(const MimeType &mimeType, const QStringList &patterns); + static void setMagicRulesForMimeType(const MimeType &mimeType, + const QMap > &rules); // priority -> rules private: Internal::MimeDatabasePrivate *d; diff --git a/src/libs/utils/mimetypes/mimeprovider.cpp b/src/libs/utils/mimetypes/mimeprovider.cpp index be5f962d74..104c2c727c 100644 --- a/src/libs/utils/mimetypes/mimeprovider.cpp +++ b/src/libs/utils/mimetypes/mimeprovider.cpp @@ -803,6 +803,32 @@ QMap > MimeXMLProvider::magicRulesForMimeType(const Mi return result; } +void MimeXMLProvider::setGlobPatternsForMimeType(const MimeType &mimeType, const QStringList &patterns) +{ + // remove all previous globs + m_mimeTypeGlobs.removeMimeType(mimeType.name()); + // add new patterns as case-insensitive default-weight patterns + foreach (const QString &pattern, patterns) + addGlobPattern(MimeGlobPattern(pattern, mimeType.name())); + mimeType.d->globPatterns = patterns; +} + +void MimeXMLProvider::setMagicRulesForMimeType(const MimeType &mimeType, const QMap > &rules) +{ + // remove all previous rules + QMutableListIterator matcherIt(m_magicMatchers); + while (matcherIt.hasNext()) { + if (matcherIt.next().mimetype() == mimeType.name()) + matcherIt.remove(); + } + // add new rules + for (auto it = rules.constBegin(); it != rules.constEnd(); ++it) { + MimeMagicRuleMatcher matcher(mimeType.name(), it.key()/*priority*/); + matcher.addRules(it.value()); + addMagicMatcher(matcher); + } +} + 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 04d0458c99..9a375a018d 100644 --- a/src/libs/utils/mimetypes/mimeprovider_p.h +++ b/src/libs/utils/mimetypes/mimeprovider_p.h @@ -78,6 +78,8 @@ public: 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; + virtual void setGlobPatternsForMimeType(const MimeType &mimeType, const QStringList &patterns) = 0; + virtual void setMagicRulesForMimeType(const MimeType &mimeType, const QMap > &rules) = 0; MimeDatabasePrivate *m_db; protected: @@ -159,6 +161,8 @@ public: QStringList bestMatchByFileName(const QString &fileName, const QList &types); MimeType bestMatchByMagic(const QByteArray &data, const QList &types, int *accuracyPtr); QMap > magicRulesForMimeType(const MimeType &mimeType); + void setGlobPatternsForMimeType(const MimeType &mimeType, const QStringList &patterns); + void setMagicRulesForMimeType(const MimeType &mimeType, const QMap > &rules); private: void ensureLoaded(); -- cgit v1.2.3