libpurple/protocols/msn/slpcall.c

changeset 31249
b6c1a0a39131
parent 31185
5ffa2e7ba2e1
child 31335
a2794d868ffc
--- 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;
 

mercurial