changeset 662:4111ff4cdd15

Do not loose the unread_message flag when disconnecting from the server
author Mikael Berthe <mikael@lilotux.net>
date Mon, 09 Jan 2006 19:40:29 +0100
parents 4674e92a3e01
children c2da058e8849
files mcabber/src/roster.c
diffstat 1 files changed, 46 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/roster.c	Sun Jan 08 22:56:22 2006 +0100
+++ b/mcabber/src/roster.c	Mon Jan 09 19:40:29 2006 +0100
@@ -80,10 +80,14 @@
 static int hide_offline_buddies;
 static GSList *groups;
 static GSList *unread_list;
+static GHashTable *unread_jids;
 GList *buddylist;
 GList *current_buddy;
 GList *alternate_buddy;
 
+void unread_jid_add(const char *jid);
+int  unread_jid_del(const char *jid);
+
 
 /* ### Resources functions ### */
 
@@ -313,6 +317,11 @@
     roster_usr->name = g_strdup(str);
     g_free(str);
   }
+  if (unread_jid_del(jid)) {
+    roster_usr->flags |= ROSTER_FLAG_MSG;
+    // Append the roster_usr to unread_list
+    unread_list = g_slist_append(unread_list, roster_usr);
+  }
   roster_usr->type = type;
   roster_usr->subscription = esub;
   roster_usr->list = slist;    // (my_group SList element)
@@ -339,6 +348,9 @@
   // Remove (if present) from unread messages list
   node = g_slist_find(unread_list, roster_usr);
   if (node) unread_list = g_slist_delete_link(unread_list, node);
+  // If there is a pending unread message, keep track of it
+  if (roster_usr->flags & ROSTER_FLAG_MSG)
+    unread_jid_add(roster_usr->jid);
 
   // Let's free memory (jid, name, status message)
   if (roster_usr->jid)        g_free((gchar*)roster_usr->jid);
@@ -379,6 +391,9 @@
     // Walk through this group users
     while (sl_usr) {
       roster *roster_usr = (roster*)sl_usr->data;
+      // If there is a pending unread message, keep track of it
+      if (roster_usr->flags & ROSTER_FLAG_MSG)
+        unread_jid_add(roster_usr->jid);
       // Free name and jid
       if (roster_usr->jid)        g_free((gchar*)roster_usr->jid);
       if (roster_usr->name)       g_free((gchar*)roster_usr->name);
@@ -1188,4 +1203,35 @@
   return unread_list->data;
 }
 
+
+/* ### "unread_jids" functions ###
+ *
+ * The unread_jids hash table is used to keep track of the buddies with
+ * unread messages when a disconnection occurs.
+ * When removing a buddy with an unread message from the roster, the
+ * jid should be added to the unread_jids table.  When adding a buddy to
+ * the roster, we check if (s)he had a pending unread message.
+ */
+
+//  unread_jid_add(jid)
+// Add jid to the unread_jids hash table
+void unread_jid_add(const char *jid)
+{
+  if (!unread_jids) {
+    // Initialize unread_jids hash table
+    unread_jids = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+  }
+  // The 2nd unread_jids is an arbitrary non-null pointer:
+  g_hash_table_insert(unread_jids, g_strdup(jid), unread_jids);
+}
+
+//  unread_jid_del(jid)
+// Return TRUE if jid is found in the table (and remove it), FALSE if not
+int unread_jid_del(const char *jid)
+{
+  if (!unread_jids)
+    return FALSE;
+  return g_hash_table_remove(unread_jids, jid);
+}
+
 /* vim: set expandtab cindent cinoptions=>2\:2(0:  For Vim users... */