aboutsummaryrefslogtreecommitdiffstats
path: root/res/res_jabber.c
diff options
context:
space:
mode:
Diffstat (limited to 'res/res_jabber.c')
-rw-r--r--res/res_jabber.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/res/res_jabber.c b/res/res_jabber.c
index 6e7344591..722a8bbb1 100644
--- a/res/res_jabber.c
+++ b/res/res_jabber.c
@@ -1209,29 +1209,42 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
found = NULL;
break;
}
+ /* resource list is sorted by descending priority */
if (tmp->priority != priority) {
found->priority = priority;
if (!last && !found->next)
+ /* resource was found to be unique,
+ leave loop */
break;
+ /* search for resource in our list
+ and take it out for the moment */
if (last)
last->next = found->next;
else
buddy->resources = found->next;
+
last = NULL;
tmp = buddy->resources;
if (!buddy->resources)
buddy->resources = found;
+ /* priority processing */
while (tmp) {
+ /* insert resource back according to
+ its priority value */
if (found->priority > tmp->priority) {
if (last)
+ /* insert within list */
last->next = found;
found->next = tmp;
if (!last)
+ /* insert on top */
buddy->resources = found;
break;
}
if (!tmp->next) {
+ /* insert at the end of the list */
tmp->next = found;
+ found->next = NULL;
break;
}
last = tmp;
@@ -1244,6 +1257,7 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
tmp = tmp->next;
}
+ /* resource not found in our list, create it */
if (!found && status != 6) {
found = (struct aji_resource *) malloc(sizeof(struct aji_resource));
memset(found, 0, sizeof(struct aji_resource));
@@ -1278,12 +1292,25 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
if (!tmp)
buddy->resources = found;
}
+
+ /* if 'from' attribute does not contain 'resource' string
+ point to the top of our resource list */
+ if (!found && !pak->from->resource && buddy->resources) {
+ found = buddy->resources;
+ }
+
ASTOBJ_UNLOCK(buddy);
ASTOBJ_UNREF(buddy, aji_buddy_destroy);
node = iks_find_attrib(iks_find(pak->x, "c"), "node");
ver = iks_find_attrib(iks_find(pak->x, "c"), "ver");
+ /* handle gmail client's special caps:c tag */
+ if (!node && !ver) {
+ node = iks_find_attrib(iks_find(pak->x, "caps:c"), "node");
+ ver = iks_find_attrib(iks_find(pak->x, "caps:c"), "ver");
+ }
+
if(status !=6 && !found->cap) {
found->cap = aji_find_version(node, ver, pak);
if(gtalk_yuck(pak->x)) /* gtalk should do discover */