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 qsizetype patternLength = m_pattern.size();
113 const qsizetype fileNameLength = fileName.size();
115 switch (m_patternType) {
116 case SuffixPattern: {
117 if (fileNameLength + 1 < patternLength)
120 return fileName.endsWith(QStringView(m_pattern).mid(1), m_caseSensitivity);
122 case PrefixPattern: {
123 if (fileNameLength + 1 < patternLength)
126 return fileName.startsWith(QStringView(m_pattern).chopped(1), m_caseSensitivity);
129 return m_pattern.compare(fileName, m_caseSensitivity) == 0;
131 return fileNameLength == 7
132 && fileName.at(0).isDigit() && fileName.at(1).isDigit() && fileName.at(2).isDigit()
133 && QStringView{fileName}.mid(3, 4).compare(
".vdr"_L1, m_caseSensitivity) == 0;
135 if (fileNameLength < 6)
137 QChar lastChar = fileName.at(fileNameLength - 1);
138 if (m_caseSensitivity == Qt::CaseInsensitive)
139 lastChar = lastChar.toLower();
140 const bool lastCharOK = (lastChar.isDigit() && lastChar != u'0')
142 return lastCharOK && QStringView{fileName}.mid(fileNameLength - 6, 5).compare(
".anim"_L1, m_caseSensitivity) == 0;
146#if QT_CONFIG(regularexpression)
147 auto rx = QRegularExpression::fromWildcard(m_pattern);
148 if (m_caseSensitivity == Qt::CaseInsensitive)
149 rx.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
150 return rx.match(fileName).hasMatch();
183 const QString &pattern = glob.pattern();
184 Q_ASSERT(!pattern.isEmpty());
190 if (glob.weight() == 50 && isFastPattern(pattern) && !glob.isCaseSensitive()) {
192 const QString extension = pattern.mid(2).toLower();
194 if (!patterns.contains(glob.mimeType()))
195 patterns.append(glob.mimeType());
216 const AddMatchFilterFunc &filterFunc)
const
218 for (
const QMimeGlobPattern &glob : *
this) {
219 if (glob.matchFileName(fileName) && filterFunc(glob.mimeType())) {
220 const QString pattern = glob.pattern();
221 const qsizetype suffixLen = isSimplePattern(pattern) ? pattern.size() - strlen(
"*.") : 0;
222 result.addMatch(glob.mimeType(), glob.weight(), pattern, suffixLen);
228 const AddMatchFilterFunc &filterFunc)
const
235 const qsizetype lastDot = fileName.lastIndexOf(u'.');
237 const qsizetype ext_len = fileName.size() - lastDot - 1;
238 const QString simpleExtension = fileName.right(ext_len).toLower();
241 const QStringList matchingMimeTypes =
m_fastPatterns.value(simpleExtension);
242 const QString simplePattern =
"*."_L1 + simpleExtension;
243 for (
const QString &mime : matchingMimeTypes) {
244 if (filterFunc(mime))
245 result.addMatch(mime, 50, simplePattern, simpleExtension.size());