diff options
Diffstat (limited to 'protocols/jabber')
| -rw-r--r-- | protocols/jabber/jabber.h | 3 | ||||
| -rw-r--r-- | protocols/jabber/jabber_util.c | 30 | 
2 files changed, 22 insertions, 11 deletions
| 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 <x> */ +	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 <delay> */ +		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; | 
