diff mcabber/src/roster.c @ 164:faf534be8ff0

[/trunk] Changeset 176 by mikael * Add roster_free() * Empty roster when disconnecting from the server / going offline * Don't display buddies status when we're offline * Fix a bug when the roster is empty and we try to send a message (commands.c)
author mikael
date Mon, 02 May 2005 20:31:01 +0000
parents c3624b2a7059
children aa5b635520ef
line wrap: on
line diff
--- a/mcabber/src/roster.c	Mon May 02 14:18:55 2005 +0000
+++ b/mcabber/src/roster.c	Mon May 02 20:31:01 2005 +0000
@@ -195,6 +195,45 @@
   // previous (or next) node.
 }
 
+// Free all roster data.  Call buddylist_build() to free the buddylist.
+void roster_free(void)
+{
+  GSList *sl_grp = groups;
+
+  // Walk through groups
+  while (sl_grp) {
+    roster *roster_grp = (roster*)sl_grp->data;
+    GSList *sl_usr = roster_grp->list;
+    // Walk through this group users
+    while (sl_usr) {
+      roster *roster_usr = (roster*)sl_usr->data;
+      // Free name and jid
+      if (roster_usr->jid)
+        g_free((gchar*)roster_usr->jid);
+      if (roster_usr->name)
+        g_free((gchar*)roster_usr->name);
+      sl_usr = g_slist_next(sl_usr);
+    }
+    // Free group's users list
+    if (roster_grp->list)
+      g_slist_free(roster_grp->list);
+    // Free group's name and jid
+    if (roster_grp->jid)
+      g_free((gchar*)roster_grp->jid);
+    if (roster_grp->name)
+      g_free((gchar*)roster_grp->name);
+    sl_grp = g_slist_next(sl_grp);
+  }
+  // Free groups list
+  if (groups) {
+    g_slist_free(groups);
+    groups = NULL;
+    // Update (i.e. free) buddylist
+    if (buddylist)
+      buddylist_build();
+  }
+}
+
 void roster_setstatus(const char *jid, enum imstatus bstat)
 {
   GSList *sl_user;