desktop-data-model r7248 - trunk/engine-dbus



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]