comparison libpurple/protocols/jabber/presence.c @ 25202:f8e6484fa8ac

Support setting offset from <delayed/> element in <presence/> or "stamp" attribute on an <x/> element (old XEP for delayed messages). Hopefully this works (I tested the code by "faking" hard-coded "stamp" values
author Marcus Lundblad <ml@update.uu.se>
date Mon, 17 Nov 2008 23:18:12 +0000
parents 3d4ce9df0d48
children cac2f6203505
comparison
equal deleted inserted replaced
25201:3d4ce9df0d48 25202:f8e6484fa8ac
473 JabberChat *chat; 473 JabberChat *chat;
474 JabberBuddy *jb; 474 JabberBuddy *jb;
475 JabberBuddyResource *jbr = NULL, *found_jbr = NULL; 475 JabberBuddyResource *jbr = NULL, *found_jbr = NULL;
476 PurpleConvChatBuddyFlags flags = PURPLE_CBFLAGS_NONE; 476 PurpleConvChatBuddyFlags flags = PURPLE_CBFLAGS_NONE;
477 gboolean delayed = FALSE; 477 gboolean delayed = FALSE;
478 const gchar *stamp = NULL; /* from <delayed/> element */
478 PurpleBuddy *b = NULL; 479 PurpleBuddy *b = NULL;
479 char *buddy_name; 480 char *buddy_name;
480 JabberBuddyState state = JABBER_BUDDY_STATE_UNKNOWN; 481 JabberBuddyState state = JABBER_BUDDY_STATE_UNKNOWN;
481 xmlnode *y; 482 xmlnode *y;
482 gboolean muc = FALSE; 483 gboolean muc = FALSE;
560 g_free(p); 561 g_free(p);
561 } 562 }
562 } else if(!strcmp(y->name, "delay") && !strcmp(xmlns, "urn:xmpp:delay")) { 563 } else if(!strcmp(y->name, "delay") && !strcmp(xmlns, "urn:xmpp:delay")) {
563 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ 564 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */
564 delayed = TRUE; 565 delayed = TRUE;
566 stamp = xmlnode_get_attrib(y, "stamp");
565 } else if(!strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) { 567 } else if(!strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) {
566 caps = y; /* store for later, when creating buddy resource */ 568 caps = y; /* store for later, when creating buddy resource */
567 } else if(!strcmp(y->name, "x")) { 569 } else if(!strcmp(y->name, "x")) {
568 const char *xmlns = xmlnode_get_namespace(y); 570 const char *xmlns = xmlnode_get_namespace(y);
569 if(xmlns && !strcmp(xmlns, "jabber:x:delay")) { 571 if(xmlns && !strcmp(xmlns, "jabber:x:delay")) {
570 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ 572 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */
571 delayed = TRUE; 573 delayed = TRUE;
574 stamp = xmlnode_get_attrib(y, "stamp");
572 } else if(xmlns && !strcmp(xmlns, "http://jabber.org/protocol/muc#user")) { 575 } else if(xmlns && !strcmp(xmlns, "http://jabber.org/protocol/muc#user")) {
573 xmlnode *z; 576 xmlnode *z;
574 577
575 muc = TRUE; 578 muc = TRUE;
576 if((z = xmlnode_get_child(y, "status"))) { 579 if((z = xmlnode_get_child(y, "status"))) {
628 idle = atoi(seconds); 631 idle = atoi(seconds);
629 } 632 }
630 } 633 }
631 } 634 }
632 635
636 purple_debug_info("jabber", "got %d seconds idle from presence\n", idle);
637
638 if (idle && delayed && stamp) {
639 /* if we have a delayed presence, we need to add the delay to the idle
640 value */
641 time_t offset = time(NULL) - purple_str_to_time(stamp, TRUE, NULL, NULL,
642 NULL);
643 purple_debug_info("jabber", "got delay %s yielding %ld s offset\n",
644 stamp, offset);
645 idle += offset;
646 }
647
633 648
634 if(jid->node && (chat = jabber_chat_find(js, jid->node, jid->domain))) { 649 if(jid->node && (chat = jabber_chat_find(js, jid->node, jid->domain))) {
635 static int i = 1; 650 static int i = 1;
636 char *room_jid = g_strdup_printf("%s@%s", jid->node, jid->domain); 651 char *room_jid = g_strdup_printf("%s@%s", jid->node, jid->domain);
637 652