diff libpurple/protocols/jabber/buddy.c @ 25952:6185767dc03c

When getting info from a buddy, update the idle status to the libpurple core if we get last activity (ie. idle) time
author Marcus Lundblad <ml@update.uu.se>
date Wed, 24 Dec 2008 22:51:16 +0000
parents 9100b9176a16
children cf29591fe78a
line wrap: on
line diff
--- a/libpurple/protocols/jabber/buddy.c	Wed Dec 24 13:36:10 2008 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Wed Dec 24 22:51:16 2008 +0000
@@ -1627,12 +1627,39 @@
 				if(seconds) {
 					char *end = NULL;
 					long sec = strtol(seconds, &end, 10);
-					if(end != seconds) {
+                    JabberBuddy *jb = NULL;
+                    char *resource = NULL;
+                    char *buddy_name = NULL;
+					JabberBuddyResource *jbr = NULL;
+                    
+                    if(end != seconds) {
 						JabberBuddyInfoResource *jbir = g_hash_table_lookup(jbi->resources, resource_name);
 						if(jbir) {
 							jbir->idle_seconds = sec;
 						}
 					}
+                    /* if this idle time different from the one stored
+                     in the JabberBuddyResource (as obtained via
+                     <presence/>) update it. This is to correct the value
+                     when a server doesn't mark delayed presence */
+                    jb = jabber_buddy_find(js, from, FALSE);
+                    if (jb) {
+                        resource = jabber_get_resource(from);
+                        buddy_name = jabber_get_bare_jid(from);
+                        if (resource && buddy_name) {
+                            jbr = jabber_buddy_find_resource(jb, resource);
+                            jbr->idle = time(NULL) - sec;
+                            
+                            if (jbr == 
+                                jabber_buddy_find_resource(jb, NULL) &&
+                                jbr->idle) {
+                                purple_prpl_got_user_idle(js->gc->account, 
+                                    buddy_name, jbr->idle, jbr->idle);
+                            }
+                        }
+                        g_free(resource);
+                        g_free(buddy_name);
+                    }
 				}
 			}
 		}