From 0b76bc5d970b3255c532982f7d43f2b430b724fd Mon Sep 17 00:00:00 2001 From: Isaikin Roman Date: Sun, 14 Sep 2014 23:40:30 +0400 Subject: [PATCH] work in progress... --- main.cpp | 10 ++++-- msgpack-qt.pro | 6 ++-- msgpack.cpp | 22 +++++++++++-- msgpack.h | 4 +-- private/pack_p.cpp | 41 +++++++++++++++++++++++++ private/pack_p.h | 19 ++++++++++++ private/{msgpack_p.cpp => unpack_p.cpp} | 6 ++-- private/{msgpack_p.h => unpack_p.h} | 0 8 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 private/pack_p.cpp create mode 100644 private/pack_p.h rename private/{msgpack_p.cpp => unpack_p.cpp} (99%) rename private/{msgpack_p.h => unpack_p.h} (100%) diff --git a/main.cpp b/main.cpp index fbb76fa..c1e8bd1 100644 --- a/main.cpp +++ b/main.cpp @@ -2,12 +2,18 @@ #include #include +#include + 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(); } diff --git a/msgpack-qt.pro b/msgpack-qt.pro index 94dc41c..429703a 100644 --- a/msgpack-qt.pro +++ b/msgpack-qt.pro @@ -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 diff --git a/msgpack.cpp b/msgpack.cpp index 05949a0..27ca097 100644 --- a/msgpack.cpp +++ b/msgpack.cpp @@ -1,12 +1,28 @@ #include "msgpack.h" #include -#include "private/msgpack_p.h" +#include "private/unpack_p.h" +#include "private/pack_p.h" +#include -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; +} diff --git a/msgpack.h b/msgpack.h index 5e8e23c..bfa7cc2 100644 --- a/msgpack.h +++ b/msgpack.h @@ -5,8 +5,8 @@ namespace MsgPack { - - QVariant deserialize(const QByteArray &data); + QVariant unpack(const QByteArray &data); + QByteArray pack(const QVariant &variant); } #endif // MSGPACK_H diff --git a/private/pack_p.cpp b/private/pack_p.cpp new file mode 100644 index 0000000..953da9c --- /dev/null +++ b/private/pack_p.cpp @@ -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; +} diff --git a/private/pack_p.h b/private/pack_p.h new file mode 100644 index 0000000..392d4b3 --- /dev/null +++ b/private/pack_p.h @@ -0,0 +1,19 @@ +#ifndef PACK_P_H +#define PACK_P_H +#include + +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 diff --git a/private/msgpack_p.cpp b/private/unpack_p.cpp similarity index 99% rename from private/msgpack_p.cpp rename to private/unpack_p.cpp index 7d84639..6827850 100644 --- a/private/msgpack_p.cpp +++ b/private/unpack_p.cpp @@ -1,4 +1,4 @@ -#include "msgpack_p.h" +#include "unpack_p.h" #include 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; } diff --git a/private/msgpack_p.h b/private/unpack_p.h similarity index 100% rename from private/msgpack_p.h rename to private/unpack_p.h