Mercurial > ~mikael > mcabber > hg
comparison mcabber/src/jabglue.c @ 532:2ac8d8e49e81
Send status changes to chatrooms
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Thu, 24 Nov 2005 00:03:37 +0100 |
parents | aee9a279a0f3 |
children | c478e8f7f074 |
comparison
equal
deleted
inserted
replaced
531:aee9a279a0f3 | 532:2ac8d8e49e81 |
---|---|
55 STATE_GETAUTH, | 55 STATE_GETAUTH, |
56 STATE_SENDAUTH, | 56 STATE_SENDAUTH, |
57 STATE_LOGGED | 57 STATE_LOGGED |
58 } jstate; | 58 } jstate; |
59 | 59 |
60 struct T_presence { | |
61 enum imstatus st; | |
62 const char *msg; | |
63 }; | |
64 | |
60 | 65 |
61 void statehandler(jconn, int); | 66 void statehandler(jconn, int); |
62 void packethandler(jconn, jpacket); | 67 void packethandler(jconn, jpacket); |
63 | 68 |
64 static void logger(jconn j, int io, const char *buf) | 69 static void logger(jconn j, int io, const char *buf) |
261 inline const char *jb_getstatusmsg() | 266 inline const char *jb_getstatusmsg() |
262 { | 267 { |
263 return mystatusmsg; | 268 return mystatusmsg; |
264 } | 269 } |
265 | 270 |
271 static void roompresence(gpointer room, void *presencedata) | |
272 { | |
273 const char *jid; | |
274 const char *nickname; | |
275 char *to; | |
276 struct T_presence *pres = presencedata; | |
277 | |
278 if (!buddy_getresources(room)) // FIXME: that's a memory leak | |
279 return; | |
280 | |
281 jid = buddy_getjid(room); | |
282 if (!jid) return; | |
283 nickname = buddy_getnickname(room); | |
284 if (!nickname) return; | |
285 | |
286 to = g_strdup_printf("%s/%s", jid, nickname); | |
287 jb_setstatus(pres->st, to, pres->msg); | |
288 g_free(to); | |
289 } | |
290 | |
266 void jb_setstatus(enum imstatus st, const char *recipient, const char *msg) | 291 void jb_setstatus(enum imstatus st, const char *recipient, const char *msg) |
267 { | 292 { |
268 xmlnode x; | 293 xmlnode x; |
269 gchar *utf8_msg; | 294 gchar *utf8_msg; |
270 unsigned int prio; | 295 unsigned int prio; |
296 struct T_presence room_presence; | |
271 | 297 |
272 if (!online) return; | 298 if (!online) return; |
273 | 299 |
274 x = jutil_presnew(JPACKET__UNKNOWN, 0, 0); | 300 x = jutil_presnew(JPACKET__UNKNOWN, 0, 0); |
275 | 301 |
345 xmlnode_free(x); | 371 xmlnode_free(x); |
346 | 372 |
347 // If we didn't change our _global_ status, we are done | 373 // If we didn't change our _global_ status, we are done |
348 if (recipient) return; | 374 if (recipient) return; |
349 | 375 |
350 // Buddy per buddy invisibility handling | 376 // Send presence to chatrooms |
351 //sendvisibility(); | 377 if (st != invisible) { |
378 room_presence.st = st; | |
379 room_presence.msg = msg; | |
380 foreach_buddy(ROSTER_TYPE_ROOM, &roompresence, &room_presence); | |
381 } | |
352 | 382 |
353 // We'll need to update the roster if we switch to/from offline because | 383 // We'll need to update the roster if we switch to/from offline because |
354 // we don't know the presences of buddies when offline... | 384 // we don't know the presences of buddies when offline... |
355 if (mystatus == offline || st == offline) | 385 if (mystatus == offline || st == offline) |
356 update_roster = TRUE; | 386 update_roster = TRUE; |