comparison libpurple/protocols/jabber/buddy.c @ 25980:13541e130064

propagate from branch 'im.pidgin.pidgin' (head 431618de0f30a6938f7e14d2d61ee5d7738acd59) to branch 'im.pidgin.cpw.malu.xmpp.idle' (head f8e9aac4fdd81fdf8e998b2ea726f2b97c06fc84)
author Marcus Lundblad <ml@update.uu.se>
date Mon, 02 Mar 2009 21:25:31 +0000
parents 5f9a24d1c25e a2388ce30772
children 6b0409164425
comparison
equal deleted inserted replaced
25446:52fbda23e398 25980:13541e130064
96 if(!jb) 96 if(!jb)
97 return NULL; 97 return NULL;
98 98
99 for(l = jb->resources; l; l = l->next) 99 for(l = jb->resources; l; l = l->next)
100 { 100 {
101 if(!jbr && !resource) { 101 JabberBuddyResource *tmp = (JabberBuddyResource *) l->data;
102 jbr = l->data; 102 if (!jbr && !resource) {
103 } else if(!resource) { 103 jbr = tmp;
104 if(((JabberBuddyResource *)l->data)->priority > jbr->priority) 104 } else if (!resource) {
105 jbr = l->data; 105 if (tmp->priority > jbr->priority)
106 else if(((JabberBuddyResource *)l->data)->priority == jbr->priority) { 106 jbr = tmp;
107 else if (tmp->priority == jbr->priority) {
107 /* Determine if this resource is more available than the one we've currently chosen */ 108 /* Determine if this resource is more available than the one we've currently chosen */
108 switch(((JabberBuddyResource *)l->data)->state) { 109 switch(tmp->state) {
109 case JABBER_BUDDY_STATE_ONLINE: 110 case JABBER_BUDDY_STATE_ONLINE:
110 case JABBER_BUDDY_STATE_CHAT: 111 case JABBER_BUDDY_STATE_CHAT:
111 /* This resource is online/chatty. Prefer to one which isn't either. */ 112 /* This resource is online/chatty. Prefer to one which isn't either. */
112 if ((jbr->state != JABBER_BUDDY_STATE_ONLINE) && (jbr->state != JABBER_BUDDY_STATE_CHAT)) 113 if (((jbr->state != JABBER_BUDDY_STATE_ONLINE) && (jbr->state != JABBER_BUDDY_STATE_CHAT))
113 jbr = l->data; 114 || (jbr->idle && !tmp->idle)
115 || (jbr->idle && tmp->idle && tmp->idle > jbr->idle))
116 jbr = tmp;
114 break; 117 break;
115 case JABBER_BUDDY_STATE_AWAY: 118 case JABBER_BUDDY_STATE_AWAY:
116 case JABBER_BUDDY_STATE_DND: 119 case JABBER_BUDDY_STATE_DND:
117 /* This resource is away/dnd. Prefer to one which is extended away, unavailable, or unknown. */ 120 /* This resource is away/dnd. Prefer to one which is extended away, unavailable, or unknown. */
118 if ((jbr->state == JABBER_BUDDY_STATE_XA) || (jbr->state == JABBER_BUDDY_STATE_UNAVAILABLE) || 121 if (((jbr->state == JABBER_BUDDY_STATE_XA) || (jbr->state == JABBER_BUDDY_STATE_UNAVAILABLE) ||
119 (jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR)) 122 (jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR))
120 jbr = l->data; 123 || (jbr->idle && !tmp->idle)
124 || (jbr->idle && tmp->idle && tmp->idle > jbr->idle))
125 jbr = tmp;
121 break; 126 break;
122 case JABBER_BUDDY_STATE_XA: 127 case JABBER_BUDDY_STATE_XA:
123 /* This resource is extended away. That's better than unavailable or unknown. */ 128 /* This resource is extended away. That's better than unavailable or unknown. */
124 if ((jbr->state == JABBER_BUDDY_STATE_UNAVAILABLE) || (jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR)) 129 if ((jbr->state == JABBER_BUDDY_STATE_UNAVAILABLE) || (jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR))
125 jbr = l->data; 130 jbr = tmp;
126 break; 131 break;
127 case JABBER_BUDDY_STATE_UNAVAILABLE: 132 case JABBER_BUDDY_STATE_UNAVAILABLE:
128 /* This resource is unavailable. That's better than unknown. */ 133 /* This resource is unavailable. That's better than unknown. */
129 if ((jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR)) 134 if ((jbr->state == JABBER_BUDDY_STATE_UNKNOWN) || (jbr->state == JABBER_BUDDY_STATE_ERROR))
130 jbr = l->data; 135 jbr = tmp;
131 break; 136 break;
132 case JABBER_BUDDY_STATE_UNKNOWN: 137 case JABBER_BUDDY_STATE_UNKNOWN:
133 case JABBER_BUDDY_STATE_ERROR: 138 case JABBER_BUDDY_STATE_ERROR:
134 /* These are never preferable. */ 139 /* These are never preferable. */
135 break; 140 break;
136 } 141 }
137 } 142 }
138 } else if(((JabberBuddyResource *)l->data)->name) { 143 } else if(tmp->name) {
139 if(!strcmp(((JabberBuddyResource *)l->data)->name, resource)) { 144 if(!strcmp(tmp->name, resource)) {
140 jbr = l->data; 145 jbr = tmp;
141 break; 146 break;
142 } 147 }
143 } 148 }
144 } 149 }
145 150
1623 if((query = xmlnode_get_child(packet, "query"))) { 1628 if((query = xmlnode_get_child(packet, "query"))) {
1624 seconds = xmlnode_get_attrib(query, "seconds"); 1629 seconds = xmlnode_get_attrib(query, "seconds");
1625 if(seconds) { 1630 if(seconds) {
1626 char *end = NULL; 1631 char *end = NULL;
1627 long sec = strtol(seconds, &end, 10); 1632 long sec = strtol(seconds, &end, 10);
1628 if(end != seconds) { 1633 JabberBuddy *jb = NULL;
1634 char *resource = NULL;
1635 char *buddy_name = NULL;
1636 JabberBuddyResource *jbr = NULL;
1637
1638 if(end != seconds) {
1629 JabberBuddyInfoResource *jbir = g_hash_table_lookup(jbi->resources, resource_name); 1639 JabberBuddyInfoResource *jbir = g_hash_table_lookup(jbi->resources, resource_name);
1630 if(jbir) { 1640 if(jbir) {
1631 jbir->idle_seconds = sec; 1641 jbir->idle_seconds = sec;
1632 } 1642 }
1633 } 1643 }
1644 /* Update the idle time of the buddy resource, if we got it.
1645 This will correct the value when a server doesn't mark
1646 delayed presence and we got the presence when signing on */
1647 jb = jabber_buddy_find(js, from, FALSE);
1648 if (jb) {
1649 resource = jabber_get_resource(from);
1650 buddy_name = jabber_get_bare_jid(from);
1651 /* if the resource already has an idle time set, we
1652 must have gotten it originally from a presence. In
1653 this case we update it. Otherwise don't update it, to
1654 avoid setting an idle and not getting informed about
1655 the resource getting unidle */
1656 if (resource && buddy_name) {
1657 jbr = jabber_buddy_find_resource(jb, resource);
1658
1659 if (jbr->idle) {
1660 if (sec) {
1661 jbr->idle = time(NULL) - sec;
1662 } else {
1663 jbr->idle = 0;
1664 }
1665
1666 if (jbr ==
1667 jabber_buddy_find_resource(jb, NULL)) {
1668 purple_prpl_got_user_idle(js->gc->account,
1669 buddy_name, jbr->idle, jbr->idle);
1670 }
1671 }
1672 }
1673 g_free(resource);
1674 g_free(buddy_name);
1675 }
1634 } 1676 }
1635 } 1677 }
1636 } 1678 }
1637 g_free(resource_name); 1679 g_free(resource_name);
1638 } 1680 }