From 4f7b6bb311fc8323283629e4251466afa21cc204 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 30 Aug 2024 11:12:11 +0200 Subject: [PATCH] Update mime database from Qt qtbase/071a9c90615966e6af375ec46c1b4acd5d1cd628 QMimeDatabase: introduce QMimeMagicResult to accumulate magic results Change-Id: I877922d518def275f15037d60d090955afbc1e21 Reviewed-by: Jarek Kobus --- src/libs/utils/mimetypes2/mimedatabase.cpp | 11 ++++++----- src/libs/utils/mimetypes2/mimeprovider.cpp | 22 ++++++++++++---------- src/libs/utils/mimetypes2/mimeprovider_p.h | 14 +++++++++++--- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/libs/utils/mimetypes2/mimedatabase.cpp b/src/libs/utils/mimetypes2/mimedatabase.cpp index 7451889dab7..61d97f5e8d9 100644 --- a/src/libs/utils/mimetypes2/mimedatabase.cpp +++ b/src/libs/utils/mimetypes2/mimedatabase.cpp @@ -421,13 +421,14 @@ MimeType MimeDatabasePrivate::findByData(const QByteArray &data, int *accuracyPt } #endif - *accuracyPtr = 0; - QString candidate; + MimeMagicResult result; for (const auto &provider : providers()) - provider->findByMagic(data, accuracyPtr, &candidate); + provider->findByMagic(data, result); - if (!candidate.isEmpty()) - return MimeType(MimeTypePrivate(candidate)); + if (result.isValid()) { + *accuracyPtr = result.accuracy; + return MimeType(MimeTypePrivate(result.candidate)); + } if (isTextFile(data)) { *accuracyPtr = 5; diff --git a/src/libs/utils/mimetypes2/mimeprovider.cpp b/src/libs/utils/mimetypes2/mimeprovider.cpp index efcd44f1a62..0385735be3f 100644 --- a/src/libs/utils/mimetypes2/mimeprovider.cpp +++ b/src/libs/utils/mimetypes2/mimeprovider.cpp @@ -362,7 +362,7 @@ bool MimeBinaryProvider::matchMagicRule(MimeBinaryProvider::CacheFile *cacheFile return false; } -void MimeBinaryProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) +void MimeBinaryProvider::findByMagic(const QByteArray &data, MimeMagicResult &result) { const int magicListOffset = m_cacheFile->getUint32(PosMagicListOffset); const int numMatches = m_cacheFile->getUint32(magicListOffset); @@ -378,11 +378,13 @@ void MimeBinaryProvider::findByMagic(const QByteArray &data, int *accuracyPtr, Q const char *mimeType = m_cacheFile->getCharStar(mimeTypeOffset); if (m_overriddenMimeTypes.contains(QLatin1String(mimeType))) continue; - *accuracyPtr = m_cacheFile->getUint32(off); - // Return the first match. We have no rules for conflicting magic data... - // (mime.cache itself is sorted, but what about local overrides with a lower prio?) - *candidate = QString::fromLatin1(mimeType); - return; + const int accuracy = static_cast(m_cacheFile->getUint32(off)); + if (accuracy > result.accuracy) { + result.accuracy = accuracy; + result.candidate = QString::fromLatin1(mimeType); + // Return the first match, mime.cache is sorted + return; + } } } } @@ -747,16 +749,16 @@ void MimeXMLProvider::addFileNameMatches(const QString &fileName, MimeGlobMatchR m_mimeTypeGlobs.matchingGlobs(fileName, result, filterFunc); } -void MimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) +void MimeXMLProvider::findByMagic(const QByteArray &data, MimeMagicResult &result) { for (const MimeMagicRuleMatcher &matcher : std::as_const(m_magicMatchers)) { if (m_overriddenMimeTypes.contains(matcher.mimetype())) continue; if (matcher.matches(data)) { const int priority = matcher.priority(); - if (priority > *accuracyPtr) { - *accuracyPtr = priority; - *candidate = matcher.mimetype(); + if (priority > result.accuracy) { + result.accuracy = priority; + result.candidate = matcher.mimetype(); } } } diff --git a/src/libs/utils/mimetypes2/mimeprovider_p.h b/src/libs/utils/mimetypes2/mimeprovider_p.h index b96034a4dc4..4332fb8b9ad 100644 --- a/src/libs/utils/mimetypes2/mimeprovider_p.h +++ b/src/libs/utils/mimetypes2/mimeprovider_p.h @@ -28,6 +28,14 @@ class MimeMagicRuleMatcher; class MimeTypeXMLData; class MimeProviderBase; +struct MimeMagicResult +{ + bool isValid() const { return !candidate.isEmpty(); } + + QString candidate; + int accuracy = 0; +}; + class MimeProviderBase { Q_DISABLE_COPY(MimeProviderBase) @@ -43,7 +51,7 @@ public: virtual void addParents(const QString &mime, QStringList &result) = 0; virtual QString resolveAlias(const QString &name) = 0; virtual void addAliases(const QString &name, QStringList &result) = 0; - virtual void findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) = 0; + virtual void findByMagic(const QByteArray &data, MimeMagicResult &result) = 0; virtual void addAllMimeTypes(QList &result) = 0; virtual MimeTypePrivate::LocaleHash localeComments(const QString &name) = 0; virtual bool hasGlobDeleteAll(const QString &name) = 0; @@ -92,7 +100,7 @@ public: void addParents(const QString &mime, QStringList &result) override; QString resolveAlias(const QString &name) override; void addAliases(const QString &name, QStringList &result) override; - void findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) override; + void findByMagic(const QByteArray &data, MimeMagicResult &result) override; void addAllMimeTypes(QList &result) override; MimeTypePrivate::LocaleHash localeComments(const QString &name) override; bool hasGlobDeleteAll(const QString &name) override; @@ -168,7 +176,7 @@ public: void addParents(const QString &mime, QStringList &result) override; QString resolveAlias(const QString &name) override; void addAliases(const QString &name, QStringList &result) override; - void findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate) override; + void findByMagic(const QByteArray &data, MimeMagicResult &result) override; void addAllMimeTypes(QList &result) override; void ensureLoaded() override; MimeTypePrivate::LocaleHash localeComments(const QString &name) override;