MCPcopy Create free account
hub / github.com/KDE/kdiff3 / EncodedDataStream

Class EncodedDataStream

src/EncodedDataStream.h:20–140  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

18#include <QStringDecoder>
19
20class EncodedDataStream: public QDataStream
21{
22 private:
23 QStringEncoder mEncoder = QStringEncoder("UTF-8", QStringEncoder::Flag::ConvertInitialBom);
24 QByteArray mEncoding = "UTF-8";
25 bool mGenerateBOM = false;
26 bool mError = false;
27
28 public:
29 using QDataStream::QDataStream;
30
31 void setGenerateByteOrderMark(bool generate) { mGenerateBOM = generate; }
32
33 inline bool hasBOM() const { return mGenerateBOM; }
34
35 inline void setEncoding(const QByteArray &inEncoding)
36 {
37 assert(!inEncoding.isEmpty());
38
39 if(inEncoding == "UTF-8-BOM")
40 {
41 mGenerateBOM = true;
42 mEncoding = "UTF-8";
43 }
44 else
45 {
46 mGenerateBOM = inEncoding.startsWith("UTF-16") || inEncoding.startsWith("UTF-32");
47 mEncoding = inEncoding;
48 }
49
50 mEncoder = QStringEncoder(mEncoding, mGenerateBOM ? QStringConverter::Flag::WriteBom : QStringConverter::Flag::ConvertInitialBom);
51
52 assert(!mGenerateBOM || ((inEncoding.startsWith("UTF-16") || inEncoding.startsWith("UTF-32")) || inEncoding == "UTF-8-BOM"));
53 };
54
55 inline qint32 readChar(QString& s)
56 {
57 char curData = '\0';
58 qint32 len = 0;
59 QStringDecoder decoder = QStringDecoder(mEncoding, mGenerateBOM ? QStringConverter::Flag::WriteBom : QStringConverter::Flag::ConvertInitialBom);
60 assert(decoder.isValid());
61 if(!decoder.isValid()) return 0;
62
63 /*
64 As long as the encoding is incomplete QStringDecoder returns an empty string and waits for more data.
65 This loop proceeds one byte at a time until we hit the end of input, get an encoded char and encounter an error.
66 */
67 do
68 {
69 len += readRawData(&curData, 1);
70
71 s = decoder(QByteArray::fromRawData(&curData, sizeof(curData)));
72 } while(!decoder.hasError() && s.isEmpty() && !atEnd());
73
74 mError = decoder.hasError() || (s.isEmpty() && atEnd());
75 if(mError)
76 {
77 s[0] = QChar::SpecialCharacter::ReplacementCharacter;

Callers

nothing calls this directly

Calls 2

hasErrorMethod · 0.80
isValidMethod · 0.45

Tested by

no test coverage detected