diff options
author | Alberto Mardegan <alberto.mardegan@nokia.com> | 2009-02-17 18:20:58 +0200 |
---|---|---|
committer | Alberto Mardegan <alberto.mardegan@nokia.com> | 2009-02-18 16:36:29 +0200 |
commit | e30c03c9f3569dffd50a1954884101faf256ee96 (patch) | |
tree | 4f7375eb7d94e16d0dd93b9918cdfab4a08e55bc /src | |
parent | 1cf95a3e0565245d0b15cac2642cf0ced172f352 (diff) |
Allow callbacks to be registered on generic pointers
Allow the callback to be "emitted" by any kind of pointers, not only GObject. A
GObject is still needed to hold the quark data, but the callback can be invoked
with another base pointer.
Diffstat (limited to 'src')
-rw-r--r-- | src/mcd-misc.c | 19 | ||||
-rw-r--r-- | src/mcd-misc.h | 5 |
2 files changed, 18 insertions, 6 deletions
diff --git a/src/mcd-misc.c b/src/mcd-misc.c index 06b84497..38bfdc97 100644 --- a/src/mcd-misc.c +++ b/src/mcd-misc.c @@ -188,7 +188,7 @@ typedef struct typedef struct { - gpointer object; + gpointer strukt; GSList *callbacks; } McdReadyData; @@ -201,7 +201,7 @@ mcd_object_invoke_ready_callbacks (McdReadyData *rd, const GError *error) { McdReadyCbData *cb = list->data; - cb->callback (rd->object, error, cb->user_data); + cb->callback (rd->strukt, error, cb->user_data); g_slice_free (McdReadyCbData, cb); } g_slist_free (rd->callbacks); @@ -210,7 +210,7 @@ mcd_object_invoke_ready_callbacks (McdReadyData *rd, const GError *error) static void mcd_ready_data_free (McdReadyData *rd) { - if (rd->object) + if (rd->strukt) { GError error = { TP_ERRORS, TP_ERROR_CANCELLED, "Object disposed" }; mcd_object_invoke_ready_callbacks (rd, &error); @@ -222,6 +222,15 @@ void mcd_object_call_when_ready (gpointer object, GQuark quark, McdReadyCb callback, gpointer user_data) { + mcd_object_call_on_struct_when_ready (object, object, quark, callback, + user_data); +} + +void +mcd_object_call_on_struct_when_ready (gpointer object, gpointer strukt, + GQuark quark, McdReadyCb callback, + gpointer user_data) +{ McdReadyData *rd; McdReadyCbData *cb; @@ -237,7 +246,7 @@ mcd_object_call_when_ready (gpointer object, GQuark quark, McdReadyCb callback, if (!rd) { rd = g_slice_new (McdReadyData); - rd->object = object; + rd->strukt = strukt; rd->callbacks = NULL; g_object_set_qdata_full ((GObject *)object, quark, rd, (GDestroyNotify)mcd_ready_data_free); @@ -254,7 +263,7 @@ mcd_object_ready (gpointer object, GQuark quark, const GError *error) if (!rd) return; mcd_object_invoke_ready_callbacks (rd, error); - rd->object = NULL; /* so the callbacks won't be invoked again */ + rd->strukt = NULL; /* so the callbacks won't be invoked again */ g_object_set_qdata ((GObject *)object, quark, NULL); } diff --git a/src/mcd-misc.h b/src/mcd-misc.h index 30d2604c..f1336d28 100644 --- a/src/mcd-misc.h +++ b/src/mcd-misc.h @@ -52,10 +52,13 @@ const gchar *_mcd_get_error_string (const GError *error); #define TP_ARRAY_TYPE_CHANNEL_CLASS_LIST (type_dbus_aasv ()) GType type_dbus_aasv (void); -typedef void (*McdReadyCb) (gpointer *object, const GError *error, +typedef void (*McdReadyCb) (gpointer object, const GError *error, gpointer user_data); void mcd_object_call_when_ready (gpointer object, GQuark quark, McdReadyCb callback, gpointer user_data); +void mcd_object_call_on_struct_when_ready (gpointer object, gpointer strukt, + GQuark quark, McdReadyCb callback, + gpointer user_data); void mcd_object_ready (gpointer object, GQuark quark, const GError *error); G_END_DECLS |