forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user