From c8b826c6a0a7966b7ef11b398cde2d01b85c6cfe Mon Sep 17 00:00:00 2001 From: Anton Dutov Date: Mon, 29 Jun 2015 01:19:10 +0500 Subject: [PATCH 1/2] Unpack nil fix --- src/private/unpack_p.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/private/unpack_p.cpp b/src/private/unpack_p.cpp index 511bd4a..aafa0c1 100644 --- a/src/private/unpack_p.cpp +++ b/src/private/unpack_p.cpp @@ -63,7 +63,7 @@ quint8 *MsgPackPrivate::unpack_type(QVariant &v, quint8 *p) quint8 * MsgPackPrivate::unpack_nil(QVariant &v, quint8 *p) { Q_UNUSED(p) - Q_UNUSED(v) + v = QVariant(); return p + 1; } From deac492817c38dec64523fed92db43d054055ec9 Mon Sep 17 00:00:00 2001 From: Anton Dutov Date: Mon, 29 Jun 2015 01:33:48 +0500 Subject: [PATCH 2/2] Nil packer and unittests pack/unpack for nil --- src/private/pack_p.cpp | 12 +++++++++++- src/private/pack_p.h | 1 + tests/pack/pack_test.cpp | 9 +++++++++ tests/unpack/unpack_test.cpp | 8 ++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/private/pack_p.cpp b/src/private/pack_p.cpp index 7e759d1..382b541 100644 --- a/src/private/pack_p.cpp +++ b/src/private/pack_p.cpp @@ -15,7 +15,10 @@ bool MsgPackPrivate::compatibilityMode = false; quint8 *MsgPackPrivate::pack(const QVariant &v, quint8 *p, bool wr) { QMetaType::Type t = (QMetaType::Type)v.type(); - if (t == QMetaType::Int) + + if (v.isNull()) + p = pack_nil(p, wr); + else if (t == QMetaType::Int) p = pack_int(v.toInt(), p, wr); else if (t == QMetaType::UInt) p = pack_uint(v.toUInt(), p, wr); @@ -47,6 +50,13 @@ quint8 *MsgPackPrivate::pack(const QVariant &v, quint8 *p, bool wr) return p; } +quint8 *MsgPackPrivate::pack_nil(quint8 *p, bool wr) +{ + if (wr) + *p = 0xc0; + return p + 1; +} + quint8 *MsgPackPrivate::pack_int(qint32 i, quint8 *p, bool wr) { if (i >= -32 && i <= 127) { diff --git a/src/private/pack_p.h b/src/private/pack_p.h index b29f971..6d12f53 100644 --- a/src/private/pack_p.h +++ b/src/private/pack_p.h @@ -23,6 +23,7 @@ extern bool compatibilityMode; quint8 * pack(const QVariant &v, quint8 *p, bool wr); +quint8 * pack_nil(quint8 *p, bool wr); quint8 * pack_int(qint32 i, quint8 *p, bool wr); quint8 * pack_uint(quint32 i, quint8 *p, bool wr); quint8 * pack_longlong(qint64 i, quint8 *p, bool wr); diff --git a/tests/pack/pack_test.cpp b/tests/pack/pack_test.cpp index 70b2963..5c208ba 100644 --- a/tests/pack/pack_test.cpp +++ b/tests/pack/pack_test.cpp @@ -9,6 +9,7 @@ class PackTest : public QObject Q_OBJECT private Q_SLOTS: + void test_nil(); void test_bool(); void test_fixint(); void test_integer8(); @@ -21,6 +22,14 @@ private Q_SLOTS: void test_array(); }; +void PackTest::test_nil() +{ + QByteArray arr = MsgPack::pack(QVariant()); + quint8 *p = (quint8 *)arr.data(); + QVERIFY(arr.size() == 1); + QVERIFY(p[0] == 0xc0); +} + void PackTest::test_bool() { QByteArray arr = MsgPack::pack(false); diff --git a/tests/unpack/unpack_test.cpp b/tests/unpack/unpack_test.cpp index 10e8c48..02c91ab 100644 --- a/tests/unpack/unpack_test.cpp +++ b/tests/unpack/unpack_test.cpp @@ -9,6 +9,7 @@ class UnpackTest : public QObject Q_OBJECT private Q_SLOTS: + void test_nil(); void test_booleans(); void test_integers(); void test_floats(); @@ -17,6 +18,13 @@ private Q_SLOTS: void test_array(); }; +void UnpackTest::test_nil() +{ + QByteArray pack = MsgPack::pack(QVariantList() << true << QVariant()); + QVariantList u = MsgPack::unpack(pack).toList(); + QVERIFY(u[0] == true); + QVERIFY(u[1].isNull()); +} void UnpackTest::test_booleans() {