Mercurial > pidgin.yaz
comparison libpurple/protocols/jabber/caps.c @ 25780:5d2e4a3b0c63
Rename user_data to cb_data (there were too many 'userdata'/'user_data's).
Refactor jabber_caps_client_iqcb a bit (less repeating of the clean up)
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Fri, 12 Dec 2008 00:00:00 +0000 |
parents | a259d2711416 |
children | ef90728dbae8 |
comparison
equal
deleted
inserted
replaced
25779:1ce32c6752fc | 25780:5d2e4a3b0c63 |
---|---|
341 } | 341 } |
342 #endif | 342 #endif |
343 | 343 |
344 typedef struct _jabber_caps_cbplususerdata { | 344 typedef struct _jabber_caps_cbplususerdata { |
345 jabber_caps_get_info_cb cb; | 345 jabber_caps_get_info_cb cb; |
346 gpointer user_data; | 346 gpointer cb_data; |
347 | 347 |
348 char *who; | 348 char *who; |
349 char *node; | 349 char *node; |
350 char *ver; | 350 char *ver; |
351 char *hash; | 351 char *hash; |
352 #if 0 | 352 #if 0 |
362 #endif | 362 #endif |
363 | 363 |
364 #if 0 | 364 #if 0 |
365 static void jabber_caps_get_info_check_completion(jabber_caps_cbplususerdata *userdata) { | 365 static void jabber_caps_get_info_check_completion(jabber_caps_cbplususerdata *userdata) { |
366 if(userdata->extOutstanding == 0) { | 366 if(userdata->extOutstanding == 0) { |
367 userdata->cb(jabber_caps_collect_info(userdata->node, userdata->ver, userdata->ext), userdata->user_data); | 367 userdata->cb(jabber_caps_collect_info(userdata->node, userdata->ver, userdata->ext), userdata->cb_data); |
368 g_free(userdata->who); | 368 g_free(userdata->who); |
369 g_free(userdata->node); | 369 g_free(userdata->node); |
370 g_free(userdata->ver); | 370 g_free(userdata->ver); |
371 while(userdata->ext) { | 371 while(userdata->ext) { |
372 g_free(userdata->ext->data); | 372 g_free(userdata->ext->data); |
444 jabber_caps_client_iqcb(JabberStream *js, xmlnode *packet, gpointer data) | 444 jabber_caps_client_iqcb(JabberStream *js, xmlnode *packet, gpointer data) |
445 { | 445 { |
446 xmlnode *query = xmlnode_get_child_with_namespace(packet, "query", | 446 xmlnode *query = xmlnode_get_child_with_namespace(packet, "query", |
447 "http://jabber.org/protocol/disco#info"); | 447 "http://jabber.org/protocol/disco#info"); |
448 jabber_caps_cbplususerdata *userdata = data; | 448 jabber_caps_cbplususerdata *userdata = data; |
449 JabberCapsClientInfo *info, *value; | 449 JabberCapsClientInfo *info = NULL, *value; |
450 gchar *hash; | 450 gchar *hash = NULL; |
451 const char *type = xmlnode_get_attrib(packet, "type"); | 451 const char *type = xmlnode_get_attrib(packet, "type"); |
452 JabberCapsKey key; | 452 JabberCapsKey key; |
453 | 453 |
454 if (!query || !strcmp(type, "error")) { | 454 if (!query || !strcmp(type, "error")) { |
455 userdata->cb(NULL, userdata->user_data); | 455 userdata->cb(NULL, userdata->cb_data); |
456 | 456 goto out; |
457 g_free(userdata->who); | |
458 g_free(userdata->node); | |
459 g_free(userdata->ver); | |
460 g_free(userdata->hash); | |
461 g_free(userdata); | |
462 return; | |
463 } | 457 } |
464 | 458 |
465 /* check hash */ | 459 /* check hash */ |
466 info = jabber_caps_parse_client_info(query); | 460 info = jabber_caps_parse_client_info(query); |
467 | 461 |
468 if (!strcmp(userdata->hash, "sha-1")) { | 462 if (!strcmp(userdata->hash, "sha-1")) { |
469 hash = jabber_caps_calculate_hash(info, "sha1"); | 463 hash = jabber_caps_calculate_hash(info, "sha1"); |
470 } else if (!strcmp(userdata->hash, "md5")) { | 464 } else if (!strcmp(userdata->hash, "md5")) { |
471 hash = jabber_caps_calculate_hash(info, "md5"); | 465 hash = jabber_caps_calculate_hash(info, "md5"); |
472 } else { | 466 } |
473 purple_debug_warning("jabber", "unknown caps hash algorithm: %s\n", userdata->hash); | 467 |
474 | 468 if (!hash || strcmp(hash, userdata->ver)) { |
475 userdata->cb(NULL, userdata->user_data); | 469 purple_debug_warning("jabber", "Could not validate caps info from %s\n", |
476 | 470 xmlnode_get_attrib(packet, "from")); |
471 | |
472 userdata->cb(NULL, userdata->cb_data); | |
477 jabber_caps_client_info_destroy(info); | 473 jabber_caps_client_info_destroy(info); |
478 g_free(userdata->who); | 474 goto out; |
479 g_free(userdata->node); | 475 } |
480 g_free(userdata->ver); | 476 |
481 g_free(userdata->hash); | 477 key.node = userdata->node; |
482 g_free(userdata); | 478 key.ver = userdata->ver; |
483 return; | 479 key.hash = userdata->hash; |
484 } | 480 |
485 | 481 /* Use the copy of this data already in the table if it exists or insert |
486 if (!hash || strcmp(hash, userdata->ver)) { | 482 * a new one if we need to */ |
487 purple_debug_warning("jabber", "caps hash from %s did not match\n", xmlnode_get_attrib(packet, "from")); | 483 if ((value = g_hash_table_lookup(capstable, &key))) { |
488 userdata->cb(NULL, userdata->user_data); | |
489 | |
490 jabber_caps_client_info_destroy(info); | 484 jabber_caps_client_info_destroy(info); |
491 g_free(userdata->who); | |
492 g_free(userdata->node); | |
493 g_free(userdata->ver); | |
494 g_free(userdata->hash); | |
495 g_free(userdata); | |
496 g_free(hash); | |
497 return; | |
498 } | |
499 | |
500 key.node = userdata->node; | |
501 key.ver = userdata->ver; | |
502 key.hash = userdata->hash; | |
503 | |
504 /* check whether it's not in the table */ | |
505 if ((value = g_hash_table_lookup(capstable, &key))) { | |
506 JabberCapsClientInfo *tmp = info; | |
507 info = value; | 485 info = value; |
508 jabber_caps_client_info_destroy(tmp); | |
509 } else { | 486 } else { |
510 JabberCapsKey *n_key = g_new(JabberCapsKey, 1); | 487 JabberCapsKey *n_key = g_new(JabberCapsKey, 1); |
511 n_key->node = userdata->node; | 488 n_key->node = userdata->node; |
512 n_key->ver = userdata->ver; | 489 n_key->ver = userdata->ver; |
513 n_key->hash = userdata->hash; | 490 n_key->hash = userdata->hash; |
514 userdata->node = userdata->ver = userdata->hash = NULL; | 491 userdata->node = userdata->ver = userdata->hash = NULL; |
515 | 492 |
516 g_hash_table_insert(capstable, n_key, info); | 493 g_hash_table_insert(capstable, n_key, info); |
517 jabber_caps_store(); | 494 jabber_caps_store(); |
518 } | 495 } |
519 | 496 |
520 userdata->cb(info, userdata->user_data); | 497 userdata->cb(info, userdata->cb_data); |
521 | 498 /* capstable owns info */ |
522 /* capstable will free info */ | 499 |
500 out: | |
523 g_free(userdata->who); | 501 g_free(userdata->who); |
524 g_free(userdata->node); | 502 g_free(userdata->node); |
525 g_free(userdata->ver); | 503 g_free(userdata->ver); |
526 g_free(userdata->hash); | 504 g_free(userdata->hash); |
527 g_free(userdata); | 505 g_free(userdata); |
534 { | 512 { |
535 JabberCapsClientInfo *client; | 513 JabberCapsClientInfo *client; |
536 JabberCapsKey *key = g_new0(JabberCapsKey, 1); | 514 JabberCapsKey *key = g_new0(JabberCapsKey, 1); |
537 jabber_caps_cbplususerdata *userdata = g_new0(jabber_caps_cbplususerdata, 1); | 515 jabber_caps_cbplususerdata *userdata = g_new0(jabber_caps_cbplususerdata, 1); |
538 userdata->cb = cb; | 516 userdata->cb = cb; |
539 userdata->user_data = user_data; | 517 userdata->cb_data = user_data; |
540 userdata->who = g_strdup(who); | 518 userdata->who = g_strdup(who); |
541 userdata->node = g_strdup(node); | 519 userdata->node = g_strdup(node); |
542 userdata->ver = g_strdup(ver); | 520 userdata->ver = g_strdup(ver); |
543 userdata->hash = g_strdup(hash); | 521 userdata->hash = g_strdup(hash); |
544 | 522 |