24 static xmmsv_t *xmms_create_xmmsv_list (GList *list);
25 static xmmsv_t *xmms_create_xmmsv_dict (GTree *dict);
26 static xmmsv_t *xmms_create_xmmsv_bin (GString *gs);
27 static void create_xmmsv_list_foreach (gpointer data, gpointer userdata);
28 static gboolean create_xmmsv_dict_foreach (gpointer key, gpointer data, gpointer userdata);
44 } xmms_object_handler_entry_t;
47 cleanup_signal_list (gpointer key, gpointer value, gpointer data)
53 list = g_list_delete_link (list, list);
65 g_return_if_fail (
object);
74 g_tree_foreach (object->
signals, cleanup_signal_list, NULL);
75 g_tree_destroy (object->
signals);
82 g_tree_destroy (object->
cmds);
85 g_mutex_free (object->
mutex);
89 compare_signal_key (gconstpointer a, gconstpointer b)
91 gint aa = GPOINTER_TO_INT (a);
92 gint bb = GPOINTER_TO_INT (b);
120 xmms_object_handler_entry_t *entry;
122 g_return_if_fail (
object);
124 g_return_if_fail (handler);
126 entry = g_new0 (xmms_object_handler_entry_t, 1);
127 entry->handler = handler;
128 entry->userdata = userdata;
131 object->signals = g_tree_new (compare_signal_key);
133 list = g_tree_lookup (object->
signals,
134 GINT_TO_POINTER (signalid));
136 list = g_list_prepend (list, entry);
139 g_tree_insert (object->
signals, GINT_TO_POINTER (signalid), list);
150 GList *list, *node = NULL;
151 xmms_object_handler_entry_t *entry;
153 g_return_if_fail (
object);
155 g_return_if_fail (handler);
157 g_mutex_lock (object->
mutex);
160 list = g_tree_lookup (object->
signals,
161 GINT_TO_POINTER (signalid));
163 for (node = list; node; node = g_list_next (node)) {
166 if (entry->handler == handler && entry->userdata == userdata)
171 list = g_list_remove_link (list, node);
174 g_tree_insert (object->
signals,
175 GINT_TO_POINTER (signalid), list);
179 g_mutex_unlock (object->
mutex);
181 g_return_if_fail (node);
184 g_list_free_1 (node);
198 GList *list, *node, *list2 = NULL;
199 xmms_object_handler_entry_t *entry;
201 g_return_if_fail (
object);
204 g_mutex_lock (object->
mutex);
207 list = g_tree_lookup (object->
signals,
208 GINT_TO_POINTER (signalid));
210 for (node = list; node; node = g_list_next (node)) {
213 list2 = g_list_prepend (list2, entry);
217 g_mutex_unlock (object->
mutex);
224 g_assert (entry->handler);
226 entry->handler (
object, data, entry->userdata);
228 list2 = g_list_delete_link (list2, list2);
239 g_return_if_fail (arg);
242 xmms_error_reset (&arg->
error);
276 arg = xmms_create_xmmsv_dict (va_arg (ap, GTree *));
280 XMMS_DBG (
"OBJECT: trying to emit value of unsupported type (%d)!", (
int)type);
281 g_assert_not_reached ();
300 compare_cmd_key (gconstpointer a, gconstpointer b)
302 guint aa = GPOINTER_TO_INT (a);
303 guint bb = GPOINTER_TO_INT (b);
324 g_return_if_fail (
object);
325 g_return_if_fail (desc);
328 object->cmds = g_tree_new (compare_cmd_key);
330 g_tree_insert (object->
cmds, GUINT_TO_POINTER (cmdid),
343 g_return_if_fail (
object);
346 desc = g_tree_lookup (object->
cmds, GUINT_TO_POINTER (cmdid));
348 if (desc && desc->
func)
349 desc->
func (
object, arg);
360 xmms_create_xmmsv_list (GList *list)
363 g_list_foreach (list, create_xmmsv_list_foreach, (gpointer) v);
372 v = xmms_create_xmmsv_list (list);
384 xmms_create_xmmsv_dict (GTree *dict)
389 g_tree_foreach (dict, create_xmmsv_dict_foreach, (gpointer) v);
399 v = xmms_create_xmmsv_dict (dict);
402 g_tree_destroy (dict);
424 create_xmmsv_list_foreach (gpointer data, gpointer userdata)
438 create_xmmsv_dict_foreach (gpointer key, gpointer data, gpointer userdata)
440 const char *k = (
const char *) key;
455 *gs = g_string_new_len (str, len);
491 g_return_if_fail (object->
ref > 0);
492 if (g_atomic_int_dec_and_test (&(object->
ref))) {
494 object->destroy_func (
object);
505 ret = g_malloc0 (size);
509 ret->
mutex = g_mutex_new ();
xmmsv_t * xmmsv_new_dict(void)
Allocates a new dict xmmsv_t.
void xmmsv_unref(xmmsv_t *val)
Decreases the references for the xmmsv_t When the number of references reaches 0 it will be freed...
int xmmsv_dict_set(xmmsv_t *dictv, const char *key, xmmsv_t *val)
Insert an element under the given key in the dict xmmsv_t.
int xmmsv_get_list_iter(const xmmsv_t *val, xmmsv_list_iter_t **it)
Retrieves a list iterator from a list xmmsv_t.
xmms_object_cmd_func_t func
void xmms_object_cmd_add(xmms_object_t *object, guint cmdid, const xmms_object_cmd_desc_t *desc)
Add a command that could be called from the client API to a object.
xmmsv_t * xmmsv_new_none(void)
Allocates a new empty xmmsv_t.
int xmmsv_list_iter_entry(xmmsv_list_iter_t *it, xmmsv_t **val)
Get the element currently pointed at by the iterator.
xmmsv_t * xmmsv_new_string(const char *s)
Allocates a new string xmmsv_t.
int xmmsv_list_append(xmmsv_t *listv, xmmsv_t *val)
Append an element to the end of the list xmmsv_t.
gboolean check_string_list(xmmsv_t *list)
Checks that the list only contains string values.
int xmms_bin_to_gstring(xmmsv_t *value, GString **gs)
void xmms_object_cleanup(xmms_object_t *object)
Cleanup all the resources for the object.
void xmms_object_emit(xmms_object_t *object, guint32 signalid, xmmsv_t *data)
Emit a signal and thus call all the handlers that are connected.
void xmms_object_cmd_arg_init(xmms_object_cmd_arg_t *arg)
Initialize a command argument.
xmms_object_t * __int_xmms_object_new(gint size, xmms_object_destroy_func_t destfunc)
void xmms_object_emit_f(xmms_object_t *object, guint32 signalid, xmmsv_type_t type,...)
Emits a signal on the current object.
void xmms_object_cmd_call(xmms_object_t *object, guint cmdid, xmms_object_cmd_arg_t *arg)
Call a command with argument.
void __int_xmms_object_unref(xmms_object_t *object)
void xmmsv_list_iter_next(xmmsv_list_iter_t *it)
Advance the iterator to the next element in the list.
int dummy_identity(xmmsv_t *value, xmmsv_t **arg)
xmmsv_type_t xmmsv_get_type(const xmmsv_t *val)
Get the type of the value.
xmmsv_t * xmmsv_new_int(int32_t i)
Allocates a new integer xmmsv_t.
xmmsv_t * xmms_convert_and_kill_list(GList *list)
xmmsv_t * xmms_convert_and_kill_string(gchar *str)
void(* xmms_object_destroy_func_t)(xmms_object_t *object)
#define xmms_object_ref(obj)
int xmmsv_get_bin(const xmmsv_t *val, const unsigned char **r, unsigned int *rlen)
Retrieves binary data from the value.
xmmsv_t * xmmsv_new_list(void)
Allocates a new list xmmsv_t.
#define XMMS_DBG(fmt,...)
xmmsv_t * xmms_convert_and_kill_dict(GTree *dict)
void xmms_object_connect(xmms_object_t *object, guint32 signalid, xmms_object_handler_t handler, gpointer userdata)
Connect to a signal that is emitted by this object.
void xmms_object_disconnect(xmms_object_t *object, guint32 signalid, xmms_object_handler_t handler, gpointer userdata)
Disconnect from a signal.
#define XMMS_IS_OBJECT(p)
void(* xmms_object_handler_t)(xmms_object_t *object, xmmsv_t *data, gpointer userdata)
struct xmmsv_list_iter_St xmmsv_list_iter_t
int xmmsv_list_iter_valid(xmmsv_list_iter_t *it)
Check whether the iterator is valid and points to a valid element.
xmms_object_destroy_func_t destroy_func