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 {
|
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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user