Mercurial > pidgin
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 |