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));