Mercurial > pidgin
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 |