File: qcbor.cpp

package info (click to toggle)
kdevelop 4%3A25.04.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 73,508 kB
  • sloc: cpp: 291,803; python: 4,322; javascript: 3,518; sh: 1,316; ansic: 703; xml: 414; php: 95; lisp: 66; makefile: 31; sed: 12
file content (121 lines) | stat: -rw-r--r-- 4,502 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <QCoreApplication>
#include <QCborMap>
#include <QCborArray>
#include <QCborValue>
#include <QDebug>
#include <QBuffer>
#include <QUuid>
#include <QTimeZone>

class Source
{
public:
    Source() {
        QCborMap cborMap;
        cborMap[QStringLiteral("name")] = "John Doe";
        cborMap[QStringLiteral("address")] = "Some street\nCity\nCountry";
        cborMap[QStringLiteral("year")] = 2024;
        QCborValue age(30.57);
        cborMap[QStringLiteral("age")] = age;
        QCborValue notMarried(false);
        cborMap[QStringLiteral("married")] = notMarried;
        cborMap[QStringLiteral("undefined")] = QCborValue();
        cborMap[QStringLiteral("null")] = QCborValue(nullptr);
        QCborValue urlValue(QUrl("http://www.kde.org"));
        cborMap[QStringLiteral("url")] = urlValue;
        QUuid uuid("{67C8770B-44F1-410A-AB9A-F9B5446F13EE}");
        QCborValue uuidValue(uuid);
        cborMap[QStringLiteral("uuid")] = uuidValue;
        cborMap[QStringLiteral("regexp")] = QCborValue(QRegularExpression(QStringLiteral("^kde$")));
        cborMap[QStringLiteral("birth")] = QCborValue(QDateTime(QDate(2001, 5, 30), QTime(9, 31, 0), QTimeZone(3600)));
        cborMap[QStringLiteral("bytes")] = QByteArray("ABC\xFF\x00\xFE", 6);
        QCborValue otherSimpleType(QCborSimpleType(12));
        cborMap[QStringLiteral("otherSimpleType")] = otherSimpleType;

        QCborMap childMap;
        childMap[QStringLiteral("company")] = "KDAB";
        childMap[QStringLiteral("title")] = "Surface technician";
        childMap[QStringLiteral("emptyObj")] = QCborMap();
        childMap[QStringLiteral("emptyArray")] = QCborArray();
        // The byte value 0x01 followed by 8 zero bytes represents the number 2^64 (example from Qt API docs)
        QCborValue bigNum(QCborTag(QCborKnownTags::PositiveBignum), QByteArray("\x01\0\0\0\0\0\0\0\0", 9));
        childMap[QStringLiteral("bigNum")] = bigNum;
        QCborMap taggedMap;
        taggedMap[QStringLiteral("planet")] = QString("earth");
        QCborValue tagWithMap(QCborTag(42), taggedMap);
        childMap[QStringLiteral("tagWithMap")] = tagWithMap;

        cborMap[QStringLiteral("job")] = childMap;

        QCborArray childrenArray;
        childrenArray.append("Alice");
        childrenArray.append("Mickaƫl");
        cborMap[QStringLiteral("children")] = childrenArray;

        m_document = cborMap;
    }

    Q_NEVER_INLINE QCborValue documentValue();
    Q_NEVER_INLINE QCborMap mainMap();
    Q_NEVER_INLINE QCborArray childrenArray();

private:
    QCborValue m_document;
};

QCborValue Source::documentValue() { return m_document; }
QCborMap Source::mainMap() { return m_document.toMap(); }
QCborArray Source::childrenArray() { return m_document[QStringLiteral("children")].toArray(); }

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QCborValue emptyValue;
    Source source;
    QCborValue cborValue = source.documentValue();
    QCborMap cborMap = source.mainMap();
    QByteArray cborData = cborValue.toCbor();

    // Deserialize the CBOR data back into a QCborValue
    QCborValue parsedValue = QCborValue::fromCbor(cborData);
    // Clear the very long string after use to prevent overly wide Value column in
    // KDevelop's Variables tool view, which moves the Type column far to the right.
    cborData.clear();

    if (parsedValue.isMap()) {
        QCborMap parsedMap = parsedValue.toMap();

        QString nameStr = QStringLiteral("name");
        auto nameRef = parsedMap[nameStr];
        QCborValue name = nameRef;

        auto yearRef = parsedMap[QStringLiteral("year")];
        QCborValue year = yearRef;

        auto ageRef = parsedMap[QStringLiteral("age")];
        QCborValue age = ageRef;

        auto marriedRef = parsedMap[QStringLiteral("married")];
        QCborValue married = marriedRef;

        auto childrenValue = parsedMap[QStringLiteral("children")];
        QCborArray parsedChildren = childrenValue.toArray();

        auto bytesValueRef = parsedMap[QStringLiteral("bytes")];
        QCborValue bytesValue = bytesValueRef;

        auto childMap = parsedMap[QStringLiteral("job")].toMap();
        auto bigNumValueRef = childMap[QStringLiteral("bigNum")];
        QCborValue bigNumValue = bigNumValueRef;

        for (const auto &child : parsedChildren) {
            QString childName = child.toString();
        }
    } else {
        qCritical() << "Failed to parse CBOR data.";
        return 1;
    }

    return 0;
}