static int xmmsc_deserialize_list (xmmsv_t *bb, xmmsv_t **val) { xmmsv_t *list; int32_t len; list = xmmsv_new_list (); if (!_internal_get_from_bb_int32_positive (bb, &len)) { goto err; } while (len--) { xmmsv_t *v; if (xmmsv_bitbuffer_deserialize_value (bb, &v)) { xmmsv_list_append (list, v); } else { goto err; } xmmsv_unref (v); } *val = list; return true; err: x_internal_error ("Message from server did not parse correctly!"); xmmsv_unref (list); return false; }
static int xmmsc_deserialize_dict (xmmsv_t *bb, xmmsv_t **val) { xmmsv_t *dict; int32_t len; unsigned int ignore; char *key; dict = xmmsv_new_dict (); if (!_internal_get_from_bb_int32_positive (bb, &len)) { goto err; } while (len--) { xmmsv_t *v; if (!_internal_get_from_bb_string_alloc (bb, &key, &ignore)) { goto err; } if (!xmmsv_bitbuffer_deserialize_value (bb, &v)) { free (key); goto err; } xmmsv_dict_set (dict, key, v); free (key); xmmsv_unref (v); } *val = dict; return true; err: x_internal_error ("Message from server did not parse correctly!"); xmmsv_unref (dict); return false; }
xmmsv_t * xmmsv_deserialize (xmmsv_t *v) { xmmsv_t *bb; xmmsv_t *res; const unsigned char *data; uint32_t len; if (!xmmsv_get_bin (v, &data, &len)) return NULL; bb = xmmsv_bitbuffer_new_ro (data, len); if (!xmmsv_bitbuffer_deserialize_value (bb, &res)) { xmmsv_unref (bb); return NULL; } xmmsv_unref (bb); return res; }
bool xmms_ipc_msg_get_value (xmms_ipc_msg_t *msg, xmmsv_t **val) { return xmmsv_bitbuffer_deserialize_value (msg->bb, val); }