Mercurial > pidgin.yaz
diff libpurple/protocols/msn/slp.c @ 31493:b4064198e017
Add functions for reading and writing a MsnFileContext which negates
the need for any more packing.
Fixes #12856.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Fri, 17 Dec 2010 08:53:34 +0000 |
parents | bc85e62fdb19 |
children | 9ccbd0302bb2 |
line wrap: on
line diff
--- a/libpurple/protocols/msn/slp.c Fri Dec 17 07:58:33 2010 +0000 +++ b/libpurple/protocols/msn/slp.c Fri Dec 17 08:53:34 2010 +0000 @@ -293,7 +293,7 @@ gen_context(PurpleXfer *xfer, const char *file_name, const char *file_path) { gsize size = 0; - MsnFileContext *header; + MsnFileContext header; gchar *u8 = NULL; gchar *ret; gunichar2 *uni = NULL; @@ -322,32 +322,34 @@ } preview = purple_xfer_get_thumbnail(xfer, &preview_len); - header = g_malloc(sizeof(MsnFileContext) + preview_len); - header->length = GUINT32_TO_LE(sizeof(MsnFileContext) - 1); - header->version = GUINT32_TO_LE(2); /* V.3 contains additional unnecessary data */ - header->file_size = GUINT64_TO_LE(size); + header.length = MSN_FILE_CONTEXT_SIZE; + header.version = 2; /* V.3 contains additional unnecessary data */ + header.file_size = size; if (preview) - header->type = GUINT32_TO_LE(0); + header.type = 0; else - header->type = GUINT32_TO_LE(1); + header.type = 1; len = MIN(len, MAX_FILE_NAME_LEN); for (currentChar = 0; currentChar < len; currentChar++) { - header->file_name[currentChar] = GUINT16_TO_LE(uni[currentChar]); + header.file_name[currentChar] = GUINT16_TO_LE(uni[currentChar]); } - memset(&header->file_name[currentChar], 0x00, (MAX_FILE_NAME_LEN - currentChar) * 2); + memset(&header.file_name[currentChar], 0x00, (MAX_FILE_NAME_LEN - currentChar) * 2); + + memset(&header.unknown1, 0, sizeof(header.unknown1)); + header.unknown2 = 0xffffffff; - memset(&header->unknown1, 0, sizeof(header->unknown1)); - header->unknown2 = GUINT32_TO_LE(0xffffffff); - if (preview) { - memcpy(&header->preview, preview, preview_len); - } - header->preview[preview_len] = '\0'; + /* Mind the cast, as in, don't free it after! */ + header.preview = (char *)preview; + header.preview_len = preview_len; + + u8 = msn_file_context_to_wire(&header); + ret = purple_base64_encode((const guchar *)u8, MSN_FILE_CONTEXT_SIZE + preview_len); g_free(uni); - ret = purple_base64_encode((const guchar *)header, sizeof(MsnFileContext) + preview_len); - g_free(header); + g_free(u8); + return ret; }