xmmsc_result_t * xmmsc_visualization_init (xmmsc_connection_t *c) { xmmsc_result_t *res = NULL; x_check_conn (c, 0); c->visc++; c->visv = realloc (c->visv, sizeof (xmmsc_visualization_t*) * c->visc); if (!c->visv) { x_oom (); c->visc = 0; } if (c->visc > 0) { int vv = c->visc-1; if (!(c->visv[vv] = x_new0 (xmmsc_visualization_t, 1))) { x_oom (); } else { c->visv[vv]->idx = vv; c->visv[vv]->state = VIS_NEW; res = xmmsc_send_msg_no_arg (c, XMMS_IPC_OBJECT_VISUALIZATION, XMMS_IPC_CMD_VISUALIZATION_REGISTER); if (res) { xmmsc_result_visc_set (res, c->visv[vv]); } } } return res; }
/** * Create a new argument for a method. * * @param name The name of the argument. Must not be NULL. * @param docstring The docstring of the argument. * @param type The expected type of the argument. Use XMMSV_TYPE_NONE to * accept any type. XMMSV_TYPE_ERROR is reserved and should not be used. * @param default_value Value to set this argument to if it's missing in the * method call. Implies that the argument is optional. If NULL, the argument * is not optional. */ xmmsv_t * xmmsv_sc_argument_new (const char *name, const char *docstring, xmmsv_type_t type, xmmsv_t *default_value) { xmmsv_t *arg; x_api_error_if (!name, "with NULL name.", NULL); x_api_error_if (type == XMMSV_TYPE_ERROR, "with ERROR type.", NULL); x_api_error_if (default_value && type != XMMSV_TYPE_NONE && xmmsv_get_type (default_value) != type, "with wrong type for default value.", NULL); arg = xmmsv_new_dict (); if (!arg) { x_oom (); return NULL; } xmmsv_dict_set_string (arg, "name", name); xmmsv_dict_set_int (arg, "type", type); if (docstring) { xmmsv_dict_set_string (arg, "docstring", docstring); } if (default_value) { xmmsv_dict_set (arg, "default_value", default_value); } return arg; }
/** * Allocate a new collection of the given type. * The pointer will have to be deallocated using #xmmsv_coll_unref. * * @param type the #xmmsv_coll_type_t specifying the type of collection to create. * @return a pointer to the newly created collection, or NULL if the type is invalid. */ static xmmsv_coll_internal_t* _xmmsv_coll_new (xmmsv_coll_type_t type) { xmmsv_coll_internal_t *coll; x_return_val_if_fail (type <= XMMS_COLLECTION_TYPE_LAST, NULL); coll = x_new0 (xmmsv_coll_internal_t, 1); if (!coll) { x_oom (); return NULL; } coll->type = type; coll->idlist = xmmsv_new_list (); xmmsv_list_restrict_type (coll->idlist, XMMSV_TYPE_INT64); coll->operands = xmmsv_new_list (); xmmsv_list_restrict_type (coll->operands, XMMSV_TYPE_COLL); coll->attributes = xmmsv_new_dict (); return coll; }
/** * Decode an URL-encoded string. * * Some strings (currently only the url of media) has no known * encoding, and must be encoded in an UTF-8 clean way. This is done * similar to the url encoding web browsers do. This functions decodes * a string encoded in that way. OBSERVE that the decoded string HAS * NO KNOWN ENCODING and you cannot display it on screen in a 100% * guaranteed correct way (a good heuristic is to try to validate the * decoded string as UTF-8, and if it validates assume that it is an * UTF-8 encoded string, and otherwise fall back to some other * encoding). * * Do not use this function if you don't understand the * implications. The best thing is not to try to display the url at * all. * * Note that the fact that the string has NO KNOWN ENCODING and CAN * NOT BE DISPLAYED does not stop you from open the file if it is a * local file (if it starts with "file://"). * * @param url the #xmmsv_t containing a url-encoded string * @return a new #xmmsv_t containing the decoded string as a XMMSV_BIN or NULL on failure * */ xmmsv_t * xmmsv_decode_url (const xmmsv_t *inv) { int i = 0, j = 0; const char *ins; unsigned char *url; xmmsv_t *ret; if (!xmmsv_get_string (inv, &ins)) { return NULL; } url = x_malloc (strlen (ins)); if (!url) { x_oom (); return NULL; } while (ins[i]) { unsigned char chr = ins[i++]; if (chr == '+') { chr = ' '; } else if (chr == '%') { char ts[3]; char *t; ts[0] = ins[i++]; if (!ts[0]) goto err; ts[1] = ins[i++]; if (!ts[1]) goto err; ts[2] = '\0'; chr = strtoul (ts, &t, 16); if (t != &ts[2]) goto err; } url[j++] = chr; } ret = xmmsv_new_bin (url, j); free (url); return ret; err: free (url); return NULL; }