From 648840c617f8702bca1cd7162cdb17b5e24ec1d4 Mon Sep 17 00:00:00 2001 From: David Faure Date: Wed, 11 Oct 2017 20:38:57 +0200 Subject: QMimeDatabase: handle removal of a mime directory The previous commit didn't handle correctly the case where an entire mime directory is deleted. The unittest wasn't testing that case, now it is. We need to move providers into a new list, and then delete those left over (i.e. now unused). Change-Id: I04fd8b39b511a2331d706864f695ce5074acf916 Reviewed-by: Thiago Macieira --- src/corelib/mimetypes/qmimedatabase.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src') 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 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 QMimeDatabasePrivate::providers() -- cgit v1.2.3