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