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