Mercurial > pidgin.yaz
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 { |