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 { 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) Q_GLOBAL_STATIC(MimeDatabasePrivate, staticMimeDatabase)
MimeDatabasePrivate *MimeDatabasePrivate::instance() MimeDatabasePrivate *MimeDatabasePrivate::instance()
@@ -584,6 +593,7 @@ QList<MimeType> MimeDatabasePrivate::allMimeTypes()
bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent) bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
{ {
const QString resolvedParent = resolveAlias(parent); const QString resolvedParent = resolveAlias(parent);
DuplicateTracker<QString> seen;
std::stack<QString, QStringList> toCheck; std::stack<QString, QStringList> toCheck;
toCheck.push(mime); toCheck.push(mime);
while (!toCheck.empty()) { while (!toCheck.empty()) {
@@ -592,8 +602,11 @@ bool MimeDatabasePrivate::inherits(const QString &mime, const QString &parent)
const QString mimeName = toCheck.top(); const QString mimeName = toCheck.top();
toCheck.pop(); toCheck.pop();
const auto parentList = parents(mimeName); const auto parentList = parents(mimeName);
for (const QString &par : parentList) for (const QString &par : parentList) {
toCheck.push(resolveAlias(par)); const QString resolvedPar = resolveAlias(par);
if (!seen.hasSeen(resolvedPar))
toCheck.push(resolvedPar);
}
} }
return false; return false;
} }

View File

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