summaryrefslogtreecommitdiffstats
path: root/src/corelib/mimetypes/qmimeprovider.cpp
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2023-08-28 18:28:28 +0200
committerDavid Faure <david.faure@kdab.com>2023-09-01 15:04:33 +0200
commit1b39e61a775d70ee96287e9f0e418cb5741e6638 (patch)
tree1fe758fa5b5a9aa565ee3f1191fd259104c4ecae /src/corelib/mimetypes/qmimeprovider.cpp
parentd4eda5d34d29c965e625300e2136250fabd0aee5 (diff)
QMimeDatabase: fix detection of pattern conflict in different prefixes
Installing a second mimetype with *.txt as glob had a different effect depending on whether it was installed into the same prefix or a different prefix as the one where text/plain is installed. Pick-to: 6.6 Change-Id: I7f54b8efe22f620eb57257745c48fe5402c87626 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/mimetypes/qmimeprovider.cpp')
-rw-r--r--src/corelib/mimetypes/qmimeprovider.cpp30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp
index 74fc0a269f..df1d68a764 100644
--- a/src/corelib/mimetypes/qmimeprovider.cpp
+++ b/src/corelib/mimetypes/qmimeprovider.cpp
@@ -213,22 +213,25 @@ void QMimeBinaryProvider::addFileNameMatches(const QString &fileName, QMimeGlobM
return;
Q_ASSERT(m_cacheFile);
const QString lowerFileName = fileName.toLower();
+ int numMatches = 0;
// Check literals (e.g. "Makefile")
- matchGlobList(result, m_cacheFile.get(), m_cacheFile->getUint32(PosLiteralListOffset),
- fileName);
+ numMatches = matchGlobList(result, m_cacheFile.get(),
+ m_cacheFile->getUint32(PosLiteralListOffset), fileName);
// Check the very common *.txt cases with the suffix tree
- if (result.m_matchingMimeTypes.isEmpty()) {
+ if (numMatches == 0) {
const int reverseSuffixTreeOffset = m_cacheFile->getUint32(PosReverseSuffixTreeOffset);
const int numRoots = m_cacheFile->getUint32(reverseSuffixTreeOffset);
const int firstRootOffset = m_cacheFile->getUint32(reverseSuffixTreeOffset + 4);
- matchSuffixTree(result, m_cacheFile.get(), numRoots, firstRootOffset, lowerFileName,
- lowerFileName.size() - 1, false);
- if (result.m_matchingMimeTypes.isEmpty())
- matchSuffixTree(result, m_cacheFile.get(), numRoots, firstRootOffset, fileName,
- fileName.size() - 1, true);
+ if (matchSuffixTree(result, m_cacheFile.get(), numRoots, firstRootOffset, lowerFileName,
+ lowerFileName.size() - 1, false)) {
+ ++numMatches;
+ } else if (matchSuffixTree(result, m_cacheFile.get(), numRoots, firstRootOffset, fileName,
+ fileName.size() - 1, true)) {
+ ++numMatches;
+ }
}
// Check complex globs (e.g. "callgrind.out[0-9]*" or "README*")
- if (result.m_matchingMimeTypes.isEmpty())
+ if (numMatches == 0)
matchGlobList(result, m_cacheFile.get(), m_cacheFile->getUint32(PosGlobListOffset),
fileName);
}
@@ -244,8 +247,10 @@ void QMimeBinaryProvider::excludeMimeTypeGlobs(const QStringList &toExclude)
appendIfNew(m_mimeTypesWithExcludedGlobs, mt);
}
-void QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int off, const QString &fileName)
+int QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int off,
+ const QString &fileName)
{
+ int numMatches = 0;
const int numGlobs = cacheFile->getUint32(off);
//qDebug() << "Loading" << numGlobs << "globs from" << cacheFile->file.fileName() << "at offset" << cacheFile->globListOffset;
for (int i = 0; i < numGlobs; ++i) {
@@ -263,9 +268,12 @@ void QMimeBinaryProvider::matchGlobList(QMimeGlobMatchResult &result, CacheFile
continue;
QMimeGlobPattern glob(pattern, QString() /*unused*/, weight, qtCaseSensitive);
- if (glob.matchFileName(fileName))
+ if (glob.matchFileName(fileName)) {
result.addMatch(QLatin1StringView(mimeType), weight, pattern);
+ ++numMatches;
+ }
}
+ return numMatches;
}
bool QMimeBinaryProvider::matchSuffixTree(QMimeGlobMatchResult &result,