comparison libgaim/protocols/jabber/buddy.c @ 15212:49afc9ce69d2

[gaim-migrate @ 18001] Update our Jabber vcard even when the buddy icon is null. This allows users to remove their buddy icon. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Fri, 15 Dec 2006 02:40:27 +0000
parents b81e4e44b509
children b6f192c01225
comparison
equal deleted inserted replaced
15211:7d682fc9098f 15212:49afc9ce69d2
384 JabberStream *js = gc->proto_data; 384 JabberStream *js = gc->proto_data;
385 xmlnode *vc_node; 385 xmlnode *vc_node;
386 char *avatar_file = NULL; 386 char *avatar_file = NULL;
387 struct tag_attr *tag_attr; 387 struct tag_attr *tag_attr;
388 388
389 if(js->avatar_hash) 389 g_free(js->avatar_hash);
390 g_free(js->avatar_hash);
391 js->avatar_hash = NULL; 390 js->avatar_hash = NULL;
392 391
393 /* 392 /*
394 * Send only if there's actually any *information* to send 393 * Send only if there's actually any *information* to send
395 */ 394 */
396 vc_node = info ? xmlnode_from_str(info, -1) : NULL; 395 vc_node = info ? xmlnode_from_str(info, -1) : NULL;
397 avatar_file = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(gc->account)); 396 avatar_file = gaim_buddy_icons_get_full_path(gaim_account_get_buddy_icon(gc->account));
398 397
399 if(!vc_node && avatar_file) { 398 if(!vc_node) {
400 vc_node = xmlnode_new("vCard"); 399 vc_node = xmlnode_new("vCard");
401 for(tag_attr = vcard_tag_attr_list; tag_attr->attr != NULL; ++tag_attr) 400 for(tag_attr = vcard_tag_attr_list; tag_attr->attr != NULL; ++tag_attr)
402 xmlnode_set_attrib(vc_node, tag_attr->attr, tag_attr->value); 401 xmlnode_set_attrib(vc_node, tag_attr->attr, tag_attr->value);
403 } 402 }
404 403
405 if(vc_node) { 404 if (vc_node->name &&
406 if (vc_node->name && 405 !g_ascii_strncasecmp(vc_node->name, "vCard", 5)) {
407 !g_ascii_strncasecmp(vc_node->name, "vCard", 5)) { 406 GError *error = NULL;
408 GError *error = NULL; 407 gchar *avatar_data_tmp;
409 gchar *avatar_data_tmp; 408 guchar *avatar_data;
410 guchar *avatar_data; 409 gsize avatar_len;
411 gsize avatar_len; 410
412 411 if(avatar_file && g_file_get_contents(avatar_file, &avatar_data_tmp, &avatar_len, &error)) {
413 if(avatar_file && g_file_get_contents(avatar_file, &avatar_data_tmp, &avatar_len, &error)) { 412 xmlnode *photo, *binval;
414 xmlnode *photo, *binval; 413 gchar *enc;
415 gchar *enc; 414 int i;
416 int i; 415 unsigned char hashval[20];
417 unsigned char hashval[20]; 416 char *p, hash[41];
418 char *p, hash[41]; 417
419 418 avatar_data = (guchar *) avatar_data_tmp;
420 avatar_data = (guchar *) avatar_data_tmp; 419 photo = xmlnode_new_child(vc_node, "PHOTO");
421 photo = xmlnode_new_child(vc_node, "PHOTO"); 420 binval = xmlnode_new_child(photo, "BINVAL");
422 binval = xmlnode_new_child(photo, "BINVAL"); 421 enc = gaim_base64_encode(avatar_data, avatar_len);
423 enc = gaim_base64_encode(avatar_data, avatar_len); 422
424 423 gaim_cipher_digest_region("sha1", (guchar *)avatar_data,
425 gaim_cipher_digest_region("sha1", (guchar *)avatar_data, 424 avatar_len, sizeof(hashval),
426 avatar_len, sizeof(hashval), 425 hashval, NULL);
427 hashval, NULL); 426
428 427 p = hash;
429 p = hash; 428 for(i=0; i<20; i++, p+=2)
430 for(i=0; i<20; i++, p+=2) 429 snprintf(p, 3, "%02x", hashval[i]);
431 snprintf(p, 3, "%02x", hashval[i]); 430 js->avatar_hash = g_strdup(hash);
432 js->avatar_hash = g_strdup(hash); 431
433 432 xmlnode_insert_data(binval, enc, -1);
434 xmlnode_insert_data(binval, enc, -1); 433 g_free(enc);
435 g_free(enc); 434 g_free(avatar_data);
436 g_free(avatar_data); 435 } else if (error != NULL) {
437 } else if (error != NULL) { 436 g_error_free(error);
438 g_error_free(error); 437 }
439 } 438 g_free(avatar_file);
440 g_free(avatar_file); 439
441 440 iq = jabber_iq_new(js, JABBER_IQ_SET);
442 iq = jabber_iq_new(js, JABBER_IQ_SET); 441 xmlnode_insert_child(iq->node, vc_node);
443 xmlnode_insert_child(iq->node, vc_node); 442 jabber_iq_send(iq);
444 jabber_iq_send(iq); 443 } else {
445 } else { 444 xmlnode_free(vc_node);
446 xmlnode_free(vc_node);
447 }
448 } 445 }
449 } 446 }
450 447
451 void jabber_set_buddy_icon(GaimConnection *gc, const char *iconfile) 448 void jabber_set_buddy_icon(GaimConnection *gc, const char *iconfile)
452 { 449 {