# HG changeset patch # User mikael # Date 1115065861 0 # Node ID faf534be8ff06bbb1c34f4cea79d1022696a3be5 # Parent a8f7dc0a56cb0fa8471fc56308cf65734a8f6fb2 [/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) diff -r a8f7dc0a56cb -r faf534be8ff0 mcabber/src/TODO --- 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? diff -r a8f7dc0a56cb -r faf534be8ff0 mcabber/src/commands.c --- 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); } diff -r a8f7dc0a56cb -r faf534be8ff0 mcabber/src/jabglue.c --- 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"); diff -r a8f7dc0a56cb -r faf534be8ff0 mcabber/src/roster.c --- 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; diff -r a8f7dc0a56cb -r faf534be8ff0 mcabber/src/roster.h --- 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); diff -r a8f7dc0a56cb -r faf534be8ff0 mcabber/src/screen.c --- 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));