static bool _internal_put_on_bb_string (xmmsv_t *bb, const char *str) { if (!bb) { return false; } if (!str) { return xmmsv_bitbuffer_put_bits (bb, 32, 0); } if (!xmmsv_bitbuffer_put_bits (bb, 32, strlen (str) + 1)) return false; return xmmsv_bitbuffer_put_data (bb, (const unsigned char *) str, strlen (str) + 1); }
static bool _internal_put_on_bb_error (xmmsv_t *bb, const char *errmsg) { if (!bb) { return -1; } if (!errmsg) { return xmmsv_bitbuffer_put_bits (bb, 32, 0); } if (!xmmsv_bitbuffer_put_bits (bb, 32, strlen (errmsg) + 1)) return false; return xmmsv_bitbuffer_put_data (bb, (const unsigned char *) errmsg, strlen (errmsg) + 1); }
static bool _internal_put_on_bb_value_dict (xmmsv_t *bb, xmmsv_t *v) { xmmsv_dict_iter_t *it; const char *key; xmmsv_t *entry; uint32_t ret, offset, count; if (!xmmsv_get_dict_iter (v, &it)) { return false; } /* store a dummy value, store the real count once it's known */ offset = xmmsv_bitbuffer_pos (bb); xmmsv_bitbuffer_put_bits (bb, 32, 0); count = 0; while (xmmsv_dict_iter_valid (it)) { xmmsv_dict_iter_pair (it, &key, &entry); ret = _internal_put_on_bb_string (bb, key); ret = xmmsv_bitbuffer_serialize_value (bb, entry); xmmsv_dict_iter_next (it); count++; } /* overwrite with real size */ xmmsv_bitbuffer_put_bits_at (bb, 32, count, offset); return ret; }
void xmms_ipc_msg_set_cookie (xmms_ipc_msg_t *msg, uint32_t cookie) { xmmsv_bitbuffer_goto (msg->bb, 8 * 8); xmmsv_bitbuffer_put_bits (msg->bb, 32, cookie); xmmsv_bitbuffer_end (msg->bb); }
static bool _internal_put_on_bb_value_list (xmmsv_t *bb, xmmsv_t *v) { xmmsv_list_iter_t *it; xmmsv_t *entry; uint32_t offset, count; bool ret = true; if (!xmmsv_get_list_iter (v, &it)) { return false; } /* store a dummy value, store the real count once it's known */ offset = xmmsv_bitbuffer_pos (bb); xmmsv_bitbuffer_put_bits (bb, 32, 0); count = 0; while (xmmsv_list_iter_valid (it)) { xmmsv_list_iter_entry (it, &entry); ret = xmmsv_bitbuffer_serialize_value (bb, entry); xmmsv_list_iter_next (it); count++; } /* overwrite with real size */ xmmsv_bitbuffer_put_bits_at (bb, 32, count, offset); return ret; }
static void _internal_store_on_bb_uint32 (xmmsv_t *bb, uint32_t offset, uint32_t v) { xmmsv_bitbuffer_goto (bb, offset); xmmsv_bitbuffer_put_bits (bb, 32, v); xmmsv_bitbuffer_end (bb); }
static void xmms_ipc_msg_set_cmd (xmms_ipc_msg_t *msg, uint32_t cmd) { x_return_if_fail (msg); xmmsv_bitbuffer_goto (msg->bb, 4 * 8); xmmsv_bitbuffer_put_bits (msg->bb, 32, cmd); xmmsv_bitbuffer_end (msg->bb); }
static void xmms_ipc_msg_set_object (xmms_ipc_msg_t *msg, uint32_t object) { x_return_if_fail (msg); xmmsv_bitbuffer_goto (msg->bb, 0); xmmsv_bitbuffer_put_bits (msg->bb, 32, object); xmmsv_bitbuffer_end (msg->bb); }
static bool _internal_put_on_bb_bin (xmmsv_t *bb, const unsigned char *data, unsigned int len) { if (!xmmsv_bitbuffer_put_bits (bb, 32, len)) return false; return xmmsv_bitbuffer_put_data (bb, data, len); }
static void xmms_ipc_msg_update_length (xmmsv_t *bb) { int len; len = xmmsv_bitbuffer_len (bb); len /= 8; len -= XMMS_IPC_MSG_HEAD_LEN; xmmsv_bitbuffer_goto (bb, 12*8); xmmsv_bitbuffer_put_bits (bb, 32, len); xmmsv_bitbuffer_end (bb); }
static bool _internal_put_on_bb_int32 (xmmsv_t *bb, int32_t v) { return xmmsv_bitbuffer_put_bits (bb, 32, v); }
static bool _internal_put_on_bb_collection (xmmsv_t *bb, xmmsv_coll_t *coll) { xmmsv_list_iter_t *it; xmmsv_t *v, *attrs; int n; uint32_t ret; int32_t entry; xmmsv_coll_t *op; if (!bb || !coll) { return false; } /* push type */ if (!xmmsv_bitbuffer_put_bits (bb, 32, xmmsv_coll_get_type (coll))) return false; /* attribute counter and values */ attrs = xmmsv_coll_attributes_get (coll); n = 0; xmmsv_dict_foreach (attrs, _internal_put_on_bb_count_coll_attr, &n); if (!xmmsv_bitbuffer_put_bits (bb, 32, n)) return false; /* needs error checking! */ xmmsv_dict_foreach (attrs, _internal_put_on_bb_append_coll_attr, bb); attrs = NULL; /* no unref needed. */ /* idlist counter and content */ xmmsv_bitbuffer_put_bits (bb, 32, xmmsv_coll_idlist_get_size (coll)); xmmsv_get_list_iter (xmmsv_coll_idlist_get (coll), &it); for (xmmsv_list_iter_first (it); xmmsv_list_iter_valid (it); xmmsv_list_iter_next (it)) { if (!xmmsv_list_iter_entry_int (it, &entry)) { x_api_error ("Non integer in idlist", 0); } xmmsv_bitbuffer_put_bits (bb, 32, entry); } xmmsv_list_iter_explicit_destroy (it); /* operands counter and objects */ n = 0; if (xmmsv_coll_get_type (coll) != XMMS_COLLECTION_TYPE_REFERENCE) { n = xmmsv_list_get_size (xmmsv_coll_operands_get (coll)); } ret = xmmsv_bitbuffer_pos (bb); xmmsv_bitbuffer_put_bits (bb, 32, n); if (n > 0) { xmmsv_get_list_iter (xmmsv_coll_operands_get (coll), &it); while (xmmsv_list_iter_entry (it, &v)) { if (!xmmsv_get_coll (v, &op)) { x_api_error ("Non collection operand", 0); } _internal_put_on_bb_int32 (bb, XMMSV_TYPE_COLL); ret = _internal_put_on_bb_collection (bb, op); xmmsv_list_iter_next (it); } } return ret; }