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