libpurple/protocols/jabber/buddy.c

changeset 16545
5188ffbaeb6e
parent 16490
68c22924d66b
parent 16539
75a20ae3a527
child 16576
95afcaa6bc4d
equal deleted inserted replaced
16514:e8896810a485 16545:5188ffbaeb6e
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));
713 709
714 purple_notify_userinfo(jbi->js->gc, jbi->jid, user_info, NULL, NULL); 710 purple_notify_userinfo(jbi->js->gc, jbi->jid, user_info, NULL, NULL);
715 purple_notify_user_info_destroy(user_info); 711 purple_notify_user_info_destroy(user_info);
716 712
717 while(jbi->vcard_imgids) { 713 while(jbi->vcard_imgids) {
718 purple_imgstore_unref(GPOINTER_TO_INT(jbi->vcard_imgids->data)); 714 purple_imgstore_unref_by_id(GPOINTER_TO_INT(jbi->vcard_imgids->data));
719 jbi->vcard_imgids = g_slist_delete_link(jbi->vcard_imgids, jbi->vcard_imgids); 715 jbi->vcard_imgids = g_slist_delete_link(jbi->vcard_imgids, jbi->vcard_imgids);
720 } 716 }
721 717
722 jbi->js->pending_buddy_info_requests = g_slist_remove(jbi->js->pending_buddy_info_requests, jbi); 718 jbi->js->pending_buddy_info_requests = g_slist_remove(jbi->js->pending_buddy_info_requests, jbi);
723 719
958 char *p, hash[41]; 954 char *p, hash[41];
959 gboolean photo = (strcmp(child->name, "PHOTO") == 0); 955 gboolean photo = (strcmp(child->name, "PHOTO") == 0);
960 956
961 data = purple_base64_decode(bintext, &size); 957 data = purple_base64_decode(bintext, &size);
962 958
963 jbi->vcard_imgids = g_slist_prepend(jbi->vcard_imgids, GINT_TO_POINTER(purple_imgstore_add(data, size, "logo.png"))); 959 jbi->vcard_imgids = g_slist_prepend(jbi->vcard_imgids, GINT_TO_POINTER(purple_imgstore_add_with_id(g_memdup(data, size), size, "logo.png")));
964 g_string_append_printf(info_text, 960 g_string_append_printf(info_text,
965 "<b>%s:</b> <img id='%d'><br/>", 961 "<b>%s:</b> <img id='%d'><br/>",
966 photo ? _("Photo") : _("Logo"), 962 photo ? _("Photo") : _("Logo"),
967 GPOINTER_TO_INT(jbi->vcard_imgids->data)); 963 GPOINTER_TO_INT(jbi->vcard_imgids->data));
968
969 purple_buddy_icons_set_for_user(js->gc->account, bare_jid,
970 data, size);
971 964
972 purple_cipher_digest_region("sha1", (guchar *)data, size, 965 purple_cipher_digest_region("sha1", (guchar *)data, size,
973 sizeof(hashval), hashval, NULL); 966 sizeof(hashval), hashval, NULL);
974 p = hash; 967 p = hash;
975 for(i=0; i<20; i++, p+=2) 968 for(i=0; i<20; i++, p+=2)
976 snprintf(p, 3, "%02x", hashval[i]); 969 snprintf(p, 3, "%02x", hashval[i]);
977 purple_blist_node_set_string((PurpleBlistNode*)b, "avatar_hash", hash); 970
978 971 purple_buddy_icons_set_for_user(js->gc->account, bare_jid,
979 g_free(data); 972 data, size, hash);
980 g_free(bintext); 973 g_free(bintext);
981 } 974 }
982 } 975 }
983 g_free(text); 976 g_free(text);
984 } 977 }

mercurial