X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fxmpp%2Fxmpp_presence.c;h=9eaf88728e7eae30ed3dc4c67281d8da8fe68733;hb=c5931fff7cb33567d6fcedfea165a7a0437bd10d;hp=a60580fae4ff4d1d74f16b63f2048dd35f418125;hpb=3e304fcdabe4753960b394108543819e52dc8aec;p=citadel.git diff --git a/citadel/modules/xmpp/xmpp_presence.c b/citadel/modules/xmpp/xmpp_presence.c index a60580fae..9eaf88728 100644 --- a/citadel/modules/xmpp/xmpp_presence.c +++ b/citadel/modules/xmpp/xmpp_presence.c @@ -3,7 +3,7 @@ * * Handle XMPP presence exchanges * - * Copyright (c) 2007-2009 by Art Cancro + * Copyright (c) 2007-2010 by Art Cancro * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -70,16 +70,17 @@ void xmpp_wholist_presence_dump(void) int aide = (CC->user.axlevel >= 6); cptr = CtdlGetContextArray(&nContexts); - if (!cptr) - return ; /** FIXME: Does xmpp need to send something to maintain the protocol? */ - + if (!cptr) { + return; + } + for (i=0; iuser.usernum) /* don't show myself */ && (cptr[i].can_receive_im) /* IM-capable session */ - ) { + ) { cprintf("", cptr[i].cs_inet_email); } @@ -89,6 +90,28 @@ void xmpp_wholist_presence_dump(void) } +/* + * Function to remove a buddy subscription and delete from the roster + * (used in several places) + */ +void xmpp_destroy_buddy(char *presence_jid) { + static int unsolicited_id = 1; + + /* Transmit non-presence information */ + cprintf("", presence_jid); + cprintf("", presence_jid); + + /* Do an unsolicited roster update that deletes the contact. */ + cprintf("", ++unsolicited_id); + cprintf(""); + cprintf("", presence_jid); + cprintf("%s", config.c_humannode); + cprintf(""); + cprintf("" + "" + ); +} + /* * When a user logs in or out of the local Citadel system, notify all XMPP sessions about it. @@ -101,10 +124,12 @@ void xmpp_presence_notify(char *presence_jid, int event_type) { int aide = (CC->user.axlevel >= 6); if (IsEmptyStr(presence_jid)) return; + if (CC->kill_me) return; cptr = CtdlGetContextArray(&nContexts); - if (!cptr) - return ; /** FIXME: Does XMPP need to send something to maintain the protocol? */ + if (!cptr) { + return; + } /* Count the visible sessions for this user */ for (i=0; i logged out\n", CC->cs_pid, presence_jid); - /* Transmit non-presence information */ - cprintf("", presence_jid); - cprintf("", presence_jid); - - /* Do an unsolicited roster update that deletes the contact. */ - cprintf("", ++unsolicited_id); - cprintf(""); - cprintf("", presence_jid); - cprintf("%s", config.c_humannode); - cprintf(""); - cprintf("" - ""); + xmpp_destroy_buddy(presence_jid); } free(cptr); } + + + +/* + * Upon logout we make an attempt to delete the whole roster, in order to + * try to keep "ghost" buddies from remaining in the client-side roster. + */ +void xmpp_massacre_roster(void) +{ + struct CitContext *cptr; + int nContexts, i; + int aide = (CC->user.axlevel >= 6); + + cptr = CtdlGetContextArray(&nContexts); + if (cptr) { + for (i=0; iuser.usernum) + ) { + xmpp_destroy_buddy(cptr[i].cs_inet_email); + } + } + } + free (cptr); + } +} + + +