diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/xmpp/message.c | 96 |
1 files changed, 55 insertions, 41 deletions
diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 85106132..bc702199 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -608,6 +608,58 @@ _private_chat_handler(xmpp_stanza_t * const stanza, const char * const fulljid) xmpp_free(ctx, message); } +static gboolean +_handle_carbons(xmpp_stanza_t * const stanza) +{ + xmpp_stanza_t *carbons = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CARBONS); + if (!carbons) { + return FALSE; + } + + char *name = xmpp_stanza_get_name(carbons); + if ((g_strcmp0(name, "received") == 0) || (g_strcmp0(name, "sent")) == 0) { + xmpp_stanza_t *forwarded = xmpp_stanza_get_child_by_ns(carbons, STANZA_NS_FORWARD); + xmpp_stanza_t *message = xmpp_stanza_get_child_by_name(forwarded, STANZA_NAME_MESSAGE); + + xmpp_ctx_t *ctx = connection_get_ctx(); + + gchar *to = xmpp_stanza_get_attribute(message, STANZA_ATTR_TO); + gchar *from = xmpp_stanza_get_attribute(message, STANZA_ATTR_FROM); + + // happens when receive a carbon of a self sent message + if (!to) to = from; + + Jid *jid_from = jid_create(from); + Jid *jid_to = jid_create(to); + Jid *my_jid = jid_create(jabber_get_fulljid()); + + // check for and deal with message + xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(message, STANZA_NAME_BODY); + if (body) { + char *message = xmpp_stanza_get_text(body); + if (message) { + // if we are the recipient, treat as standard incoming message + if(g_strcmp0(my_jid->barejid, jid_to->barejid) == 0){ + sv_ev_incoming_message(jid_from->barejid, jid_from->resourcepart, message); + } + // else treat as a sent message + else{ + sv_ev_carbon(jid_to->barejid, message); + } + xmpp_free(ctx, message); + } + } + + jid_destroy(jid_from); + jid_destroy(jid_to); + jid_destroy(my_jid); + + return TRUE; + } + + return FALSE; +} + static int _chat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata) { @@ -618,47 +670,9 @@ _chat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * con } // check if carbon message - xmpp_stanza_t *carbons = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CARBONS); - if (carbons) { - char *name = xmpp_stanza_get_name(carbons); - if ((g_strcmp0(name, "received") == 0) || (g_strcmp0(name, "sent")) == 0){ - xmpp_stanza_t *forwarded = xmpp_stanza_get_child_by_ns(carbons, STANZA_NS_FORWARD); - xmpp_stanza_t *message = xmpp_stanza_get_child_by_name(forwarded, STANZA_NAME_MESSAGE); - - xmpp_ctx_t *ctx = connection_get_ctx(); - - gchar *to = xmpp_stanza_get_attribute(message, STANZA_ATTR_TO); - gchar *from = xmpp_stanza_get_attribute(message, STANZA_ATTR_FROM); - - // happens when receive a carbon of a self sent message - if (!to) to = from; - - Jid *jid_from = jid_create(from); - Jid *jid_to = jid_create(to); - Jid *my_jid = jid_create(jabber_get_fulljid()); - - // check for and deal with message - xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(message, STANZA_NAME_BODY); - if (body) { - char *message = xmpp_stanza_get_text(body); - if (message) { - // if we are the recipient, treat as standard incoming message - if(g_strcmp0(my_jid->barejid, jid_to->barejid) == 0){ - sv_ev_incoming_message(jid_from->barejid, jid_from->resourcepart, message); - } - // else treat as a sent message - else{ - sv_ev_carbon(jid_to->barejid, message); - } - xmpp_free(ctx, message); - } - } - - jid_destroy(jid_from); - jid_destroy(jid_to); - jid_destroy(my_jid); - return 1; - } + gboolean res = _handle_carbons(stanza); + if (res) { + return 1; } // ignore handled namespaces |