comparison libpurple/protocols/msn/slplink.c @ 30730:f8ec889c5bce

propagate from branch 'im.pidgin.pidgin' (head f6cdf8776559775f9a4a72563e69741e139518bd) to branch 'im.pidgin.cpw.qulogic.msnp16' (head ee6655c65ffae7f61734aa5a05267a3f5a4fc0de)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Mon, 10 May 2010 23:21:44 +0000
parents 7a26ff6c0044 afc9cec164e4
children 66e7fe9f7810
comparison
equal deleted inserted replaced
30729:edb7c80bf930 30730:f8ec889c5bce
689 689
690 static gchar * 690 static gchar *
691 gen_context(PurpleXfer *xfer, const char *file_name, const char *file_path) 691 gen_context(PurpleXfer *xfer, const char *file_name, const char *file_path)
692 { 692 {
693 gsize size = 0; 693 gsize size = 0;
694 MsnFileContext header; 694 MsnFileContext *header;
695 gchar *u8 = NULL; 695 gchar *u8 = NULL;
696 gchar *ret; 696 gchar *ret;
697 gunichar2 *uni = NULL; 697 gunichar2 *uni = NULL;
698 glong currentChar = 0; 698 glong currentChar = 0;
699 glong len = 0; 699 glong len = 0;
700 const char *preview;
701 gsize preview_len;
700 702
701 size = purple_xfer_get_size(xfer); 703 size = purple_xfer_get_size(xfer);
704
705 purple_xfer_prepare_thumbnail(xfer, "png");
702 706
703 if (!file_name) { 707 if (!file_name) {
704 gchar *basename = g_path_get_basename(file_path); 708 gchar *basename = g_path_get_basename(file_path);
705 u8 = purple_utf8_try_convert(basename); 709 u8 = purple_utf8_try_convert(basename);
706 g_free(basename); 710 g_free(basename);
713 g_free(u8); 717 g_free(u8);
714 file_name = NULL; 718 file_name = NULL;
715 u8 = NULL; 719 u8 = NULL;
716 } 720 }
717 721
718 header.length = GUINT32_TO_LE(sizeof(MsnFileContext) - 1); 722 preview = purple_xfer_get_thumbnail(xfer, &preview_len);
719 header.version = GUINT32_TO_LE(2); /* V.3 contains additional unnecessary data */ 723 header = g_malloc(sizeof(MsnFileContext) + preview_len);
720 header.file_size = GUINT64_TO_LE(size); 724
721 header.type = GUINT32_TO_LE(1); /* No file preview */ 725 header->length = GUINT32_TO_LE(sizeof(MsnFileContext) - 1);
726 header->version = GUINT32_TO_LE(2); /* V.3 contains additional unnecessary data */
727 header->file_size = GUINT64_TO_LE(size);
728 if (preview)
729 header->type = GUINT32_TO_LE(0);
730 else
731 header->type = GUINT32_TO_LE(1);
722 732
723 len = MIN(len, MAX_FILE_NAME_LEN); 733 len = MIN(len, MAX_FILE_NAME_LEN);
724 for (currentChar = 0; currentChar < len; currentChar++) { 734 for (currentChar = 0; currentChar < len; currentChar++) {
725 header.file_name[currentChar] = GUINT16_TO_LE(uni[currentChar]); 735 header->file_name[currentChar] = GUINT16_TO_LE(uni[currentChar]);
726 } 736 }
727 memset(&header.file_name[currentChar], 0x00, (MAX_FILE_NAME_LEN - currentChar) * 2); 737 memset(&header->file_name[currentChar], 0x00, (MAX_FILE_NAME_LEN - currentChar) * 2);
728 738
729 memset(&header.unknown1, 0, sizeof(header.unknown1)); 739 memset(&header->unknown1, 0, sizeof(header->unknown1));
730 header.unknown2 = GUINT32_TO_LE(0xffffffff); 740 header->unknown2 = GUINT32_TO_LE(0xffffffff);
731 header.preview[0] = '\0'; 741 if (preview) {
742 memcpy(&header->preview, preview, preview_len);
743 }
744 header->preview[preview_len] = '\0';
732 745
733 g_free(uni); 746 g_free(uni);
734 ret = purple_base64_encode((const guchar *)&header, sizeof(MsnFileContext)); 747 ret = purple_base64_encode((const guchar *)header, sizeof(MsnFileContext) + preview_len);
748 g_free(header);
735 return ret; 749 return ret;
736 } 750 }
737 751
738 void 752 void
739 msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer) 753 msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer)