26void QMimeGlobMatchResult::addMatch(
const QString &mimeType,
int weight,
const QString &pattern,
27 qsizetype knownSuffixLength)
29 if (m_allMatchingMimeTypes.contains(mimeType))
32 if (weight < m_weight) {
33 m_allMatchingMimeTypes.append(mimeType);
36 bool replace = weight > m_weight;
39 if (pattern.size() < m_matchingPatternLength)
41 else if (pattern.size() > m_matchingPatternLength) {
47 m_matchingMimeTypes.clear();
49 m_matchingPatternLength = pattern.size();
52 if (!m_matchingMimeTypes.contains(mimeType)) {
53 m_matchingMimeTypes.append(mimeType);
55 m_allMatchingMimeTypes.prepend(mimeType);
57 m_allMatchingMimeTypes.append(mimeType);
58 m_knownSuffixLength = knownSuffixLength;
110 const QString fileName = m_caseSensitivity == Qt::CaseInsensitive
111 ? inputFileName.toLower() : inputFileName;
113 const qsizetype patternLength = m_pattern.size();
116 const qsizetype fileNameLength = fileName.size();
118 switch (m_patternType) {
119 case SuffixPattern: {
120 if (fileNameLength + 1 < patternLength)
123 const QChar *c1 = m_pattern.unicode() + patternLength - 1;
124 const QChar *c2 = fileName.unicode() + fileNameLength - 1;
126 while (cnt < patternLength && *c1-- == *c2--)
128 return cnt == patternLength;
130 case PrefixPattern: {
131 if (fileNameLength + 1 < patternLength)
134 const QChar *c1 = m_pattern.unicode();
135 const QChar *c2 = fileName.unicode();
137 while (cnt < patternLength && *c1++ == *c2++)
139 return cnt == patternLength;
142 return (m_pattern == fileName);
144 return fileNameLength == 7
145 && fileName.at(0).isDigit() && fileName.at(1).isDigit() && fileName.at(2).isDigit()
146 && QStringView{fileName}.mid(3, 4) ==
".vdr"_L1;
148 if (fileNameLength < 6)
150 const QChar lastChar = fileName.at(fileNameLength - 1);
151 const bool lastCharOK = (lastChar.isDigit() && lastChar != u'0')
153 return lastCharOK && QStringView{fileName}.mid(fileNameLength - 6, 5) ==
".anim"_L1;
157#if QT_CONFIG(regularexpression)
158 auto rx = QRegularExpression::fromWildcard(m_pattern);
159 return rx.match(fileName).hasMatch();
192 const QString &pattern = glob.pattern();
193 Q_ASSERT(!pattern.isEmpty());
199 if (glob.weight() == 50 && isFastPattern(pattern) && !glob.isCaseSensitive()) {
201 const QString extension = pattern.mid(2).toLower();
203 if (!patterns.contains(glob.mimeType()))
204 patterns.append(glob.mimeType());
225 const AddMatchFilterFunc &filterFunc)
const
227 for (
const QMimeGlobPattern &glob : *
this) {
228 if (glob.matchFileName(fileName) && filterFunc(glob.mimeType())) {
229 const QString pattern = glob.pattern();
230 const qsizetype suffixLen = isSimplePattern(pattern) ? pattern.size() - strlen(
"*.") : 0;
231 result.addMatch(glob.mimeType(), glob.weight(), pattern, suffixLen);
237 const AddMatchFilterFunc &filterFunc)
const
244 const qsizetype lastDot = fileName.lastIndexOf(u'.');
246 const qsizetype ext_len = fileName.size() - lastDot - 1;
247 const QString simpleExtension = fileName.right(ext_len).toLower();
250 const QStringList matchingMimeTypes =
m_fastPatterns.value(simpleExtension);
251 const QString simplePattern =
"*."_L1 + simpleExtension;
252 for (
const QString &mime : matchingMimeTypes) {
253 if (filterFunc(mime))
254 result.addMatch(mime, 50, simplePattern, simpleExtension.size());