Update mime database from Qt

qtbase/54656da9ace06caf4a0eeb1832989c0ab211a4a0
  QMimeDatabase: handle buggy type definitions with circular inheritance

Change-Id: I6cee043587ee6a60eb53d072824fcd664a5f8ce0
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
Eike Ziller
2024-08-30 11:36:04 +02:00
parent 828ed1eff5
commit 377198641c
2 changed files with 20 additions and 4 deletions

View File

@@ -39,6 +39,15 @@ static QString plainTextMimeType()
namespace Utils {
// simplified from qduplicatetracker_p.h
template <typename T>
class DuplicateTracker {
public:
bool hasSeen(const T &v) { return Utils::insert(seen, v); }
private:
QSet<T> seen;
};
Q_GLOBAL_STATIC(MimeDatabasePrivate, staticMimeDatabase)
MimeDatabasePrivate *MimeDatabasePrivate::instance()
@@ -584,6 +593,7 @@ QList<MimeType> MimeDatabasePrivate::allMimeTypes()
bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
{
const QString resolvedParent = resolveAlias(parent);
DuplicateTracker<QString> seen;
std::stack<QString, QStringList> toCheck;
toCheck.push(mime);
while (!toCheck.empty()) {
@@ -592,8 +602,11 @@ bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
const QString mimeName = toCheck.top();
toCheck.pop();
const auto parentList = parents(mimeName);
for (const QString &par : parentList)
toCheck.push(resolveAlias(par));
for (const QString &par : parentList) {
const QString resolvedPar = resolveAlias(par);
if (!seen.hasSeen(resolvedPar))
toCheck.push(resolvedPar);
}
}
return false;
}

View File

@@ -338,14 +338,17 @@ QStringList MimeType::parentMimeTypes() const
static void collectParentMimeTypes(const QString &mime, QStringList &allParents)
{
const QStringList parents = MimeDatabasePrivate::instance()->mimeParents(mime);
QStringList newParents;
for (const QString &parent : parents) {
// I would use QSet, but since order matters I better not
if (!allParents.contains(parent))
if (!allParents.contains(parent)) {
allParents.append(parent);
newParents.append(parent);
}
}
// We want a breadth-first search, so that the least-specific parent (octet-stream) is last
// This means iterating twice, unfortunately.
for (const QString &parent : parents)
for (const QString &parent : newParents)
collectParentMimeTypes(parent, allParents);
}