From bf1f9977ced4224358ffc23203ca5db47040150c Mon Sep 17 00:00:00 2001 From: Isaikin Roman Date: Wed, 10 Sep 2014 22:11:41 +0400 Subject: [PATCH] work in progress --- main.cpp | 6 +- msgpack-qt.pro.user | 233 ------------------------------------------ private/msgpack_p.cpp | 194 ++++++++++++++++++++--------------- private/msgpack_p.h | 83 +++++++-------- 4 files changed, 157 insertions(+), 359 deletions(-) delete mode 100644 msgpack-qt.pro.user diff --git a/main.cpp b/main.cpp index 7594430..fbb76fa 100644 --- a/main.cpp +++ b/main.cpp @@ -2,16 +2,12 @@ #include #include -void test(quint8 *p) { - p++; -} - int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() << "MsgPack"; - qDebug() << MsgPack::deserialize(QByteArray::fromHex("c403010203")); + 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")); return a.exec(); } diff --git a/msgpack-qt.pro.user b/msgpack-qt.pro.user deleted file mode 100644 index b1032d6..0000000 --- a/msgpack-qt.pro.user +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - EnvironmentId - {293bfe28-51d8-4f1a-a70e-1e515004ec8c} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - true - false - 0 - true - 0 - 8 - true - 1 - true - true - true - false - - - - ProjectExplorer.Project.PluginSettings - - - - ProjectExplorer.Project.Target.0 - - Desktop Qt 5.3 GCC 64bit - Desktop Qt 5.3 GCC 64bit - qt.53.gcc_64_kit - 0 - 0 - 0 - - /home/roman/build/build-msgpack-qt-Desktop_Qt_5_3_GCC_64bit-Debug - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - true - Сборка - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Сборка - - ProjectExplorer.BuildSteps.Build - - - - true - Сборка - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Очистка - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Отладка - - Qt4ProjectManager.Qt4BuildConfiguration - 2 - true - - - /home/roman/build/build-msgpack-qt-Desktop_Qt_5_3_GCC_64bit-Release - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - true - Сборка - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Сборка - - ProjectExplorer.BuildSteps.Build - - - - true - Сборка - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Очистка - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Выпуск - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - 2 - - - 0 - Установка - - ProjectExplorer.BuildSteps.Deploy - - 1 - Локальная установка - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - 2 - - msgpack-qt - - Qt4ProjectManager.Qt4RunConfiguration:/home/roman/git/msgpack-qt/msgpack-qt.pro - - msgpack-qt.pro - false - false - - 3768 - false - true - false - false - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 16 - - - Version - 16 - - diff --git a/private/msgpack_p.cpp b/private/msgpack_p.cpp index bb1bf96..7d84639 100644 --- a/private/msgpack_p.cpp +++ b/private/msgpack_p.cpp @@ -19,7 +19,7 @@ MsgPackPrivate::type_parser_f MsgPackPrivate::unpackers[32] = { QVariant MsgPackPrivate::unpack(quint8 *p, quint8 *end) { QVariantList d; - int typesz = 0; + quint32 typesz = 0; while (p <= end) { typesz = 0; @@ -30,12 +30,12 @@ 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; } -QVariant MsgPackPrivate::unpack_type(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_type(quint8 *p, quint32 &sz) { QVariant d; @@ -57,34 +57,54 @@ QVariant MsgPackPrivate::unpack_type(quint8 *p, int &sz) return d; } -QVariant MsgPackPrivate::unpack_positive_fixint(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_positive_fixint(quint8 *p, quint32 &sz) { + sz += 1; quint32 val = (quint32)*p; - sz = 1; return val; } -QVariant MsgPackPrivate::unpack_negative_fixint(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_negative_fixint(quint8 *p, quint32 &sz) { + sz += 1; quint8 val8 = (quint8)*p; val8 &= ~((1 << 7) | (1 << 6) | (1 << 5)); qint32 val = 0xffffffff; val &= (0xffffffe0 | val8); - sz = 1; return val; } -QVariant MsgPackPrivate::unpack_fixmap(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_map_len(quint8 *p, quint32 &sz, quint32 len) { + quint32 elemsz = 0; + QMap map; + for (quint32 i = 0; i < len; ++i) { + elemsz = 0; + QVariant key = unpack_type(p, elemsz); + p += elemsz; sz += elemsz; + elemsz = 0; + + QVariant val = unpack_type(p, elemsz); + p += elemsz; sz += elemsz; + map.insert(key.toString(), val); + } + return map; } -QVariant MsgPackPrivate::unpack_array_len(quint8 *p, int &sz, int len) +QVariant MsgPackPrivate::unpack_fixmap(quint8 *p, quint32 &sz) { - int elemsz = 0; + sz += 1; + quint32 len = (*p++) & 0x0f; // 0b00001111 + return unpack_map_len(p, sz ,len); +} + +QVariant MsgPackPrivate::unpack_array_len(quint8 *p, quint32 &sz, quint32 len) +{ + quint32 elemsz = 0; QVariantList arr; - for (int i = 0; i < len; ++i) { + for (quint32 i = 0; i < len; ++i) { elemsz = 0; arr.append(unpack_type(p, elemsz)); p += elemsz; @@ -117,241 +137,255 @@ quint32 MsgPackPrivate::unpack_uint32(quint8 *p) return val; } -QVariant MsgPackPrivate::unpack_fixarray(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_fixarray(quint8 *p, quint32 &sz) { - int len = (*p++) & 0x0f; // 0b00001111 - sz++; - + sz += 1; + quint32 len = (*p++) & 0x0f; // 0b00001111 return unpack_array_len(p, sz, len); } -QVariant MsgPackPrivate::unpack_fixstr(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_fixstr(quint8 *p, quint32 &sz) { - int len = (*p) & 0x1f; // 0b00011111 + sz += 1; + quint32 len = (*p) & 0x1f; // 0b00011111 QString str = QString::fromUtf8((char*)(p + 1), len); - sz = len + 1; + sz += len; return QVariant(str); } -QVariant MsgPackPrivate::unpack_nil(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_nil(quint8 *p, quint32 &sz) { Q_UNUSED(p) - sz = 1; + sz += 1; return 0; } -QVariant MsgPackPrivate::unpack_never_used(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_never_used(quint8 *p, quint32 &sz) { Q_UNUSED(p) - sz = 1; + sz += 1; return QVariant(); } -QVariant MsgPackPrivate::unpack_false(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_false(quint8 *p, quint32 &sz) { Q_UNUSED(p) - sz = 1; + sz += 1; return false; } -QVariant MsgPackPrivate::unpack_true(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_true(quint8 *p, quint32 &sz) { Q_UNUSED(p) - sz = 1; + sz += 1; return true; } -QVariant MsgPackPrivate::unpack_bin8(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_bin8(quint8 *p, quint32 &sz) { + sz += 2; quint32 len = unpack_uint8(++p); - QByteArray arr((const char *)(++p), len); - sz = len + 2; + QByteArray arr((const char *)(p + 1), len); + sz += len; return arr; } -QVariant MsgPackPrivate::unpack_bin16(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_bin16(quint8 *p, quint32 &sz) { + sz += 3; quint32 len = unpack_uint16(++p); - QByteArray arr((const char *)(++p), len); - sz = len + 2; + QByteArray arr((const char *)(p + 2), len); + sz += len; return arr; } -QVariant MsgPackPrivate::unpack_bin32(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_bin32(quint8 *p, quint32 &sz) { + sz += 5; quint32 len = unpack_uint32(++p); - QByteArray arr((const char *)(++p), len); - sz = len + 2; + QByteArray arr((const char *)(p + 4), len); + sz = len; return arr; } -QVariant MsgPackPrivate::unpack_ext8(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_ext8(quint8 *p, quint32 &sz) { } -QVariant MsgPackPrivate::unpack_ext16(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_ext16(quint8 *p, quint32 &sz) { } -QVariant MsgPackPrivate::unpack_ext32(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_ext32(quint8 *p, quint32 &sz) { } -QVariant MsgPackPrivate::unpack_float32(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_float32(quint8 *p, quint32 &sz) { + sz += 5; float val = 0; quint8 *vp = ( (quint8 *)&val ) + 3; for (int i = 0; i < 4; ++i) *(vp--) = *(++p); - sz = 5; return val; } -QVariant MsgPackPrivate::unpack_float64(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_float64(quint8 *p, quint32 &sz) { + sz += 9; double val = 0; quint8 *vp = ( (quint8 *)&val ) + 7; for (int i = 0; i < 8; ++i) *(vp--) = *(++p); - sz = 9; return val; } -QVariant MsgPackPrivate::unpack_uint8(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_uint8(quint8 *p, quint32 &sz) { - sz = 2; + sz += 2; return unpack_uint8(++p); } -QVariant MsgPackPrivate::unpack_uint16(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_uint16(quint8 *p, quint32 &sz) { - sz = 3; + sz += 3; return unpack_uint16(++p); } -QVariant MsgPackPrivate::unpack_uint32(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_uint32(quint8 *p, quint32 &sz) { - sz = 5; + sz += 5; return unpack_uint32(++p); } -QVariant MsgPackPrivate::unpack_uint64(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_uint64(quint8 *p, quint32 &sz) { + sz += 9; quint64 val = 0; for (int i = 56; i >= 0; i -= 8) val |= (quint64)(*(++p)) << i; - sz = 9; return val; } -QVariant MsgPackPrivate::unpack_int8(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_int8(quint8 *p, quint32 &sz) { + sz += 2; qint32 val = 0xffffff00; val |= *(++p); - sz = 2; return val; } -QVariant MsgPackPrivate::unpack_int16(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_int16(quint8 *p, quint32 &sz) { + sz += 3; qint32 val = 0xffff0000; quint8 *pv = (quint8 *)&val; pv[1] = *(++p); pv[0] = *(++p); - sz = 3; return val; } -QVariant MsgPackPrivate::unpack_int32(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_int32(quint8 *p, quint32 &sz) { + sz += 5; qint32 val = 0; quint8 *pv = (quint8 *)&val; pv[3] = *(++p); pv[2] = *(++p); pv[1] = *(++p); pv[0] = *(++p); - sz = 5; return val; } -QVariant MsgPackPrivate::unpack_int64(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_int64(quint8 *p, quint32 &sz) { + sz += 9; qint64 val = 0; for (int i = 56; i >= 0; i -= 8) val |= (quint64)(*(++p)) << i; - sz = 9; return val; } -QVariant MsgPackPrivate::unpack_fixext1(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_fixext1(quint8 *p, quint32 &sz) { } -QVariant MsgPackPrivate::unpack_fixext2(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_fixext2(quint8 *p, quint32 &sz) { } -QVariant MsgPackPrivate::unpack_fixext4(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_fixext4(quint8 *p, quint32 &sz) { } -QVariant MsgPackPrivate::unpack_fixext8(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_fixext8(quint8 *p, quint32 &sz) { } -QVariant MsgPackPrivate::unpack_fixext16(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_fixext16(quint8 *p, quint32 &sz) { } -QVariant MsgPackPrivate::unpack_str8(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_str8(quint8 *p, quint32 &sz) { + sz += 2; quint32 len = unpack_uint8(++p); QString str = QString::fromUtf8((char*)(p + 1), len); - sz = len + 1; + sz += len; return QVariant(str); } -QVariant MsgPackPrivate::unpack_str16(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_str16(quint8 *p, quint32 &sz) { + sz += 3; quint32 len = unpack_uint16(++p); - QString str = QString::fromUtf8((char*)(p + 1), len); - sz = len + 1; + QString str = QString::fromUtf8((char*)(p + 2), len); + sz += len; return QVariant(str); } -QVariant MsgPackPrivate::unpack_str32(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_str32(quint8 *p, quint32 &sz) { + sz += 5; quint32 len = unpack_uint32(++p); - QString str = QString::fromUtf8((char*)(p + 1), len); - sz = len + 1; + QString str = QString::fromUtf8((char*)(p + 4), len); + sz += len; return QVariant(str); } -QVariant MsgPackPrivate::unpack_array16(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_array16(quint8 *p, quint32 &sz) { + sz += 3; quint32 len = unpack_uint16(++p); - return unpack_array_len(p, sz, len); + return unpack_array_len(p + 2, sz, len); } -QVariant MsgPackPrivate::unpack_array32(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_array32(quint8 *p, quint32 &sz) { + sz += 5; quint32 len = unpack_uint32(++p); - return unpack_array_len(p, sz, len); + return unpack_array_len(p + 4, sz, len); } -QVariant MsgPackPrivate::unpack_map16(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_map16(quint8 *p, quint32 &sz) { - + sz += 3; + quint32 len = unpack_uint16(p); + return unpack_map_len(p + 2, sz, len); } -QVariant MsgPackPrivate::unpack_map32(quint8 *p, int &sz) +QVariant MsgPackPrivate::unpack_map32(quint8 *p, quint32 &sz) { - + sz += 5; + quint32 len = unpack_uint32(p); + return unpack_map_len(p + 4, sz, len); } + + diff --git a/private/msgpack_p.h b/private/msgpack_p.h index e6ae808..6f58d18 100644 --- a/private/msgpack_p.h +++ b/private/msgpack_p.h @@ -7,62 +7,63 @@ namespace MsgPackPrivate { /* unpack functions: - * QVariant _type_(quint8 *p, int &sz); + * QVariant _type_(quint8 *p, quint32 &sz); * parses some type, which data is stored at p * fill sz with type size (sz is there at the moment of calling * parser function) */ -typedef QVariant (* type_parser_f)(quint8 *p, int &sz); +typedef QVariant (* type_parser_f)(quint8 *p, quint32 &sz); extern type_parser_f unpackers[32]; // goes from p to end unpacking types with unpack_type function below QVariant unpack(quint8 *p, quint8 *end); // unpack some type, can be called recursively from other unpack functions -QVariant unpack_type(quint8 *p, int &sz); +QVariant unpack_type(quint8 *p, quint32 &sz); -QVariant unpack_array_len(quint8 *p, int &sz, int len); +QVariant unpack_map_len(quint8 *p, quint32 &sz, quint32 len); +QVariant unpack_array_len(quint8 *p, quint32 &sz, quint32 len); quint32 unpack_uint8(quint8 *p); quint32 unpack_uint16(quint8 *p); quint32 unpack_uint32(quint8 *p); -QVariant unpack_positive_fixint(quint8 *p, int &sz); -QVariant unpack_negative_fixint(quint8 *p, int &sz); -QVariant unpack_fixmap(quint8 *p, int &sz); -QVariant unpack_fixarray(quint8 *p, int &sz); -QVariant unpack_fixstr(quint8 *p, int &sz); -QVariant unpack_nil(quint8 *p, int &sz); -QVariant unpack_never_used(quint8 *p, int &sz); -QVariant unpack_false(quint8 *p, int &sz); -QVariant unpack_true(quint8 *p, int &sz); -QVariant unpack_bin8(quint8 *p, int &sz); -QVariant unpack_bin16(quint8 *p, int &sz); -QVariant unpack_bin32(quint8 *p, int &sz); -QVariant unpack_ext8(quint8 *p, int &sz); -QVariant unpack_ext16(quint8 *p, int &sz); -QVariant unpack_ext32(quint8 *p, int &sz); -QVariant unpack_float32(quint8 *p, int &sz); -QVariant unpack_float64(quint8 *p, int &sz); -QVariant unpack_uint8(quint8 *p, int &sz); -QVariant unpack_uint16(quint8 *p, int &sz); -QVariant unpack_uint32(quint8 *p, int &sz); -QVariant unpack_uint64(quint8 *p, int &sz); -QVariant unpack_int8(quint8 *p, int &sz); -QVariant unpack_int16(quint8 *p, int &sz); -QVariant unpack_int32(quint8 *p, int &sz); -QVariant unpack_int64(quint8 *p, int &sz); -QVariant unpack_fixext1(quint8 *p, int &sz); -QVariant unpack_fixext2(quint8 *p, int &sz); -QVariant unpack_fixext4(quint8 *p, int &sz); -QVariant unpack_fixext8(quint8 *p, int &sz); -QVariant unpack_fixext16(quint8 *p, int &sz); -QVariant unpack_str8(quint8 *p, int &sz); -QVariant unpack_str16(quint8 *p, int &sz); -QVariant unpack_str32(quint8 *p, int &sz); -QVariant unpack_array16(quint8 *p, int &sz); -QVariant unpack_array32(quint8 *p, int &sz); -QVariant unpack_map16(quint8 *p, int &sz); -QVariant unpack_map32(quint8 *p, int &sz); +QVariant unpack_positive_fixint(quint8 *p, quint32 &sz); +QVariant unpack_negative_fixint(quint8 *p, quint32 &sz); +QVariant unpack_fixmap(quint8 *p, quint32 &sz); +QVariant unpack_fixarray(quint8 *p, quint32 &sz); +QVariant unpack_fixstr(quint8 *p, quint32 &sz); +QVariant unpack_nil(quint8 *p, quint32 &sz); +QVariant unpack_never_used(quint8 *p, quint32 &sz); +QVariant unpack_false(quint8 *p, quint32 &sz); +QVariant unpack_true(quint8 *p, quint32 &sz); +QVariant unpack_bin8(quint8 *p, quint32 &sz); +QVariant unpack_bin16(quint8 *p, quint32 &sz); +QVariant unpack_bin32(quint8 *p, quint32 &sz); +QVariant unpack_ext8(quint8 *p, quint32 &sz); +QVariant unpack_ext16(quint8 *p, quint32 &sz); +QVariant unpack_ext32(quint8 *p, quint32 &sz); +QVariant unpack_float32(quint8 *p, quint32 &sz); +QVariant unpack_float64(quint8 *p, quint32 &sz); +QVariant unpack_uint8(quint8 *p, quint32 &sz); +QVariant unpack_uint16(quint8 *p, quint32 &sz); +QVariant unpack_uint32(quint8 *p, quint32 &sz); +QVariant unpack_uint64(quint8 *p, quint32 &sz); +QVariant unpack_int8(quint8 *p, quint32 &sz); +QVariant unpack_int16(quint8 *p, quint32 &sz); +QVariant unpack_int32(quint8 *p, quint32 &sz); +QVariant unpack_int64(quint8 *p, quint32 &sz); +QVariant unpack_fixext1(quint8 *p, quint32 &sz); +QVariant unpack_fixext2(quint8 *p, quint32 &sz); +QVariant unpack_fixext4(quint8 *p, quint32 &sz); +QVariant unpack_fixext8(quint8 *p, quint32 &sz); +QVariant unpack_fixext16(quint8 *p, quint32 &sz); +QVariant unpack_str8(quint8 *p, quint32 &sz); +QVariant unpack_str16(quint8 *p, quint32 &sz); +QVariant unpack_str32(quint8 *p, quint32 &sz); +QVariant unpack_array16(quint8 *p, quint32 &sz); +QVariant unpack_array32(quint8 *p, quint32 &sz); +QVariant unpack_map16(quint8 *p, quint32 &sz); +QVariant unpack_map32(quint8 *p, quint32 &sz); } #endif // MSGPACK_P_H