Mercurial > pidgin
annotate src/protocols/msn/slp.c @ 9788:1e9ecca6c97e
[gaim-migrate @ 10656]
"ixes sending declines when we would decline a request
to an MSN file xfer.
Fixes accidentally having 2 xfers of the same file in
the transfer dialog when sending through MSN and SILC.
Fixes crash when cancelling MSN file transfers.
Should fix crash when removing old MSN transfers from
the xfer window in MSN.
Fixes MSN crash when the remote side sends a decline
after we've canceled locally." --Dave West
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Fri, 20 Aug 2004 03:44:46 +0000 |
parents | 35f22ba01bd7 |
children | d0c196ebe176 |
rev | line source |
---|---|
9193 | 1 /** |
2 * @file msnslp.c MSNSLP support | |
3 * | |
4 * gaim | |
5 * | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
6 * Gaim is the legal property of its developers, whose names are too numerous |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
7 * to list here. Please refer to the COPYRIGHT file distributed with this |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
8 * source distribution. |
9193 | 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 "slp.h" | |
26 #include "slpcall.h" | |
27 #include "slpmsg.h" | |
28 #include "slpsession.h" | |
29 | |
30 #include "object.h" | |
31 #include "user.h" | |
32 #include "switchboard.h" | |
33 | |
34 /* #include "slplink.h" */ | |
35 /* #include "directconn.h" */ | |
36 | |
37 static void send_ok(MsnSlpCall *slpcall, const char *branch, | |
38 const char *type, const char *content); | |
39 | |
40 static void send_decline(MsnSlpCall *slpcall, const char *branch, | |
41 const char *type, const char *content); | |
42 | |
43 /************************************************************************** | |
44 * Util | |
45 **************************************************************************/ | |
46 | |
47 char * | |
48 get_token(const char *str, const char *start, const char *end) | |
49 { | |
50 const char *c, *c2; | |
51 | |
52 if ((c = strstr(str, start)) == NULL) | |
53 return NULL; | |
54 | |
55 c += strlen(start); | |
56 | |
57 if (end != NULL) | |
58 { | |
59 if ((c2 = strstr(c, end)) == NULL) | |
60 return NULL; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
61 |
9193 | 62 return g_strndup(c, c2 - c); |
63 } | |
64 else | |
65 { | |
66 /* This has to be changed */ | |
67 return g_strdup(c); | |
68 } | |
69 | |
70 } | |
71 | |
72 /************************************************************************** | |
73 * Xfer | |
74 **************************************************************************/ | |
75 | |
76 static void | |
77 msn_xfer_init(GaimXfer *xfer) | |
78 { | |
79 MsnSlpCall *slpcall; | |
80 /* MsnSlpLink *slplink; */ | |
81 char *content; | |
82 | |
83 gaim_debug_info("msn", "xfer_init\n"); | |
84 | |
85 slpcall = xfer->data; | |
86 | |
87 /* Send Ok */ | |
88 content = g_strdup_printf("SessionID: %lu\r\n\r\n", | |
89 slpcall->session_id); | |
90 | |
91 send_ok(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody", | |
92 content); | |
93 | |
94 g_free(content); | |
95 msn_slplink_unleash(slpcall->slplink); | |
96 } | |
97 | |
98 void | |
99 msn_xfer_cancel(GaimXfer *xfer) | |
100 { | |
101 MsnSlpCall *slpcall; | |
102 char *content; | |
103 | |
9788 | 104 g_return_if_fail(xfer != NULL); |
105 g_return_if_fail(xfer->data != NULL); | |
106 | |
9193 | 107 slpcall = xfer->data; |
108 | |
109 if (gaim_xfer_get_status(xfer) == GAIM_XFER_STATUS_CANCEL_LOCAL) | |
110 { | |
111 if (slpcall->started) | |
112 { | |
113 msn_slp_call_close(slpcall); | |
114 } | |
115 else | |
116 { | |
117 content = g_strdup_printf("SessionID: %lu\r\n\r\n", | |
118 slpcall->session_id); | |
119 | |
120 send_decline(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody", | |
121 content); | |
122 | |
123 g_free(content); | |
124 msn_slplink_unleash(slpcall->slplink); | |
125 } | |
126 } | |
127 } | |
128 | |
129 void | |
130 msn_xfer_progress_cb(MsnSlpCall *slpcall, gsize total_length, gsize len, gsize offset) | |
131 { | |
132 GaimXfer *xfer; | |
133 | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
134 xfer = slpcall->xfer; |
9193 | 135 |
9226
7a00289f2ef1
[gaim-migrate @ 10022]
Christian Hammond <chipx86@chipx86.com>
parents:
9198
diff
changeset
|
136 xfer->bytes_sent = (offset + len); |
7a00289f2ef1
[gaim-migrate @ 10022]
Christian Hammond <chipx86@chipx86.com>
parents:
9198
diff
changeset
|
137 xfer->bytes_remaining = total_length - (offset + len); |
9193 | 138 |
139 gaim_xfer_update_progress(xfer); | |
140 } | |
141 | |
142 void | |
9259
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
143 msn_xfer_end_cb(MsnSlpCall *slpcall) |
9193 | 144 { |
9226
7a00289f2ef1
[gaim-migrate @ 10022]
Christian Hammond <chipx86@chipx86.com>
parents:
9198
diff
changeset
|
145 if (gaim_xfer_get_status(slpcall->xfer) != GAIM_XFER_STATUS_DONE) |
7a00289f2ef1
[gaim-migrate @ 10022]
Christian Hammond <chipx86@chipx86.com>
parents:
9198
diff
changeset
|
146 { |
9259
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
147 gaim_xfer_cancel_remote(slpcall->xfer); |
9226
7a00289f2ef1
[gaim-migrate @ 10022]
Christian Hammond <chipx86@chipx86.com>
parents:
9198
diff
changeset
|
148 } |
9193 | 149 } |
150 | |
9259
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
151 void |
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
152 msn_xfer_completed_cb(MsnSlpCall *slpcall, const char *body, |
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
153 long long size) |
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
154 { |
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
155 gaim_xfer_set_completed(slpcall->xfer, TRUE); |
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
156 } |
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
157 |
9193 | 158 /************************************************************************** |
159 * SLP Control | |
160 **************************************************************************/ | |
161 | |
162 #if 0 | |
163 static void | |
164 got_transresp(MsnSlpCall *slpcall, const char *nonce, | |
165 const char *ips_str, int port) | |
166 { | |
167 MsnDirectConn *directconn; | |
168 char **ip_addrs, **c; | |
169 | |
170 directconn = msn_directconn_new(slpcall->slplink); | |
171 | |
172 directconn->initial_call = slpcall; | |
173 | |
174 /* msn_directconn_parse_nonce(directconn, nonce); */ | |
175 directconn->nonce = g_strdup(nonce); | |
176 | |
177 ip_addrs = g_strsplit(ips_str, " ", -1); | |
178 | |
179 for (c = ip_addrs; *c != NULL; c++) | |
180 { | |
181 gaim_debug_info("msn", "ip_addr = %s\n", *c); | |
182 if (msn_directconn_connect(directconn, *c, port)) | |
183 break; | |
184 } | |
185 | |
186 g_strfreev(ip_addrs); | |
187 } | |
188 #endif | |
189 | |
190 static void | |
191 send_ok(MsnSlpCall *slpcall, const char *branch, | |
192 const char *type, const char *content) | |
193 { | |
194 MsnSlpLink *slplink; | |
195 MsnSlpMessage *slpmsg; | |
196 | |
197 slplink = slpcall->slplink; | |
198 | |
199 /* 200 OK */ | |
200 slpmsg = msn_slpmsg_sip_new(slpcall, 1, | |
201 "MSNSLP/1.0 200 OK", | |
202 branch, type, content); | |
203 | |
204 #ifdef DEBUG_SLP | |
205 slpmsg->info = "SLP 200 OK"; | |
206 slpmsg->text_body = TRUE; | |
207 #endif | |
208 | |
209 msn_slplink_queue_slpmsg(slplink, slpmsg); | |
210 | |
211 msn_slp_call_session_init(slpcall); | |
212 } | |
213 | |
214 static void | |
215 send_decline(MsnSlpCall *slpcall, const char *branch, | |
216 const char *type, const char *content) | |
217 { | |
218 MsnSlpLink *slplink; | |
219 MsnSlpMessage *slpmsg; | |
220 | |
221 slplink = slpcall->slplink; | |
222 | |
223 /* 603 Decline */ | |
224 slpmsg = msn_slpmsg_sip_new(slpcall, 1, | |
225 "MSNSLP/1.0 603 Decline", | |
226 branch, type, content); | |
227 | |
228 #ifdef DEBUG_SLP | |
229 slpmsg->info = "SLP 603 Decline"; | |
230 slpmsg->text_body = TRUE; | |
231 #endif | |
232 | |
233 msn_slplink_queue_slpmsg(slplink, slpmsg); | |
234 } | |
235 | |
236 static void | |
237 got_sessionreq(MsnSlpCall *slpcall, const char *branch, | |
238 const char *euf_guid, const char *context) | |
239 { | |
240 if (!strcmp(euf_guid, "A4268EEC-FEC5-49E5-95C3-F126696BDBF6")) | |
241 { | |
242 /* Emoticon or UserDisplay */ | |
243 MsnSlpSession *slpsession; | |
244 MsnSlpLink *slplink; | |
245 MsnSlpMessage *slpmsg; | |
246 MsnObject *obj; | |
247 char *msnobj_data; | |
248 const char *sha1c; | |
249 const char *file_name; | |
250 char *content; | |
251 gsize len; | |
252 int type; | |
253 | |
254 /* Send Ok */ | |
255 content = g_strdup_printf("SessionID: %lu\r\n\r\n", | |
256 slpcall->session_id); | |
257 | |
258 send_ok(slpcall, branch, "application/x-msnmsgr-sessionreqbody", | |
259 content); | |
260 | |
261 g_free(content); | |
262 | |
263 slplink = slpcall->slplink; | |
264 | |
265 gaim_base64_decode(context, &msnobj_data, &len); | |
266 obj = msn_object_new_from_string(msnobj_data); | |
267 type = msn_object_get_type(obj); | |
268 sha1c = msn_object_get_sha1c(obj); | |
269 g_free(msnobj_data); | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
270 |
9193 | 271 if (!(type == MSN_OBJECT_USERTILE)) |
272 { | |
273 gaim_debug_error("msn", "Wrong object?\n"); | |
274 msn_object_destroy(obj); | |
275 g_return_if_reached(); | |
276 } | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
277 |
9193 | 278 file_name = msn_object_get_real_location(obj); |
279 | |
280 slpsession = msn_slplink_find_slp_session(slplink, | |
281 slpcall->session_id); | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
282 |
9193 | 283 /* DATA PREP */ |
284 slpmsg = msn_slpmsg_new(slplink); | |
285 slpmsg->slpsession = slpsession; | |
286 slpmsg->session_id = slpsession->id; | |
287 msn_slpmsg_set_body(slpmsg, NULL, 4); | |
288 #ifdef DEBUG_SLP | |
289 slpmsg->info = "SLP DATA PREP"; | |
290 #endif | |
291 msn_slplink_queue_slpmsg(slplink, slpmsg); | |
292 | |
293 /* DATA */ | |
294 slpmsg = msn_slpmsg_new(slplink); | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
295 slpmsg->slpsession = slpsession; |
9193 | 296 slpmsg->flags = 0x20; |
297 #ifdef DEBUG_SLP | |
298 slpmsg->info = "SLP DATA"; | |
299 #endif | |
300 msn_slpmsg_open_file(slpmsg, file_name); | |
301 msn_slplink_queue_slpmsg(slplink, slpmsg); | |
302 } | |
303 else if (!strcmp(euf_guid, "5D3E02AB-6190-11D3-BBBB-00C04F795683")) | |
304 { | |
305 /* File Transfer */ | |
306 GaimAccount *account; | |
307 GaimXfer *xfer; | |
308 char *bin; | |
309 gsize bin_len; | |
310 guint32 file_size; | |
311 char *file_name; | |
312 | |
313 account = slpcall->slplink->session->account; | |
314 | |
9259
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
315 slpcall->cb = msn_xfer_completed_cb; |
f5f7482678d2
[gaim-migrate @ 10058]
Christian Hammond <chipx86@chipx86.com>
parents:
9231
diff
changeset
|
316 slpcall->end_cb = msn_xfer_end_cb; |
9193 | 317 slpcall->progress_cb = msn_xfer_progress_cb; |
318 slpcall->branch = g_strdup(branch); | |
319 | |
320 xfer = gaim_xfer_new(account, GAIM_XFER_RECEIVE, | |
321 slpcall->slplink->remote_user); | |
322 | |
323 gaim_base64_decode(context, &bin, &bin_len); | |
9263
70153c759016
[gaim-migrate @ 10062]
Christian Hammond <chipx86@chipx86.com>
parents:
9259
diff
changeset
|
324 file_size = GUINT32_FROM_LE(*((gsize *)bin + 2)); |
9193 | 325 file_name = g_utf16_to_utf8((const gunichar2 *)(bin + 20), -1, |
326 NULL, NULL, NULL); | |
327 | |
328 g_free(bin); | |
329 | |
330 gaim_xfer_set_filename(xfer, file_name); | |
331 gaim_xfer_set_size(xfer, file_size); | |
332 gaim_xfer_set_init_fnc(xfer, msn_xfer_init); | |
333 gaim_xfer_set_request_denied_fnc(xfer, msn_xfer_cancel); | |
334 gaim_xfer_set_cancel_recv_fnc(xfer, msn_xfer_cancel); | |
335 | |
336 slpcall->xfer = xfer; | |
337 xfer->data = slpcall; | |
338 | |
339 gaim_xfer_request(xfer); | |
340 } | |
341 } | |
342 | |
343 void | |
344 send_bye(MsnSlpCall *slpcall, const char *type) | |
345 { | |
346 MsnSlpLink *slplink; | |
347 MsnSlpMessage *slpmsg; | |
348 char *header; | |
349 | |
350 slplink = slpcall->slplink; | |
351 | |
352 g_return_if_fail(slplink != NULL); | |
353 | |
354 header = g_strdup_printf("BYE MSNMSGR:%s MSNSLP/1.0", | |
355 slplink->local_user); | |
356 | |
357 slpmsg = msn_slpmsg_sip_new(slpcall, 0, header, | |
358 "A0D624A6-6C0C-4283-A9E0-BC97B4B46D32", | |
359 type, | |
360 "\r\n"); | |
361 g_free(header); | |
362 | |
363 #ifdef DEBUG_SLP | |
364 slpmsg->info = "SLP BYE"; | |
365 slpmsg->text_body = TRUE; | |
366 #endif | |
367 | |
368 msn_slplink_queue_slpmsg(slplink, slpmsg); | |
369 } | |
370 | |
371 static void | |
372 got_invite(MsnSlpCall *slpcall, | |
373 const char *branch, const char *type, const char *content) | |
374 { | |
375 MsnSlpLink *slplink; | |
376 | |
377 slplink = slpcall->slplink; | |
378 | |
379 if (!strcmp(type, "application/x-msnmsgr-sessionreqbody")) | |
380 { | |
381 char *euf_guid, *context; | |
382 char *temp; | |
383 | |
384 euf_guid = get_token(content, "EUF-GUID: {", "}\r\n"); | |
385 | |
386 temp = get_token(content, "SessionID: ", "\r\n"); | |
387 if (temp != NULL) | |
388 slpcall->session_id = atoi(temp); | |
389 g_free(temp); | |
390 | |
391 temp = get_token(content, "AppID: ", "\r\n"); | |
392 if (temp != NULL) | |
393 slpcall->app_id = atoi(temp); | |
394 g_free(temp); | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
395 |
9193 | 396 context = get_token(content, "Context: ", "\r\n"); |
397 | |
398 got_sessionreq(slpcall, branch, euf_guid, context); | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
399 |
9193 | 400 g_free(context); |
401 g_free(euf_guid); | |
402 } | |
403 else if (!strcmp(type, "application/x-msnmsgr-transreqbody")) | |
404 { | |
405 /* A direct connection? */ | |
406 | |
407 char *listening, *nonce; | |
408 char *content; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
409 |
9193 | 410 if (FALSE) |
411 { | |
412 #if 0 | |
413 MsnDirectConn *directconn; | |
414 /* const char *ip_addr; */ | |
415 char *ip_port; | |
416 int port; | |
417 | |
418 /* ip_addr = gaim_prefs_get_string("/core/ft/public_ip"); */ | |
419 ip_port = "5190"; | |
420 listening = "true"; | |
421 nonce = rand_guid(); | |
422 | |
423 directconn = msn_directconn_new(slplink); | |
424 | |
425 /* msn_directconn_parse_nonce(directconn, nonce); */ | |
426 directconn->nonce = g_strdup(nonce); | |
427 | |
428 msn_directconn_listen(directconn); | |
429 | |
430 port = directconn->port; | |
431 | |
432 content = g_strdup_printf( | |
433 "Bridge: TCPv1\r\n" | |
434 "Listening: %s\r\n" | |
435 "Nonce: {%s}\r\n" | |
436 "Ipv4Internal-Addrs: 192.168.0.82\r\n" | |
437 "Ipv4Internal-Port: %d\r\n" | |
438 "\r\n", | |
439 listening, | |
440 nonce, | |
441 port); | |
442 #endif | |
443 } | |
444 else | |
445 { | |
446 listening = "false"; | |
447 nonce = g_strdup("00000000-0000-0000-0000-000000000000"); | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
448 |
9193 | 449 content = g_strdup_printf( |
450 "Bridge: TCPv1\r\n" | |
451 "Listening: %s\r\n" | |
452 "Nonce: {%s}\r\n" | |
453 "\r\n", | |
454 listening, | |
455 nonce); | |
456 } | |
457 | |
458 send_ok(slpcall, branch, | |
459 "application/x-msnmsgr-transrespbody", content); | |
460 | |
461 g_free(content); | |
462 g_free(nonce); | |
463 } | |
464 else if (!strcmp(type, "application/x-msnmsgr-transrespbody")) | |
465 { | |
466 #if 0 | |
467 char *ip_addrs; | |
468 char *temp; | |
469 char *nonce; | |
470 int port; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
471 |
9193 | 472 nonce = get_token(content, "Nonce: {", "}\r\n"); |
473 ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n"); | |
474 | |
475 temp = get_token(content, "IPv4Internal-Port: ", "\r\n"); | |
476 if (temp != NULL) | |
477 port = atoi(temp); | |
478 else | |
479 port = -1; | |
480 g_free(temp); | |
481 | |
482 if (ip_addrs == NULL) | |
483 return; | |
484 | |
485 if (port > 0) | |
486 got_transresp(slpcall, nonce, ip_addrs, port); | |
487 | |
488 g_free(nonce); | |
489 g_free(ip_addrs); | |
490 #endif | |
491 } | |
492 } | |
493 | |
494 static void | |
495 got_ok(MsnSlpCall *slpcall, | |
496 const char *type, const char *content) | |
497 { | |
498 g_return_if_fail(slpcall != NULL); | |
499 g_return_if_fail(type != NULL); | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
500 |
9193 | 501 if (!strcmp(type, "application/x-msnmsgr-sessionreqbody")) |
502 { | |
503 #if 0 | |
504 if (slpcall->type == MSN_SLPCALL_DC) | |
505 { | |
506 /* First let's try a DirectConnection. */ | |
507 | |
508 MsnSlpLink *slplink; | |
509 MsnSlpMessage *slpmsg; | |
510 char *header; | |
511 char *content; | |
512 char *branch; | |
513 | |
514 slplink = slpcall->slplink; | |
515 | |
516 branch = rand_guid(); | |
517 | |
518 content = g_strdup_printf( | |
519 "Bridges: TRUDPv1 TCPv1\r\n" | |
520 "NetID: 0\r\n" | |
521 "Conn-Type: Direct-Connect\r\n" | |
522 "UPnPNat: false\r\n" | |
523 "ICF: false\r\n" | |
524 ); | |
525 | |
526 header = g_strdup_printf("INVITE MSNMSGR:%s MSNSLP/1.0", | |
527 slplink->remote_user); | |
528 | |
529 slpmsg = msn_slp_sipmsg_new(slpcall, 0, header, branch, | |
530 "application/x-msnmsgr-transreqbody", | |
531 content); | |
532 | |
533 #ifdef DEBUG_SLP | |
534 slpmsg->info = "SLP INVITE"; | |
535 slpmsg->text_body = TRUE; | |
536 #endif | |
537 msn_slplink_send_slpmsg(slplink, slpmsg); | |
538 | |
539 g_free(header); | |
540 g_free(content); | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
541 |
9193 | 542 g_free(branch); |
543 } | |
544 else | |
545 { | |
546 msn_slp_call_session_init(slpcall); | |
547 } | |
548 #else | |
549 msn_slp_call_session_init(slpcall); | |
550 #endif | |
551 } | |
552 else if (!strcmp(type, "application/x-msnmsgr-transreqbody")) | |
553 { | |
554 /* Do we get this? */ | |
555 gaim_debug_info("msn", "OK with transreqbody\n"); | |
556 } | |
557 else if (!strcmp(type, "application/x-msnmsgr-transrespbody")) | |
558 { | |
559 #if 0 | |
560 char *ip_addrs; | |
561 char *temp; | |
562 char *nonce; | |
563 int port; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
564 |
9193 | 565 nonce = get_token(content, "Nonce: {", "}\r\n"); |
566 ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n"); | |
567 | |
568 temp = get_token(content, "IPv4Internal-Port: ", "\r\n"); | |
569 if (temp != NULL) | |
570 port = atoi(temp); | |
571 else | |
572 port = -1; | |
573 g_free(temp); | |
574 | |
575 if (ip_addrs == NULL) | |
576 return; | |
577 | |
578 if (port > 0) | |
579 got_transresp(slpcall, nonce, ip_addrs, port); | |
580 | |
581 g_free(nonce); | |
582 g_free(ip_addrs); | |
583 #endif | |
584 } | |
585 } | |
586 | |
587 MsnSlpCall * | |
588 msn_slp_sip_recv(MsnSlpLink *slplink, const char *body, gsize len) | |
589 { | |
590 MsnSlpCall *slpcall; | |
591 | |
592 if (!strncmp(body, "INVITE", strlen("INVITE"))) | |
593 { | |
594 char *branch; | |
595 char *content; | |
596 char *content_type; | |
597 | |
598 slpcall = msn_slp_call_new(slplink); | |
599 | |
600 /* From: <msnmsgr:buddy@hotmail.com> */ | |
601 #if 0 | |
602 slpcall->remote_user = get_token(body, "From: <msnmsgr:", ">\r\n"); | |
603 #endif | |
604 | |
605 branch = get_token(body, ";branch={", "}"); | |
606 | |
607 slpcall->id = get_token(body, "Call-ID: {", "}"); | |
608 | |
609 #if 0 | |
610 long content_len = -1; | |
611 | |
612 temp = get_token(body, "Content-Length: ", "\r\n"); | |
613 if (temp != NULL) | |
614 content_len = atoi(temp); | |
615 g_free(temp); | |
616 #endif | |
617 content_type = get_token(body, "Content-Type: ", "\r\n"); | |
618 | |
619 content = get_token(body, "\r\n\r\n", NULL); | |
620 | |
621 got_invite(slpcall, branch, content_type, content); | |
622 | |
623 g_free(content_type); | |
624 g_free(content); | |
625 } | |
626 else if (!strncmp(body, "MSNSLP/1.0 ", strlen("MSNSLP/1.0 "))) | |
627 { | |
628 char *content; | |
629 char *content_type; | |
630 /* Make sure this is "OK" */ | |
631 const char *status = body + strlen("MSNSLP/1.0 "); | |
632 char *call_id; | |
633 | |
634 call_id = get_token(body, "Call-ID: {", "}"); | |
635 slpcall = msn_slplink_find_slp_call(slplink, call_id); | |
636 g_free(call_id); | |
637 | |
9231
ac8790437abe
[gaim-migrate @ 10027]
Christian Hammond <chipx86@chipx86.com>
parents:
9226
diff
changeset
|
638 g_return_val_if_fail(slpcall != NULL, NULL); |
ac8790437abe
[gaim-migrate @ 10027]
Christian Hammond <chipx86@chipx86.com>
parents:
9226
diff
changeset
|
639 |
9193 | 640 if (strncmp(status, "200 OK", 6)) |
641 { | |
642 /* It's not valid. Kill this off. */ | |
643 char temp[32]; | |
644 const char *c; | |
645 | |
646 /* Eww */ | |
647 if ((c = strchr(status, '\r')) || (c = strchr(status, '\n')) || | |
648 (c = strchr(status, '\0'))) | |
649 { | |
9739 | 650 size_t offset = c - status; |
651 if (offset >= sizeof(temp)) | |
652 offset = sizeof(temp) - 1; | |
653 | |
654 strncpy(temp, status, offset); | |
655 temp[offset] = '\0'; | |
9193 | 656 } |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
657 |
9193 | 658 gaim_debug_error("msn", "Received non-OK result: %s\n", temp); |
659 | |
660 slpcall->wasted = TRUE; | |
661 | |
662 /* msn_slp_call_destroy(slpcall); */ | |
663 return slpcall; | |
664 } | |
665 | |
666 content_type = get_token(body, "Content-Type: ", "\r\n"); | |
667 | |
668 content = get_token(body, "\r\n\r\n", NULL); | |
669 | |
670 got_ok(slpcall, content_type, content); | |
671 | |
672 g_free(content_type); | |
673 g_free(content); | |
674 } | |
675 else if (!strncmp(body, "BYE", strlen("BYE"))) | |
676 { | |
677 char *call_id; | |
678 | |
679 call_id = get_token(body, "Call-ID: {", "}"); | |
680 slpcall = msn_slplink_find_slp_call(slplink, call_id); | |
681 g_free(call_id); | |
682 | |
683 if (slpcall != NULL) | |
684 slpcall->wasted = TRUE; | |
685 | |
686 /* msn_slp_call_destroy(slpcall); */ | |
687 } | |
688 else | |
689 slpcall = NULL; | |
690 | |
691 return slpcall; | |
692 } | |
693 | |
694 /************************************************************************** | |
695 * Msg Callbacks | |
696 **************************************************************************/ | |
697 | |
698 void | |
699 msn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg) | |
700 { | |
701 MsnSession *session; | |
702 MsnSlpLink *slplink; | |
703 | |
704 session = cmdproc->servconn->session; | |
705 slplink = msn_session_get_slplink(session, msg->remote_user); | |
706 | |
707 msn_slplink_process_msg(slplink, msg); | |
708 } | |
709 | |
710 void | |
711 got_emoticon(MsnSlpCall *slpcall, | |
712 const char *data, long long size) | |
713 { | |
714 gaim_debug_info("msn", "Got smiley: %s\n", slpcall->data_info); | |
715 | |
716 #if 0 | |
717 GaimConversation *conv; | |
718 GaimConnection *gc = slpsession->swboard->servconn->session->account->gc; | |
719 serv_got_smiley(gc, info, data, size); | |
720 #endif | |
721 } | |
722 | |
723 void | |
724 msn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg) | |
725 { | |
726 MsnSession *session; | |
727 MsnSlpLink *slplink; | |
728 MsnObject *obj; | |
729 char **tokens; | |
730 char *smile; | |
731 const char *who; | |
732 | |
733 session = cmdproc->servconn->session; | |
734 | |
735 tokens = g_strsplit(msg->body, "\t", 2); | |
736 | |
737 smile = tokens[0]; | |
738 obj = msn_object_new_from_string(gaim_url_decode(tokens[1])); | |
739 | |
740 who = msn_object_get_creator(obj); | |
741 | |
742 slplink = msn_session_get_slplink(session, who); | |
743 | |
744 msn_slplink_request_object(slplink, smile, got_emoticon, obj); | |
745 | |
746 g_strfreev(tokens); | |
747 } | |
748 | |
749 void | |
750 got_user_display(MsnSlpCall *slpcall, | |
751 const char *data, long long size) | |
752 { | |
753 const char *info; | |
754 GaimAccount *account; | |
755 GSList *sl; | |
756 | |
757 info = slpcall->data_info; | |
758 gaim_debug_info("msn", "Got User Display: %s\n", info); | |
759 | |
760 account = slpcall->slplink->session->account; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
761 |
9193 | 762 /* TODO: I think we need better buddy icon core functions. */ |
763 gaim_buddy_icons_set_for_user(account, slpcall->slplink->remote_user, | |
764 (void *)data, size); | |
765 | |
766 sl = gaim_find_buddies(account, slpcall->slplink->remote_user); | |
767 | |
768 for (; sl != NULL; sl = sl->next) | |
769 { | |
770 GaimBuddy *buddy = (GaimBuddy *)sl->data; | |
771 gaim_blist_node_set_string((GaimBlistNode*)buddy, "icon_checksum", info); | |
772 } | |
773 } | |
774 | |
775 static gboolean | |
776 buddy_icon_cached(GaimConnection *gc, MsnObject *obj) | |
777 { | |
778 GaimAccount *account; | |
779 GaimBuddy *buddy; | |
780 GSList *sl; | |
781 const char *old; | |
782 const char *new; | |
783 | |
784 g_return_val_if_fail(obj != NULL, FALSE); | |
785 | |
786 account = gaim_connection_get_account(gc); | |
787 | |
788 sl = gaim_find_buddies(account, msn_object_get_creator(obj)); | |
789 | |
790 if (sl == NULL) | |
791 { | |
792 return FALSE; | |
793 } | |
794 | |
795 buddy = (GaimBuddy *)sl->data; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
796 |
9193 | 797 old = gaim_blist_node_get_string((GaimBlistNode *)buddy, "icon_checksum"); |
798 new = msn_object_get_sha1c(obj); | |
799 | |
800 if (new == NULL) | |
801 { | |
802 return FALSE; | |
803 } | |
804 | |
805 if (old != NULL && !strcmp(old, new)) | |
806 return TRUE; | |
807 | |
808 return FALSE; | |
809 } | |
810 | |
811 void | |
812 msn_request_buddy_icon(GaimConnection *gc, const char *passport) | |
813 { | |
814 MsnSession *session; | |
815 MsnSlpLink *slplink; | |
816 MsnUser *user; | |
817 MsnObject *obj; | |
818 const char *info; | |
819 | |
820 session = gc->proto_data; | |
821 | |
822 g_return_if_fail(session->protocol_ver == 9); | |
823 | |
824 slplink = msn_session_get_slplink(session, passport); | |
825 | |
826 user = msn_userlist_find_user(session->userlist, passport); | |
827 | |
828 obj = msn_user_get_object(user); | |
829 | |
830 if (obj == NULL) | |
831 /* It seems the user has not set a msnobject */ | |
832 return; | |
833 | |
834 info = msn_object_get_sha1c(obj); | |
835 | |
836 if (!buddy_icon_cached(gc, obj)) | |
837 msn_slplink_request_object(slplink, info, got_user_display, obj); | |
838 } |