From 7b40f17f9f514127c8a37c35ac3d1c3bd34c13d5 Mon Sep 17 00:00:00 2001 From: dequis Date: Fri, 10 Oct 2014 23:20:53 -0300 Subject: Add support for XEP-0203: Delayed delivery (message timestamps) Very similar to XEP-0091 which is already supported, but was marked as obsolete, replaced by XEP-0203. The main differences are the tag name and the timestamp format. Due to the similarities, both XEPs are still supported. --- protocols/jabber/jabber.h | 3 ++- protocols/jabber/jabber_util.c | 30 ++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 11 deletions(-) (limited to 'protocols') diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h index e6aa3ba3..eb99f9ca 100644 --- a/protocols/jabber/jabber.h +++ b/protocols/jabber/jabber.h @@ -228,7 +228,8 @@ struct jabber_transfer #define XMLNS_PING "urn:xmpp:ping" /* XEP-0199 */ #define XMLNS_RECEIPTS "urn:xmpp:receipts" /* XEP-0184 */ #define XMLNS_VCARD "vcard-temp" /* XEP-0054 */ -#define XMLNS_DELAY "jabber:x:delay" /* XEP-0091 */ +#define XMLNS_DELAY_OLD "jabber:x:delay" /* XEP-0091 */ +#define XMLNS_DELAY "urn:xmpp:delay" /* XEP-0203 */ #define XMLNS_XDATA "jabber:x:data" /* XEP-0004 */ #define XMLNS_CHATSTATES "http://jabber.org/protocol/chatstates" /* XEP-0085 */ #define XMLNS_DISCO_INFO "http://jabber.org/protocol/disco#info" /* XEP-0030 */ diff --git a/protocols/jabber/jabber_util.c b/protocols/jabber/jabber_util.c index 0fcc8338..fb68c33d 100644 --- a/protocols/jabber/jabber_util.c +++ b/protocols/jabber/jabber_util.c @@ -725,19 +725,29 @@ time_t jabber_get_timestamp( struct xt_node *xt ) struct xt_node *c; char *s = NULL; struct tm tp; - - for( c = xt->children; ( c = xt_find_node( c, "x" ) ); c = c->next ) - { - if( ( s = xt_find_attr( c, "xmlns" ) ) && strcmp( s, XMLNS_DELAY ) == 0 ) - break; + gboolean is_old = TRUE; + const char *format; + + /* XEP-0091 has */ + c = xt_find_node_by_attr( xt->children, "x", "xmlns", XMLNS_DELAY_OLD ); + + if( !c || !( s = xt_find_attr( c, "stamp" ) ) ) { + is_old = FALSE; + + /* XEP-0203 has */ + c = xt_find_node_by_attr( xt->children, "delay", "xmlns", XMLNS_DELAY ); + if( !c || !( s = xt_find_attr( c, "stamp" ) ) ) { + return 0; + } } - if( !c || !( s = xt_find_attr( c, "stamp" ) ) ) - return 0; - memset( &tp, 0, sizeof( tp ) ); - if( sscanf( s, "%4d%2d%2dT%2d:%2d:%2d", &tp.tm_year, &tp.tm_mon, &tp.tm_mday, - &tp.tm_hour, &tp.tm_min, &tp.tm_sec ) != 6 ) + + /* The other main difference between XEPs is the timestamp format */ + format = (is_old) ? "%4d%2d%2dT%2d:%2d:%2d" : "%4d-%2d-%2dT%2d:%2d:%2dZ"; + + if( sscanf( s, format, &tp.tm_year, &tp.tm_mon, &tp.tm_mday, + &tp.tm_hour, &tp.tm_min, &tp.tm_sec ) != 6 ) return 0; tp.tm_year -= 1900; -- cgit v1.2.3