comparison libpurple/protocols/jabber/presence.c @ 25149:416ff3d65c16

Rewrite jabber_presence_set_capabilities a little
author Paul Aurich <paul@darkrain42.org>
date Fri, 21 Nov 2008 05:54:22 +0000
parents 6d6e10476c52
children 7dcba13d0e28
comparison
equal deleted inserted replaced
25147:6d6e10476c52 25149:416ff3d65c16
380 JabberStream *js; 380 JabberStream *js;
381 JabberBuddy *jb; 381 JabberBuddy *jb;
382 char *from; 382 char *from;
383 } JabberPresenceCapabilities; 383 } JabberPresenceCapabilities;
384 384
385 static void jabber_presence_set_capabilities(JabberCapsClientInfo *info, gpointer user_data) { 385 static void jabber_presence_set_capabilities(JabberCapsClientInfo *info, JabberPresenceCapabilities *userdata)
386 JabberPresenceCapabilities *userdata = user_data; 386 {
387 JabberID *jid;
388 JabberBuddyResource *jbr; 387 JabberBuddyResource *jbr;
389 GList *iter; 388 char *resource = g_utf8_strrchr(userdata->from, -1, '/');
390 389 resource += 1;
391 jid = jabber_id_new(userdata->from); 390
392 jbr = jabber_buddy_find_resource(userdata->jb, jid->resource); 391 jbr = jabber_buddy_find_resource(userdata->jb, resource);
393 jabber_id_free(jid); 392 if (!jbr) {
394
395 if(!jbr) {
396 g_free(userdata->from); 393 g_free(userdata->from);
397 g_free(userdata); 394 g_free(userdata);
398 return; 395 return;
399 } 396 }
400 397
401 if(jbr->caps) 398 if(jbr->caps)
402 jabber_caps_free_clientinfo(jbr->caps); 399 jabber_caps_free_clientinfo(jbr->caps);
403 jbr->caps = info; 400 jbr->caps = info;
404 401
405 if (info) { 402 if (info) {
406 for(iter = info->features; iter; iter = g_list_next(iter)) { 403 GList *node = g_list_find_custom(info->features, "http://jabber.org/protocol/commands", (GCompareFunc)strcmp);
407 if(!strcmp((const char*)iter->data, "http://jabber.org/protocol/commands")) { 404 if (node) {
408 JabberIq *iq = jabber_iq_new_query(userdata->js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#items"); 405 JabberIq *iq = jabber_iq_new_query(userdata->js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#items");
409 xmlnode *query = xmlnode_get_child_with_namespace(iq->node,"query","http://jabber.org/protocol/disco#items"); 406 xmlnode *query = xmlnode_get_child_with_namespace(iq->node, "query", "http://jabber.org/protocol/disco#items");
410 xmlnode_set_attrib(iq->node, "to", userdata->from); 407 xmlnode_set_attrib(iq->node, "to", userdata->from);
411 xmlnode_set_attrib(query, "node", "http://jabber.org/protocol/commands"); 408 xmlnode_set_attrib(query, "node", "http://jabber.org/protocol/commands");
412 409 jabber_iq_set_callback(iq, jabber_adhoc_disco_result_cb, NULL);
413 jabber_iq_set_callback(iq, jabber_adhoc_disco_result_cb, NULL); 410 jabber_iq_send(iq);
414 jabber_iq_send(iq);
415 break;
416 }
417 } 411 }
418 } 412 }
419 413
420 g_free(userdata->from); 414 g_free(userdata->from);
421 g_free(userdata); 415 g_free(userdata);
765 if(node && ver && hash) { 759 if(node && ver && hash) {
766 JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1); 760 JabberPresenceCapabilities *userdata = g_new0(JabberPresenceCapabilities, 1);
767 userdata->js = js; 761 userdata->js = js;
768 userdata->jb = jb; 762 userdata->jb = jb;
769 userdata->from = g_strdup(from); 763 userdata->from = g_strdup(from);
770 jabber_caps_get_info(js, from, node, ver, hash, jabber_presence_set_capabilities, userdata); 764 jabber_caps_get_info(js, from, node, ver, hash,
765 (jabber_caps_get_info_cb)jabber_presence_set_capabilities,
766 userdata);
771 } 767 }
772 } 768 }
773 } 769 }
774 770
775 if((found_jbr = jabber_buddy_find_resource(jb, NULL))) { 771 if((found_jbr = jabber_buddy_find_resource(jb, NULL))) {