diff libpurple/protocols/msn/slpcall.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 f26e961e1274
children 3824f34c93d9
line wrap: on
line diff
--- a/libpurple/protocols/msn/slpcall.c	Fri Dec 17 07:58:33 2010 +0000
+++ b/libpurple/protocols/msn/slpcall.c	Fri Dec 17 08:53:34 2010 +0000
@@ -512,6 +512,7 @@
 		PurpleAccount *account;
 		PurpleXfer *xfer;
 		MsnFileContext *header;
+		char *buf;
 		gsize bin_len;
 		guint32 file_size;
 		char *file_name;
@@ -526,11 +527,11 @@
 		xfer = purple_xfer_new(account, PURPLE_XFER_RECEIVE,
 							 slpcall->slplink->remote_user);
 
-		header = (MsnFileContext *)purple_base64_decode(context, &bin_len);
-		if (header != NULL && bin_len >= sizeof(MsnFileContext) - 1 &&
-			(header->version == 2 ||
-			 (header->version == 3 && header->length == sizeof(MsnFileContext) + 63))) {
-			file_size = GUINT64_FROM_LE(header->file_size);
+		buf = (char *)purple_base64_decode(context, &bin_len);
+		header = msn_file_context_from_wire(buf, bin_len);
+
+		if (header != NULL) {
+			file_size = header->file_size;
 
 			file_name = g_convert((const gchar *)&header->file_name,
 			                      MAX_FILE_NAME_LEN * 2,
@@ -553,15 +554,17 @@
 
 			xfer->data = slpcall;
 
-			if (header->type == 0 && bin_len >= sizeof(MsnFileContext)) {
-				purple_xfer_set_thumbnail(xfer, &header->preview,
-				                          bin_len - sizeof(MsnFileContext),
+			if (header->preview) {
+				purple_xfer_set_thumbnail(xfer, header->preview,
+				                          header->preview_len,
 				    					  "image/png");
+				g_free(header->preview);
 			}
 
 			purple_xfer_request(xfer);
 		}
 		g_free(header);
+		g_free(buf);
 
 		accepted = TRUE;