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); }
/** * Try to read message from transport into msg. * * @returns TRUE if message is fully read. */ bool xmms_ipc_msg_read_transport (xmms_ipc_msg_t *msg, xmms_ipc_transport_t *transport, bool *disconnected) { char buf[512]; unsigned int ret, len, rlen; x_return_val_if_fail (msg, false); x_return_val_if_fail (transport, false); while (true) { len = XMMS_IPC_MSG_HEAD_LEN; if (msg->xfered >= XMMS_IPC_MSG_HEAD_LEN) { len += xmms_ipc_msg_get_length (msg); if (msg->xfered == len) { return true; } } x_return_val_if_fail (msg->xfered < len, false); rlen = len - msg->xfered; if (rlen > sizeof (buf)) rlen = sizeof (buf); ret = xmms_ipc_transport_read (transport, buf, rlen); if (ret == SOCKET_ERROR) { if (xmms_socket_error_recoverable ()) { return false; } if (disconnected) { *disconnected = true; } return false; } else if (ret == 0) { if (disconnected) { *disconnected = true; } return false; } else { xmmsv_bitbuffer_goto (msg->bb, msg->xfered * 8); xmmsv_bitbuffer_put_data (msg->bb, (unsigned char *) buf, ret); msg->xfered += ret; xmmsv_bitbuffer_goto (msg->bb, XMMS_IPC_MSG_HEAD_LEN * 8); } } }
xmms_ipc_msg_t * xmms_ipc_msg_alloc (void) { xmms_ipc_msg_t *msg; static unsigned char empty[16] = {0,}; msg = x_new0 (xmms_ipc_msg_t, 1); msg->bb = xmmsv_new_bitbuffer (); xmmsv_bitbuffer_put_data (msg->bb, empty, 16); return msg; }
/** * Return a new value object which is a deep copy of the input value * * @param val #xmmsv_t to copy. * @return 1 the address to the new copy of the value. */ xmmsv_t * xmmsv_copy (xmmsv_t *val) { xmmsv_t *cur_val = NULL; xmmsv_type_t type; int64_t i; const char *s; float f; x_return_val_if_fail (val, 0); type = xmmsv_get_type (val); switch (type) { case XMMSV_TYPE_DICT: cur_val = duplicate_dict_value (val); break; case XMMSV_TYPE_LIST: cur_val = duplicate_list_value (val); break; case XMMSV_TYPE_INT64: xmmsv_get_int (val, &i); cur_val = xmmsv_new_int (i); break; case XMMSV_TYPE_FLOAT: xmmsv_get_float (val, &f); cur_val = xmmsv_new_float (f); break; case XMMSV_TYPE_STRING: xmmsv_get_string (val, &s); cur_val = xmmsv_new_string (s); break; case XMMSV_TYPE_ERROR: xmmsv_get_error (val, &s); cur_val = xmmsv_new_error (s); break; case XMMSV_TYPE_COLL: cur_val = duplicate_coll_value (val); break; case XMMSV_TYPE_BIN: cur_val = xmmsv_new_bin (val->value.bin.data, val->value.bin.len); break; case XMMSV_TYPE_BITBUFFER: cur_val = xmmsv_new_bitbuffer (); xmmsv_bitbuffer_put_data (cur_val, val->value.bit.buf, val->value.bit.len / 8); xmmsv_bitbuffer_goto (cur_val, xmmsv_bitbuffer_pos (val)); break; default: cur_val = xmmsv_new_none (); break; } assert (cur_val); return cur_val; }
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); }