Qt 6.x
The Qt SDK
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
5#ifndef QMIMEPROVIDER_P_H
6#define QMIMEPROVIDER_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "qmimedatabase_p.h"
20
22
23#include "qmimeglobpattern_p.h"
24#include <QtCore/qdatetime.h>
25#include <QtCore/qset.h>
26#include <QtCore/qmap.h>
27
29
31
33{
34 Q_DISABLE_COPY(QMimeProviderBase)
35
36public:
38 virtual ~QMimeProviderBase() {}
39
40 virtual bool isValid() = 0;
41 virtual bool isInternalDatabase() const = 0;
44 virtual void addParents(const QString &mime, QStringList &result) = 0;
45 virtual QString resolveAlias(const QString &name) = 0;
46 virtual void addAliases(const QString &name, QStringList &result) = 0;
47 virtual void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) = 0;
49 virtual bool loadMimeTypePrivate(QMimeTypePrivate &) { return false; }
50 virtual void loadIcon(QMimeTypePrivate &) {}
52 virtual void ensureLoaded() {}
53 virtual void excludeMimeTypeGlobs(const QStringList &) {}
54
55 QString directory() const { return m_directory; }
56
59
60 /*
61 MimeTypes with "glob-deleteall" tags are handled differently by each provider
62 sub-class:
63 - QMimeBinaryProvider parses glob-deleteall tags lazily, i.e. only when loadMimeTypePrivate()
64 is called, and clears the glob patterns associated with mimetypes that have this tag
65 - QMimeXMLProvider parses glob-deleteall from the the start, i.e. when a XML file is
66 parsed with QMimeTypeParser
67
68 The two lists below are used to let both provider types (XML and Binary) communicate
69 about mimetypes with glob-deleteall.
70 */
71 /*
72 List of mimetypes in _this_ Provider that have a "glob-deleteall" tag,
73 glob patterns for those mimetypes should be ignored in all _other_ lower
74 precedence Providers.
75 */
77
78 /*
79 List of mimetypes with glob patterns that are "overwritten" in _this_ Provider,
80 by a "glob-deleteall" tag in a mimetype definition in a _higher precedence_
81 Provider. With QMimeBinaryProvider, we can't change the data in the binary mmap'ed
82 file, hence the need for this list.
83 */
85};
86
87/*
88 Parses the files 'mime.cache' and 'types' on demand
89 */
91{
92public:
95
96 bool isValid() override;
97 bool isInternalDatabase() const override;
98 QMimeType mimeTypeForName(const QString &name) override;
100 void addParents(const QString &mime, QStringList &result) override;
101 QString resolveAlias(const QString &name) override;
102 void addAliases(const QString &name, QStringList &result) override;
103 void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override;
105 bool loadMimeTypePrivate(QMimeTypePrivate &) override;
106 void loadIcon(QMimeTypePrivate &) override;
107 void loadGenericIcon(QMimeTypePrivate &) override;
108 void ensureLoaded() override;
109 void excludeMimeTypeGlobs(const QStringList &toExclude) override;
110
111private:
112 struct CacheFile;
113
114 void matchGlobList(QMimeGlobMatchResult &result, CacheFile *cacheFile, int offset, const QString &fileName);
115 bool matchSuffixTree(QMimeGlobMatchResult &result, CacheFile *cacheFile, int numEntries,
116 int firstOffset, const QString &fileName, qsizetype charPos,
117 bool caseSensitiveCheck);
118 bool matchMagicRule(CacheFile *cacheFile, int numMatchlets, int firstOffset, const QByteArray &data);
119 bool isMimeTypeGlobsExcluded(const char *name);
120 QLatin1StringView iconForMime(CacheFile *cacheFile, int posListOffset, const QByteArray &inputMime);
121 void loadMimeTypeList();
122 bool checkCacheChanged();
123
124 std::unique_ptr<CacheFile> m_cacheFile;
125 QStringList m_cacheFileNames;
126 QSet<QString> m_mimetypeNames;
127 bool m_mimetypeListLoaded;
128 struct MimeTypeExtra
129 {
130 // Both retrieved on demand in loadMimeTypePrivate
131 QHash<QString, QString> localeComments;
132 QStringList globPatterns;
133 };
134 QMap<QString, MimeTypeExtra> m_mimetypeExtra;
135};
136
137/*
138 Parses the raw XML files (slower)
139 */
141{
142public:
144#if QT_CONFIG(mimetype_database)
145 enum : bool { InternalDatabaseAvailable = true };
146#else
147 enum : bool { InternalDatabaseAvailable = false };
148#endif
152
153 bool isValid() override;
154 bool isInternalDatabase() const override;
155 QMimeType mimeTypeForName(const QString &name) override;
157 void addParents(const QString &mime, QStringList &result) override;
158 QString resolveAlias(const QString &name) override;
159 void addAliases(const QString &name, QStringList &result) override;
160 void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override;
162 void ensureLoaded() override;
163
165
166 // Called by the mimetype xml parser
167 void addMimeType(const QMimeType &mt);
168 void excludeMimeTypeGlobs(const QStringList &toExclude) override;
169 void addGlobPattern(const QMimeGlobPattern &glob);
170 void addParent(const QString &child, const QString &parent);
171 void addAlias(const QString &alias, const QString &name);
173
174private:
175 void load(const QString &fileName);
176 void load(const char *data, qsizetype len);
177
178 typedef QHash<QString, QMimeType> NameMimeTypeMap;
179 NameMimeTypeMap m_nameMimeTypeMap;
180
181 typedef QHash<QString, QString> AliasHash;
182 AliasHash m_aliases;
183
184 typedef QHash<QString, QStringList> ParentsHash;
185 ParentsHash m_parents;
186 QMimeAllGlobPatterns m_mimeTypeGlobs;
187
188 QList<QMimeMagicRuleMatcher> m_magicMatchers;
189 QStringList m_allFiles;
190};
191
193
194#endif // QMIMEPROVIDER_P_H
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qhash.h:818
Definition qlist.h:74
Definition qmap.h:186
Result of the globs parsing, as data structures ready for efficient MIME type matching.
void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result) override
QString resolveAlias(const QString &name) override
void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override
void ensureLoaded() override
bool isValid() override
void loadIcon(QMimeTypePrivate &) 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
void loadGenericIcon(QMimeTypePrivate &) override
void excludeMimeTypeGlobs(const QStringList &toExclude) override
QMimeType mimeTypeForName(const QString &name) override
bool isInternalDatabase() const override
bool loadMimeTypePrivate(QMimeTypePrivate &) override
The QMimeGlobPattern class contains the glob pattern for file names for MIME type matching.
The QMimeMagicRuleMatcher class checks a number of rules based on operator "or".
virtual void addAliases(const QString &name, QStringList &result)=0
virtual void ensureLoaded()
virtual void addFileNameMatches(const QString &fileName, QMimeGlobMatchResult &result)=0
virtual bool isValid()=0
virtual void addParents(const QString &mime, QStringList &result)=0
virtual bool isInternalDatabase() const =0
virtual void loadIcon(QMimeTypePrivate &)
virtual bool loadMimeTypePrivate(QMimeTypePrivate &)
QStringList m_mimeTypesWithExcludedGlobs
virtual void excludeMimeTypeGlobs(const QStringList &)
QMimeDatabasePrivate * m_db
virtual void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate)=0
virtual QMimeType mimeTypeForName(const QString &name)=0
QString directory() const
virtual void addAllMimeTypes(QList< QMimeType > &result)=0
QStringList m_mimeTypesWithDeletedGlobs
virtual ~QMimeProviderBase()
virtual void loadGenericIcon(QMimeTypePrivate &)
virtual QString resolveAlias(const QString &name)=0
\inmodule QtCore
Definition qmimetype.h:25
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)
void excludeMimeTypeGlobs(const QStringList &toExclude) override
bool load(const QString &fileName, QString *errorMessage)
void findByMagic(const QByteArray &data, int *accuracyPtr, QMimeType &candidate) override
void ensureLoaded() override
bool isValid() override
bool isInternalDatabase() const override
QString resolveAlias(const QString &name) override
void addParents(const QString &mime, QStringList &result) override
void addAllMimeTypes(QList< QMimeType > &result) override
QMimeType mimeTypeForName(const QString &name) override
void addMagicMatcher(const QMimeMagicRuleMatcher &matcher)
void addMimeType(const QMimeType &mt)
void addParent(const QString &child, const QString &parent)
Definition qset.h:18
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
Combined button and popup list for selecting options.
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLuint name
GLenum GLsizei len
GLuint64EXT * result
[6]
#define QT_REQUIRE_CONFIG(feature)
ptrdiff_t qsizetype
Definition qtypes.h:70
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
Definition qurl.cpp:3503
application x qt windows mime
[2]
QMimeDatabase db
[0]
static const auto matcher
[0]
QLayoutItem * child
[0]
The QMimeGlobMatchResult class accumulates results from glob matching.
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent