diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp index 36e9dd30c9d..32629a74edb 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 c029cc0d9e8..f894933f769 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 be5f962d741..104c2c727cd 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 04d0458c99d..9a375a018dd 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();