mirror of
https://github.com/romixlab/qmsgpack.git
synced 2025-07-29 18:07:16 +02:00
ExtHelpers added
This commit is contained in:
138
src/msgpack.cpp
138
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -11,6 +11,7 @@
|
||||
#define NO_QTGUI_WARNING "Library built without QtGui, hence some types are not available"
|
||||
|
||||
#include <QTime>
|
||||
#include <QPoint>
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user