diff options
Diffstat (limited to 'src/corelib/mimetypes/qmimeprovider_p.h')
-rw-r--r-- | src/corelib/mimetypes/qmimeprovider_p.h | 77 |
1 files changed, 56 insertions, 21 deletions
diff --git a/src/corelib/mimetypes/qmimeprovider_p.h b/src/corelib/mimetypes/qmimeprovider_p.h index f5cc7bc3c0..3ded01cd46 100644 --- a/src/corelib/mimetypes/qmimeprovider_p.h +++ b/src/corelib/mimetypes/qmimeprovider_p.h @@ -23,36 +23,56 @@ QT_REQUIRE_CONFIG(mimetype); #include "qmimeglobpattern_p.h" #include <QtCore/qdatetime.h> #include <QtCore/qset.h> -#include <QtCore/qmap.h> + +#include <map> QT_BEGIN_NAMESPACE class QMimeMagicRuleMatcher; +class QMimeTypeXMLData; +class QMimeProviderBase; + +struct QMimeMagicResult +{ + bool isValid() const { return !candidate.isEmpty(); } + + QString candidate; + int accuracy = 0; +}; class QMimeProviderBase { + Q_DISABLE_COPY(QMimeProviderBase) + public: QMimeProviderBase(QMimeDatabasePrivate *db, const QString &directory); virtual ~QMimeProviderBase() {} virtual bool isValid() = 0; virtual bool isInternalDatabase() const = 0; - virtual QMimeType mimeTypeForName(const QString &name) = 0; + virtual bool knowsMimeType(const QString &name) = 0; virtual void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) = 0; virtual void addParents(const QString &mime, QStringList &result) = 0; virtual QString resolveAlias(const QString &name) = 0; virtual void addAliases(const QString &name, QStringList &result) = 0; - virtual void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) = 0; + virtual void findByMagic(const QByteArray &data, QMimeMagicResult &result) = 0; virtual void addAllMimeTypes(QList<QMimeType> &result) = 0; - virtual bool loadMimeTypePrivate(QMimeTypePrivate &) { return false; } - virtual void loadIcon(QMimeTypePrivate &) {} - virtual void loadGenericIcon(QMimeTypePrivate &) {} - virtual void ensureLoaded() {} + virtual QMimeTypePrivate::LocaleHash localeComments(const QString &name) = 0; + virtual bool hasGlobDeleteAll(const QString &name) = 0; + virtual QStringList globPatterns(const QString &name) = 0; + virtual QString icon(const QString &name) = 0; + virtual QString genericIcon(const QString &name) = 0; + virtual void ensureLoaded() { } QString directory() const { return m_directory; } + QMimeProviderBase *overrideProvider() const; + void setOverrideProvider(QMimeProviderBase *provider); + bool isMimeTypeGlobsExcluded(const QString &name) const; + QMimeDatabasePrivate *m_db; QString m_directory; + QMimeProviderBase *m_overrideProvider = nullptr; // more "local" than this one }; /* @@ -66,29 +86,35 @@ public: bool isValid() override; bool isInternalDatabase() const override; - QMimeType mimeTypeForName(const QString &name) override; + bool knowsMimeType(const QString &name) override; void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override; void addParents(const QString &mime, QStringList &result) override; QString resolveAlias(const QString &name) override; void addAliases(const QString &name, QStringList &result) override; - void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override; + void findByMagic(const QByteArray &data, QMimeMagicResult &result) override; void addAllMimeTypes(QList<QMimeType> &result) override; - bool loadMimeTypePrivate(QMimeTypePrivate &) override; - void loadIcon(QMimeTypePrivate &) override; - void loadGenericIcon(QMimeTypePrivate &) override; + QMimeTypePrivate::LocaleHash localeComments(const QString &name) override; + bool hasGlobDeleteAll(const QString &name) override; + QStringList globPatterns(const QString &name) override; + QString icon(const QString &name) override; + QString genericIcon(const QString &name) override; void ensureLoaded() override; private: struct CacheFile; - void matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int offset, const QString &fileName); - bool matchSuffixTree(QMimeGlobMatchResult &result, CacheFile *cacheFile, int numEntries, int firstOffset, const QString &fileName, int charPos, bool caseSensitiveCheck); - bool matchMagicRule(CacheFile *cacheFile, int numMatchlets, int firstOffset, const QByteArray &data); + int matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int offset, + const QString &fileName); + bool matchSuffixTree(QMimeGlobMatchResult &result, CacheFile *cacheFile, int numEntries, + int firstOffset, const QString &fileName, qsizetype charPos, + bool caseSensitiveCheck); + bool matchMagicRule(CacheFile *cacheFile, int numMatchlets, int firstOffset, + const QByteArray &data); QLatin1StringView iconForMime(CacheFile *cacheFile, int posListOffset, const QByteArray &inputMime); void loadMimeTypeList(); bool checkCacheChanged(); - CacheFile *m_cacheFile = nullptr; + std::unique_ptr<CacheFile> m_cacheFile; QStringList m_cacheFileNames; QSet<QString> m_mimetypeNames; bool m_mimetypeListLoaded; @@ -96,8 +122,12 @@ private: { QHash<QString, QString> localeComments; QStringList globPatterns; + bool hasGlobDeleteAll = false; }; - QMap<QString, MimeTypeExtra> m_mimetypeExtra; + using MimeTypeExtraMap = std::map<QString, MimeTypeExtra>; + MimeTypeExtraMap m_mimetypeExtra; + + MimeTypeExtraMap::const_iterator loadMimeTypeExtra(const QString &mimeName); }; /* @@ -118,19 +148,24 @@ public: bool isValid() override; bool isInternalDatabase() const override; - QMimeType mimeTypeForName(const QString &name) override; + bool knowsMimeType(const QString &name) override; void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override; void addParents(const QString &mime, QStringList &result) override; QString resolveAlias(const QString &name) override; void addAliases(const QString &name, QStringList &result) override; - void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override; + void findByMagic(const QByteArray &data, QMimeMagicResult &result) override; void addAllMimeTypes(QList<QMimeType> &result) override; void ensureLoaded() override; + QMimeTypePrivate::LocaleHash localeComments(const QString &name) override; + bool hasGlobDeleteAll(const QString &name) override; + QStringList globPatterns(const QString &name) override; + QString icon(const QString &name) override; + QString genericIcon(const QString &name) override; bool load(const QString &fileName, QString *errorMessage); // Called by the mimetype xml parser - void addMimeType(const QMimeType &mt); + void addMimeType(const QMimeTypeXMLData &mt); void addGlobPattern(const QMimeGlobPattern &glob); void addParent(const QString &child, const QString &parent); void addAlias(const QString &alias, const QString &name); @@ -140,7 +175,7 @@ private: void load(const QString &fileName); void load(const char *data, qsizetype len); - typedef QHash<QString, QMimeType> NameMimeTypeMap; + typedef QHash<QString, QMimeTypeXMLData> NameMimeTypeMap; NameMimeTypeMap m_nameMimeTypeMap; typedef QHash<QString, QString> AliasHash; |