WIP fix for #516, needs memory cleanup
This commit is contained in:
@@ -559,10 +559,9 @@ _groupchat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void
|
||||
}
|
||||
|
||||
// determine if the notifications happened whilst offline
|
||||
GTimeVal tv_stamp;
|
||||
gboolean delayed = stanza_get_delay(stanza, &tv_stamp);
|
||||
if (delayed) {
|
||||
sv_ev_room_history(jid->barejid, jid->resourcepart, tv_stamp, message);
|
||||
GDateTime *timestamp = stanza_get_delay(stanza);
|
||||
if (timestamp) {
|
||||
sv_ev_room_history(jid->barejid, jid->resourcepart, timestamp, message);
|
||||
} else {
|
||||
sv_ev_room_message(jid->barejid, jid->resourcepart, message);
|
||||
}
|
||||
@@ -663,10 +662,9 @@ _private_chat_handler(xmpp_stanza_t * const stanza, const char * const fulljid)
|
||||
return;
|
||||
}
|
||||
|
||||
GTimeVal tv_stamp;
|
||||
gboolean delayed = stanza_get_delay(stanza, &tv_stamp);
|
||||
if (delayed) {
|
||||
sv_ev_delayed_private_message(fulljid, message, tv_stamp);
|
||||
GDateTime *timestamp = stanza_get_delay(stanza);
|
||||
if (timestamp) {
|
||||
sv_ev_delayed_private_message(fulljid, message, timestamp);
|
||||
} else {
|
||||
sv_ev_incoming_private_message(fulljid, message);
|
||||
}
|
||||
@@ -761,15 +759,13 @@ _chat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * con
|
||||
}
|
||||
|
||||
// standard chat message, use jid without resource
|
||||
GTimeVal tv_stamp;
|
||||
gboolean delayed = stanza_get_delay(stanza, &tv_stamp);
|
||||
|
||||
GDateTime *timestamp = stanza_get_delay(stanza);
|
||||
xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_BODY);
|
||||
if (body) {
|
||||
char *message = xmpp_stanza_get_text(body);
|
||||
if (message) {
|
||||
if (delayed) {
|
||||
sv_ev_delayed_message(jid->barejid, message, tv_stamp);
|
||||
if (timestamp) {
|
||||
sv_ev_delayed_message(jid->barejid, message, timestamp);
|
||||
} else {
|
||||
char *enc_message = NULL;
|
||||
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_ENCRYPTED);
|
||||
@@ -787,7 +783,7 @@ _chat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * con
|
||||
}
|
||||
|
||||
// handle chat sessions and states
|
||||
if (!delayed && jid->resourcepart) {
|
||||
if (!timestamp && jid->resourcepart) {
|
||||
gboolean gone = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_GONE) != NULL;
|
||||
gboolean typing = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_COMPOSING) != NULL;
|
||||
gboolean paused = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_PAUSED) != NULL;
|
||||
|
||||
@@ -982,17 +982,20 @@ stanza_create_ping_iq(xmpp_ctx_t *ctx, const char * const target)
|
||||
return iq;
|
||||
}
|
||||
|
||||
gboolean
|
||||
stanza_get_delay(xmpp_stanza_t * const stanza, GTimeVal *tv_stamp)
|
||||
GDateTime*
|
||||
stanza_get_delay(xmpp_stanza_t * const stanza)
|
||||
{
|
||||
GTimeVal utc_stamp;
|
||||
// first check for XEP-0203 delayed delivery
|
||||
xmpp_stanza_t *delay = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_DELAY);
|
||||
if (delay) {
|
||||
char *xmlns = xmpp_stanza_get_attribute(delay, STANZA_ATTR_XMLNS);
|
||||
if (xmlns && (strcmp(xmlns, "urn:xmpp:delay") == 0)) {
|
||||
char *stamp = xmpp_stanza_get_attribute(delay, STANZA_ATTR_STAMP);
|
||||
if (stamp && (g_time_val_from_iso8601(stamp, tv_stamp))) {
|
||||
return TRUE;
|
||||
if (stamp && (g_time_val_from_iso8601(stamp, &utc_stamp))) {
|
||||
GDateTime *utc_datetime = g_date_time_new_from_timeval_utc(&utc_stamp);
|
||||
GDateTime *local_datetime = g_date_time_to_local(utc_datetime);
|
||||
return local_datetime;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1004,13 +1007,15 @@ stanza_get_delay(xmpp_stanza_t * const stanza, GTimeVal *tv_stamp)
|
||||
char *xmlns = xmpp_stanza_get_attribute(x, STANZA_ATTR_XMLNS);
|
||||
if (xmlns && (strcmp(xmlns, "jabber:x:delay") == 0)) {
|
||||
char *stamp = xmpp_stanza_get_attribute(x, STANZA_ATTR_STAMP);
|
||||
if (stamp && (g_time_val_from_iso8601(stamp, tv_stamp))) {
|
||||
return TRUE;
|
||||
if (stamp && (g_time_val_from_iso8601(stamp, &utc_stamp))) {
|
||||
GDateTime *utc_datetime = g_date_time_new_from_timeval_utc(&utc_stamp);
|
||||
GDateTime *local_datetime = g_date_time_to_local(utc_datetime);
|
||||
return local_datetime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *
|
||||
|
||||
@@ -223,7 +223,7 @@ xmpp_stanza_t* stanza_create_mediated_invite(xmpp_ctx_t *ctx, const char * const
|
||||
|
||||
gboolean stanza_contains_chat_state(xmpp_stanza_t *stanza);
|
||||
|
||||
gboolean stanza_get_delay(xmpp_stanza_t * const stanza, GTimeVal *tv_stamp);
|
||||
GDateTime* stanza_get_delay(xmpp_stanza_t * const stanza);
|
||||
|
||||
gboolean stanza_is_muc_presence(xmpp_stanza_t * const stanza);
|
||||
gboolean stanza_is_muc_self_presence(xmpp_stanza_t * const stanza,
|
||||
|
||||
Reference in New Issue
Block a user