[/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)
--- 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));