comparison libpurple/protocols/jabber/presence.c @ 25805:6fed1bb3b02e

Fix merge
author Marcus Lundblad <ml@update.uu.se>
date Wed, 17 Dec 2008 18:23:36 +0000
parents 9100b9176a16
children b1a16f0efec2
comparison
equal deleted inserted replaced
25804:9100b9176a16 25805:6fed1bb3b02e
149 149
150 #define CHANGED(a,b) ((!a && b) || (a && a[0] == '\0' && b && b[0] != '\0') || \ 150 #define CHANGED(a,b) ((!a && b) || (a && a[0] == '\0' && b && b[0] != '\0') || \
151 (a && !b) || (a && a[0] != '\0' && b && b[0] == '\0') || (a && b && strcmp(a,b))) 151 (a && !b) || (a && a[0] != '\0' && b && b[0] == '\0') || (a && b && strcmp(a,b)))
152 /* check if there are any differences to the <presence> and send them in that case */ 152 /* check if there are any differences to the <presence> and send them in that case */
153 if (allowBuzz != js->allowBuzz || js->old_state != state || CHANGED(js->old_msg, stripped) || 153 if (allowBuzz != js->allowBuzz || js->old_state != state || CHANGED(js->old_msg, stripped) ||
154 js->old_priority != priority || CHANGED(js->old_avatarhash, js->avatar_hash)) { 154 js->old_priority != priority || CHANGED(js->old_avatarhash, js->avatar_hash) ||
155 js->old_idle != js->idle) {
155 js->allowBuzz = allowBuzz; 156 js->allowBuzz = allowBuzz;
156 157
157 presence = jabber_presence_create_js(js, state, stripped, priority); 158 presence = jabber_presence_create_js(js, state, stripped, priority);
158 159
159 if(js->avatar_hash) { 160 if(js->avatar_hash) {
176 g_free(js->old_avatarhash); 177 g_free(js->old_avatarhash);
177 js->old_msg = g_strdup(stripped); 178 js->old_msg = g_strdup(stripped);
178 js->old_avatarhash = g_strdup(js->avatar_hash); 179 js->old_avatarhash = g_strdup(js->avatar_hash);
179 js->old_state = state; 180 js->old_state = state;
180 js->old_priority = priority; 181 js->old_priority = priority;
182 js->old_idle = js->idle;
181 } 183 }
182 g_free(stripped); 184 g_free(stripped);
183 185
184 /* next, check if there are any changes to the tune values */ 186 /* next, check if there are any changes to the tune values */
185 tune = purple_presence_get_status(p, "tune"); 187 tune = purple_presence_get_status(p, "tune");
258 pri = xmlnode_new_child(presence, "priority"); 260 pri = xmlnode_new_child(presence, "priority");
259 xmlnode_insert_data(pri, pstr, -1); 261 xmlnode_insert_data(pri, pstr, -1);
260 g_free(pstr); 262 g_free(pstr);
261 } 263 }
262 264
265 /* if we are idle and not offline, include idle */
266 if (js->idle && state != JABBER_BUDDY_STATE_UNAVAILABLE) {
267 xmlnode *query = xmlnode_new_child(presence, "query");
268 gchar seconds[10];
269 g_snprintf(seconds, 10, "%d", (int) (time(NULL) - js->idle));
270
271 xmlnode_set_namespace(query, "jabber:iq:last");
272 xmlnode_set_attrib(query, "seconds", seconds);
273 }
274
263 /* JEP-0115 */ 275 /* JEP-0115 */
264 c = xmlnode_new_child(presence, "c"); 276 c = xmlnode_new_child(presence, "c");
265 xmlnode_set_namespace(c, "http://jabber.org/protocol/caps"); 277 xmlnode_set_namespace(c, "http://jabber.org/protocol/caps");
266 xmlnode_set_attrib(c, "node", CAPS0115_NODE); 278 xmlnode_set_attrib(c, "node", CAPS0115_NODE);
267 xmlnode_set_attrib(c, "ver", VERSION); 279 xmlnode_set_attrib(c, "ver", VERSION);
425 JabberChat *chat; 437 JabberChat *chat;
426 JabberBuddy *jb; 438 JabberBuddy *jb;
427 JabberBuddyResource *jbr = NULL, *found_jbr = NULL; 439 JabberBuddyResource *jbr = NULL, *found_jbr = NULL;
428 PurpleConvChatBuddyFlags flags = PURPLE_CBFLAGS_NONE; 440 PurpleConvChatBuddyFlags flags = PURPLE_CBFLAGS_NONE;
429 gboolean delayed = FALSE; 441 gboolean delayed = FALSE;
442 const gchar *stamp = NULL; /* from <delayed/> element */
430 PurpleBuddy *b = NULL; 443 PurpleBuddy *b = NULL;
431 char *buddy_name; 444 char *buddy_name;
432 JabberBuddyState state = JABBER_BUDDY_STATE_UNKNOWN; 445 JabberBuddyState state = JABBER_BUDDY_STATE_UNKNOWN;
433 xmlnode *y; 446 xmlnode *y;
434 gboolean muc = FALSE; 447 gboolean muc = FALSE;
435 char *avatar_hash = NULL; 448 char *avatar_hash = NULL;
436 xmlnode *caps = NULL; 449 xmlnode *caps = NULL;
437 450 int idle = 0;
451
438 if(!(jb = jabber_buddy_find(js, from, TRUE))) 452 if(!(jb = jabber_buddy_find(js, from, TRUE)))
439 return; 453 return;
440 454
441 if(!(jid = jabber_id_new(from))) 455 if(!(jid = jabber_id_new(from)))
442 return; 456 return;
511 g_free(p); 525 g_free(p);
512 } 526 }
513 } else if(!strcmp(y->name, "delay") && !strcmp(xmlns, "urn:xmpp:delay")) { 527 } else if(!strcmp(y->name, "delay") && !strcmp(xmlns, "urn:xmpp:delay")) {
514 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ 528 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */
515 delayed = TRUE; 529 delayed = TRUE;
530 stamp = xmlnode_get_attrib(y, "stamp");
516 } else if(xmlns && !strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) { 531 } else if(xmlns && !strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) {
517 caps = y; /* store for later, when creating buddy resource */ 532 caps = y; /* store for later, when creating buddy resource */
518 } else if(!strcmp(y->name, "x")) { 533 } else if(!strcmp(y->name, "x")) {
519 const char *xmlns = xmlnode_get_namespace(y); 534 const char *xmlns = xmlnode_get_namespace(y);
520 if(xmlns && !strcmp(xmlns, "jabber:x:delay")) { 535 if(xmlns && !strcmp(xmlns, "jabber:x:delay")) {
521 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */ 536 /* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */
522 delayed = TRUE; 537 delayed = TRUE;
538 stamp = xmlnode_get_attrib(y, "stamp");
523 } else if(xmlns && !strcmp(xmlns, "http://jabber.org/protocol/muc#user")) { 539 } else if(xmlns && !strcmp(xmlns, "http://jabber.org/protocol/muc#user")) {
524 xmlnode *z; 540 xmlnode *z;
525 541
526 muc = TRUE; 542 muc = TRUE;
527 if((z = xmlnode_get_child(y, "status"))) { 543 if((z = xmlnode_get_child(y, "status"))) {
568 if(photo) { 584 if(photo) {
569 g_free(avatar_hash); 585 g_free(avatar_hash);
570 avatar_hash = xmlnode_get_data(photo); 586 avatar_hash = xmlnode_get_data(photo);
571 } 587 }
572 } 588 }
573 } 589 } else if (!strcmp(y->name, "query") &&
574 } 590 !strcmp(xmlnode_get_namespace(y), "jabber:iq:last")) {
575 591 /* resource has specified idle */
592 const gchar *seconds = xmlnode_get_attrib(y, "seconds");
593 if (seconds) {
594 /* we may need to take "delayed" into account here */
595 idle = atoi(seconds);
596 }
597 }
598 }
599
600 purple_debug_info("jabber", "got %d seconds idle from presence\n", idle);
601
602 if (idle && delayed && stamp) {
603 /* if we have a delayed presence, we need to add the delay to the idle
604 value */
605 time_t offset = time(NULL) - purple_str_to_time(stamp, TRUE, NULL, NULL,
606 NULL);
607 purple_debug_info("jabber", "got delay %s yielding %ld s offset\n",
608 stamp, offset);
609 idle += offset;
610 }
611
576 612
577 if(jid->node && (chat = jabber_chat_find(js, jid->node, jid->domain))) { 613 if(jid->node && (chat = jabber_chat_find(js, jid->node, jid->domain))) {
578 static int i = 1; 614 static int i = 1;
579 char *room_jid = g_strdup_printf("%s@%s", jid->node, jid->domain); 615 char *room_jid = g_strdup_printf("%s@%s", jid->node, jid->domain);
580 616
745 purple_conversation_set_name(conv, buddy_name); 781 purple_conversation_set_name(conv, buddy_name);
746 782
747 } else { 783 } else {
748 jbr = jabber_buddy_track_resource(jb, jid->resource, priority, 784 jbr = jabber_buddy_track_resource(jb, jid->resource, priority,
749 state, status); 785 state, status);
786 if (idle) {
787 jbr->idle = time(NULL) - idle;
788 } else {
789 jbr->idle = 0;
790 }
791
750 if(caps) { 792 if(caps) {
751 const char *node = xmlnode_get_attrib(caps,"node"); 793 const char *node = xmlnode_get_attrib(caps,"node");
752 const char *ver = xmlnode_get_attrib(caps,"ver"); 794 const char *ver = xmlnode_get_attrib(caps,"ver");
753 const char *ext = xmlnode_get_attrib(caps,"ext"); 795 const char *ext = xmlnode_get_attrib(caps,"ext");
754 796
763 } 805 }
764 806
765 if((found_jbr = jabber_buddy_find_resource(jb, NULL))) { 807 if((found_jbr = jabber_buddy_find_resource(jb, NULL))) {
766 jabber_google_presence_incoming(js, buddy_name, found_jbr); 808 jabber_google_presence_incoming(js, buddy_name, found_jbr);
767 purple_prpl_got_user_status(js->gc->account, buddy_name, jabber_buddy_state_get_status_id(found_jbr->state), "priority", found_jbr->priority, "message", found_jbr->status, NULL); 809 purple_prpl_got_user_status(js->gc->account, buddy_name, jabber_buddy_state_get_status_id(found_jbr->state), "priority", found_jbr->priority, "message", found_jbr->status, NULL);
810 purple_prpl_got_user_idle(js->gc->account, buddy_name, found_jbr->idle, found_jbr->idle);
768 } else { 811 } else {
769 purple_prpl_got_user_status(js->gc->account, buddy_name, "offline", status ? "message" : NULL, status, NULL); 812 purple_prpl_got_user_status(js->gc->account, buddy_name, "offline", status ? "message" : NULL, status, NULL);
770 } 813 }
771 g_free(buddy_name); 814 g_free(buddy_name);
772 } 815 }