From 4f34e814d121bcfef2e6d47853932e523e27d3db Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 3 Dec 2007 05:38:07 +0000 Subject: [PATCH] Jabber chat is now working in both directions --- citadel/modules/jabber/serv_xmpp.c | 32 ++++++++++++++++++++------ citadel/modules/jabber/serv_xmpp.h | 4 ++++ citadel/modules/jabber/xmpp_messages.c | 24 +++++++++++++++++++ 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/citadel/modules/jabber/serv_xmpp.c b/citadel/modules/jabber/serv_xmpp.c index cc7eba873..a70481696 100644 --- a/citadel/modules/jabber/serv_xmpp.c +++ b/citadel/modules/jabber/serv_xmpp.c @@ -146,6 +146,14 @@ void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) { } } } + + else if (!strcasecmp(el, "message")) { + for (i=0; attr[i] != NULL; i+=2) { + if (!strcasecmp(attr[i], "to")) { + safestrncpy(XMPP->message_to, attr[i+1], sizeof XMPP->message_to); + } + } + } } @@ -203,13 +211,6 @@ void xmpp_xml_end(void *data, const char *supplied_el) { /* Generate the "full JID" of the client resource */ - // snprintf(XMPP->client_jid, sizeof XMPP->client_jid, - // "%d@%s/%s", - // CC->cs_pid, - // config.c_fqdn, - // XMPP->iq_client_resource - //); - snprintf(XMPP->client_jid, sizeof XMPP->client_jid, "%s/%s", CC->cs_inet_email, @@ -267,6 +268,20 @@ void xmpp_xml_end(void *data, const char *supplied_el) { jabber_wholist_presence_dump(); } + else if (!strcasecmp(el, "body")) { + if (XMPP->message_body != NULL) { + free(XMPP->message_body); + XMPP->message_body = NULL; + } + if (XMPP->chardata_len > 0) { + XMPP->message_body = strdup(XMPP->chardata); + } + } + + else if (!strcasecmp(el, "message")) { + jabber_send_message(XMPP->message_to, XMPP->message_body); + } + XMPP->chardata_len = 0; if (XMPP->chardata_alloc > 0) { XMPP->chardata[0] = 0; @@ -306,6 +321,9 @@ void xmpp_cleanup_function(void) { XMPP->chardata = NULL; XMPP->chardata_len = 0; XMPP->chardata_alloc = 0; + if (XMPP->message_body != NULL) { + free(XMPP->message_body); + } } XML_ParserFree(XMPP->xp); free(XMPP); diff --git a/citadel/modules/jabber/serv_xmpp.h b/citadel/modules/jabber/serv_xmpp.h index fac8d3731..b9140bd5c 100644 --- a/citadel/modules/jabber/serv_xmpp.h +++ b/citadel/modules/jabber/serv_xmpp.h @@ -21,6 +21,9 @@ struct citxmpp { /* Information about the current session */ char iq_query_xmlns[256]; /* Namespace of */ char sasl_auth_mech[32]; /* SASL auth mechanism requested by the client */ + + char message_to[256]; + char *message_body; /* Message body in transit */ }; #define XMPP ((struct citxmpp *)CC->session_specific_data) @@ -55,3 +58,4 @@ void xmpp_queue_event(int, char *); void xmpp_process_events(void); void xmpp_presence_notify(char *, char *); void jabber_roster_item(struct CitContext *); +void jabber_send_message(char *, char *); diff --git a/citadel/modules/jabber/xmpp_messages.c b/citadel/modules/jabber/xmpp_messages.c index 834b3edfb..00f6781b0 100644 --- a/citadel/modules/jabber/xmpp_messages.c +++ b/citadel/modules/jabber/xmpp_messages.c @@ -77,5 +77,29 @@ void jabber_output_incoming_messages(void) { } } +/* + * Client is sending a message. + */ +void jabber_send_message(char *message_to, char *message_body) { + char *recp = NULL; + int message_sent = 0; + struct CitContext *cptr; + + if (message_body == NULL) return; + if (message_to == NULL) return; + if (IsEmptyStr(message_to)) return; + + for (cptr = ContextList; cptr != NULL; cptr = cptr->next) { + if (!strcasecmp(cptr->cs_inet_email, message_to)) { + recp = cptr->user.fullname; + } + } + + if (recp) { + message_sent = PerformXmsgHooks(CC->user.fullname, CC->cs_inet_email, recp, message_body); + } +} + + #endif /* HAVE_EXPAT */ -- 2.39.2