desktop-data-model r7248 - trunk/engine-dbus
- From: otaylor svn gnome org
- To: svn-commits-list gnome org
- Subject: desktop-data-model r7248 - trunk/engine-dbus
- Date: Thu,  7 Feb 2008 23:02:14 +0000 (GMT)
Author: otaylor
Date: Thu Feb  7 23:02:14 2008
New Revision: 7248
URL: http://svn.gnome.org/viewvc/desktop-data-model?rev=7248&view=rev
Log:
Fix bug where we weren't handling removing buddies properly because
 on pidgin startup we got BuddyChanged messages for each buddy 
 before our request to get the list of buddies returned.
Modified:
   trunk/engine-dbus/hippo-dbus-im-client.c
Modified: trunk/engine-dbus/hippo-dbus-im-client.c
==============================================================================
--- trunk/engine-dbus/hippo-dbus-im-client.c	(original)
+++ trunk/engine-dbus/hippo-dbus-im-client.c	Thu Feb  7 23:02:14 2008
@@ -123,8 +123,7 @@
 
 static void
 notify_buddy(ImData             *id,
-             DBusMessageIter    *buddy_iter,
-             GHashTable         *new_resource_ids /* may be NULL */)
+             DBusMessageIter    *buddy_iter)
 {
     char *resource_id = NULL;
 
@@ -176,13 +175,15 @@
         dbus_message_iter_next(buddy_iter);
     }
     
+    resource_id = make_buddy_resource_id(id, protocol, name);
+
     if (protocol == NULL || name == NULL) {
-        /* not enough info */
-        return;
+        hippo_im_remove_buddy(resource_id);
+            
+        g_hash_table_remove(id->resource_ids, resource_id);
+        g_free(resource_id);
     }
 
-    resource_id = make_buddy_resource_id(id, protocol, name);
-
     hippo_im_update_buddy(resource_id,
                           protocol,
                           name, alias,
@@ -202,12 +203,9 @@
         g_debug("It looks like we already have icon %s", icon ? icon : "(none)");
     }
     
-    if (new_resource_ids)
-        g_hash_table_replace(new_resource_ids,
-                             resource_id,
-                             GINT_TO_POINTER(1));
-    else
-        g_free(resource_id);
+    g_hash_table_replace(id->resource_ids,
+                         resource_id,
+                         GINT_TO_POINTER(1));
 }
 
 static void
@@ -225,7 +223,7 @@
     g_assert(dbus_message_iter_get_arg_type(&toplevel_iter) == DBUS_TYPE_ARRAY);
     dbus_message_iter_recurse(&toplevel_iter, &buddy_iter);
     
-    notify_buddy(id, &buddy_iter, NULL);
+    notify_buddy(id, &buddy_iter);
 }
 
 
@@ -263,10 +261,11 @@
 load_state_from_buddy_list(ImData          *id,
                            DBusMessageIter *buddy_array_iter)
 {
-    GHashTable *new_buddy_resource_ids;
-    
-    new_buddy_resource_ids = g_hash_table_new_full(g_str_hash, g_str_equal,
-                                                   g_free, NULL);
+    GHashTable *old_buddy_resource_ids;
+
+    old_buddy_resource_ids = id->resource_ids;
+    id->resource_ids = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                             g_free, NULL);
     
     while (dbus_message_iter_get_arg_type(buddy_array_iter) != DBUS_TYPE_INVALID) {
         DBusMessageIter buddy_iter;
@@ -274,16 +273,15 @@
         g_assert(dbus_message_iter_get_arg_type(buddy_array_iter) == DBUS_TYPE_ARRAY);
         dbus_message_iter_recurse(buddy_array_iter, &buddy_iter);
 
-        notify_buddy(id, &buddy_iter, new_buddy_resource_ids);        
+        notify_buddy(id, &buddy_iter);        
         
         dbus_message_iter_next(buddy_array_iter);
     }
 
     /* Figure out what we removed */
-    remove_old_resources(id->resource_ids, new_buddy_resource_ids);
+    remove_old_resources(old_buddy_resource_ids, id->resource_ids);
     
-    g_hash_table_destroy(id->resource_ids);
-    id->resource_ids = new_buddy_resource_ids;
+    g_hash_table_destroy(old_buddy_resource_ids);
 }
 
 static void
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]