22 #include "xmmsclientpriv/xmmsclient_util.h"
24 static bool _internal_put_on_bb_bin (
xmmsv_t *bb,
const unsigned char *data,
unsigned int len);
25 static bool _internal_put_on_bb_error (
xmmsv_t *bb,
const char *errmsg);
26 static bool _internal_put_on_bb_int32 (
xmmsv_t *bb, int32_t v);
27 static bool _internal_put_on_bb_string (
xmmsv_t *bb,
const char *str);
29 static bool _internal_put_on_bb_value_list (
xmmsv_t *bb,
xmmsv_t *v);
30 static bool _internal_put_on_bb_value_dict (
xmmsv_t *bb,
xmmsv_t *v);
32 static bool _internal_get_from_bb_error_alloc (
xmmsv_t *bb,
char **buf,
unsigned int *len);
33 static bool _internal_get_from_bb_int32 (
xmmsv_t *bb, int32_t *v);
34 static bool _internal_get_from_bb_int32_positive (
xmmsv_t *bb, int32_t *v);
35 static bool _internal_get_from_bb_string_alloc (
xmmsv_t *bb,
char **buf,
unsigned int *len);
37 static bool _internal_get_from_bb_bin_alloc (
xmmsv_t *bb,
unsigned char **buf,
unsigned int *len);
43 _internal_put_on_bb_append_coll_attr (
const char *key,
xmmsv_t *value,
void *userdata)
52 _internal_put_on_bb_string (bb, key);
53 _internal_put_on_bb_string (bb, s);
57 _internal_put_on_bb_count_coll_attr (
const char *key,
xmmsv_t *value,
void *userdata)
59 int *n = (
int *)userdata;
64 _internal_put_on_bb_bin (
xmmsv_t *bb,
65 const unsigned char *data,
75 _internal_put_on_bb_error (
xmmsv_t *bb,
const char *errmsg)
92 _internal_put_on_bb_int32 (
xmmsv_t *bb, int32_t v)
98 _internal_put_on_bb_string (
xmmsv_t *bb,
const char *str)
154 x_api_error (
"Non integer in idlist", 0);
174 x_api_error (
"Non collection operand", 0);
179 ret = _internal_put_on_bb_collection (bb, op);
192 uint32_t offset, count;
223 uint32_t ret, offset, count;
236 ret = _internal_put_on_bb_string (bb, key);
249 _internal_get_from_bb_data (
xmmsv_t *bb,
void *buf,
unsigned int len)
258 _internal_get_from_bb_error_alloc (
xmmsv_t *bb,
char **buf,
262 return _internal_get_from_bb_string_alloc (bb, buf, len);
266 _internal_get_from_bb_int32 (
xmmsv_t *bb, int32_t *v)
272 _internal_get_from_bb_int32_positive (
xmmsv_t *bb, int32_t *v)
275 ret = _internal_get_from_bb_int32 (bb, v);
281 _internal_get_from_bb_string_alloc (
xmmsv_t *bb,
char **buf,
287 if (!_internal_get_from_bb_int32_positive (bb, &l)) {
296 if (!_internal_get_from_bb_data (bb, str, l)) {
310 _internal_get_from_bb_bin_alloc (
xmmsv_t *bb,
317 if (!_internal_get_from_bb_int32_positive (bb, &l)) {
326 if (!_internal_get_from_bb_data (bb, b, l)) {
344 int32_t *idlist = NULL;
348 if (!_internal_get_from_bb_int32_positive (bb, &type)) {
355 if (!_internal_get_from_bb_int32_positive (bb, &n_items)) {
359 for (i = 0; i < n_items; i++) {
361 if (!_internal_get_from_bb_string_alloc (bb, &key, &len)) {
364 if (!_internal_get_from_bb_string_alloc (bb, &val, &len)) {
375 if (!_internal_get_from_bb_int32_positive (bb, &n_items)) {
379 if (!(idlist =
x_new (int32_t, n_items + 1))) {
383 for (i = 0; i < n_items; i++) {
384 if (!_internal_get_from_bb_int32 (bb, &
id)) {
397 if (!_internal_get_from_bb_int32_positive (bb, &n_items)) {
401 for (i = 0; i < n_items; i++) {
404 if (!_internal_get_from_bb_int32_positive (bb, &type) ||
406 !_internal_get_from_bb_collection_alloc (bb, &operand)) {
417 if (idlist != NULL) {
437 if (!_internal_get_from_bb_int32_positive (bb, &len)) {
444 if (!_internal_get_from_bb_string_alloc (bb, &key, &ignore)) {
463 x_internal_error (
"Message from server did not parse correctly!");
476 if (!_internal_get_from_bb_int32_positive (bb, &len)) {
495 x_internal_error (
"Message from server did not parse correctly!");
512 if (!_internal_get_from_bb_error_alloc (bb, &s, &len)) {
519 if (!_internal_get_from_bb_int32 (bb, &i)) {
525 if (!_internal_get_from_bb_string_alloc (bb, &s, &len)) {
532 if (!xmmsc_deserialize_dict (bb, val)) {
538 if (!xmmsc_deserialize_list (bb, val)) {
544 if (!_internal_get_from_bb_collection_alloc (bb, &c)) {
552 if (!_internal_get_from_bb_bin_alloc (bb, &d, &len)) {
563 x_internal_error (
"Got message of unknown type!");
579 const unsigned char *bc;
584 ret = _internal_put_on_bb_int32 (bb, type);
593 ret = _internal_put_on_bb_error (bb, s);
599 ret = _internal_put_on_bb_int32 (bb, i);
605 ret = _internal_put_on_bb_string (bb, s);
611 ret = _internal_put_on_bb_collection (bb, c);
617 ret = _internal_put_on_bb_bin (bb, bc, bl);
620 ret = _internal_put_on_bb_value_list (bb, v);
623 ret = _internal_put_on_bb_value_dict (bb, v);
629 x_internal_error (
"Tried to serialize value of unsupported type");
641 if (!_internal_get_from_bb_int32 (bb, &type)) {
645 return _internal_get_from_bb_value_of_type_alloc (bb, type, val);
677 const unsigned char *data;