From 6d04bc66c60bbecbb9118ea24e906a8d00106a0e Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 15 Apr 2015 22:59:59 +0300 Subject: [PATCH] ExtHelpers added --- src/msgpack.cpp | 138 +++++++++++++++++++++++++++++++++++++ src/msgpack.h | 15 +++- src/msgpack_common.h | 2 +- src/msgpack_common.h.in | 2 +- src/private/qt_types_p.cpp | 3 +- src/private/unpack_p.cpp | 2 +- 6 files changed, 157 insertions(+), 5 deletions(-) diff --git a/src/msgpack.cpp b/src/msgpack.cpp index 0ab84cd..fed3bba 100644 --- a/src/msgpack.cpp +++ b/src/msgpack.cpp @@ -3,6 +3,7 @@ #include "private/unpack_p.h" #include "private/pack_p.h" #include "private/qt_types_p.h" +#include "private/sysdep.h" QVariant MsgPack::unpack(const QByteArray &data) { @@ -45,3 +46,140 @@ void MsgPack::setCompatibilityModeEnabled(bool enabled) { MsgPackPrivate::compatibilityMode = enabled; } + +quint8 * MsgPack::ExtHelpers::unpack_upto_quint8(quint8 *to, quint8 *p, bool *success) +{ + if (*p <= MsgPack::FirstByte::POSITIVE_FIXINT) { + *to = *(p++); + } else if (*p == MsgPack::FirstByte::UINT8) { + *to = *(++p); + } else { + *success = false; + return p; + } + *success = true; + return p; +} + +quint8 *MsgPack::ExtHelpers::unpack_upto_quint16(quint16 *to, quint8 *p, bool *success) +{ + if (*p == MsgPack::FirstByte::UINT16) { + *to = _msgpack_load16(quint16, p); + *success = true; + return p + 2; + } else { + quint8 u8; + p = unpack_upto_quint8(&u8, p, success); + *to = u8; + return p; + } +} + +quint8 *MsgPack::ExtHelpers::unpack_upto_quint32(quint32 *to, quint8 *p, bool *success) +{ + if (*p == MsgPack::FirstByte::UINT32) { + *to = _msgpack_load32(quint32, p); + *success = true; + return p + 4; + } else { + quint16 u16; + p = unpack_upto_quint16(&u16, p, success); + *to = u16; + return p; + } +} + +quint8 *MsgPack::ExtHelpers::unpack_upto_quint64(quint64 *to, quint8 *p, bool *success) +{ + if (*p == MsgPack::FirstByte::UINT64) { + *to = _msgpack_load64(quint64, p); + *success = true; + return p + 8; + } else { + quint32 u32; + p = unpack_upto_quint32(&u32, p, success); + *to = u32; + return p; + } +} + +quint8 *MsgPack::ExtHelpers::unpack_upto_qint8(qint8 *to, quint8 *p, bool *success) +{ + if (*p >= MsgPack::FirstByte::NEGATIVE_FIXINT) { + *to = *p; + *success = true; + return p + 1; + } else if (*p == MsgPack::FirstByte::INT8) { + *to = (qint8) *(++p); + *success = true; + return p + 1; + } else { + quint8 u8; + p = unpack_upto_quint8(&u8, p, success); + *to = u8; + return p; + } +} + +quint8 *MsgPack::ExtHelpers::unpack_upto_qint16(qint16 *to, quint8 *p, bool *success) +{ + if (*p == MsgPack::FirstByte::INT16) { + *to = _msgpack_load16(qint16, p); + *success = true; + return p + 2; + } else { + qint8 i8; + p = unpack_upto_qint8(&i8, p, success); + *to = i8; + if (*success) { + return p; + } else { + quint16 u16; + p = unpack_upto_quint16(&u16, p, success); + *to = u16; + return p; + } + } +} + +quint8 *MsgPack::ExtHelpers::unpack_upto_qint32(qint32 *to, quint8 *p, bool *success) +{ + if(*p == MsgPack::FirstByte::INT32) { + *to = _msgpack_load32(qint32, p); + *success = true; + return p + 4; + } else { + qint16 i16; + p = unpack_upto_qint16(&i16, p, success); + *to = i16; + if (*success) { + return p; + } else { + quint32 u32; + p = unpack_upto_quint32(&u32, p, success); + *to = u32; + return p; + } + } +} + +quint8 *MsgPack::ExtHelpers::unpack_upto_qint64(qint64 *to, quint8 *p, bool *success) +{ + if(*p == MsgPack::FirstByte::INT64) { + *to = _msgpack_load64(qint64, p); + *success = true; + return p + 8; + } else { + qint32 i32; + p = unpack_upto_qint32(&i32, p, success); + *to = i32; + if (*success) { + return p; + } else { + quint64 u64; + p = unpack_upto_quint64(&u64, p, success); + *to = u64; + return p; + } + } +} diff --git a/src/msgpack.h b/src/msgpack.h index ba95663..e90cc44 100644 --- a/src/msgpack.h +++ b/src/msgpack.h @@ -18,6 +18,19 @@ namespace MsgPack MSGPACK_EXPORT bool registerType(QMetaType::Type qType, quint8 msgpackType); MSGPACK_EXPORT void setCompatibilityModeEnabled(bool enabled); -} + + namespace ExtHelpers { + quint8 * unpack_upto_quint8(quint8 *to, quint8 *from, bool *success); + quint8 * unpack_upto_quint16(quint16 *to, quint8 *from, bool *success); + quint8 * unpack_upto_quint32(quint32 *to, quint8 *from, bool *success); + quint8 * unpack_upto_quint64(quint64 *to, quint8 *from, bool *success); + quint8 * unpack_upto_qint8(qint8 *to, quint8 *from, bool *success); + quint8 * unpack_upto_qint16(qint16 *to, quint8 *from, bool *success); + quint8 * unpack_upto_qint32(qint32 *to, quint8 *from, bool *success); + quint8 * unpack_upto_qint64(qint64 *to, quint8 *from, bool *success); + quint8 * unpack_float(float *to, quint8 *from, bool *success); + quint8 * unpack_double(double *to, quint8 *from, bool *success); + } // ExtHelpers +} // MsgPack #endif // MSGPACK_H diff --git a/src/msgpack_common.h b/src/msgpack_common.h index 7311e7a..bb36a16 100644 --- a/src/msgpack_common.h +++ b/src/msgpack_common.h @@ -30,7 +30,7 @@ QString version(); * From Message Pack spec */ namespace FirstByte { -const quint8 POSITIVE_FIXINT = 0x00; +const quint8 POSITIVE_FIXINT = 0x7f; const quint8 FIXMAP = 0x80; const quint8 FIXARRAY = 0x90; const quint8 FIXSTR = 0xa0; diff --git a/src/msgpack_common.h.in b/src/msgpack_common.h.in index fbf906d..af55f1f 100644 --- a/src/msgpack_common.h.in +++ b/src/msgpack_common.h.in @@ -30,7 +30,7 @@ QString version(); * From Message Pack spec */ namespace FirstByte { -const quint8 POSITIVE_FIXINT = 0x00; +const quint8 POSITIVE_FIXINT = 0x7f; const quint8 FIXMAP = 0x80; const quint8 FIXARRAY = 0x90; const quint8 FIXSTR = 0xa0; diff --git a/src/private/qt_types_p.cpp b/src/private/qt_types_p.cpp index 67b6a0d..6c550b4 100644 --- a/src/private/qt_types_p.cpp +++ b/src/private/qt_types_p.cpp @@ -11,6 +11,7 @@ #define NO_QTGUI_WARNING "Library built without QtGui, hence some types are not available" #include +#include bool MsgPackPrivate::register_qtype(QMetaType::Type q_type, quint8 msgpack_type) { @@ -156,4 +157,4 @@ QVariant MsgPackPrivate::unpack_qpoint(const QByteArray &data) QVariant v; p = (MsgPackPrivate::unpackers[*p - 0xc0])(v, p); -} \ No newline at end of file +} diff --git a/src/private/unpack_p.cpp b/src/private/unpack_p.cpp index 4570b3d..6a09c48 100644 --- a/src/private/unpack_p.cpp +++ b/src/private/unpack_p.cpp @@ -147,7 +147,7 @@ quint8 * MsgPackPrivate::unpack_int16(QVariant &v, quint8 *p) quint8 * MsgPackPrivate::unpack_int32(QVariant &v, quint8 *p) { p++; - v = _msgpack_load32(quint32, p); + v = _msgpack_load32(qint32, p); return p + 4; }