comparison libpurple/protocols/msn/slpmsg.c @ 15373:5fe8042783c1

Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author Sean Egan <seanegan@gmail.com>
date Sat, 20 Jan 2007 02:32:10 +0000
parents
children 32c366eeeb99
comparison
equal deleted inserted replaced
15372:f79e0f4df793 15373:5fe8042783c1
1 /**
2 * @file slpmsg.h SLP Message functions
3 *
4 * gaim
5 *
6 * Gaim is the legal property of its developers, whose names are too numerous
7 * to list here. Please refer to the COPYRIGHT file distributed with this
8 * source distribution.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24 #include "msn.h"
25 #include "slpmsg.h"
26 #include "slplink.h"
27
28 /**************************************************************************
29 * SLP Message
30 **************************************************************************/
31
32 MsnSlpMessage *
33 msn_slpmsg_new(MsnSlpLink *slplink)
34 {
35 MsnSlpMessage *slpmsg;
36
37 slpmsg = g_new0(MsnSlpMessage, 1);
38
39 #ifdef MSN_DEBUG_SLPMSG
40 gaim_debug_info("msn", "slpmsg new (%p)\n", slpmsg);
41 #endif
42
43 slpmsg->slplink = slplink;
44
45 slplink->slp_msgs =
46 g_list_append(slplink->slp_msgs, slpmsg);
47
48 return slpmsg;
49 }
50
51 void
52 msn_slpmsg_destroy(MsnSlpMessage *slpmsg)
53 {
54 MsnSlpLink *slplink;
55 GList *cur;
56
57 g_return_if_fail(slpmsg != NULL);
58
59 #ifdef MSN_DEBUG_SLPMSG
60 gaim_debug_info("msn", "slpmsg destroy (%p)\n", slpmsg);
61 #endif
62
63 slplink = slpmsg->slplink;
64
65 if (slpmsg->fp != NULL)
66 fclose(slpmsg->fp);
67
68 if (slpmsg->buffer != NULL)
69 g_free(slpmsg->buffer);
70
71 #ifdef MSN_DEBUG_SLP
72 /*
73 if (slpmsg->info != NULL)
74 g_free(slpmsg->info);
75 */
76 #endif
77
78 for (cur = slpmsg->msgs; cur != NULL; cur = cur->next)
79 {
80 /* Something is pointing to this slpmsg, so we should remove that
81 * pointer to prevent a crash. */
82 /* Ex: a user goes offline and after that we receive an ACK */
83
84 MsnMessage *msg = cur->data;
85
86 #ifdef MSN_DEBUG_SLPMSG
87 gaim_debug_info("msn", "Unlink slpmsg callbacks.\n");
88 #endif
89
90 msg->ack_cb = NULL;
91 msg->nak_cb = NULL;
92 msg->ack_data = NULL;
93 }
94
95 slplink->slp_msgs = g_list_remove(slplink->slp_msgs, slpmsg);
96
97 g_free(slpmsg);
98 }
99
100 void
101 msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body,
102 long long size)
103 {
104 if (body != NULL)
105 slpmsg->buffer = g_memdup(body, size);
106 else
107 slpmsg->buffer = g_new0(guchar, size);
108
109 slpmsg->size = size;
110 }
111
112 void
113 msn_slpmsg_open_file(MsnSlpMessage *slpmsg, const char *file_name)
114 {
115 struct stat st;
116
117 slpmsg->fp = g_fopen(file_name, "rb");
118
119 if (g_stat(file_name, &st) == 0)
120 slpmsg->size = st.st_size;
121 }
122
123 #ifdef MSN_DEBUG_SLP
124 void
125 msn_slpmsg_show(MsnMessage *msg)
126 {
127 const char *info;
128 gboolean text;
129 guint32 flags;
130
131 text = FALSE;
132
133 flags = GUINT32_TO_LE(msg->msnslp_header.flags);
134
135 switch (flags)
136 {
137 case 0x0:
138 info = "SLP CONTROL";
139 text = TRUE;
140 break;
141 case 0x2:
142 info = "SLP ACK"; break;
143 case 0x20:
144 case 0x1000030:
145 info = "SLP DATA"; break;
146 default:
147 info = "SLP UNKNOWN"; break;
148 }
149
150 msn_message_show_readable(msg, info, text);
151 }
152 #endif
153
154 MsnSlpMessage *
155 msn_slpmsg_sip_new(MsnSlpCall *slpcall, int cseq,
156 const char *header, const char *branch,
157 const char *content_type, const char *content)
158 {
159 MsnSlpLink *slplink;
160 MsnSlpMessage *slpmsg;
161 char *body;
162 gsize body_len;
163 gsize content_len;
164
165 g_return_val_if_fail(slpcall != NULL, NULL);
166 g_return_val_if_fail(header != NULL, NULL);
167
168 slplink = slpcall->slplink;
169
170 /* Let's remember that "content" should end with a 0x00 */
171
172 content_len = (content != NULL) ? strlen(content) + 1 : 0;
173
174 body = g_strdup_printf(
175 "%s\r\n"
176 "To: <msnmsgr:%s>\r\n"
177 "From: <msnmsgr:%s>\r\n"
178 "Via: MSNSLP/1.0/TLP ;branch={%s}\r\n"
179 "CSeq: %d\r\n"
180 "Call-ID: {%s}\r\n"
181 "Max-Forwards: 0\r\n"
182 "Content-Type: %s\r\n"
183 "Content-Length: %" G_GSIZE_FORMAT "\r\n"
184 "\r\n",
185 header,
186 slplink->remote_user,
187 slplink->local_user,
188 branch,
189 cseq,
190 slpcall->id,
191 content_type,
192 content_len);
193
194 body_len = strlen(body);
195
196 if (content_len > 0)
197 {
198 body_len += content_len;
199 body = g_realloc(body, body_len);
200 g_strlcat(body, content, body_len);
201 }
202
203 slpmsg = msn_slpmsg_new(slplink);
204 msn_slpmsg_set_body(slpmsg, body, body_len);
205
206 slpmsg->sip = TRUE;
207 slpmsg->slpcall = slpcall;
208
209 g_free(body);
210
211 return slpmsg;
212 }