# HG changeset patch # User Mikael Berthe # Date 1132787017 -3600 # Node ID 2ac8d8e49e81ae7d0aeb1d3e33ed738aafef0e61 # Parent aee9a279a0f3b9fa0666d2783b82192b74dbd281 Send status changes to chatrooms diff -r aee9a279a0f3 -r 2ac8d8e49e81 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Tue Nov 22 23:36:12 2005 +0100 +++ b/mcabber/src/jabglue.c Thu Nov 24 00:03:37 2005 +0100 @@ -57,6 +57,11 @@ STATE_LOGGED } jstate; +struct T_presence { + enum imstatus st; + const char *msg; +}; + void statehandler(jconn, int); void packethandler(jconn, jpacket); @@ -263,11 +268,32 @@ return mystatusmsg; } +static void roompresence(gpointer room, void *presencedata) +{ + const char *jid; + const char *nickname; + char *to; + struct T_presence *pres = presencedata; + + if (!buddy_getresources(room)) // FIXME: that's a memory leak + return; + + jid = buddy_getjid(room); + if (!jid) return; + nickname = buddy_getnickname(room); + if (!nickname) return; + + to = g_strdup_printf("%s/%s", jid, nickname); + jb_setstatus(pres->st, to, pres->msg); + g_free(to); +} + void jb_setstatus(enum imstatus st, const char *recipient, const char *msg) { xmlnode x; gchar *utf8_msg; unsigned int prio; + struct T_presence room_presence; if (!online) return; @@ -347,8 +373,12 @@ // If we didn't change our _global_ status, we are done if (recipient) return; - // Buddy per buddy invisibility handling - //sendvisibility(); + // Send presence to chatrooms + if (st != invisible) { + room_presence.st = st; + room_presence.msg = msg; + foreach_buddy(ROSTER_TYPE_ROOM, &roompresence, &room_presence); + } // We'll need to update the roster if we switch to/from offline because // we don't know the presences of buddies when offline... diff -r aee9a279a0f3 -r 2ac8d8e49e81 mcabber/src/roster.c --- a/mcabber/src/roster.c Tue Nov 22 23:36:12 2005 +0100 +++ b/mcabber/src/roster.c Thu Nov 24 00:03:37 2005 +0100 @@ -774,7 +774,7 @@ { roster *roster_usr = rosterdata; - if (!roster_usr->type & ROSTER_TYPE_ROOM) return; + if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return; if (roster_usr->nickname) { g_free((gchar*)roster_usr->nickname); @@ -964,6 +964,33 @@ } } +// foreach_buddy(roster_type, pfunction, param) +// Call pfunction(buddy, param) for each buddy from the roster with +// type matching roster_type. +void foreach_buddy(guint roster_type, + void (*pfunc)(gpointer rosterdata, void *param), + void *param) +{ + GSList *sl_roster_elt = groups; + roster *roster_elt; + GSList *sl_roster_usrelt; + roster *roster_usrelt; + + while (sl_roster_elt) { // group list loop + roster_elt = (roster*) sl_roster_elt->data; + sl_roster_usrelt = roster_elt->list; + while (sl_roster_usrelt) { // user list loop + roster_usrelt = (roster*) sl_roster_usrelt->data; + + if (roster_usrelt->type & roster_type) + pfunc(roster_usrelt, param); + + sl_roster_usrelt = g_slist_next(sl_roster_usrelt); + } + sl_roster_elt = g_slist_next(sl_roster_elt); + } +} + // compl_list(type) // Returns a list of jid's or groups. (For commands completion) // type: ROSTER_TYPE_USER (jid's) or ROSTER_TYPE_GROUP (group names) @@ -1011,4 +1038,3 @@ return unread_list->data; } - diff -r aee9a279a0f3 -r 2ac8d8e49e81 mcabber/src/roster.h --- a/mcabber/src/roster.h Tue Nov 22 23:36:12 2005 +0100 +++ b/mcabber/src/roster.h Thu Nov 24 00:03:37 2005 +0100 @@ -88,6 +88,9 @@ guint buddy_getflags(gpointer rosterdata); GList *buddy_search_jid(char *jid); GList *buddy_search(char *string); +void foreach_buddy(guint roster_type, + void (*pfunc)(gpointer rosterdata, void *param), + void *param); gpointer unread_msg(gpointer rosterdata); GSList *compl_list(guint type);