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
12QT_REQUIRE_CONFIG(textcodec);
13
14QT_BEGIN_NAMESPACE
15
16class QTextDecoder;
17class QTextEncoder;
18
19class Q_CORE5COMPAT_EXPORT QTextCodec : public QStringConverterBase
20{
21 Q_DISABLE_COPY(QTextCodec)
22public:
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 IgnoreHeader = 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
81protected:
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
88private:
89 friend struct QTextCodecData;
90};
91
92class Q_CORE5COMPAT_EXPORT QTextEncoder
93{
94 Q_DISABLE_COPY(QTextEncoder)
95public:
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;
104private:
105 const QTextCodec *c = nullptr;
106 QTextCodec::ConverterState state;
107};
108
109class Q_CORE5COMPAT_EXPORT QTextDecoder
110{
111 Q_DISABLE_COPY(QTextDecoder)
112public:
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;
122private:
123 const QTextCodec *c = nullptr;
124 QTextCodec::ConverterState state;
125};
126
127namespace Qt
128{
129 Q_CORE5COMPAT_EXPORT QTextCodec *codecForHtml(const QByteArray &ba);
130}
131
132QT_END_NAMESPACE
133
134#endif // QTEXTCODEC_H
135

source code of qt5compat/src/core5/codecs/qtextcodec.h