1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4
5#ifndef QMIMETYPEPARSER_P_H
6#define QMIMETYPEPARSER_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
21QT_REQUIRE_CONFIG(mimetype);
22
23#include "qmimeprovider_p.h"
24
25QT_BEGIN_NAMESPACE
26
27class QIODevice;
28
29class QMimeTypeParserBase
30{
31 Q_DISABLE_COPY_MOVE(QMimeTypeParserBase)
32
33public:
34 QMimeTypeParserBase() {}
35 virtual ~QMimeTypeParserBase() {}
36
37 bool parse(QIODevice *dev, const QString &fileName, QString *errorMessage);
38
39 static bool parseNumber(QStringView n, int *target, QString *errorMessage);
40
41protected:
42 virtual bool process(const QMimeType &t, QString *errorMessage) = 0;
43 virtual bool process(const QMimeGlobPattern &t, QString *errorMessage) = 0;
44 virtual void processParent(const QString &child, const QString &parent) = 0;
45 virtual void processAlias(const QString &alias, const QString &name) = 0;
46 virtual void processMagicMatcher(const QMimeMagicRuleMatcher &matcher) = 0;
47
48private:
49 enum ParseState {
50 ParseBeginning,
51 ParseMimeInfo,
52 ParseMimeType,
53 ParseComment,
54 ParseGenericIcon,
55 ParseIcon,
56 ParseGlobPattern,
57 ParseGlobDeleteAll,
58 ParseSubClass,
59 ParseAlias,
60 ParseMagic,
61 ParseMagicMatchRule,
62 ParseOtherMimeTypeSubTag,
63 ParseError
64 };
65
66 static ParseState nextState(ParseState currentState, QStringView startElement);
67};
68
69
70class QMimeTypeParser : public QMimeTypeParserBase
71{
72public:
73 explicit QMimeTypeParser(QMimeXMLProvider &provider) : m_provider(provider) {}
74
75protected:
76 inline bool process(const QMimeType &t, QString *) override
77 { m_provider.addMimeType(mt: t); return true; }
78
79 inline bool process(const QMimeGlobPattern &glob, QString *) override
80 { m_provider.addGlobPattern(glob); return true; }
81
82 inline void processParent(const QString &child, const QString &parent) override
83 { m_provider.addParent(child, parent); }
84
85 inline void processAlias(const QString &alias, const QString &name) override
86 { m_provider.addAlias(alias, name); }
87
88 inline void processMagicMatcher(const QMimeMagicRuleMatcher &matcher) override
89 { m_provider.addMagicMatcher(matcher); }
90
91private:
92 QMimeXMLProvider &m_provider;
93};
94
95QT_END_NAMESPACE
96
97#endif // MIMETYPEPARSER_P_H
98

source code of qtbase/src/corelib/mimetypes/qmimetypeparser_p.h