changeset 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 a8f7dc0a56cb
children b4921dbf8709
files mcabber/src/TODO mcabber/src/commands.c mcabber/src/jabglue.c mcabber/src/roster.c mcabber/src/roster.h mcabber/src/screen.c
diffstat 6 files changed, 65 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/TODO	Mon May 02 14:18:55 2005 +0000
+++ b/mcabber/src/TODO	Mon May 02 20:31:01 2005 +0000
@@ -1,7 +1,6 @@
 
 BUGS:
 
-* Empty roster when disconnecting from the server / going offline.
 * Check if it crashes when resized too small...  Can we have a minimum size?
 
 
--- a/mcabber/src/commands.c	Mon May 02 14:18:55 2005 +0000
+++ b/mcabber/src/commands.c	Mon May 02 20:31:01 2005 +0000
@@ -319,18 +319,22 @@
 
 void do_say(char *arg)
 {
-  gpointer bud = BUDDATA(current_buddy);
+  gpointer bud;
 
   scr_set_chatmode(TRUE);
-  if (current_buddy) {
-    if (!(buddy_gettype(bud) & ROSTER_TYPE_USER)) {
-      scr_LogPrint("This is not a user");
-      return;
-    }
-    buddy_setflags(bud, ROSTER_FLAG_LOCK, TRUE);
-    send_message(arg);
-  } else {
+
+  if (!current_buddy) {
     scr_LogPrint("Who are you talking to??");
+    return;
   }
+
+  bud = BUDDATA(current_buddy);
+  if (!(buddy_gettype(bud) & ROSTER_TYPE_USER)) {
+    scr_LogPrint("This is not a user");
+    return;
+  }
+
+  buddy_setflags(bud, ROSTER_FLAG_LOCK, TRUE);
+  send_message(arg);
 }
 
--- a/mcabber/src/jabglue.c	Mon May 02 14:18:55 2005 +0000
+++ b/mcabber/src/jabglue.c	Mon May 02 20:31:01 2005 +0000
@@ -159,8 +159,8 @@
   xmlnode x, z;
   char *cid;
 
-  if (!online)
-    return;
+  if (!online) return;
+
   if (jc && jc->state == JCONN_STATE_CONNECTING) {
     jab_start(jc);
     return;
@@ -213,8 +213,7 @@
 {
   xmlnode x;
 
-  if (!online)
-    return;
+  if (!online) return;
 
   x = jutil_presnew(JPACKET__UNKNOWN, 0, 0);
 
@@ -271,6 +270,11 @@
 
   //sendvisibility();   ???
 
+  // We'll need to update the roster if we switch to/from offline because
+  // we don't know the presences of buddies when offline...
+  if (mystatus == offline || st == offline)
+    update_roster = TRUE;
+
   hk_mystatuschange(0, mystatus, st);
   mystatus = st;
 }
@@ -443,6 +447,8 @@
 
         online = FALSE;
         mystatus = offline;
+        roster_free();
+        update_roster = TRUE;
 
         if (previous_state != JCONN_STATE_OFF) {
           scr_LogPrint("+ JCONN_STATE_OFF");
--- 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;
--- a/mcabber/src/roster.h	Mon May 02 14:18:55 2005 +0000
+++ b/mcabber/src/roster.h	Mon May 02 20:31:01 2005 +0000
@@ -34,6 +34,7 @@
 GSList *roster_add_user(const char *jid, const char *name, const char *group,
         guint type);
 void    roster_del_user(const char *jid);
+void    roster_free(void);
 void    roster_setstatus(const char *jid, enum imstatus bstat);
 void    roster_setflags(const char *jid, guint flags, guint value);
 void    roster_msg_setflag(const char *jid, guint value);
--- a/mcabber/src/screen.c	Mon May 02 14:18:55 2005 +0000
+++ b/mcabber/src/screen.c	Mon May 02 20:31:01 2005 +0000
@@ -567,6 +567,7 @@
   GList *buddy;
   int i, n;
   int rOffset;
+  enum imstatus currentstatus = jb_getstatus();
 
   // We can reset update_roster
   update_roster = FALSE;
@@ -628,7 +629,7 @@
     }
 
     budstate = buddy_getstatus(BUDDATA(buddy));
-    if (budstate >= 0 && budstate < imstatus_size)
+    if (budstate >= 0 && budstate < imstatus_size && currentstatus != offline)
       status = imstatus2char[budstate];
     if (buddy == current_buddy) {
       wattrset(rosterWnd, COLOR_PAIR(COLOR_BD_DESSEL));