Mercurial > pidgin
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) |