X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fxmpp%2Fxmpp_presence.c;h=053994a3490b956172648cf5933055ec1b437c6b;hb=ebc64e2caae8740dd047e5317de2172eb3f44fc3;hp=521d257c4cb386d1e1c8a027f5b4a5331794cf16;hpb=62e5cd8b5bcf983f843a7e27d0ecddc4b11b13c3;p=citadel.git diff --git a/citadel/modules/xmpp/xmpp_presence.c b/citadel/modules/xmpp/xmpp_presence.c index 521d257c4..053994a34 100644 --- a/citadel/modules/xmpp/xmpp_presence.c +++ b/citadel/modules/xmpp/xmpp_presence.c @@ -1,7 +1,7 @@ /* * Handle XMPP presence exchanges * - * Copyright (c) 2007-2010 by Art Cancro + * Copyright (c) 2007-2014 by Art Cancro * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -58,22 +58,21 @@ #include "serv_xmpp.h" - /* * Indicate the presence of another user to the client * (used in several places) */ void xmpp_indicate_presence(char *presence_jid) { - XPUT("client_jid, strlen(XMPP->client_jid)); - XPUT("\">"); + XPrint(HKEY("presence"), + XCLOSED, + XPROPERTY("from", presence_jid, strlen(presence_jid)), + XPROPERTY("to", XMPP->client_jid, strlen(XMPP->client_jid)), + TYPE_ARGEND + ); } - /* * Convenience function to determine whether any given session is 'visible' to any other given session, * and is capable of receiving instant messages from that session. @@ -125,17 +124,19 @@ void xmpp_wholist_presence_dump(void *data, const char *supplied_el, const char void xmpp_destroy_buddy(char *presence_jid, int aggressively) { static int unsolicited_id = 1; struct CitContext *CCC = CC; + char Buf[64]; + long blen; if (!presence_jid) return; if (!XMPP) return; if (!XMPP->client_jid) return; /* Transmit non-presence information */ - XPUT("client_jid, strlen(XMPP->client_jid)); - XPUT("\">"); + XPrint(HKEY("presence"), XCLOSED, + XCPROPERTY("type", "unavailable"), + XPROPERTY("from", presence_jid, strlen(presence_jid)), + XPROPERTY("to", XMPP->client_jid, strlen(XMPP->client_jid)), + TYPE_ARGEND); /* * Setting the "aggressively" flag also sends an "unsubscribed" presence update. @@ -144,32 +145,38 @@ void xmpp_destroy_buddy(char *presence_jid, int aggressively) { * it as a rejection of a subscription request. */ if (aggressively) { - XPUT("client_jid, strlen(XMPP->client_jid)); - XPUT("\">"); + XPrint(HKEY("presence"), XCLOSED, + XCPROPERTY("type", "unsubscribed"), + XPROPERTY("from", presence_jid, strlen(presence_jid)), + XPROPERTY("to", XMPP->client_jid, strlen(XMPP->client_jid)), + TYPE_ARGEND); } // FIXME ... we should implement xmpp_indicate_nonpresence so we can use it elsewhere + blen = snprintf(Buf, sizeof(Buf), "unbuddy_%x", ++unsolicited_id); + /* Do an unsolicited roster update that deletes the contact. */ - XPUT("cs_inet_email, strlen(CCC->cs_inet_email)); - XPUT("\" to=\""); - XPutProp(XMPP->client_jid, strlen(XMPP->client_jid)); - XPUT("\" id=\"unbuddy_"); - XPrintf("%x", ++unsolicited_id); - XPUT("\">"); - - XPUT("" - "" - ""); - XPutBody(CFG_KEY(c_humannode)); - XPUT("" - "" + XPrint(HKEY("iq"), 0, + XCPROPERTY("type", "result"), + XPROPERTY("from", CCC->cs_inet_email, strlen(CCC->cs_inet_email)), + XPROPERTY("to", XMPP->client_jid, strlen(XMPP->client_jid)), + XPROPERTY("id", Buf, blen), + TYPE_ARGEND); + + XPrint(HKEY("query"), 0, + XCPROPERTY("xmlns", "jabber:iq:roster"), + TYPE_ARGEND); + + XPrint(HKEY("item"), 0, + XCPROPERTY("subscription", "remove"), + XPROPERTY("jid", presence_jid, strlen(presence_jid)), + TYPE_ARGEND); + + XPrint(HKEY("group"), XCLOSED, + XCFGBODY(c_humannode), + TYPE_ARGEND); + XPUT("" "" "" ); @@ -209,16 +216,26 @@ void xmpp_presence_notify(char *presence_jid, int event_type) { visible_sessions, presence_jid, CC->cs_pid); if ( (event_type == XMPP_EVT_LOGIN) && (visible_sessions == 1) ) { + long blen; + char Buf[64]; XMPP_syslog(LOG_DEBUG, "Telling session %d that <%s> logged in\n", CC->cs_pid, presence_jid); /* Do an unsolicited roster update that adds a new contact. */ assert(which_cptr_is_relevant >= 0); - XPUT("" - ""); + + blen = snprintf(Buf, sizeof(Buf), "unsolicited_%x", ++unsolicited_id); + + XPrint(HKEY("iq"), 0, + XCPROPERTY("type", "result"), + XPROPERTY("id", Buf, blen), + TYPE_ARGEND); + + XPrint(HKEY("query"), 0, + XCPROPERTY("xmlns", "jabber:iq:roster"), + TYPE_ARGEND); + xmpp_roster_item(&cptr[which_cptr_is_relevant]); XPUT("");