Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
src_corelib_serialization_qcborstream.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
3
4#include <QFile>
5#include <QCborStreamWriter>
6#include <QCborStreamReader>
7#include <QCborValue>
8
9using namespace Qt::StringLiterals;
10
11void examples(QCborStreamWriter &writer)
12{
13 {
14 //! [0]
15 QCborValue(QCborTag(2), QByteArray("\x01\0\0\0\0\0\0\0\0", 9));
16 //! [0]
17 }
18
19 {
20 //! [1]
21 using namespace Qt::StringLiterals;
22 // ...
23 writer.startMap(4); // 4 elements in the map
24
25 writer.append("label"_L1);
26 writer.append("journald"_L1);
27
28 writer.append("autoDetect"_L1);
29 writer.append(false);
30
31 writer.append("condition"_L1);
32 writer.append("libs.journald"_L1);
33
34 writer.append("output"_L1);
35 writer.startArray(1);
36 writer.append("privateFeature"_L1);
37 writer.endArray();
38
39 writer.endMap();
40 //! [1]
41 }
42
43 {
44 //! [2]
45 QFile f("output");
46 QCborStreamWriter writer(&f);
47 writer.startMap(0);
48 writer.endMap();
49 //! [2]
50 }
51}
52
53//! [3]
55{
56 QByteArray ba;
57 QCborStreamWriter writer(&ba);
58 writer.append(value);
59 return ba;
60}
61//! [3]
62
63void writer_examples(QCborStreamWriter &writer)
64{
65 //! [4]
66 writer.append(0U);
67 writer.append(Q_UINT64_C(4294967296));
68 writer.append(std::numeric_limits<quint64>::max());
69 //! [4]
70
71 //! [5]
72 writer.append(0);
73 writer.append(-1);
74 writer.append(Q_INT64_C(4294967296));
75 writer.append(std::numeric_limits<qint64>::max());
76 //! [5]
77
78 //! [6]
79 writer.append(QCborNegativeInteger(1));
80 writer.append(QCborNegativeInteger(Q_INT64_C(4294967296)));
81 writer.append(QCborNegativeInteger(-quint64(std::numeric_limits<qint64>::min())));
82 //! [6]
83}
84//! [7]
85void writeFile(QCborStreamWriter &writer, const QString &fileName)
86{
87 QFile f(fileName);
88 if (f.open(QIODevice::ReadOnly))
89 writer.append(f.readAll());
90}
91//! [7]
92
93void helloWorld(QCborStreamWriter &writer)
94{
95 //! [8]
96 using namespace Qt::StringLiterals;
97 // ...
98 writer.append("Hello, World"_L1);
99 //! [8]
100}
101
102//! [9]
103void writeString(QCborStreamWriter &writer, const QString &str)
104{
105 writer.append(str);
106}
107//! [9]
108
109//! [10]
110void writeRxPattern(QCborStreamWriter &writer, const QRegularExpression &rx)
111{
112 writer.append(QCborTag(36));
113 writer.append(rx.pattern());
114}
115//! [10]
116
117//! [11]
118void writeCurrentTime(QCborStreamWriter &writer)
119{
120 writer.append(QCborKnownTags::UnixTime_t);
121 writer.append(qint64(time(nullptr)));
122}
123//! [11]
124
125void ammend_example(QCborStreamWriter &writer)
126{
127 //! [12]
128 writer.append(QCborSimpleType::Null);
129 writer.append(QCborSimpleType(32));
130 //! [12]
131}
132
133//! [13]
134void writeFloat(QCborStreamWriter &writer, float f)
135{
136 qfloat16 f16 = qfloat16(f);
137 if (qIsNaN(f) || f16 == f)
138 writer.append(f16);
139 else
140 writer.append(f);
141}
142//! [13]
143
144//! [14]
145void writeFloat(QCborStreamWriter &writer, double d)
146{
147 float f = d;
148 if (qIsNaN(d) || d == f)
149 writer.append(f);
150 else
151 writer.append(d);
152}
153//! [14]
154
155//! [15]
156void writeDouble(QCborStreamWriter &writer, double d)
157{
158 float f;
159 if (qIsNaN(d)) {
160 writer.append(qfloat16(qQNaN()));
161 } else if (qIsInf(d)) {
162 writer.append(d < 0 ? -qInf() : qInf());
163 } else if ((f = d) == d) {
164 qfloat16 f16 = qfloat16(f);
165 if (f16 == f)
166 writer.append(f16);
167 else
168 writer.append(f);
169 } else {
170 writer.append(d);
171 }
172}
173//! [15]
174
175void snippets_16_19(QCborStreamWriter &writer, bool b)
176{
177 //! [16]
178 writer.append(b ? QCborSimpleType::True : QCborSimpleType::False);
179 //! [16]
180
181 //! [17]
182 writer.append(QCborSimpleType::Null);
183 //! [17]
184
185 //! [18]
186 writer.append(QCborSimpleType::Null);
187 //! [18]
188
189 //! [19]
190 writer.append(QCborSimpleType::Undefined);
191 //! [19]
192}
193
194//! [20]
195void appendList(QCborStreamWriter &writer, const QList<QString> &values)
196{
197 writer.startArray();
198 for (const QString &s : values)
199 writer.append(s);
200 writer.endArray();
201}
202//! [20]
203
204namespace repetitions
205{
206 //! [21]
207 void appendList(QCborStreamWriter &writer, const QStringList &list)
208 {
209 writer.startArray(list.size());
210 for (const QString &s : list)
211 writer.append(s);
212 writer.endArray();
213 }
214 //! [21]
215
216 //! [22]
217 void appendMap(QCborStreamWriter &writer, const QList<std::pair<int, QString>> &values)
218 {
219 writer.startMap();
220 for (const auto pair : values) {
221 writer.append(pair.first);
222 writer.append(pair.second);
223 }
224 writer.endMap();
225 }
226 //! [22]
227}
228
229//! [23]
230void appendMap(QCborStreamWriter &writer, const QMap<int, QString> &map)
231{
232 writer.startMap(map.size());
233 for (auto it = map.cbegin(), end = map.cend(); it != end; ++it) {
234 writer.append(it.key());
235 writer.append(it.value());
236 }
237 writer.endMap();
238}
239//! [23]
240
241void handleFixedWidth(QCborStreamReader &reader);
242
243void handleString(QCborStreamReader &reader);
244
245//! [24]
246void handleStream(QCborStreamReader &reader)
247{
248 switch (reader.type())
249 {
250 case QCborStreamReader::UnsignedInteger:
251 case QCborStreamReader::NegativeInteger:
252 case QCborStreamReader::SimpleType:
253 case QCborStreamReader::Float16:
254 case QCborStreamReader::Float:
255 case QCborStreamReader::Double:
256 handleFixedWidth(reader);
257 reader.next();
258 break;
259 case QCborStreamReader::ByteArray:
260 case QCborStreamReader::String:
261 handleString(reader);
262 break;
263 case QCborStreamReader::Array:
264 case QCborStreamReader::Map:
265 reader.enterContainer();
266 while (reader.lastError() == QCborError::NoError)
267 handleStream(reader);
268 if (reader.lastError() == QCborError::NoError)
269 reader.leaveContainer();
270 }
271
272}
273//! [24]
274
275QString readOneElement(QCborStreamReader &reader);
276
277//! [25]
278QVariantList populateFromCbor(QCborStreamReader &reader)
279{
280 QVariantList list;
281 if (reader.isLengthKnown())
282 list.reserve(reader.length());
283
284 reader.enterContainer();
285 while (reader.lastError() == QCborError::NoError && reader.hasNext())
286 list.append(readOneElement(reader));
287 if (reader.lastError() == QCborError::NoError)
288 reader.leaveContainer();
289
290 return list;
291}
292//! [25]
293
295{
296 QString readElementAsString(QCborStreamReader &reader);
297 QVariantMap setMapLength(QVariantMap &map, qsizetype length);
298
299 //! [26]
300 QVariantMap populateFromCbor(QCborStreamReader &reader)
301 {
302 QVariantMap map;
303 if (reader.isLengthKnown())
304 map = setMapLength(map, reader.length());
305
306 reader.enterContainer();
307 while (reader.lastError() == QCborError::NoError && reader.hasNext()) {
308 QString key = readElementAsString(reader);
309 map.insert(key, readOneElement(reader));
310 }
311 if (reader.lastError() == QCborError::NoError)
312 reader.leaveContainer();
313
314 return map;
315 }
316 //! [26]
317}
318
319//! [27]
320QString decodeString(QCborStreamReader &reader)
321{
322 QString result;
323 auto r = reader.readString();
324 while (r.status == QCborStreamReader::Ok) {
325 result += r.data;
326 r = reader.readString();
327 }
328
329 if (r.status == QCborStreamReader::Error) {
330 // handle error condition
331 result.clear();
332 }
333 return result;
334}
335//! [27]
336
337//! [28]
338QByteArray decodeBytearray(QCborStreamReader &reader)
339{
340 QByteArray result;
341 auto r = reader.readByteArray();
342 while (r.status == QCborStreamReader::Ok) {
343 result += r.data;
344 r = reader.readByteArray();
345 }
346
347 if (r.status == QCborStreamReader::Error) {
348 // handle error condition
349 result.clear();
350 }
351 return result;
352}
353//! [28]
354
355void do_while_example(QCborStreamReader &reader, QByteArray &buffer)
356{
357 //! [29]
358 QCborStreamReader::StringResult<qsizetype> result;
359 do {
360 qsizetype size = reader.currentStringChunkSize();
361 qsizetype oldsize = buffer.size();
362 buffer.resize(oldsize + size);
363 result = reader.readStringChunk(buffer.data() + oldsize, size);
364 } while (result.status == QCborStreamReader::Ok);
365 //! [29]
366}
void appendMap(QCborStreamWriter &writer, const QList< std::pair< int, QString > > &values)
[21]
void appendList(QCborStreamWriter &writer, const QStringList &list)
[21]
QVariantMap populateFromCbor(QCborStreamReader &reader)
[26]
QString readElementAsString(QCborStreamReader &reader)
QVariantMap setMapLength(QVariantMap &map, qsizetype length)
void writer_examples(QCborStreamWriter &writer)
[3]
void writeCurrentTime(QCborStreamWriter &writer)
[10]
void writeFloat(QCborStreamWriter &writer, float f)
[13]
void writeDouble(QCborStreamWriter &writer, double d)
[14]
void snippets_16_19(QCborStreamWriter &writer, bool b)
[15]
QVariantList populateFromCbor(QCborStreamReader &reader)
[25]
void writeFloat(QCborStreamWriter &writer, double d)
[13]
void do_while_example(QCborStreamReader &reader, QByteArray &buffer)
[28]
void helloWorld(QCborStreamWriter &writer)
[7]
void examples(QCborStreamWriter &writer)
void appendMap(QCborStreamWriter &writer, const QMap< int, QString > &map)
[23]
QString readOneElement(QCborStreamReader &reader)
[24]
void writeString(QCborStreamWriter &writer, const QString &str)
[9]
void writeFile(QCborStreamWriter &writer, const QString &fileName)
[7]
QByteArray encodedNumber(qint64 value)
[3]
void handleString(QCborStreamReader &reader)
void writeRxPattern(QCborStreamWriter &writer, const QRegularExpression &rx)
[9]
void ammend_example(QCborStreamWriter &writer)
[11]
void handleFixedWidth(QCborStreamReader &reader)
[23]
QString decodeString(QCborStreamReader &reader)
[27]
void appendList(QCborStreamWriter &writer, const QList< QString > &values)
[20]
QByteArray decodeBytearray(QCborStreamReader &reader)
[27]
void handleStream(QCborStreamReader &reader)
[24]