empathy r2190 - trunk/libempathy
- From: xclaesse svn gnome org
- To: svn-commits-list gnome org
- Subject: empathy r2190 - trunk/libempathy
- Date: Fri, 9 Jan 2009 16:15:34 +0000 (UTC)
Author: xclaesse
Date: Fri Jan 9 16:15:34 2009
New Revision: 2190
URL: http://svn.gnome.org/viewvc/empathy?rev=2190&view=rev
Log:
Add weak object, destroy notify and error reporting to empathy_contact_call_when_ready
Signed-off-by: Sjoerd Simons <sjoerd simons collabora co uk>
Modified:
trunk/libempathy/empathy-contact.c
trunk/libempathy/empathy-contact.h
Modified: trunk/libempathy/empathy-contact.c
==============================================================================
--- trunk/libempathy/empathy-contact.c (original)
+++ trunk/libempathy/empathy-contact.c Fri Jan 9 16:15:34 2009
@@ -21,6 +21,7 @@
* Authors: Mikael Hallendal <micke imendio com>
* Martyn Russell <martyn imendio com>
* Xavier Claessens <xclaesse gmail com>
+ * Sjoerd Simons <sjoerd simons collabora co uk>
*/
#include "config.h"
@@ -60,6 +61,8 @@
EmpathyContactReady ready;
EmpathyContactReadyCb *callback;
gpointer user_data;
+ GDestroyNotify destroy;
+ GObject *weak_object;
} ReadyCbData;
static void contact_finalize (GObject *object);
@@ -351,6 +354,43 @@
return (priv->ready & ready) == ready;
}
+static void
+contact_weak_object_notify (gpointer data, GObject *old_object)
+{
+ EmpathyContact *contact = EMPATHY_CONTACT (data);
+ EmpathyContactPriv *priv = GET_PRIV (contact);
+
+ GList *l, *ln;
+
+ for (l = priv->ready_callbacks ; l != NULL ; l = ln )
+ {
+ ReadyCbData *d = (ReadyCbData *)l->data;
+ ln = g_list_next (l);
+
+ if (d->weak_object == old_object)
+ {
+ if (d->destroy != NULL)
+ d->destroy (d->user_data);
+
+ priv->ready_callbacks = g_list_delete_link (priv->ready_callbacks,
+ l);
+ }
+ }
+}
+
+static void
+contact_call_ready_callback (EmpathyContact *contact, GError *error,
+ ReadyCbData *data)
+{
+ data->callback (contact, error, data->user_data, data->weak_object);
+ if (data->destroy != NULL)
+ data->destroy (data->user_data);
+
+ if (data->weak_object)
+ g_object_weak_unref (data->weak_object,
+ contact_weak_object_notify, contact);
+}
+
static void
contact_set_ready_flag (EmpathyContact *contact,
@@ -372,8 +412,7 @@
if (contact_is_ready (contact, d->ready))
{
- d->callback (contact, d->user_data);
-
+ contact_call_ready_callback (contact, NULL, d);
priv->ready_callbacks = g_list_delete_link
(priv->ready_callbacks, l);
}
@@ -807,8 +846,8 @@
}
void empathy_contact_call_when_ready (EmpathyContact *contact,
- EmpathyContactReady ready, EmpathyContactReadyCb *callback, gpointer
- user_data)
+ EmpathyContactReady ready, EmpathyContactReadyCb *callback,
+ gpointer user_data, GDestroyNotify destroy, GObject *weak_object)
{
EmpathyContactPriv *priv = GET_PRIV (contact);
@@ -817,7 +856,9 @@
if (contact_is_ready (contact, ready))
{
- callback (contact, user_data);
+ callback (contact, NULL, user_data, weak_object);
+ if (destroy != NULL)
+ destroy (user_data);
}
else
{
@@ -825,8 +866,13 @@
d->ready = ready;
d->callback = callback;
d->user_data = user_data;
- priv->ready_callbacks = g_list_prepend (priv->ready_callbacks,
- d);
+ d->destroy = destroy;
+ d->weak_object = weak_object;
+
+ if (weak_object != NULL)
+ g_object_weak_ref (weak_object, contact_weak_object_notify, contact);
+
+ priv->ready_callbacks = g_list_prepend (priv->ready_callbacks, d);
}
}
Modified: trunk/libempathy/empathy-contact.h
==============================================================================
--- trunk/libempathy/empathy-contact.h (original)
+++ trunk/libempathy/empathy-contact.h Fri Jan 9 16:15:34 2009
@@ -114,10 +114,11 @@
guint empathy_contact_hash (gconstpointer key);
typedef void (EmpathyContactReadyCb)
- (EmpathyContact *contact, gpointer user_data);
+ (EmpathyContact *contact, GError *error, gpointer user_data,
+ GObject *weak_object);
void empathy_contact_call_when_ready (EmpathyContact *contact,
EmpathyContactReady ready, EmpathyContactReadyCb *callback, gpointer
- user_data);
+ user_data, GDestroyNotify destroy, GObject *weak_object);
void empathy_contact_run_until_ready (EmpathyContact *contact,
EmpathyContactReady ready, GMainLoop **loop);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]