[Telepathy-commits] [telepathy-mission-control/master] Allow callbacks to be registered on generic pointers

Alberto Mardegan alberto.mardegan at nokia.com
Tue Feb 17 08:20:58 PST 2009


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.
---
 src/mcd-misc.c |   19 ++++++++++++++-----
 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 06b8449..38bfdc9 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 30d2604..f1336d2 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
-- 
1.5.6.5




More information about the telepathy-commits mailing list