25void QMimeGlobMatchResult::addMatch(
const QString &mimeType,
int weight,
const QString &pattern,
26 qsizetype knownSuffixLength)
28 if (m_allMatchingMimeTypes.contains(mimeType))
31 if (weight < m_weight) {
32 m_allMatchingMimeTypes.append(mimeType);
35 bool replace = weight > m_weight;
38 if (pattern.size() < m_matchingPatternLength)
40 else if (pattern.size() > m_matchingPatternLength) {
46 m_matchingMimeTypes.clear();
48 m_matchingPatternLength = pattern.size();
51 if (!m_matchingMimeTypes.contains(mimeType)) {
52 m_matchingMimeTypes.append(mimeType);
54 m_allMatchingMimeTypes.prepend(mimeType);
56 m_allMatchingMimeTypes.append(mimeType);
57 m_knownSuffixLength = knownSuffixLength;
109 const QString fileName = m_caseSensitivity == Qt::CaseInsensitive
110 ? inputFileName.toLower() : inputFileName;
112 const qsizetype patternLength = m_pattern.size();
115 const qsizetype fileNameLength = fileName.size();
117 switch (m_patternType) {
118 case SuffixPattern: {
119 if (fileNameLength + 1 < patternLength)
122 const QChar *c1 = m_pattern.unicode() + patternLength - 1;
123 const QChar *c2 = fileName.unicode() + fileNameLength - 1;
125 while (cnt < patternLength && *c1-- == *c2--)
127 return cnt == patternLength;
129 case PrefixPattern: {
130 if (fileNameLength + 1 < patternLength)
133 const QChar *c1 = m_pattern.unicode();
134 const QChar *c2 = fileName.unicode();
136 while (cnt < patternLength && *c1++ == *c2++)
138 return cnt == patternLength;
141 return (m_pattern == fileName);
143 return fileNameLength == 7
144 && fileName.at(0).isDigit() && fileName.at(1).isDigit() && fileName.at(2).isDigit()
145 && QStringView{fileName}.mid(3, 4) ==
".vdr"_L1;
147 if (fileNameLength < 6)
149 const QChar lastChar = fileName.at(fileNameLength - 1);
150 const bool lastCharOK = (lastChar.isDigit() && lastChar != u'0')
152 return lastCharOK && QStringView{fileName}.mid(fileNameLength - 6, 5) ==
".anim"_L1;
156#if QT_CONFIG(regularexpression)
157 auto rx = QRegularExpression::fromWildcard(m_pattern);
158 return rx.match(fileName).hasMatch();
191 const QString &pattern = glob.pattern();
192 Q_ASSERT(!pattern.isEmpty());
198 if (glob.weight() == 50 && isFastPattern(pattern) && !glob.isCaseSensitive()) {
200 const QString extension = pattern.mid(2).toLower();
202 if (!patterns.contains(glob.mimeType()))
203 patterns.append(glob.mimeType());
224 const AddMatchFilterFunc &filterFunc)
const
226 for (
const QMimeGlobPattern &glob : *
this) {
227 if (glob.matchFileName(fileName) && filterFunc(glob.mimeType())) {
228 const QString pattern = glob.pattern();
229 const qsizetype suffixLen = isSimplePattern(pattern) ? pattern.size() - strlen(
"*.") : 0;
230 result.addMatch(glob.mimeType(), glob.weight(), pattern, suffixLen);
236 const AddMatchFilterFunc &filterFunc)
const
243 const qsizetype lastDot = fileName.lastIndexOf(u'.');
245 const qsizetype ext_len = fileName.size() - lastDot - 1;
246 const QString simpleExtension = fileName.right(ext_len).toLower();
249 const QStringList matchingMimeTypes =
m_fastPatterns.value(simpleExtension);
250 const QString simplePattern =
"*."_L1 + simpleExtension;
251 for (
const QString &mime : matchingMimeTypes) {
252 if (filterFunc(mime)) {
253 result.addMatch(mime, 50, simplePattern, simpleExtension.size());