From e7ef1ad0ba526dd2fc47602e4d45d62adbdbe5db Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 28 Jun 2019 22:46:20 -0700 Subject: [PATCH] Re-fix QtCore resource path changing and prepare for Qt 5.13 Commit 9cf8ab3b3d44ac50a1f8d4893d8f70b8aedb18b0 added the #ifdef, but that of course only works if you don't upgrade Qt compared to what Qt Creator was compiled with. Instead, attempt both paths and only do that if the system copy is not found. Searching the system copy is required to address Qt 5.13's configure option -no-mimetype-database (used by Linux distributions because the system copy is always present). This code will still need work to deal with Qt 5.14 changes. Task-number: QTCREATORBUG-19600 Task-number: QTCREATORBUG-22636 Change-Id: I6aed4df6a12e43c3ac8efffd15ac952a6e9d4770 --- diff --git a/src/libs/utils/mimetypes/mimeprovider.cpp b/src/libs/utils/mimetypes/mimeprovider.cpp index d444aa8..ce94215 100644 --- a/src/libs/utils/mimetypes/mimeprovider.cpp +++ b/src/libs/utils/mimetypes/mimeprovider.cpp @@ -784,32 +784,25 @@ { if (!m_loaded /*|| shouldCheck()*/) { m_loaded = true; -// bool fdoXmlFound = false; - QStringList allFiles; + QStringList allFiles = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, + QStringLiteral("mime/packages/freedesktop.org.xml"), + QStandardPaths::LocateFile); -// const QStringList packageDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/packages"), QStandardPaths::LocateDirectory); -// //qDebug() << "packageDirs=" << packageDirs; -// for (const QString &packageDir : packageDirs) { -// QDir dir(packageDir); -// const QStringList files = dir.entryList(QDir::Files | QDir::NoDotAndDotDot); -// //qDebug() << static_cast(this) << packageDir << files; -// if (!fdoXmlFound) -// fdoXmlFound = files.contains(QLatin1String("freedesktop.org.xml")); -// QStringList::const_iterator endIt(files.constEnd()); -// for (QStringList::const_iterator it(files.constBegin()); it != endIt; ++it) { -// allFiles.append(packageDir + QLatin1Char('/') + *it); -// } -// } - -// if (!fdoXmlFound) { -// // We could instead install the file as part of installing Qt? -#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) - const char freedesktopOrgXml[] = ":/qt-project.org/qmime/packages/freedesktop.org.xml"; -#else - const char freedesktopOrgXml[] = ":/qt-project.org/qmime/freedesktop.org.xml"; -#endif - allFiles.prepend(QLatin1String(freedesktopOrgXml)); -// } + if (allFiles.isEmpty()) { + // System freedsktop.org.xml file not found, try to use the one in QtCore. + // This is private API and has changed in the past: + // - Qt 5.11 added "package" subdir in 7a5644d6481a3c1a7416772998ca4e60c977bfbd + // - Qt 5.13 added an option to not bundle it at all + const QString fdoXml5_11 = QStringLiteral(":/qt-project.org/qmime/packages/freedesktop.org.xml"); + const QString fdoXmlPre5_11 = QStringLiteral(":/qt-project.org/qmime/freedesktop.org.xml"); + if (QFile::exists(fdoXml5_11)) + allFiles << fdoXml5_11; + else if (QFile::exists(fdoXmlPre5_11)) + allFiles << fdoXmlPre5_11; + else + qFatal("Utils::MimeXMLProvider: could not find the system freedesktop.org.xml file " + "and QtCore does not have an accessible copy."); + } m_nameMimeTypeMap.clear(); m_aliases.clear();