[empathy] Introduce empathy_contact_equal, adapt themes



commit 40d33622db46952e016cc8e540403cccb7ba6103
Author: Patryk Zawadzki <patrys pld-linux org>
Date:   Tue Jun 16 15:37:08 2009 +0200

    Introduce empathy_contact_equal, adapt themes
    
    Fixed adium and boxes theme engines to check if contacts refer to
    the same id instead of comparing pointers. This fixes bug #585885.

 libempathy-gtk/empathy-theme-adium.c |    4 +-
 libempathy-gtk/empathy-theme-boxes.c |    2 +-
 libempathy/empathy-contact.c         |   37 ++++++++++++++++++++++++++++++++++
 libempathy/empathy-contact.h         |    4 ++-
 4 files changed, 43 insertions(+), 4 deletions(-)
---
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c
index 82384ac..321d199 100644
--- a/libempathy-gtk/empathy-theme-adium.c
+++ b/libempathy-gtk/empathy-theme-adium.c
@@ -500,7 +500,8 @@ theme_adium_append_message (EmpathyChatView *view,
 	}
 
 	/* Get the right html/func to add the message */
-	if (priv->last_contact == sender) {
+	func = "appendMessage";
+	if (empathy_contact_equal (priv->last_contact, sender)) {
 		func = "appendNextMessage";
 		if (empathy_contact_is_user (sender)) {
 			html = priv->out_nextcontent_html;
@@ -512,7 +513,6 @@ theme_adium_append_message (EmpathyChatView *view,
 		}
 	}
 	if (!html) {
-		func = "appendMessage";
 		if (empathy_contact_is_user (sender)) {
 			html = priv->out_content_html;
 			len = priv->out_content_len;
diff --git a/libempathy-gtk/empathy-theme-boxes.c b/libempathy-gtk/empathy-theme-boxes.c
index 1991329..64d95d4 100644
--- a/libempathy-gtk/empathy-theme-boxes.c
+++ b/libempathy-gtk/empathy-theme-boxes.c
@@ -210,7 +210,7 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme,
 	/* Only insert a header if the previously inserted block is not the same
 	 * as this one.
 	 */
-	if (last_contact == contact) {
+	if (empathy_contact_equal (last_contact, contact)) {
 		return;
 	}
 
diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c
index 8e07fb9..bad6ef4 100644
--- a/libempathy/empathy-contact.c
+++ b/libempathy/empathy-contact.c
@@ -1082,3 +1082,40 @@ empathy_contact_set_location (EmpathyContact *contact,
   priv->location = g_hash_table_ref (location);
   g_object_notify (G_OBJECT (contact), "location");
 }
+
+/**
+ * empathy_contact_equal:
+ * @contact1: an #EmpathyContact
+ * @contact2: an #EmpathyContact
+ *
+ * Returns FALSE if one of the contacts is NULL but the other is not.
+ * Otherwise returns TRUE if both pointer are equal or if they bith
+ * refer to the same id.
+ * It's only necessary to call this function if your contact objects
+ * come from logs where contacts are created dynamically and comparing
+ * pointers is not enough.
+ */
+gboolean
+empathy_contact_equal (gconstpointer contact1,
+                       gconstpointer contact2)
+{
+  EmpathyContact *c1;
+  EmpathyContact *c2;
+  const gchar *id1;
+  const gchar *id2;
+
+  if ((contact1 == NULL) != (contact2 == NULL)) {
+    return FALSE;
+  }
+  if (contact1 == contact2) {
+    return TRUE;
+  }
+  c1 = EMPATHY_CONTACT (contact1);
+  c2 = EMPATHY_CONTACT (contact2);
+  id1 = empathy_contact_get_id (c1);
+  id2 = empathy_contact_get_id (c2);
+  if (!tp_strdiff (id1, id2)) {
+    return TRUE;
+  }
+  return FALSE;
+}
diff --git a/libempathy/empathy-contact.h b/libempathy/empathy-contact.h
index f441876..f888313 100644
--- a/libempathy/empathy-contact.h
+++ b/libempathy/empathy-contact.h
@@ -125,7 +125,9 @@ gboolean empathy_avatar_save_to_file (EmpathyAvatar *avatar,
 
 GHashTable * empathy_contact_get_location (EmpathyContact *contact);
 void empathy_contact_set_location (EmpathyContact *contact,
-  GHashTable *location);
+    GHashTable *location);
+gboolean empathy_contact_equal (gconstpointer contact1,
+    gconstpointer contact2);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]