summaryrefslogtreecommitdiff
path: root/daemon/packer.h
blob: fbf5f4b89a89a0bc46cc498f4378fa7502c55712 (plain)
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
#ifndef PACKER_H
#define PACKER_H

#include <QtEndian>
#include <QByteArray>
#include <QString>
#include <QUuid>
#include <QVariantMap>
#include <QLoggingCategory>

class Packer
{
    static QLoggingCategory l;

public:
    Packer(QByteArray *buf);

    template <typename T>
    void write(T v);

    template <typename T>
    void writeLE(T v);

    void writeBytes(int n, const QByteArray &b);

    void writeFixedString(int n, const QString &s);

    void writeCString(const QString &s);

    void writeUuid(const QUuid &uuid);

    void writeDict(const QMap<int, QVariant> &d);

private:
    char *p(int n);
    uchar *up(int n);
    QByteArray *_buf;
};

inline Packer::Packer(QByteArray *buf)
    : _buf(buf)
{
}

template <typename T>
void Packer::write(T v)
{
    qToBigEndian(v, up(sizeof(T)));
}

template <typename T>
void Packer::writeLE(T v)
{
    qToLittleEndian(v, up(sizeof(T)));
}

inline char * Packer::p(int n)
{
    int size = _buf->size();
    _buf->resize(size + n);
    return &_buf->data()[size];
}

inline uchar * Packer::up(int n)
{
    return reinterpret_cast<uchar *>(p(n));
}

#endif // PACKER_H