24 static xmmsv_t *xmms_create_xmmsv_list (GList *list);
25 static xmmsv_t *xmms_create_xmmsv_dict (GTree *dict);
26 static void create_xmmsv_list_foreach (gpointer data, gpointer userdata);
27 static gboolean create_xmmsv_dict_foreach (gpointer key, gpointer data, gpointer userdata);
43 } xmms_object_handler_entry_t;
46 cleanup_signal_list (gpointer key, gpointer value, gpointer data)
52 list = g_list_delete_link (list, list);
64 g_return_if_fail (
object);
73 g_tree_foreach (object->
signals, cleanup_signal_list, NULL);
74 g_tree_destroy (object->
signals);
81 g_tree_destroy (object->
cmds);
84 g_mutex_free (object->
mutex);
88 compare_signal_key (gconstpointer a, gconstpointer b)
90 gint aa = GPOINTER_TO_INT (a);
91 gint bb = GPOINTER_TO_INT (b);
119 xmms_object_handler_entry_t *entry;
121 g_return_if_fail (
object);
123 g_return_if_fail (handler);
125 entry = g_new0 (xmms_object_handler_entry_t, 1);
126 entry->handler = handler;
127 entry->userdata = userdata;
130 object->signals = g_tree_new (compare_signal_key);
132 list = g_tree_lookup (object->
signals,
133 GINT_TO_POINTER (signalid));
135 list = g_list_prepend (list, entry);
138 g_tree_insert (object->
signals, GINT_TO_POINTER (signalid), list);
149 GList *list, *node = NULL;
150 xmms_object_handler_entry_t *entry;
152 g_return_if_fail (
object);
154 g_return_if_fail (handler);
156 g_mutex_lock (object->
mutex);
159 list = g_tree_lookup (object->
signals,
160 GINT_TO_POINTER (signalid));
162 for (node = list; node; node = g_list_next (node)) {
165 if (entry->handler == handler && entry->userdata == userdata)
170 list = g_list_remove_link (list, node);
173 g_tree_insert (object->
signals,
174 GINT_TO_POINTER (signalid), list);
178 g_mutex_unlock (object->
mutex);
180 g_return_if_fail (node);
183 g_list_free_1 (node);
197 GList *list, *node, *list2 = NULL;
198 xmms_object_handler_entry_t *entry;
200 g_return_if_fail (
object);
203 g_mutex_lock (object->
mutex);
206 list = g_tree_lookup (object->
signals,
207 GINT_TO_POINTER (signalid));
209 for (node = list; node; node = g_list_next (node)) {
212 list2 = g_list_prepend (list2, entry);
216 g_mutex_unlock (object->
mutex);
223 g_assert (entry->handler);
225 entry->handler (
object, data, entry->userdata);
227 list2 = g_list_delete_link (list2, list2);
238 g_return_if_fail (arg);
241 xmms_error_reset (&arg->
error);
275 arg = xmms_create_xmmsv_dict (va_arg (ap, GTree *));
279 XMMS_DBG (
"OBJECT: trying to emit value of unsupported type (%d)!", (
int)type);
280 g_assert_not_reached ();
299 compare_cmd_key (gconstpointer a, gconstpointer b)
301 guint aa = GPOINTER_TO_INT (a);
302 guint bb = GPOINTER_TO_INT (b);
323 g_return_if_fail (
object);
324 g_return_if_fail (func);
327 object->cmds = g_tree_new (compare_cmd_key);
329 g_tree_insert (object->
cmds, GUINT_TO_POINTER (cmdid),
342 g_return_if_fail (
object);
345 func = g_tree_lookup (object->
cmds, GUINT_TO_POINTER (cmdid));
359 xmms_create_xmmsv_list (GList *list)
362 g_list_foreach (list, create_xmmsv_list_foreach, (gpointer) v);
371 v = xmms_create_xmmsv_list (list);
383 xmms_create_xmmsv_dict (GTree *dict)
388 g_tree_foreach (dict, create_xmmsv_dict_foreach, (gpointer) v);
398 v = xmms_create_xmmsv_dict (dict);
401 g_tree_destroy (dict);
423 create_xmmsv_list_foreach (gpointer data, gpointer userdata)
437 create_xmmsv_dict_foreach (gpointer key, gpointer data, gpointer userdata)
439 const char *k = (
const char *) key;
454 *gs = g_string_new_len ((
const gchar *) str, len);
490 g_return_if_fail (object->
ref > 0);
491 if (g_atomic_int_dec_and_test (&(object->
ref))) {
493 object->destroy_func (
object);
504 ret = g_malloc0 (size);
508 ret->
mutex = g_mutex_new ();