MimeDatabase: Allow overriding pattern and magic matchers of mime types

Change-Id: I1e2f59c98ab69ccee1eb2eaa8bc6ce918302c6cb
Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
This commit is contained in:
Eike Ziller
2015-02-05 14:37:16 +01:00
parent 3373390048
commit afa2212f8d
4 changed files with 47 additions and 0 deletions

View File

@@ -718,3 +718,17 @@ QMap<int, QList<MimeMagicRule> > MimeDatabase::magicRulesForMimeType(const MimeT
QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
return d->provider()->magicRulesForMimeType(mimeType); 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<int, QList<MimeMagicRule> > &rules)
{
auto d = MimeDatabasePrivate::instance();
QMutexLocker locker(&d->mutex);
return d->provider()->setMagicRulesForMimeType(mimeType, rules);
}

View File

@@ -89,6 +89,9 @@ public:
static QStringList allGlobPatterns(); static QStringList allGlobPatterns();
static MimeType bestMatch(const QString &fileName, const QList<MimeType> &types); static MimeType bestMatch(const QString &fileName, const QList<MimeType> &types);
static QMap<int, QList<Internal::MimeMagicRule> > magicRulesForMimeType(const MimeType &mimeType); // priority -> rules static QMap<int, QList<Internal::MimeMagicRule> > magicRulesForMimeType(const MimeType &mimeType); // priority -> rules
static void setGlobPatternsForMimeType(const MimeType &mimeType, const QStringList &patterns);
static void setMagicRulesForMimeType(const MimeType &mimeType,
const QMap<int, QList<Internal::MimeMagicRule> > &rules); // priority -> rules
private: private:
Internal::MimeDatabasePrivate *d; Internal::MimeDatabasePrivate *d;

View File

@@ -803,6 +803,32 @@ QMap<int, QList<MimeMagicRule> > MimeXMLProvider::magicRulesForMimeType(const Mi
return result; 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<int, QList<MimeMagicRule> > &rules)
{
// remove all previous rules
QMutableListIterator<MimeMagicRuleMatcher> 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() void MimeXMLProvider::ensureLoaded()
{ {
if (!m_loaded /*|| shouldCheck()*/) { if (!m_loaded /*|| shouldCheck()*/) {

View File

@@ -78,6 +78,8 @@ public:
virtual QStringList bestMatchByFileName(const QString &fileName, const QList<MimeType> &types) = 0; virtual QStringList bestMatchByFileName(const QString &fileName, const QList<MimeType> &types) = 0;
virtual MimeType bestMatchByMagic(const QByteArray &data, const QList<MimeType> &types, int *accuracyPtr) = 0; virtual MimeType bestMatchByMagic(const QByteArray &data, const QList<MimeType> &types, int *accuracyPtr) = 0;
virtual QMap<int, QList<MimeMagicRule> > magicRulesForMimeType(const MimeType &mimeType) = 0; virtual QMap<int, QList<MimeMagicRule> > magicRulesForMimeType(const MimeType &mimeType) = 0;
virtual void setGlobPatternsForMimeType(const MimeType &mimeType, const QStringList &patterns) = 0;
virtual void setMagicRulesForMimeType(const MimeType &mimeType, const QMap<int, QList<MimeMagicRule> > &rules) = 0;
MimeDatabasePrivate *m_db; MimeDatabasePrivate *m_db;
protected: protected:
@@ -159,6 +161,8 @@ public:
QStringList bestMatchByFileName(const QString &fileName, const QList<MimeType> &types); QStringList bestMatchByFileName(const QString &fileName, const QList<MimeType> &types);
MimeType bestMatchByMagic(const QByteArray &data, const QList<MimeType> &types, int *accuracyPtr); MimeType bestMatchByMagic(const QByteArray &data, const QList<MimeType> &types, int *accuracyPtr);
QMap<int, QList<MimeMagicRule> > magicRulesForMimeType(const MimeType &mimeType); QMap<int, QList<MimeMagicRule> > magicRulesForMimeType(const MimeType &mimeType);
void setGlobPatternsForMimeType(const MimeType &mimeType, const QStringList &patterns);
void setMagicRulesForMimeType(const MimeType &mimeType, const QMap<int, QList<MimeMagicRule> > &rules);
private: private:
void ensureLoaded(); void ensureLoaded();