Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qmimeprovider_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:significant reason:default
5
6#ifndef QMIMEPROVIDER_P_H
7#define QMIMEPROVIDER_P_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
21
23
25#include <QtCore/qdatetime.h>
26#include <QtCore/qset.h>
27
28#include <map>
29
30QT_BEGIN_NAMESPACE
31
32class QMimeMagicRuleMatcher;
35
37{
38 bool isValid() const { return !candidate.isEmpty(); }
39
41 int accuracy = 0;
42};
43
45{
47
48public:
50 virtual ~QMimeProviderBase() = default;
51
52 virtual bool isValid() = 0;
53 virtual bool isInternalDatabase() const = 0;
54 virtual bool knowsMimeType(const QString &name) = 0;
55 virtual void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) = 0;
56 virtual void addParents(const QString &mime, QStringList &result) = 0;
57 virtual QString resolveAlias(const QString &name) = 0;
58 virtual void addAliases(const QString &name, QStringList &result) = 0;
59 virtual void findByMagic(const QByteArray &data, QMimeMagicResult &result) = 0;
60 virtual void addAllMimeTypes(QList<QMimeType> &result) = 0;
61 virtual QMimeTypePrivate::LocaleHash localeComments(const QString &name) = 0;
62 virtual bool hasGlobDeleteAll(const QString &name) = 0;
63 virtual QStringList globPatterns(const QString &name) = 0;
64 virtual QString icon(const QString &name) = 0;
65 virtual QString genericIcon(const QString &name) = 0;
66 virtual void ensureLoaded() { }
67
68 QString directory() const { return m_directory; }
69
72 bool isMimeTypeGlobsExcluded(const QString &name) const;
73
76 QMimeProviderBase *m_overrideProvider = nullptr; // more "local" than this one
77};
78
79/*
80 Parses the files 'mime.cache' and 'types' on demand
81 */
82class QMimeBinaryProvider final : public QMimeProviderBase
83{
84public:
85 QMimeBinaryProvider(QMimeDatabasePrivate *db, const QString &directory);
87
88 bool isValid() override;
89 bool isInternalDatabase() const override;
90 bool knowsMimeType(const QString &name) override;
91 void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override;
92 void addParents(const QString &mime, QStringList &result) override;
93 QString resolveAlias(const QString &name) override;
94 void addAliases(const QString &name, QStringList &result) override;
95 void findByMagic(const QByteArray &data, QMimeMagicResult &result) override;
96 void addAllMimeTypes(QList<QMimeType> &result) override;
97 QMimeTypePrivate::LocaleHash localeComments(const QString &name) override;
98 bool hasGlobDeleteAll(const QString &name) override;
99 QStringList globPatterns(const QString &name) override;
100 QString icon(const QString &name) override;
101 QString genericIcon(const QString &name) override;
102 void ensureLoaded() override;
103
104private:
105 struct CacheFile;
106 class RecordList;
107
108 quint32 matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile,
109 const RecordList &globs, const QString &fileName);
110 bool matchSuffixTree(QMimeGlobMatchResult &result, CacheFile *cacheFile, quint32 numEntries,
111 quint64 firstOffset, const QString &fileName, qsizetype charPos,
112 bool caseSensitiveCheck);
113 bool matchMagicRule(CacheFile *cacheFile, quint32 numMatchlets, quint64 firstOffset,
114 const QByteArray &data);
115 QLatin1StringView iconForMime(CacheFile *cacheFile, const RecordList &icons,
116 QStringView inputMime);
117 void loadMimeTypeList();
118 bool checkCacheChanged();
119
120 std::unique_ptr<CacheFile> m_cacheFile;
121 QStringList m_cacheFileNames;
122 QSet<QString> m_mimetypeNames;
123 bool m_mimetypeListLoaded;
124 struct MimeTypeExtra
125 {
126 QHash<QString, QString> localeComments;
127 QStringList globPatterns;
128 bool hasGlobDeleteAll = false;
129 };
130 using MimeTypeExtraMap = std::map<QString, MimeTypeExtra>;
131 MimeTypeExtraMap m_mimetypeExtra;
132
133 MimeTypeExtraMap::const_iterator loadMimeTypeExtra(const QString &mimeName);
134};
135
136/*
137 Parses the raw XML files (slower)
138 */
139class QMimeXMLProvider final : public QMimeProviderBase
140{
141public:
143#if QT_CONFIG(mimetype_database)
144 enum : bool { InternalDatabaseAvailable = true };
145#else
146 enum : bool { InternalDatabaseAvailable = false };
147#endif
149 QMimeXMLProvider(QMimeDatabasePrivate *db, const QString &directory);
151
152 bool isValid() override;
153 bool isInternalDatabase() const override;
154 bool knowsMimeType(const QString &name) override;
155 void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override;
156 void addParents(const QString &mime, QStringList &result) override;
157 QString resolveAlias(const QString &name) override;
158 void addAliases(const QString &name, QStringList &result) override;
159 void findByMagic(const QByteArray &data, QMimeMagicResult &result) override;
160 void addAllMimeTypes(QList<QMimeType> &result) override;
161 void ensureLoaded() override;
162 QMimeTypePrivate::LocaleHash localeComments(const QString &name) override;
163 bool hasGlobDeleteAll(const QString &name) override;
164 QStringList globPatterns(const QString &name) override;
165 QString icon(const QString &name) override;
166 QString genericIcon(const QString &name) override;
167
168 bool load(const QString &fileName, QString *errorMessage);
169
170 // Called by the mimetype xml parser
171 void addMimeType(const QMimeTypeXMLData &mt);
172 void addGlobPattern(const QMimeGlobPattern &glob);
173 void addParent(const QString &child, const QString &parent);
174 void addAlias(const QString &alias, const QString &name);
175 void addMagicMatcher(const QMimeMagicRuleMatcher &matcher);
176
177private:
178 void load(const QString &fileName);
179 void load(const char *data, qsizetype len);
180
181 typedef QHash<QString, QMimeTypeXMLData> NameMimeTypeMap;
182 NameMimeTypeMap m_nameMimeTypeMap;
183
184 typedef QHash<QString, QString> AliasHash;
185 AliasHash m_aliases;
186
187 typedef QHash<QString, QStringList> ParentsHash;
188 ParentsHash m_parents;
189 QMimeAllGlobPatterns m_mimeTypeGlobs;
190
191 QList<QMimeMagicRuleMatcher> m_magicMatchers;
192 QStringList m_allFiles;
193};
194
195QT_END_NAMESPACE
196
197#endif // QMIMEPROVIDER_P_H
Result of the globs parsing, as data structures ready for efficient MIME type matching.
void addGlob(const QMimeGlobPattern &glob)
void matchingGlobs(const QString &fileName, QMimeGlobMatchResult &result, const AddMatchFilterFunc &filterFunc) const
void removeMimeType(const QString &mimeType)
QHash< QString, QStringList > PatternsMap
QMimeGlobPatternList m_highWeightGlobs
QMimeGlobPatternList m_lowWeightGlobs
void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override
QString resolveAlias(const QString &name) override
void findByMagic(const QByteArray &data, QMimeMagicResult &result) override
bool knowsMimeType(const QString &name) override
QString icon(const QString &name) override
bool hasGlobDeleteAll(const QString &name) override
void ensureLoaded() override
bool isValid() override
void addAliases(const QString &name, QStringList &result) override
virtual ~QMimeBinaryProvider()
void addAllMimeTypes(QList< QMimeType > &result) override
void addParents(const QString &mime, QStringList &result) override
QMimeBinaryProvider(QMimeDatabasePrivate *db, const QString &directory)
QStringList globPatterns(const QString &name) override
QString genericIcon(const QString &name) override
bool isInternalDatabase() const override
QMimeTypePrivate::LocaleHash localeComments(const QString &name) override
QString resolveAlias(const QString &nameOrAlias)
QStringList listAliases(const QString &mimeName)
QList< QMimeType > allMimeTypes()
QString genericIcon(const QString &name)
QMimeTypePrivate::LocaleHash localeComments(const QString &name)
bool mimeInherits(const QString &mime, const QString &parent)
QMimeType mimeTypeForFileExtension(const QString &fileName)
QMimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device)
QMimeType mimeTypeForData(QIODevice *device)
QStringList mimeTypeForFileName(const QString &fileName)
bool inherits(const QString &mime, const QString &parent)
QMimeType mimeTypeForName(const QString &nameOrAlias)
QStringList mimeParents(const QString &mimeName)
QStringList globPatterns(const QString &name)
const QString & defaultMimeType() const
QString icon(const QString &name)
static QMimeDatabasePrivate * instance()
QMimeType mimeTypeForFile(const QString &fileName, const QFileInfo &fileInfo, QMimeDatabase::MatchMode mode)
QStringList parents(const QString &mimeName)
QMimeGlobMatchResult findByFileName(const QString &fileName)
QMimeType findByData(const QByteArray &data, int *priorityPtr)
\inmodule QtCore
QMimeType mimeTypeForName(const QString &nameOrAlias) const
Returns a MIME type for nameOrAlias or an invalid one if none found.
QMimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device) const
Returns a MIME type for the given fileName and device data.
QMimeType mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mode=MatchDefault) const
Returns a MIME type for fileInfo.
QList< QMimeType > mimeTypesForFileName(const QString &fileName) const
Returns the MIME types for the file name fileName.
QMimeType mimeTypeForUrl(const QUrl &url) const
Returns a MIME type for url.
QMimeType mimeTypeForData(const QByteArray &data) const
Returns a MIME type for data.
QString suffixForFileName(const QString &fileName) const
Returns the suffix for the file fileName, as known by the MIME database.
MatchMode
This enum specifies how matching a file to a MIME type is performed.
QList< QMimeType > allMimeTypes() const
Returns the list of all available MIME types.
QMimeType mimeTypeForFileNameAndData(const QString &fileName, const QByteArray &data) const
Returns a MIME type for the given fileName and device data.
QMimeType mimeTypeForData(QIODevice *device) const
Returns a MIME type for the data in device.
QMimeType mimeTypeForFile(const QString &fileName, MatchMode mode=MatchDefault) const
Returns a MIME type for the file named fileName using mode.
bool hasPattern(QStringView mimeType, QStringView pattern) const
void removeMimeType(QStringView mimeType)
"noglobs" is very rare occurrence, so it's ok if it's slow
void match(QMimeGlobMatchResult &result, const QString &fileName, const AddMatchFilterFunc &filterFunc) const
The QMimeGlobPattern class contains the glob pattern for file names for MIME type matching.
unsigned weight() const
static const unsigned MinWeight
QMimeGlobPattern(const QString &thePattern, const QString &theMimeType, unsigned theWeight=DefaultWeight, Qt::CaseSensitivity s=Qt::CaseInsensitive)
static const unsigned DefaultWeight
void swap(QMimeGlobPattern &other) noexcept
const QString & mimeType() const
static const unsigned MaxWeight
const QString & pattern() const
bool matchFileName(const QString &fileName) const
bool isCaseSensitive() const
bool isMimeTypeGlobsExcluded(const QString &name) const
QMimeProviderBase * m_overrideProvider
virtual void addAliases(const QString &name, QStringList &result)=0
virtual bool hasGlobDeleteAll(const QString &name)=0
virtual ~QMimeProviderBase()=default
virtual void ensureLoaded()
virtual QString icon(const QString &name)=0
QMimeProviderBase * overrideProvider() const
virtual void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result)=0
virtual bool isValid()=0
virtual void findByMagic(const QByteArray &data, QMimeMagicResult &result)=0
virtual void addParents(const QString &mime, QStringList &result)=0
virtual bool isInternalDatabase() const =0
virtual QString genericIcon(const QString &name)=0
virtual QStringList globPatterns(const QString &name)=0
void setOverrideProvider(QMimeProviderBase *provider)
virtual bool knowsMimeType(const QString &name)=0
QMimeDatabasePrivate * m_db
QString directory() const
virtual void addAllMimeTypes(QList< QMimeType > &result)=0
virtual QMimeTypePrivate::LocaleHash localeComments(const QString &name)=0
virtual QString resolveAlias(const QString &name)=0
\inmodule QtCore
Definition qmimetype.h:26
void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override
void addGlobPattern(const QMimeGlobPattern &glob)
void addAliases(const QString &name, QStringList &result) override
void addAlias(const QString &alias, const QString &name)
QMimeTypePrivate::LocaleHash localeComments(const QString &name) override
QStringList globPatterns(const QString &name) override
bool load(const QString &fileName, QString *errorMessage)
QMimeXMLProvider(QMimeDatabasePrivate *db, const QString &directory)
void ensureLoaded() override
bool knowsMimeType(const QString &name) override
bool isValid() override
bool isInternalDatabase() const override
QString resolveAlias(const QString &name) override
void addMimeType(const QMimeTypeXMLData &mt)
void findByMagic(const QByteArray &data, QMimeMagicResult &result) override
QString icon(const QString &name) override
void addParents(const QString &mime, QStringList &result) override
void addAllMimeTypes(QList< QMimeType > &result) override
QMimeXMLProvider(QMimeDatabasePrivate *db, InternalDatabaseEnum)
void addMagicMatcher(const QMimeMagicRuleMatcher &matcher)
bool hasGlobDeleteAll(const QString &name) override
void addParent(const QString &child, const QString &parent)
QString genericIcon(const QString &name) override
QT_REQUIRE_CONFIG(animation)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
Definition qdir.cpp:2620
static bool isTextFile(const QByteArray &data)
static Q_CONSTINIT const int qmime_secondsBetweenChecks
static QStringList locateMimeDirectories()
static QString directoryMimeType()
static QString plainTextMimeType()
QT_REQUIRE_CONFIG(mimetype)
bool isValid() const