comparison libpurple/protocols/jabber/disco.c @ 26257:ce23e32a0ada

Don't match in the disco callbacks hashtable on remote JID. Use IQ id instead. This won't break if there are concurrent disco queries out to a remote node.
author Paul Aurich <paul@darkrain42.org>
date Tue, 31 Mar 2009 06:43:54 +0000
parents cda9031ecabc
children b5fe3f47487b
comparison
equal deleted inserted replaced
26256:cda9031ecabc 26257:ce23e32a0ada
96 96
97 97
98 void jabber_disco_info_parse(JabberStream *js, xmlnode *packet) { 98 void jabber_disco_info_parse(JabberStream *js, xmlnode *packet) {
99 const char *from = xmlnode_get_attrib(packet, "from"); 99 const char *from = xmlnode_get_attrib(packet, "from");
100 const char *type = xmlnode_get_attrib(packet, "type"); 100 const char *type = xmlnode_get_attrib(packet, "type");
101 const char *id = xmlnode_get_attrib(packet, "id");
101 102
102 if(!from || !type) 103 if(!from || !type)
103 return; 104 return;
104 105
105 if(!strcmp(type, "get")) { 106 if(!strcmp(type, "get")) {
115 116
116 117
117 iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, 118 iq = jabber_iq_new_query(js, JABBER_IQ_RESULT,
118 "http://jabber.org/protocol/disco#info"); 119 "http://jabber.org/protocol/disco#info");
119 120
120 jabber_iq_set_id(iq, xmlnode_get_attrib(packet, "id")); 121 jabber_iq_set_id(iq, id);
121 122
122 xmlnode_set_attrib(iq->node, "to", from); 123 xmlnode_set_attrib(iq->node, "to", from);
123 query = xmlnode_get_child(iq->node, "query"); 124 query = xmlnode_get_child(iq->node, "query");
124 125
125 if(node) 126 if(node)
293 capabilities |= JABBER_CAP_RETRIEVED; 294 capabilities |= JABBER_CAP_RETRIEVED;
294 295
295 if(jbr) 296 if(jbr)
296 jbr->capabilities = capabilities; 297 jbr->capabilities = capabilities;
297 298
298 if((jdicd = g_hash_table_lookup(js->disco_callbacks, from))) { 299 if((jdicd = g_hash_table_lookup(js->disco_callbacks, id))) {
299 jdicd->callback(js, from, capabilities, jdicd->data); 300 jdicd->callback(js, from, capabilities, jdicd->data);
300 g_hash_table_remove(js->disco_callbacks, from); 301 g_hash_table_remove(js->disco_callbacks, id);
301 } 302 }
302 } else if(!strcmp(type, "error")) { 303 } else if(!strcmp(type, "error")) {
303 JabberID *jid; 304 JabberID *jid;
304 JabberBuddy *jb; 305 JabberBuddy *jb;
305 JabberBuddyResource *jbr = NULL; 306 JabberBuddyResource *jbr = NULL;
306 JabberCapabilities capabilities = JABBER_CAP_NONE; 307 JabberCapabilities capabilities = JABBER_CAP_NONE;
307 struct _jabber_disco_info_cb_data *jdicd; 308 struct _jabber_disco_info_cb_data *jdicd;
308 309
309 if(!(jdicd = g_hash_table_lookup(js->disco_callbacks, from))) 310 if(!(jdicd = g_hash_table_lookup(js->disco_callbacks, id)))
310 return; 311 return;
311 312
312 if((jid = jabber_id_new(from))) { 313 if((jid = jabber_id_new(from))) {
313 if(jid->resource && (jb = jabber_buddy_find(js, from, TRUE))) 314 if(jid->resource && (jb = jabber_buddy_find(js, from, TRUE)))
314 jbr = jabber_buddy_find_resource(jb, jid->resource); 315 jbr = jabber_buddy_find_resource(jb, jid->resource);
317 318
318 if(jbr) 319 if(jbr)
319 capabilities = jbr->capabilities; 320 capabilities = jbr->capabilities;
320 321
321 jdicd->callback(js, from, capabilities, jdicd->data); 322 jdicd->callback(js, from, capabilities, jdicd->data);
322 g_hash_table_remove(js->disco_callbacks, from); 323 g_hash_table_remove(js->disco_callbacks, id);
323 } 324 }
324 } 325 }
325 326
326 void jabber_disco_items_parse(JabberStream *js, xmlnode *packet) 327 void jabber_disco_items_parse(JabberStream *js, xmlnode *packet)
327 { 328 {
550 { 551 {
551 JabberID *jid; 552 JabberID *jid;
552 JabberBuddy *jb; 553 JabberBuddy *jb;
553 JabberBuddyResource *jbr = NULL; 554 JabberBuddyResource *jbr = NULL;
554 struct _jabber_disco_info_cb_data *jdicd; 555 struct _jabber_disco_info_cb_data *jdicd;
556 const char *id;
555 JabberIq *iq; 557 JabberIq *iq;
556 558
557 if((jid = jabber_id_new(who))) { 559 if((jid = jabber_id_new(who))) {
558 if(jid->resource && (jb = jabber_buddy_find(js, who, TRUE))) 560 if(jid->resource && (jb = jabber_buddy_find(js, who, TRUE)))
559 jbr = jabber_buddy_find_resource(jb, jid->resource); 561 jbr = jabber_buddy_find_resource(jb, jid->resource);
567 569
568 jdicd = g_new0(struct _jabber_disco_info_cb_data, 1); 570 jdicd = g_new0(struct _jabber_disco_info_cb_data, 1);
569 jdicd->data = data; 571 jdicd->data = data;
570 jdicd->callback = callback; 572 jdicd->callback = callback;
571 573
572 g_hash_table_insert(js->disco_callbacks, g_strdup(who), jdicd);
573
574 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#info"); 574 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#info");
575 xmlnode_set_attrib(iq->node, "to", who); 575 xmlnode_set_attrib(iq->node, "to", who);
576
577 id = jabber_get_next_id(js);
578 jabber_iq_set_id(iq, id);
579 g_hash_table_insert(js->disco_callbacks, id, jdicd);
576 580
577 jabber_iq_send(iq); 581 jabber_iq_send(iq);
578 } 582 }
579 583
580 static void 584 static void