forked from qt-creator/qt-creator
Mimetypes v3: Re-implement adding mime types from plugin data
We get mime data specifications in text from from the plugin meta data. Add mime providers for these. An obvious example is application/vnd.google.android.android_manifest. Disable automatic, time-based update of mime providers, and instead explicitly force reloading them. Change-Id: I07e3399ca76b1913d79b92375f679ca729c594b7 Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
@@ -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<MimeProviderBase> &prov) {
|
||||
return prov && prov->directory() == id;
|
||||
});
|
||||
std::unique_ptr<MimeProviderBase> 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<MimeType> 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
|
||||
|
@@ -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<std::unique_ptr<MimeProviderBase>>;
|
||||
const Providers &providers();
|
||||
@@ -113,6 +116,10 @@ private:
|
||||
mutable Providers m_providers;
|
||||
QElapsedTimer m_lastCheck;
|
||||
|
||||
// added for Qt Creator
|
||||
QHash<QString, QByteArray> m_additionalData; // id -> data
|
||||
bool m_forceLoad = true;
|
||||
|
||||
public:
|
||||
const QString m_defaultMimeType;
|
||||
QMutex mutex;
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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<MimeXMLProvider *>(d->provider());
|
||||
// xmlProvider->addData(fileName, data);
|
||||
d->addMimeData(id, data);
|
||||
}
|
||||
|
||||
QMap<int, QList<MimeMagicRule>> magicRulesForMimeType(const MimeType &mimeType)
|
||||
|
Reference in New Issue
Block a user