work in progress...

This commit is contained in:
Isaikin Roman
2014-09-14 23:40:30 +04:00
parent dfe5c62537
commit 0b76bc5d97
8 changed files with 96 additions and 12 deletions

View File

@@ -2,12 +2,18 @@
#include <msgpack.h>
#include <QDebug>
#include <vector>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "MsgPack";
qDebug() << MsgPack::deserialize(QByteArray::fromHex("dc 00 33 c2 c3 c0 00 00 00 00 00 00 00 00 00 ff ff ff ff ff 7f 7f cc ff cd ff ff ce ff ff ff ff e0 e0 d1 ff 80 d2 ff ff 80 00 d3 ff ff ff ff 80 00 00 00 00 00 01 ff a1 61 a1 61 a1 61 a0 a0 a0 91 00 91 00 91 00 90 90 90 80 80 80 81 a1 61 61 81 a1 61 61 81 a1 61 61 91 90 91 91 a1 61"));
// qDebug() << "MsgPack";
// qDebug() << MsgPack::deserialize(QByteArray::fromHex("dc 00 33 c2 c3 c0 00 00 00 00 00 00 00 00 00 ff ff ff ff ff 7f 7f cc ff cd ff ff ce ff ff ff ff e0 e0 d1 ff 80 d2 ff ff 80 00 d3 ff ff ff ff 80 00 00 00 00 00 01 ff a1 61 a1 61 a1 61 a0 a0 a0 91 00 91 00 91 00 90 90 90 80 80 80 81 a1 61 61 81 a1 61 61 81 a1 61 61 91 90 91 91 a1 61"));
QVariantList l;
l << true << false;
QByteArray arr = MsgPack::pack(l);
qDebug() << arr << arr.toBase64();
return a.exec();
}

View File

@@ -17,8 +17,10 @@ TEMPLATE = app
SOURCES += main.cpp \
msgpack.cpp \
private/msgpack_p.cpp
private/pack_p.cpp \
private/unpack_p.cpp
HEADERS += \
msgpack.h \
private/msgpack_p.h
private/pack_p.h \
private/unpack_p.h

View File

@@ -1,12 +1,28 @@
#include "msgpack.h"
#include <QDebug>
#include "private/msgpack_p.h"
#include "private/unpack_p.h"
#include "private/pack_p.h"
#include <QByteArray>
QVariant MsgPack::deserialize(const QByteArray &data)
QVariant MsgPack::unpack(const QByteArray &data)
{
quint8 *p = (quint8 *)data.data();
quint8 *end = p + data.size() - 1;
//qDebug() << "deserialize size:" << data.size();
return MsgPackPrivate::unpack(p, end);
}
QByteArray MsgPack::pack(const QVariant &variant)
{
quint8 *p = 0;
quint8 *end = MsgPackPrivate::pack(variant, p, true);
quint32 size = end - p;
qDebug() << "size probe:" << size;
QByteArray arr;
arr.resize(size);
end = MsgPackPrivate::pack(variant, (quint8 *)arr.data(), false);
return arr;
}

View File

@@ -5,8 +5,8 @@
namespace MsgPack
{
QVariant deserialize(const QByteArray &data);
QVariant unpack(const QByteArray &data);
QByteArray pack(const QVariant &variant);
}
#endif // MSGPACK_H

41
private/pack_p.cpp Normal file
View File

@@ -0,0 +1,41 @@
#include "pack_p.h"
quint8 *MsgPackPrivate::pack(const QVariant &v, quint8 *p, bool sp)
{
QMetaType::Type t = (QMetaType::Type)v.type();
if (t == QMetaType::Int)
p = pack_int(v, p, sp);
else if (t == QMetaType::Bool)
p = pack_bool(v, p, sp);
else if (t == QMetaType::QVariantList)
p = pack_list(v, p, sp);
return p;
}
quint8 *MsgPackPrivate::pack_int(const QVariant &v, quint8 *p, bool sp)
{
}
quint8 *MsgPackPrivate::pack_bool(const QVariant &v, quint8 *p, bool sp)
{
if (!sp)
*p = v.toBool() ? 0xc3 : 0xc2;
return p + 1;
}
quint8 *MsgPackPrivate::pack_list(const QVariant &v, quint8 *p, bool sp)
{
QVariantList list = v.toList();
//pack_int(...)
if (!sp)
*p = 0x92; // 2el
p++;
foreach (QVariant item, v.toList())
p = pack(item, p, sp);
return p;
}

19
private/pack_p.h Normal file
View File

@@ -0,0 +1,19 @@
#ifndef PACK_P_H
#define PACK_P_H
#include <QVariant>
namespace MsgPackPrivate {
/* if sp (size probe) == true, packer just moves pointer forward
*
*/
quint8 * pack(const QVariant &v, quint8 *p, bool sp);
quint8 * pack_int(const QVariant &v, quint8 *p, bool sp);
quint8 * pack_bool(const QVariant &v, quint8 *p, bool sp);
quint8 * pack_list(const QVariant &v, quint8 *p, bool sp);
}
#endif // PACK_P_H

View File

@@ -1,4 +1,4 @@
#include "msgpack_p.h"
#include "unpack_p.h"
#include <QDebug>
MsgPackPrivate::type_parser_f MsgPackPrivate::unpackers[32] = {
@@ -30,8 +30,8 @@ QVariant MsgPackPrivate::unpack(quint8 *p, quint8 *end)
if (p - end > 1)
return QVariant();
// if (d.length() == 1)
// return d[0];
if (d.length() == 1)
return d[0];
return d;
}