static int32_t xmms_visualization_client_set_properties (xmms_visualization_t *vis, int32_t id, xmmsv_t* prop, xmms_error_t *err) { xmms_vis_client_t *c; xmmsv_dict_iter_t *it; const gchar *key, *valstr; xmmsv_t *value; x_fetch_client (id); if (!xmmsv_get_type (prop) == XMMSV_TYPE_DICT) { xmms_error_set (err, XMMS_ERROR_INVAL, "properties must be sent as a dict!"); } else { /* record every pair */ xmmsv_get_dict_iter (prop, &it); while (xmmsv_dict_iter_valid (it)) { if (!xmmsv_dict_iter_pair (it, &key, &value)) { xmms_error_set (err, XMMS_ERROR_INVAL, "key-value property pair could not be read!"); } else if (!xmmsv_get_string (value, &valstr)) { xmms_error_set (err, XMMS_ERROR_INVAL, "property value could not be read!"); } else if (!property_set (&c->prop, key, valstr)) { xmms_error_set (err, XMMS_ERROR_INVAL, "property could not be set!"); } xmmsv_dict_iter_next (it); } /* TODO: propagate new format to xform! */ } x_release_client (); return (++c->format); }
static int32_t xmms_visualization_client_set_property (xmms_visualization_t *vis, int32_t id, const gchar* key, const gchar* value, xmms_error_t *err) { xmms_vis_client_t *c; x_fetch_client (id); if (!property_set (&c->prop, key, value)) { xmms_error_set (err, XMMS_ERROR_INVAL, "property could not be set!"); } x_release_client (); /* the format identifier (between client and server) changes. so the client can recognize the first packet which is built using the new format according to the newly set property */ return (++c->format); }
int32_t init_udp (xmms_visualization_t *vis, int32_t id, xmms_error_t *err) { // TODO: we need the currently used port, not only the default one! */ int32_t port = XMMS_DEFAULT_TCP_PORT; xmms_vis_client_t *c; // setup socket if needed if (!xmms_socket_valid (vis->socket)) { struct addrinfo hints; struct addrinfo *result, *rp; int s; memset (&hints, 0, sizeof (hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; hints.ai_protocol = 0; if ((s = getaddrinfo (NULL, G_STRINGIFY (XMMS_DEFAULT_TCP_PORT), &hints, &result)) != 0) { xmms_log_error ("Could not setup socket! getaddrinfo: %s", gai_strerror (s)); xmms_error_set (err, XMMS_ERROR_NO_SAUSAGE, "Could not setup socket!"); return -1; } for (rp = result; rp != NULL; rp = rp->ai_next) { vis->socket = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (!xmms_socket_valid (vis->socket)) { continue; } if (bind (vis->socket, rp->ai_addr, rp->ai_addrlen) != -1) { break; } else { close (vis->socket); } } if (rp == NULL) { xmms_log_error ("Could not bind socket!"); xmms_error_set (err, XMMS_ERROR_NO_SAUSAGE, "Could not bind socket!"); freeaddrinfo (result); return -1; } freeaddrinfo (result); /* register into mainloop: */ /* perhaps needed, perhaps not .. #ifdef __WIN32__ vis->socketio = g_io_channel_win32_new_socket (vis->socket); #else */ vis->socketio = g_io_channel_unix_new (vis->socket); /*#endif */ g_io_channel_set_encoding (vis->socketio, NULL, NULL); g_io_channel_set_buffered (vis->socketio, FALSE); g_io_add_watch (vis->socketio, G_IO_IN, (GIOFunc) udpwatcher, vis); } /* set up client structure */ x_fetch_client (id); c->type = VIS_UDP; memset (&c->transport.udp.addr, 0, sizeof (c->transport.udp.addr)); c->transport.udp.socket[0] = 0; x_release_client (); xmms_log_info ("Visualization client %d initialised using UDP", id); return port; }