1 | // Copyright (C) 2018 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 | #ifndef QTEXTCODEC_H |
5 | #define QTEXTCODEC_H |
6 | |
7 | #include <QtCore/qlist.h> |
8 | #include <QtCore/qstringconverter.h> |
9 | |
10 | #include <QtCore5Compat/qcore5global.h> |
11 | |
12 | QT_REQUIRE_CONFIG(textcodec); |
13 | |
14 | QT_BEGIN_NAMESPACE |
15 | |
16 | class QTextDecoder; |
17 | class QTextEncoder; |
18 | |
19 | class Q_CORE5COMPAT_EXPORT QTextCodec : public QStringConverterBase |
20 | { |
21 | Q_DISABLE_COPY(QTextCodec) |
22 | public: |
23 | using ConversionFlags = QStringConverterBase::Flags; |
24 | using ConverterState = QStringConverterBase::State; |
25 | |
26 | static constexpr Flag ConvertInvalidToNull = Flag::ConvertInvalidToNull; |
27 | static constexpr Flag DefaultConversion = Flag::WriteBom; |
28 | static constexpr Flag = Flag::ConvertInitialBom; |
29 | |
30 | static QTextCodec* codecForName(const QByteArray &name); |
31 | static QTextCodec* codecForName(const char *name) { return codecForName(name: QByteArray(name)); } |
32 | static QTextCodec* codecForMib(int mib); |
33 | |
34 | static QList<QByteArray> availableCodecs(); |
35 | static QList<int> availableMibs(); |
36 | |
37 | static QTextCodec* codecForLocale(); |
38 | static void setCodecForLocale(QTextCodec *c); |
39 | |
40 | static QTextCodec *codecForTr() { return codecForMib(mib: 106); /* Utf8 */ } |
41 | |
42 | static QTextCodec *codecForHtml(const QByteArray &ba); |
43 | static QTextCodec *codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec); |
44 | |
45 | static QTextCodec *codecForUtfText(const QByteArray &ba); |
46 | static QTextCodec *codecForUtfText(const QByteArray &ba, QTextCodec *defaultCodec); |
47 | |
48 | bool canEncode(QChar) const; |
49 | bool canEncode(const QString&) const; |
50 | bool canEncode(QStringView) const; |
51 | |
52 | QString toUnicode(const QByteArray&) const; |
53 | QString toUnicode(const char* chars) const; |
54 | QByteArray fromUnicode(const QString& uc) const; |
55 | QByteArray fromUnicode(QStringView uc) const; |
56 | |
57 | QString toUnicode(const char *in, int length, ConverterState *state = nullptr) const |
58 | { |
59 | if (in == nullptr) |
60 | return {}; |
61 | if (length <= 0) |
62 | return QLatin1String("" ); |
63 | return convertToUnicode(in, length, state); |
64 | } |
65 | QByteArray fromUnicode(const QChar *in, int length, ConverterState *state = nullptr) const |
66 | { |
67 | if (in == nullptr) |
68 | return {}; |
69 | if (length <= 0) |
70 | return QByteArray("" ); |
71 | return convertFromUnicode(in, length, state); |
72 | } |
73 | |
74 | QTextDecoder* makeDecoder(ConversionFlags flags = DefaultConversion) const; |
75 | QTextEncoder* makeEncoder(ConversionFlags flags = DefaultConversion) const; |
76 | |
77 | virtual QByteArray name() const = 0; |
78 | virtual QList<QByteArray> aliases() const; |
79 | virtual int mibEnum() const = 0; |
80 | |
81 | protected: |
82 | virtual QString convertToUnicode(const char *in, int length, ConverterState *state) const = 0; |
83 | virtual QByteArray convertFromUnicode(const QChar *in, int length, ConverterState *state) const = 0; |
84 | |
85 | QTextCodec(); |
86 | virtual ~QTextCodec(); |
87 | |
88 | private: |
89 | friend struct QTextCodecData; |
90 | }; |
91 | |
92 | class Q_CORE5COMPAT_EXPORT QTextEncoder |
93 | { |
94 | Q_DISABLE_COPY(QTextEncoder) |
95 | public: |
96 | explicit QTextEncoder(const QTextCodec *codec) |
97 | : c(codec), state(QTextCodec::DefaultConversion) {} |
98 | explicit QTextEncoder(const QTextCodec *codec, QTextCodec::ConversionFlags flags); |
99 | ~QTextEncoder(); |
100 | QByteArray fromUnicode(const QString& str); |
101 | QByteArray fromUnicode(QStringView str); |
102 | QByteArray fromUnicode(const QChar *uc, int len); |
103 | bool hasFailure() const; |
104 | private: |
105 | const QTextCodec *c = nullptr; |
106 | QTextCodec::ConverterState state; |
107 | }; |
108 | |
109 | class Q_CORE5COMPAT_EXPORT QTextDecoder |
110 | { |
111 | Q_DISABLE_COPY(QTextDecoder) |
112 | public: |
113 | explicit QTextDecoder(const QTextCodec *codec) |
114 | : c(codec), state(QTextCodec::DefaultConversion) {} |
115 | explicit QTextDecoder(const QTextCodec *codec, QTextCodec::ConversionFlags flags); |
116 | ~QTextDecoder(); |
117 | QString toUnicode(const char* chars, int len); |
118 | QString toUnicode(const QByteArray &ba); |
119 | void toUnicode(QString *target, const char *chars, int len); |
120 | bool hasFailure() const; |
121 | bool needsMoreData() const; |
122 | private: |
123 | const QTextCodec *c = nullptr; |
124 | QTextCodec::ConverterState state; |
125 | }; |
126 | |
127 | namespace Qt |
128 | { |
129 | Q_CORE5COMPAT_EXPORT QTextCodec *codecForHtml(const QByteArray &ba); |
130 | } |
131 | |
132 | QT_END_NAMESPACE |
133 | |
134 | #endif // QTEXTCODEC_H |
135 | |