]> git.0d.be Git - empathy.git/commitdiff
Add empathy_contact_dup_from_tp_contact()
authorXavier Claessens <xclaesse@gmail.com>
Mon, 10 May 2010 10:34:42 +0000 (12:34 +0200)
committerXavier Claessens <xclaesse@gmail.com>
Wed, 26 May 2010 09:17:47 +0000 (11:17 +0200)
This API make sure to return a singleton EmpathyContact for any TpContact

libempathy/empathy-contact.c
libempathy/empathy-contact.h

index 224ad6e498914df2ca6977da56d557c2f295bcb1..56b7aa42d725a66c5ffcedcfd7d4f07d6e6dd0d7 100644 (file)
@@ -111,6 +111,9 @@ enum {
 
 static guint signals[LAST_SIGNAL];
 
+/* TpContact* -> EmpathyContact* */
+static GHashTable *contacts_table = NULL;
+
 static void
 tp_contact_notify_cb (TpContact *tp_contact,
                       GParamSpec *param,
@@ -162,6 +165,7 @@ contact_dispose (GObject *object)
 
   if (priv->tp_contact)
     {
+      g_hash_table_remove (contacts_table, priv->tp_contact);
       g_signal_handlers_disconnect_by_func (priv->tp_contact,
           tp_contact_notify_cb, object);
       g_object_unref (priv->tp_contact);
@@ -340,6 +344,8 @@ set_tp_contact (EmpathyContact *contact,
 {
   EmpathyContactPriv *priv = GET_PRIV (contact);
   GHashTable *location;
+  TpHandle self_handle;
+  TpHandle handle;
 
   if (tp_contact == NULL)
     return;
@@ -357,6 +363,14 @@ set_tp_contact (EmpathyContact *contact,
 
   contact_set_avatar_from_tp_contact (contact);
 
+  /* Set is-user property. Note that it could still be the handle is
+   * different from the connection's self handle, in the case the handle
+   * comes from a group interface. */
+  self_handle = tp_connection_get_self_handle (
+      tp_contact_get_connection (tp_contact));
+  handle = tp_contact_get_handle (tp_contact);
+  empathy_contact_set_is_user (contact, self_handle == handle);
+
   g_signal_connect (priv->tp_contact, "notify",
     G_CALLBACK (tp_contact_notify_cb), contact);
 }
@@ -1466,3 +1480,32 @@ contact_set_avatar_from_tp_contact (EmpathyContact *contact)
     }
 }
 
+EmpathyContact *
+empathy_contact_dup_from_tp_contact (TpContact *tp_contact)
+{
+  EmpathyContact *contact = NULL;
+
+  g_return_val_if_fail (TP_IS_CONTACT (tp_contact), NULL);
+
+  if (contacts_table == NULL)
+    contacts_table = g_hash_table_new (g_direct_hash, g_direct_equal);
+  else
+    contact = g_hash_table_lookup (contacts_table, tp_contact);
+
+  if (contact == NULL)
+    {
+      contact = empathy_contact_new (tp_contact);
+
+      /* The hash table does not keep any ref.
+       * contact keeps a ref to tp_contact, and is removed from the table in
+       * contact_dispose() */
+      g_hash_table_insert (contacts_table, tp_contact, contact);
+    }
+  else
+    {
+      g_object_ref (contact);
+    }
+
+  return contact;
+}
+
index 43f20957f58f4716e8a06c5b9a69be5027789f74..da463269e3d9a1cb1198b1ad9a4e5786a72ea5f1 100644 (file)
@@ -131,6 +131,8 @@ GHashTable * empathy_contact_get_location (EmpathyContact *contact);
 gboolean empathy_contact_equal (gconstpointer contact1,
     gconstpointer contact2);
 
+EmpathyContact *empathy_contact_dup_from_tp_contact (TpContact *tp_contact);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_CONTACT_H__ */