diff --git a/src/libs/utils/mimetypes2/mimedatabase.cpp b/src/libs/utils/mimetypes2/mimedatabase.cpp index 1bfa175468c..d5eb9c36b74 100644 --- a/src/libs/utils/mimetypes2/mimedatabase.cpp +++ b/src/libs/utils/mimetypes2/mimedatabase.cpp @@ -85,10 +85,14 @@ int mime_secondsBetweenChecks = 5; bool MimeDatabasePrivate::shouldCheck() { +#if 0 if (m_lastCheck.isValid() && m_lastCheck.elapsed() < mime_secondsBetweenChecks * 1000) return false; m_lastCheck.start(); return true; +#endif + // Qt Creator forces reload manually + return m_forceLoad; } #if defined(Q_OS_UNIX) && !defined(Q_OS_NACL) && !defined(Q_OS_INTEGRITY) @@ -108,7 +112,23 @@ void MimeDatabasePrivate::loadProviders() Providers currentProviders; std::swap(m_providers, currentProviders); - m_providers.reserve(mimeDirs.size() + (needInternalDB ? 1 : 0)); + m_providers.reserve(m_additionalData.size() + mimeDirs.size() + (needInternalDB ? 1 : 0)); + + // added for Qt Creator: additional mime data + for (auto dataIt = m_additionalData.cbegin(); dataIt != m_additionalData.cend(); ++dataIt) { + // Check if we already have a provider for this data + const QString id = dataIt.key(); + const auto it = std::find_if(currentProviders.begin(), currentProviders.end(), + [id](const std::unique_ptr &prov) { + return prov && prov->directory() == id; + }); + std::unique_ptr provider; + if (it != currentProviders.end()) + provider = std::move(*it); // take provider out of the vector + provider.reset(new MimeXMLProvider(this, id, dataIt.value())); + m_providers.push_back(std::move(provider)); + } + for (const QString &mimeDir : mimeDirs) { const QString cacheFile = mimeDir + QStringLiteral("/mime.cache"); @@ -168,11 +188,14 @@ const MimeDatabasePrivate::Providers &MimeDatabasePrivate::providers() #endif if (m_providers.empty()) { loadProviders(); - m_lastCheck.start(); + // Qt Creator forces reload manually + // m_lastCheck.start(); } else { if (shouldCheck()) loadProviders(); } + // Qt Creator forces reload manually + m_forceLoad = false; return m_providers; } @@ -851,4 +874,14 @@ QList MimeDatabase::allMimeTypes() const \value MatchContent The file content is used to look for a match */ +// added for Qt Creator +void MimeDatabasePrivate::addMimeData(const QString &id, const QByteArray &data) +{ + if (m_additionalData.contains(id)) + qWarning("Overwriting data in mime database, id '%s'", qPrintable(id)); + + m_additionalData.insert(id, data); + m_forceLoad = true; +} + } // namespace Utils diff --git a/src/libs/utils/mimetypes2/mimedatabase_p.h b/src/libs/utils/mimetypes2/mimedatabase_p.h index 114661a06d7..eb3cae56e57 100644 --- a/src/libs/utils/mimetypes2/mimedatabase_p.h +++ b/src/libs/utils/mimetypes2/mimedatabase_p.h @@ -104,6 +104,9 @@ public: QStringList listAliases(const QString &mimeName); bool mimeInherits(const QString &mime, const QString &parent); + // added for Qt Creator + void addMimeData(const QString &id, const QByteArray &data); + private: using Providers = std::vector>; const Providers &providers(); @@ -113,6 +116,10 @@ private: mutable Providers m_providers; QElapsedTimer m_lastCheck; + // added for Qt Creator + QHash m_additionalData; // id -> data + bool m_forceLoad = true; + public: const QString m_defaultMimeType; QMutex mutex; diff --git a/src/libs/utils/mimetypes2/mimeprovider.cpp b/src/libs/utils/mimetypes2/mimeprovider.cpp index eee202ddc7a..83c8a7a033d 100644 --- a/src/libs/utils/mimetypes2/mimeprovider.cpp +++ b/src/libs/utils/mimetypes2/mimeprovider.cpp @@ -863,4 +863,25 @@ void MimeXMLProvider::addMagicMatcher(const MimeMagicRuleMatcher &matcher) m_magicMatchers.append(matcher); } +// added for Qt Creator +MimeXMLProvider::MimeXMLProvider(MimeDatabasePrivate *db, + const QString &directory, + const QByteArray &data) + : MimeProviderBase(db, directory) +{ + QString errorMessage; + MimeTypeParser parser(*this); + QByteArray bufferData(data); + QBuffer buffer(&bufferData); + if (!buffer.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning("MimeDatabase: Error creating buffer for data with ID %ls.", + qUtf16Printable(directory)); + } + if (!parser.parse(&buffer, directory, &errorMessage)) { + qWarning("MimeDatabase: Error loading data for ID %ls\n%ls", + qUtf16Printable(directory), + qUtf16Printable(errorMessage)); + } +} + } // namespace Utils diff --git a/src/libs/utils/mimetypes2/mimeprovider_p.h b/src/libs/utils/mimetypes2/mimeprovider_p.h index ca65e9dcfdb..d298705cf02 100644 --- a/src/libs/utils/mimetypes2/mimeprovider_p.h +++ b/src/libs/utils/mimetypes2/mimeprovider_p.h @@ -146,6 +146,8 @@ public: #endif MimeXMLProvider(MimeDatabasePrivate *db, InternalDatabaseEnum); MimeXMLProvider(MimeDatabasePrivate *db, const QString &directory); + // added for Qt Creator + MimeXMLProvider(MimeDatabasePrivate *db, const QString &directory, const QByteArray &data); ~MimeXMLProvider(); bool isValid() override; diff --git a/src/libs/utils/mimetypes2/mimeutils.cpp b/src/libs/utils/mimetypes2/mimeutils.cpp index 0340366b440..2466a09b8b5 100644 --- a/src/libs/utils/mimetypes2/mimeutils.cpp +++ b/src/libs/utils/mimetypes2/mimeutils.cpp @@ -104,17 +104,17 @@ void setMimeStartupPhase(MimeStartupPhase phase) d->m_startupPhase = int(phase); } -void addMimeTypes(const QString &fileName, const QByteArray &data) +void addMimeTypes(const QString &id, const QByteArray &data) { - // auto d = MimeDatabasePrivate::instance(); - // QMutexLocker locker(&d->mutex); + auto d = MimeDatabasePrivate::instance(); + QMutexLocker locker(&d->mutex); - // if (d->m_startupPhase >= MimeDatabase::PluginsDelayedInitializing) - // qWarning("Adding items from %s to MimeDatabase after initialization time", - // qPrintable(fileName)); + if (d->m_startupPhase >= int(MimeStartupPhase::PluginsDelayedInitializing)) { + qWarning("Adding items for ID \"%s\" to MimeDatabase after initialization time", + qPrintable(id)); + } - // auto xmlProvider = static_cast(d->provider()); - // xmlProvider->addData(fileName, data); + d->addMimeData(id, data); } QMap> magicRulesForMimeType(const MimeType &mimeType)