--- 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...
--- 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;
}
-
--- 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);