summaryrefslogtreecommitdiffstats
path: root/src/corelib/mimetypes/qmimedatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/mimetypes/qmimedatabase.cpp')
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
index 864e9edc61..f90fd12e3b 100644
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -104,14 +104,15 @@ void QMimeDatabasePrivate::loadProviders()
mimeDirs.prepend(QLatin1String(":/qt-project.org/qmime"));
//qDebug() << "mime dirs:" << mimeDirs;
+ QVector<QMimeProviderBase *> currentProviders = m_providers;
+ m_providers.clear();
m_providers.reserve(mimeDirs.size());
for (const QString &mimeDir : qAsConst(mimeDirs)) {
const QString cacheFile = mimeDir + QStringLiteral("/mime.cache");
QFileInfo fileInfo(cacheFile);
// Check if we already have a provider for this dir
- // [This could be optimized by keeping a copy of mimeDirs and comparing the stringlists]
- const auto it = std::find_if(m_providers.begin(), m_providers.end(), [mimeDir](QMimeProviderBase *prov) { return prov->directory() == mimeDir; });
- if (it == m_providers.end()) {
+ const auto it = std::find_if(currentProviders.begin(), currentProviders.end(), [mimeDir](QMimeProviderBase *prov) { return prov->directory() == mimeDir; });
+ if (it == currentProviders.end()) {
QMimeProviderBase *provider = nullptr;
#if defined(QT_USE_MMAP)
if (qEnvironmentVariableIsEmpty("QT_NO_MIME_CACHE") && fileInfo.exists()) {
@@ -130,15 +131,17 @@ void QMimeDatabasePrivate::loadProviders()
m_providers.append(provider);
} else {
QMimeProviderBase *provider = *it;
+ currentProviders.erase(it);
provider->ensureLoaded();
if (!provider->isValid()) {
delete provider;
provider = new QMimeXMLProvider(this, mimeDir);
//qDebug() << "Created XML provider to replace binary provider for" << mimeDir;
- *it = provider;
}
+ m_providers.append(provider);
}
}
+ qDeleteAll(currentProviders);
}
QVector<QMimeProviderBase *> QMimeDatabasePrivate::providers()