summaryrefslogtreecommitdiffstats
path: root/src/corelib/mimetypes/qmimeprovider.cpp
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2023-09-11 18:20:12 +0200
committerDavid Faure <david.faure@kdab.com>2023-09-13 23:27:44 +0200
commit1f0bc1ade316547d01100dcca4f3f7187485f917 (patch)
tree635f1fa5fe366d1e8c6a17f8b0cf5698902c7245 /src/corelib/mimetypes/qmimeprovider.cpp
parent42e164f5ad7f279d3b7862d5882ba6705db596d2 (diff)
QMimeDatabase: fix glob-deleteall support for the binary providers
This fixes the recently added QEXPECT_FAIL about glob-deleteall in a local directory (with a binary cache). Before adding a glob match we ask the more-local (higher-precedence) directories if they have a glob-deleteall for that mimetype, and skip it then. This "asking" is a virtual method, implemented for both XML and binary providers. Change-Id: I6e4baf0120749f3331fd2d9254bea750a322b72d Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/mimetypes/qmimeprovider.cpp')
-rw-r--r--src/corelib/mimetypes/qmimeprovider.cpp64
1 files changed, 26 insertions, 38 deletions
diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp
index a55f8314df..4d2e7c7efb 100644
--- a/src/corelib/mimetypes/qmimeprovider.cpp
+++ b/src/corelib/mimetypes/qmimeprovider.cpp
@@ -62,6 +62,25 @@ QMimeProviderBase::QMimeProviderBase(QMimeDatabasePrivate *db, const QString &di
{
}
+QMimeProviderBase *QMimeProviderBase::overrideProvider() const
+{
+ return m_overrideProvider;
+}
+
+void QMimeProviderBase::setOverrideProvider(QMimeProviderBase *provider)
+{
+ m_overrideProvider = provider;
+}
+
+bool QMimeProviderBase::isMimeTypeGlobsExcluded(const QString &name) const
+{
+ if (m_overrideProvider) {
+ if (m_overrideProvider->hasGlobDeleteAll(name))
+ return true;
+ return m_overrideProvider->isMimeTypeGlobsExcluded(name);
+ }
+ return false;
+}
QMimeBinaryProvider::QMimeBinaryProvider(QMimeDatabasePrivate *db, const QString &directory)
: QMimeProviderBase(db, directory), m_mimetypeListLoaded(false)
@@ -222,17 +241,6 @@ void QMimeBinaryProvider::addFileNameMatches(const QString &fileName, QMimeGlobM
fileName);
}
-bool QMimeBinaryProvider::isMimeTypeGlobsExcluded(const char *mimeTypeName)
-{
- return m_mimeTypesWithExcludedGlobs.contains(QLatin1StringView(mimeTypeName));
-}
-
-void QMimeBinaryProvider::excludeMimeTypeGlobs(const QStringList &toExclude)
-{
- for (const auto &mt : toExclude)
- appendIfNew(m_mimeTypesWithExcludedGlobs, mt);
-}
-
int QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int off,
const QString &fileName)
{
@@ -248,14 +256,14 @@ int QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile *
const Qt::CaseSensitivity qtCaseSensitive = caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive;
const QString pattern = QLatin1StringView(cacheFile->getCharStar(globOffset));
- const char *mimeType = cacheFile->getCharStar(mimeTypeOffset);
+ const QLatin1StringView mimeType(cacheFile->getCharStar(mimeTypeOffset));
//qDebug() << pattern << mimeType << weight << caseSensitive;
if (isMimeTypeGlobsExcluded(mimeType))
continue;
QMimeGlobPattern glob(pattern, QString() /*unused*/, weight, qtCaseSensitive);
if (glob.matchFileName(fileName)) {
- result.addMatch(QLatin1StringView(mimeType), weight, pattern);
+ result.addMatch(mimeType, weight, pattern);
++numMatches;
}
}
@@ -292,15 +300,15 @@ bool QMimeBinaryProvider::matchSuffixTree(QMimeGlobMatchResult &result,
if (mch != 0)
break;
const int mimeTypeOffset = cacheFile->getUint32(childOff + 4);
- const char *mimeType = cacheFile->getCharStar(mimeTypeOffset);
+ const QLatin1StringView mimeType(cacheFile->getCharStar(mimeTypeOffset));
if (isMimeTypeGlobsExcluded(mimeType))
continue;
const int flagsAndWeight = cacheFile->getUint32(childOff + 8);
const int weight = flagsAndWeight & 0xff;
const bool caseSensitive = flagsAndWeight & 0x100;
if (caseSensitiveCheck || !caseSensitive) {
- result.addMatch(QLatin1StringView(mimeType), weight,
- u'*' + QStringView{fileName}.mid(charPos + 1),
+ result.addMatch(mimeType, weight,
+ u'*' + QStringView{ fileName }.mid(charPos + 1),
fileName.size() - charPos - 2);
success = true;
}
@@ -706,7 +714,8 @@ bool QMimeXMLProvider::knowsMimeType(const QString &name)
void QMimeXMLProvider::addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result)
{
- m_mimeTypeGlobs.matchingGlobs(fileName, result);
+ auto filterFunc = [this](const QString &name) { return !isMimeTypeGlobsExcluded(name); };
+ m_mimeTypeGlobs.matchingGlobs(fileName, result, filterFunc);
}
void QMimeXMLProvider::findByMagic(const QByteArray &data, int *accuracyPtr, QString *candidate)
@@ -741,7 +750,6 @@ void QMimeXMLProvider::ensureLoaded()
m_parents.clear();
m_mimeTypeGlobs.clear();
m_magicMatchers.clear();
- m_mimeTypesWithDeletedGlobs.clear();
//qDebug() << "Loading" << m_allFiles;
@@ -817,29 +825,9 @@ void QMimeXMLProvider::addGlobPattern(const QMimeGlobPattern &glob)
void QMimeXMLProvider::addMimeType(const QMimeTypeXMLData &mt)
{
- if (mt.hasGlobDeleteAll)
- appendIfNew(m_mimeTypesWithDeletedGlobs, mt.name);
m_nameMimeTypeMap.insert(mt.name, mt);
}
-/*
- \a toExclude is a list of mime type names that should have the the glob patterns
- associated with them cleared (because there are mime types with the same names
- in a higher precedence Provider that have glob-deleteall tags).
-
- This method is called from QMimeDatabasePrivate::loadProviders() to exclude mime
- type glob patterns in lower precedence Providers.
-*/
-void QMimeXMLProvider::excludeMimeTypeGlobs(const QStringList &toExclude)
-{
- for (const auto &mt : toExclude) {
- auto it = m_nameMimeTypeMap.find(mt);
- if (it != m_nameMimeTypeMap.end())
- it->globPatterns.clear();
- m_mimeTypeGlobs.removeMimeType(mt);
- }
-}
-
void QMimeXMLProvider::addParents(const QString &mime, QStringList &result)
{
for (const QString &parent : m_parents.value(mime)) {