File: NetworkMessage.cpp

package info (click to toggle)
js8call 2.5.2%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,720 kB
  • sloc: cpp: 562,651; sh: 898; python: 132; ansic: 102; makefile: 4
file content (107 lines) | stat: -rw-r--r-- 2,944 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
#include "NetworkMessage.h"

#include <exception>

#include <QByteArray>
#include <QDebug>
#include <QIODevice>
#include <QString>

#include "JS8_Include/pimpl_impl.h"

namespace NetworkMessage {
Builder::Builder(QIODevice *device, Type type, QString const &id,
                 quint32 schema)
    : QDataStream{device} {
    common_initialization(type, id, schema);
}

Builder::Builder(QByteArray *a, Type type, QString const &id, quint32 schema)
    : QDataStream{a, QIODevice::WriteOnly} {
    common_initialization(type, id, schema);
}

void Builder::common_initialization(Type type, QString const &id,
                                    quint32 schema) {
    if (schema <= 1) {
        setVersion(QDataStream::Qt_5_0); // Qt schema version
    }
#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
    else if (schema <= 2) {
        setVersion(QDataStream::Qt_5_2); // Qt schema version
    }
#endif
#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
    else if (schema <= 3) {
        setVersion(QDataStream::Qt_5_4); // Qt schema version
    }
#endif
    else {
        throw std::runtime_error{"Unrecognized message schema"};
    }

    // the following two items assume that the quint32 encoding is
    // unchanged over QDataStream versions
    *this << magic;
    *this << schema;

    *this << static_cast<quint32>(type) << id.toUtf8();
}

class Reader::impl {
  public:
    void common_initialization(Reader *parent) {
        quint32 magic;
        *parent >> magic;
        if (magic != Builder::magic) {
            throw std::runtime_error{"Invalid message format"};
        }
        *parent >> schema_;
        if (schema_ > Builder::schema_number) {
            throw std::runtime_error{"Unrecognized message schema"};
        }
        if (schema_ <= 1) {
            parent->setVersion(QDataStream::Qt_5_0);
        }
#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
        else if (schema_ <= 2) {
            parent->setVersion(QDataStream::Qt_5_2);
        }
#endif
#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
        else if (schema_ <= 3) {
            parent->setVersion(QDataStream::Qt_5_4);
        }
#endif
        quint32 type;
        *parent >> type >> id_;
        if (type >= maximum_message_type_) {
            qDebug() << "Unrecognized message type:" << type
                     << "from id:" << id_;
            type_ = maximum_message_type_;
        } else {
            type_ = static_cast<Type>(type);
        }
    }

    quint32 schema_;
    Type type_;
    QByteArray id_;
};

Reader::Reader(QIODevice *device) : QDataStream{device} {
    m_->common_initialization(this);
}

Reader::Reader(QByteArray const &a) : QDataStream{a} {
    m_->common_initialization(this);
}

Reader::~Reader() {}

quint32 Reader::schema() const { return m_->schema_; }

Type Reader::type() const { return static_cast<Type>(m_->type_); }

QString Reader::id() const { return QString::fromUtf8(m_->id_); }
} // namespace NetworkMessage