Jabber chat is now working in both directions
authorArt Cancro <ajc@citadel.org>
Mon, 3 Dec 2007 05:38:07 +0000 (05:38 +0000)
committerArt Cancro <ajc@citadel.org>
Mon, 3 Dec 2007 05:38:07 +0000 (05:38 +0000)
citadel/modules/jabber/serv_xmpp.c
citadel/modules/jabber/serv_xmpp.h
citadel/modules/jabber/xmpp_messages.c

index cc7eba8736b5eea636c6dc4e26c0998586b6a56c..a70481696f6fb77b8bf012f1d582a35a7f9dda81 100644 (file)
@@ -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);
index fac8d3731931cc1283b211ca8ebd5b4c448541c0..b9140bd5c2df4f1627485dbcfcc32d7c5dfb2434 100644 (file)
@@ -21,6 +21,9 @@ struct citxmpp {                      /* Information about the current session */
        char iq_query_xmlns[256];       /* Namespace of <query> */
 
        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 *);
index 834b3edfbbe392221f3ad89e269e3c3b7ac868fa..00f6781b0a3a09180061035c89a3b80e9915fa07 100644 (file)
@@ -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 */