/// nil: /// +--------+ /// | 0xc0 | /// +--------+ TEST(MsgpackTest, nil) { unsigned char buf[256]={0}; refrange::mutable_range r(buf, buf+256); // packing auto p=refrange::msgpack::create_packer(r); p.pack_nil(); // check ASSERT_EQ(1, p.size()); EXPECT_EQ(0xc0, buf[0]); }
int message_serialize_response(struct message_response *res, msgpack_packer *pk) { if (!pk || !res) return (-1); msgpack_pack_array(pk, 4); pack_uint8(pk, MESSAGE_TYPE_RESPONSE); pack_uint32(pk, res->msgid); pack_nil(pk); if (pack_params(pk, res->params) == -1) return (-1); return (0); }
quint8 *MsgPackPrivate::pack(const QVariant &v, quint8 *p, bool wr, QVector<QByteArray> &user_data) { QMetaType::Type t = (QMetaType::Type)v.type(); if (v.isNull() && !v.isValid()) 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); else if (t == QMetaType::Bool) p = pack_bool(v, p, wr); else if (t == QMetaType::QString) p = pack_string(v.toString(), p, wr); else if (t == QMetaType::QVariantList) p = pack_array(v.toList(), p, wr, user_data); else if (t == QMetaType::QStringList) p = pack_stringlist(v.toStringList(), p, wr); else if (t == QMetaType::LongLong) p = pack_longlong(v.toLongLong(), p, wr); else if (t == QMetaType::ULongLong) p = pack_ulonglong(v.toULongLong(), p, wr); else if (t == QMetaType::Double) p = pack_double(v.toDouble(), p, wr); else if (t == QMetaType::Float) p = pack_float(v.toFloat(), p, wr); else if (t == QMetaType::QByteArray) p = pack_bin(v.toByteArray(), p, wr); else if (t == QMetaType::QVariantMap) p = pack_map(v.toMap(), p, wr, user_data); else { if (t == QMetaType::User) t = (QMetaType::Type)v.userType(); QReadLocker locker(&packers_lock); bool has_packer = user_packers.contains(t); if (has_packer) has_packer &= user_packers[t].packer != 0; locker.unlock(); if (has_packer) p = pack_user(v, p, wr, user_data); else qWarning() << "MsgPack::pack can't pack type:" << t; } return p; }
int message_serialize_error_response(msgpack_packer *pk, struct api_error *api_error, uint32_t msgid) { struct message_object *err_data; array err_array; if (!pk || !api_error || !api_error->isset) return (-1); msgpack_pack_array(pk, 4); pack_uint8(pk, MESSAGE_TYPE_RESPONSE); pack_uint32(pk, msgid); err_array.size = 2; err_array.obj = CALLOC(2, struct message_object); if (!err_array.obj) { LOG_WARNING("Couldn't allocate memory for err_array object"); return (-1); } err_data = &err_array.obj[0]; err_data->type = OBJECT_TYPE_INT; err_data->data.integer = api_error->type; err_data = &err_array.obj[1]; err_data->type = OBJECT_TYPE_STR; err_data->data.string = cstring_to_string(api_error->msg); if (!err_data->data.string.str) { LOG_WARNING("Couldn't allocate memory for string in err_array object"); return (-1); } if (pack_params(pk, err_array) == -1) return (-1); pack_nil(pk); FREE(err_array.obj); return (0); }