summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlberto Mardegan <alberto.mardegan@nokia.com>2009-02-17 18:20:58 +0200
committerAlberto Mardegan <alberto.mardegan@nokia.com>2009-02-18 16:36:29 +0200
commite30c03c9f3569dffd50a1954884101faf256ee96 (patch)
tree4f7375eb7d94e16d0dd93b9918cdfab4a08e55bc /src
parent1cf95a3e0565245d0b15cac2642cf0ced172f352 (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.c19
-rw-r--r--src/mcd-misc.h5
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