diff src/protocols/msn/slpmsg.c @ 9193:502707ca1836

[gaim-migrate @ 9988] Patch by Felipe Contreras to add MSN file transfer and buddy icons. Please test and report any bugs! committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Sun, 06 Jun 2004 02:39:08 +0000
parents
children ab6636c5a136
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/protocols/msn/slpmsg.c	Sun Jun 06 02:39:08 2004 +0000
@@ -0,0 +1,187 @@
+/**
+ * @file slpmsg.h SLP Message functions
+ *
+ * gaim
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include "msn.h"
+#include "slpmsg.h"
+#include "slplink.h"
+
+/**************************************************************************
+ * SLP Message
+ **************************************************************************/
+
+MsnSlpMessage *
+msn_slpmsg_new(MsnSlpLink *slplink)
+{
+	MsnSlpMessage *slpmsg;
+	slpmsg = g_new0(MsnSlpMessage, 1);
+
+	slpmsg->slplink = slplink;
+
+	slplink->slp_msgs =
+		g_list_append(slplink->slp_msgs, slpmsg);
+
+	return slpmsg;
+}
+
+void
+msn_slpmsg_destroy(MsnSlpMessage *slpmsg)
+{
+	MsnSlpLink *slplink;
+
+	slplink = slpmsg->slplink;
+
+	if (slpmsg->fp != NULL)
+		fclose(slpmsg->fp);
+	
+	if (slpmsg->buffer != NULL)
+		g_free(slpmsg->buffer);
+
+#ifdef DEBUG_SLP
+	/*
+	if (slpmsg->info != NULL)
+		g_free(slpmsg->info);
+	*/
+#endif
+
+	if (slpmsg->msg != NULL)
+	{
+		if (slpmsg->msg->trans != NULL)
+		{
+			slpmsg->msg->trans->callbacks = NULL;
+			slpmsg->msg->trans->data = NULL;
+		}
+	}
+
+	slplink->slp_msgs =
+		g_list_remove(slplink->slp_msgs, slpmsg);
+
+	g_free(slpmsg);
+}
+
+void
+msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body,
+						 long long size)
+{
+	if (body != NULL)
+		slpmsg->buffer = g_memdup(body, size);
+	else
+		slpmsg->buffer = g_new0(char, size);
+	
+	slpmsg->size = size;
+}
+
+void
+msn_slpmsg_open_file(MsnSlpMessage *slpmsg, const char *file_name)
+{
+	struct stat st;
+
+	slpmsg->fp = fopen(file_name, "r");
+
+	if (stat(file_name, &st) == 0)
+		slpmsg->size = st.st_size;
+}
+
+#ifdef DEBUG_SLP
+const void
+msn_slpmsg_show(MsnMessage *msg)
+{
+	const char *info;
+	gboolean text;
+	guint32 flags;
+
+	text = FALSE;
+
+	flags = GUINT32_TO_LE(msg->msnslp_header.flags);;
+
+	switch (flags)
+	{
+		case 0x0:
+			info = "SLP CONTROL";
+			text = TRUE;
+			break;
+		case 0x2:
+			info = "SLP ACK"; break;
+		case 0x20:
+			info = "SLP DATA"; break;
+		default:
+			info = "SLP UNKNOWN"; break;
+	}
+
+	msn_message_show_readable(msg, info, text);
+}
+#endif
+
+MsnSlpMessage *
+msn_slpmsg_sip_new(MsnSlpCall *slpcall, int cseq,
+				   const char *header, const char *branch,
+				   const char *content_type, const char *content)
+{
+	MsnSlpLink *slplink;
+	MsnSlpMessage *slpmsg;
+	char *body;
+	gsize body_len;
+	gsize content_len;
+
+	g_return_val_if_fail(slpcall != NULL, NULL);
+	g_return_val_if_fail(header  != NULL, NULL);
+
+	slplink = slpcall->slplink;
+
+	/* Let's remember that "content" should end with a 0x00 */
+
+	content_len = (content != NULL) ? strlen(content) + 1 : 0;
+
+	body = g_strdup_printf(
+		"%s\r\n"
+		"To: <msnmsgr:%s>\r\n"
+		"From: <msnmsgr:%s>\r\n"
+		"Via: MSNSLP/1.0/TLP ;branch={%s}\r\n"
+		"CSeq: %d\r\n"
+		"Call-ID: {%s}\r\n"
+		"Max-Forwards: 0\r\n"
+		"Content-Type: %s\r\n"
+		"Content-Length: %d\r\n"
+		"\r\n",
+		header,
+		slplink->remote_user,
+		slplink->local_user,
+		branch,
+		cseq,
+		slpcall->id,
+		content_type,
+		content_len);
+
+	body_len = strlen(body);
+
+	if (content_len > 0)
+	{
+		body_len += content_len;
+		body = g_realloc(body, body_len);
+		g_strlcat(body, content, body_len);
+	}
+
+	slpmsg = msn_slpmsg_new(slplink);
+	msn_slpmsg_set_body(slpmsg, body, body_len);
+
+	slpmsg->sip = TRUE;
+
+	g_free(body);
+
+	return slpmsg;
+}