cpw.malu.xmpp.idle: c8e38df6: Fix merge
malu at pidgin.im
malu at pidgin.im
Wed Dec 17 13:25:43 EST 2008
-----------------------------------------------------------------
Revision: c8e38df6f870bd5d6b82077ffd1f9723ee23b178
Ancestor: 31917ebc02d70b7cdf42b95bafef70ea07a8b5d7
Author: malu at pidgin.im
Date: 2008-12-17T18:23:36
Branch: im.pidgin.cpw.malu.xmpp.idle
URL: http://d.pidgin.im/viewmtn/revision/info/c8e38df6f870bd5d6b82077ffd1f9723ee23b178
Modified files:
libpurple/protocols/jabber/presence.c
ChangeLog:
Fix merge
-------------- next part --------------
============================================================
--- libpurple/protocols/jabber/presence.c ebb63e249f0ece723d0f1b7053b35eee7022a6fa
+++ libpurple/protocols/jabber/presence.c 1d936aa57758d85799aa4df771c76b7409e8891b
@@ -151,7 +151,8 @@ void jabber_presence_send(PurpleAccount
(a && !b) || (a && a[0] != '\0' && b && b[0] == '\0') || (a && b && strcmp(a,b)))
/* check if there are any differences to the <presence> and send them in that case */
if (allowBuzz != js->allowBuzz || js->old_state != state || CHANGED(js->old_msg, stripped) ||
- js->old_priority != priority || CHANGED(js->old_avatarhash, js->avatar_hash)) {
+ js->old_priority != priority || CHANGED(js->old_avatarhash, js->avatar_hash) ||
+ js->old_idle != js->idle) {
js->allowBuzz = allowBuzz;
presence = jabber_presence_create_js(js, state, stripped, priority);
@@ -178,6 +179,7 @@ void jabber_presence_send(PurpleAccount
js->old_avatarhash = g_strdup(js->avatar_hash);
js->old_state = state;
js->old_priority = priority;
+ js->old_idle = js->idle;
}
g_free(stripped);
@@ -260,6 +262,16 @@ xmlnode *jabber_presence_create_js(Jabbe
g_free(pstr);
}
+ /* if we are idle and not offline, include idle */
+ if (js->idle && state != JABBER_BUDDY_STATE_UNAVAILABLE) {
+ xmlnode *query = xmlnode_new_child(presence, "query");
+ gchar seconds[10];
+ g_snprintf(seconds, 10, "%d", (int) (time(NULL) - js->idle));
+
+ xmlnode_set_namespace(query, "jabber:iq:last");
+ xmlnode_set_attrib(query, "seconds", seconds);
+ }
+
/* JEP-0115 */
c = xmlnode_new_child(presence, "c");
xmlnode_set_namespace(c, "http://jabber.org/protocol/caps");
@@ -427,6 +439,7 @@ void jabber_presence_parse(JabberStream
JabberBuddyResource *jbr = NULL, *found_jbr = NULL;
PurpleConvChatBuddyFlags flags = PURPLE_CBFLAGS_NONE;
gboolean delayed = FALSE;
+ const gchar *stamp = NULL; /* from <delayed/> element */
PurpleBuddy *b = NULL;
char *buddy_name;
JabberBuddyState state = JABBER_BUDDY_STATE_UNKNOWN;
@@ -434,7 +447,8 @@ void jabber_presence_parse(JabberStream
gboolean muc = FALSE;
char *avatar_hash = NULL;
xmlnode *caps = NULL;
-
+ int idle = 0;
+
if(!(jb = jabber_buddy_find(js, from, TRUE)))
return;
@@ -513,6 +527,7 @@ void jabber_presence_parse(JabberStream
} else if(!strcmp(y->name, "delay") && !strcmp(xmlns, "urn:xmpp:delay")) {
/* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */
delayed = TRUE;
+ stamp = xmlnode_get_attrib(y, "stamp");
} else if(xmlns && !strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) {
caps = y; /* store for later, when creating buddy resource */
} else if(!strcmp(y->name, "x")) {
@@ -520,6 +535,7 @@ void jabber_presence_parse(JabberStream
if(xmlns && !strcmp(xmlns, "jabber:x:delay")) {
/* XXX: compare the time. jabber:x:delay can happen on presence packets that aren't really and truly delayed */
delayed = TRUE;
+ stamp = xmlnode_get_attrib(y, "stamp");
} else if(xmlns && !strcmp(xmlns, "http://jabber.org/protocol/muc#user")) {
xmlnode *z;
@@ -570,9 +586,29 @@ void jabber_presence_parse(JabberStream
avatar_hash = xmlnode_get_data(photo);
}
}
+ } else if (!strcmp(y->name, "query") &&
+ !strcmp(xmlnode_get_namespace(y), "jabber:iq:last")) {
+ /* resource has specified idle */
+ const gchar *seconds = xmlnode_get_attrib(y, "seconds");
+ if (seconds) {
+ /* we may need to take "delayed" into account here */
+ idle = atoi(seconds);
+ }
}
}
+ purple_debug_info("jabber", "got %d seconds idle from presence\n", idle);
+
+ if (idle && delayed && stamp) {
+ /* if we have a delayed presence, we need to add the delay to the idle
+ value */
+ time_t offset = time(NULL) - purple_str_to_time(stamp, TRUE, NULL, NULL,
+ NULL);
+ purple_debug_info("jabber", "got delay %s yielding %ld s offset\n",
+ stamp, offset);
+ idle += offset;
+ }
+
if(jid->node && (chat = jabber_chat_find(js, jid->node, jid->domain))) {
static int i = 1;
@@ -747,6 +783,12 @@ void jabber_presence_parse(JabberStream
} else {
jbr = jabber_buddy_track_resource(jb, jid->resource, priority,
state, status);
+ if (idle) {
+ jbr->idle = time(NULL) - idle;
+ } else {
+ jbr->idle = 0;
+ }
+
if(caps) {
const char *node = xmlnode_get_attrib(caps,"node");
const char *ver = xmlnode_get_attrib(caps,"ver");
@@ -765,6 +807,7 @@ void jabber_presence_parse(JabberStream
if((found_jbr = jabber_buddy_find_resource(jb, NULL))) {
jabber_google_presence_incoming(js, buddy_name, found_jbr);
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);
+ purple_prpl_got_user_idle(js->gc->account, buddy_name, found_jbr->idle, found_jbr->idle);
} else {
purple_prpl_got_user_status(js->gc->account, buddy_name, "offline", status ? "message" : NULL, status, NULL);
}
More information about the Commits
mailing list