xmmsv_t * xmmsv_serialize (xmmsv_t *v) { xmmsv_t *bb; if (!v) return NULL; bb = xmmsv_bitbuffer_new (); if (!xmmsv_bitbuffer_serialize_value (bb, v)) { xmmsv_unref (bb); return NULL; } /* this is internally in xmmsv implementation, so we could just switch the type, but thats for later */ return xmmsv_new_bin (xmmsv_bitbuffer_buffer (bb), xmmsv_bitbuffer_len (bb) / 8); }
/** * Try to write message to transport. If full message isn't written * the message will keep track of the amount of data written and not * write already written data next time. * * @returns TRUE if full message was written, FALSE otherwise. * disconnected is set if transport was disconnected */ bool xmms_ipc_msg_write_transport (xmms_ipc_msg_t *msg, xmms_ipc_transport_t *transport, bool *disconnected) { char *buf; unsigned int ret, len; x_return_val_if_fail (msg, false); x_return_val_if_fail (transport, false); xmmsv_bitbuffer_align (msg->bb); len = xmmsv_bitbuffer_len (msg->bb) / 8; x_return_val_if_fail (len > msg->xfered, true); buf = (char *) (xmmsv_bitbuffer_buffer (msg->bb) + msg->xfered); ret = xmms_ipc_transport_write (transport, buf, len - msg->xfered); if (ret == SOCKET_ERROR) { if (xmms_socket_error_recoverable ()) { return false; } if (disconnected) { *disconnected = true; } return false; } else if (!ret) { if (disconnected) { *disconnected = true; } } else { msg->xfered += ret; } return (len == msg->xfered); }