Mercurial > pidgin.yaz
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 } |