Mercurial > pidgin.yaz
comparison libpurple/protocols/jabber/buddy.c @ 16390:4fc51a87ce42
Updates for the account buddy icon stuff. This doesn't yet work fully (and maybe not even partly), but it compiles.
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 25 Apr 2007 21:48:56 +0000 |
parents | e0c9a46b459f |
children | 24bbd7e46bfe |
comparison
equal
deleted
inserted
replaced
16389:493ca924c199 | 16390:4fc51a87ce42 |
---|---|
381 void jabber_set_info(PurpleConnection *gc, const char *info) | 381 void jabber_set_info(PurpleConnection *gc, const char *info) |
382 { | 382 { |
383 JabberIq *iq; | 383 JabberIq *iq; |
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; | |
387 struct tag_attr *tag_attr; | 386 struct tag_attr *tag_attr; |
388 | 387 |
389 g_free(js->avatar_hash); | 388 g_free(js->avatar_hash); |
390 js->avatar_hash = NULL; | 389 js->avatar_hash = NULL; |
391 | 390 |
392 /* | 391 /* |
393 * Send only if there's actually any *information* to send | 392 * Send only if there's actually any *information* to send |
394 */ | 393 */ |
395 vc_node = info ? xmlnode_from_str(info, -1) : NULL; | 394 vc_node = info ? xmlnode_from_str(info, -1) : NULL; |
396 avatar_file = purple_buddy_icons_get_full_path(purple_account_get_buddy_icon(gc->account)); | |
397 | 395 |
398 if(!vc_node) { | 396 if(!vc_node) { |
399 vc_node = xmlnode_new("vCard"); | 397 vc_node = xmlnode_new("vCard"); |
400 for(tag_attr = vcard_tag_attr_list; tag_attr->attr != NULL; ++tag_attr) | 398 for(tag_attr = vcard_tag_attr_list; tag_attr->attr != NULL; ++tag_attr) |
401 xmlnode_set_attrib(vc_node, tag_attr->attr, tag_attr->value); | 399 xmlnode_set_attrib(vc_node, tag_attr->attr, tag_attr->value); |
402 } | 400 } |
403 | 401 |
404 if (vc_node->name && | 402 if (vc_node->name && |
405 !g_ascii_strncasecmp(vc_node->name, "vCard", 5)) { | 403 !g_ascii_strncasecmp(vc_node->name, "vCard", 5)) { |
406 GError *error = NULL; | 404 PurpleStoredImage *img; |
407 gchar *avatar_data_tmp; | 405 |
408 guchar *avatar_data; | 406 if ((img = purple_buddy_icons_find_account_icon(gc->account))) { |
409 gsize avatar_len; | 407 gconstpointer avatar_data; |
410 | 408 gsize avatar_len; |
411 if(avatar_file && g_file_get_contents(avatar_file, &avatar_data_tmp, &avatar_len, &error)) { | |
412 xmlnode *photo, *binval; | 409 xmlnode *photo, *binval; |
413 gchar *enc; | 410 gchar *enc; |
414 int i; | 411 int i; |
415 unsigned char hashval[20]; | 412 unsigned char hashval[20]; |
416 char *p, hash[41]; | 413 char *p, hash[41]; |
417 | 414 |
418 avatar_data = (guchar *) avatar_data_tmp; | 415 avatar_data = purple_imgstore_get_data(img); |
416 avatar_len = purple_imgstore_get_size(img); | |
419 photo = xmlnode_new_child(vc_node, "PHOTO"); | 417 photo = xmlnode_new_child(vc_node, "PHOTO"); |
420 binval = xmlnode_new_child(photo, "BINVAL"); | 418 binval = xmlnode_new_child(photo, "BINVAL"); |
421 enc = purple_base64_encode(avatar_data, avatar_len); | 419 enc = purple_base64_encode(avatar_data, avatar_len); |
422 | 420 |
423 purple_cipher_digest_region("sha1", (guchar *)avatar_data, | 421 purple_cipher_digest_region("sha1", avatar_data, |
424 avatar_len, sizeof(hashval), | 422 avatar_len, sizeof(hashval), |
425 hashval, NULL); | 423 hashval, NULL); |
424 | |
425 purple_imgstore_unref(img); | |
426 | 426 |
427 p = hash; | 427 p = hash; |
428 for(i=0; i<20; i++, p+=2) | 428 for(i=0; i<20; i++, p+=2) |
429 snprintf(p, 3, "%02x", hashval[i]); | 429 snprintf(p, 3, "%02x", hashval[i]); |
430 js->avatar_hash = g_strdup(hash); | 430 js->avatar_hash = g_strdup(hash); |
431 | 431 |
432 xmlnode_insert_data(binval, enc, -1); | 432 xmlnode_insert_data(binval, enc, -1); |
433 g_free(enc); | 433 g_free(enc); |
434 g_free(avatar_data); | 434 } |
435 } else if (error != NULL) { | |
436 g_error_free(error); | |
437 } | |
438 g_free(avatar_file); | |
439 | 435 |
440 iq = jabber_iq_new(js, JABBER_IQ_SET); | 436 iq = jabber_iq_new(js, JABBER_IQ_SET); |
441 xmlnode_insert_child(iq->node, vc_node); | 437 xmlnode_insert_child(iq->node, vc_node); |
442 jabber_iq_send(iq); | 438 jabber_iq_send(iq); |
443 } else { | 439 } else { |
444 xmlnode_free(vc_node); | 440 xmlnode_free(vc_node); |
445 } | 441 } |
446 } | 442 } |
447 | 443 |
448 void jabber_set_buddy_icon(PurpleConnection *gc, const char *iconfile) | 444 void jabber_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img) |
449 { | 445 { |
450 PurplePresence *gpresence; | 446 PurplePresence *gpresence; |
451 PurpleStatus *status; | 447 PurpleStatus *status; |
452 | 448 |
453 jabber_set_info(gc, purple_account_get_user_info(gc->account)); | 449 jabber_set_info(gc, purple_account_get_user_info(gc->account)); |