diff src/protocols/msn/msnslp.c @ 6868:ab80de7a74d1

[gaim-migrate @ 7414] Commitinating the current MSNSLP code. It's not working.. I don't know why. No clients will respond to my messages, even though they appear very valid. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 17 Sep 2003 02:10:37 +0000
parents bd433a45a463
children ac638b90da44
line wrap: on
line diff
--- a/src/protocols/msn/msnslp.c	Wed Sep 17 01:50:15 2003 +0000
+++ b/src/protocols/msn/msnslp.c	Wed Sep 17 02:10:37 2003 +0000
@@ -22,25 +22,6 @@
 #include "msn.h"
 #include "msnslp.h"
 
-static void
-send_ack(MsnSlpSession *slpsession, MsnMessage *acked_msg)
-{
-	MsnMessage *msg;
-
-	msg = msn_message_new_msnslp();
-
-	msg->msnslp_header.length = acked_msg->msnslp_header.length;
-	msg->msnslp_header.flags = 0x02;
-	msg->msnslp_header.ack_session_id =
-		acked_msg->msnslp_header.ack_session_id;
-	msg->msnslp_header.ack_unique_id =
-		acked_msg->msnslp_header.id;
-	msg->msnslp_header.ack_length = acked_msg->msnslp_header.length;
-
-	/* Send this puppy. */
-	msn_slp_session_send_msg(slpsession, msg);
-}
-
 MsnSlpSession *
 msn_slp_session_new(MsnSwitchBoard *swboard, gboolean local_initiated)
 {
@@ -86,43 +67,127 @@
 	}
 
 	/* Now send an ack, since we got this. */
-	send_ack(slpsession, msg);
+	msn_slp_session_send_ack(slpsession, msg);
 
 	return FALSE;
 }
 
+static void
+send_msg_part(MsnSlpSession *slpsession, MsnMessage *msg)
+{
+	msg->msnslp_header.length =
+		(slpsession->orig_len - slpsession->offset > 1202
+		 ? 1202 : slpsession->orig_len - slpsession->offset);
+
+	if (slpsession->offset > 0)
+	{
+		if (msg->bin_content)
+		{
+			msn_message_set_bin_data(msg,
+				slpsession->orig_body + slpsession->offset,
+				msg->msnslp_header.length);
+		}
+		else
+		{
+			msn_message_set_body(msg,
+				slpsession->orig_body + slpsession->offset);
+		}
+	}
+
+	msg->msnslp_header.offset_1 = slpsession->offset;
+
+	msn_switchboard_send_msg(slpsession->swboard, msg);
+
+	if (slpsession->offset + msg->msnslp_header.length == slpsession->orig_len)
+	{
+		msn_message_destroy(msg);
+
+		g_free(slpsession->orig_body);
+
+		slpsession->offset       = 0;
+		slpsession->orig_len     = 0;
+		slpsession->orig_body    = NULL;
+		slpsession->outgoing_msg = NULL;
+	}
+	else
+		slpsession->offset += msg->msnslp_header.length;
+}
+
 void
 msn_slp_session_send_msg(MsnSlpSession *slpsession, MsnMessage *msg)
 {
 	g_return_if_fail(slpsession != NULL);
 	g_return_if_fail(msg != NULL);
 	g_return_if_fail(msg->msnslp_message);
+	g_return_if_fail(slpsession->outgoing_msg == NULL);
 
 	msg->msnslp_header.session_id = slpsession->session_id;
 
+	slpsession->outgoing_msg = msn_message_ref(msg);
+
 	if (slpsession->base_id == 0)
 	{
-		slpsession->base_id = rand() % 0xFFFFFF00 + 4;
+		slpsession->base_id = rand() % 0x0FFFFFF0 + 4;
 		slpsession->prev_msg_id = slpsession->base_id;
 	}
+	else if (slpsession->offset == 0)
+		slpsession->prev_msg_id = ++slpsession->base_id;
+
+	msg->msnslp_header.id = slpsession->prev_msg_id;
+//	msg->msnslp_header.ack_session_id = rand() % 0xFFFFFF00;
+	msg->msnslp_header.ack_session_id = 1980589;
+
+	msn_message_set_charset(msg, NULL);
+
+	if (msg->msnslp_header.session_id != 0)
+		msg->msnslp_footer.app_id = 1;
+
+	if (msg->bin_content)
+	{
+		const void *temp;
+
+		temp = msn_message_get_bin_data(msg, &slpsession->orig_len);
+
+		slpsession->orig_body = g_memdup(temp, slpsession->orig_len);
+	}
+	else
+	{
+		slpsession->orig_body = g_strdup(msn_message_get_body(msg));
+		slpsession->orig_len  = strlen(slpsession->orig_body);
+	}
+
+	msg->msnslp_header.total_size_1 = slpsession->orig_len;
+
+	send_msg_part(slpsession, msg);
+}
+
+void
+msn_slp_session_send_ack(MsnSlpSession *slpsession, MsnMessage *acked_msg)
+{
+	MsnMessage *msg;
+	gboolean new_base_id = FALSE;
+
+	g_return_if_fail(slpsession != NULL);
+	g_return_if_fail(acked_msg != NULL);
+	g_return_if_fail(acked_msg->msnslp_message);
+	g_return_if_fail(slpsession->outgoing_msg == NULL);
+
+	msg = msn_message_new_msnslp_ack(acked_msg);
+
+	if (slpsession->base_id == 0)
+	{
+		slpsession->base_id = rand() % 0x0FFFFE00 + 10;
+		slpsession->prev_msg_id = slpsession->base_id;
+
+		new_base_id = TRUE;
+	}
 	else
 		slpsession->prev_msg_id = ++slpsession->base_id;
 
 	msg->msnslp_header.id = slpsession->prev_msg_id;
-	msg->msnslp_header.ack_session_id = rand() % 0xFFFFFF00;
 
-	if (msn_message_get_body(msg) != NULL)
-		msg->msnslp_header.total_size = strlen(msn_message_get_body(msg));
-
-	msn_message_set_charset(msg, NULL);
-
-	msn_message_set_flag(msg, 'D');
-	msn_message_set_content_type(msg, "application/x-msnmsgrp2p");
-	msn_message_set_attr(msg, "P2P-Dest",
-			msn_user_get_passport(msn_message_get_receiver(msg)));
-
-	if (msg->msnslp_header.session_id != 0)
-		msg->msnslp_footer.app_id = 1;
+	if (new_base_id)
+		slpsession->prev_msg_id -= 4;
 
 	msn_switchboard_send_msg(slpsession->swboard, msg);
 }
@@ -141,7 +206,6 @@
 	char *call_id;
 	char *content;
 	char *body;
-	char *c;
 
 	g_return_if_fail(slpsession  != NULL);
 	g_return_if_fail(local_user  != NULL);
@@ -152,8 +216,10 @@
 	msnobj_base64 = tobase64(msnobj_data, strlen(msnobj_data));
 	g_free(msnobj_data);
 
+#if 0
 	if ((c = strchr(msnobj_base64, '=')) != NULL)
 		*c = '\0';
+#endif
 
 	session_id = rand() % 0xFFFFFF00 + 4;