Mercurial > pidgin.yaz
annotate src/protocols/icq/stdpackets.c @ 9776:1e5ef71c9583
[gaim-migrate @ 10644]
A patch from Daniel Atallah that should fix sf bug 1008489:
"Windows Messenger BOT Crashes Gaim"
Someone MSN-savvy should check this to make sure it's a valid fix.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 19 Aug 2004 01:13:58 +0000 |
parents | 6190f75950ff |
children |
rev | line source |
---|---|
2086 | 1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | |
3 /* | |
2387
6190f75950ff
[gaim-migrate @ 2400]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
4 * $Id: stdpackets.c 2400 2001-09-28 23:45:19Z warmenhoven $ |
2086 | 5 * |
6 * Copyright (C) 1998-2001, Denis V. Dmitrienko <denis@null.net> and | |
7 * Bill Soudan <soudan@kde.org> | |
8 * | |
9 * This program is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * This program is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU General Public License | |
20 * along with this program; if not, write to the Free Software | |
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
22 * | |
23 */ | |
24 | |
25 #include <stdlib.h> | |
26 | |
27 #include "icqlib.h" | |
28 #include "tcp.h" | |
29 #include "stdpackets.h" | |
30 | |
31 icq_Packet *icq_TCPCreateInitPacket(icq_TCPLink *plink) | |
32 { | |
33 icq_Packet *p=icq_PacketNew(); | |
34 | |
35 if(p) | |
36 { | |
37 int type=plink->type; | |
38 | |
39 icq_PacketAppend8(p, 0xFF); | |
40 icq_PacketAppend32(p, ICQ_TCP_VER); | |
41 if(type==TCP_LINK_MESSAGE) | |
42 icq_PacketAppend32n(p, htons(plink->icqlink->icq_TCPSrvPort)); | |
43 else | |
44 icq_PacketAppend32(p, 0x00000000); | |
45 icq_PacketAppend32(p, plink->icqlink->icq_Uin); | |
46 icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); | |
47 icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); | |
48 icq_PacketAppend8(p, 0x04); | |
49 if(type==TCP_LINK_FILE || type==TCP_LINK_CHAT) | |
50 icq_PacketAppend32(p, ntohs(plink->socket_address.sin_port)); | |
51 else | |
52 icq_PacketAppend32(p, 0x00000000); | |
53 | |
54 } | |
55 | |
56 return p; | |
57 } | |
58 | |
59 icq_Packet *icq_TCPCreateStdPacket(icq_TCPLink *plink, WORD icq_TCPCommand, | |
60 WORD type, const char *msg, WORD status, | |
61 WORD msg_command) | |
62 { | |
63 icq_Packet *p=icq_PacketNew(); | |
64 | |
65 if(p) | |
66 { | |
67 icq_PacketAppend32(p, plink->icqlink->icq_Uin); | |
68 icq_PacketAppend16(p, ICQ_TCP_VER); | |
69 icq_PacketAppend16(p, icq_TCPCommand); | |
70 icq_PacketAppend16(p, 0x0000); | |
71 icq_PacketAppend32(p, plink->icqlink->icq_Uin); | |
72 | |
73 icq_PacketAppend16(p, type); | |
74 icq_PacketAppendString(p, (char*)msg); | |
75 | |
76 /* FIXME: this should be the address the server returns to us, | |
77 * link->icq_OurIp */ | |
78 icq_PacketAppend32(p, plink->socket_address.sin_addr.s_addr); | |
79 icq_PacketAppend32(p, plink->socket_address.sin_addr.s_addr); | |
80 icq_PacketAppend32(p, ntohs(plink->socket_address.sin_port)); | |
81 icq_PacketAppend8(p, 0x04); | |
82 icq_PacketAppend16(p, status); | |
83 icq_PacketAppend16(p, msg_command); | |
84 } | |
85 | |
86 return p; | |
87 } | |
88 | |
89 icq_Packet *icq_TCPCreateMessagePacket(icq_TCPLink *plink, const char *message) | |
90 { | |
91 icq_Packet *p=icq_TCPCreateStdPacket( | |
92 plink, | |
93 ICQ_TCP_MESSAGE, | |
94 ICQ_TCP_MSG_MSG, | |
95 message, | |
96 0, /* status */ | |
97 ICQ_TCP_MSG_REAL); | |
98 | |
99 return p; | |
100 } | |
101 | |
102 icq_Packet *icq_TCPCreateAwayReqPacket(icq_TCPLink *plink, WORD statusMode) | |
103 { | |
104 icq_Packet *p=icq_TCPCreateStdPacket( | |
105 plink, | |
106 ICQ_TCP_MESSAGE, | |
2387
6190f75950ff
[gaim-migrate @ 2400]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
107 statusMode, /* one of the icq_tcp_msg_read... constants */ |
2086 | 108 "", |
109 0, /* status */ | |
110 0); | |
111 | |
112 return p; | |
113 } | |
114 | |
115 icq_Packet *icq_TCPCreateURLPacket(icq_TCPLink *plink, const char *message, | |
116 const char *url) | |
117 { | |
118 icq_Packet *p; | |
119 unsigned char *str=(unsigned char*)malloc(strlen(message)+strlen(url)+2); | |
120 | |
121 strcpy((char*)str, message); | |
122 *(str+strlen(message))=0xFE; | |
123 strcpy((char*)(str+strlen(message)+1), url); | |
124 | |
125 p=icq_TCPCreateStdPacket( | |
126 plink, | |
127 ICQ_TCP_MESSAGE, | |
128 ICQ_TCP_MSG_URL, | |
129 (const char *)str, | |
130 0, /* status */ | |
131 ICQ_TCP_MSG_REAL); | |
132 | |
133 free(str); | |
134 | |
135 return p; | |
136 } | |
137 | |
138 icq_Packet *icq_TCPCreateChatReqPacket(icq_TCPLink *plink, const char *message) | |
139 { | |
140 icq_Packet *p=icq_TCPCreateStdPacket( | |
141 plink, | |
142 ICQ_TCP_MESSAGE, | |
143 ICQ_TCP_MSG_CHAT, | |
144 message, | |
145 0, /* status */ | |
146 ICQ_TCP_MSG_REAL); | |
147 | |
148 icq_PacketAppendString(p, 0); | |
149 | |
150 icq_PacketAppend16(p, 0x0000); | |
151 icq_PacketAppend16(p, 0x0000); | |
152 icq_PacketAppend32(p, 0x00000000); | |
153 | |
154 return p; | |
155 } | |
156 | |
157 icq_Packet *icq_TCPCreateChatReqAck(icq_TCPLink *plink, WORD port) | |
158 { | |
159 icq_Packet *p=icq_TCPCreateStdPacket( | |
160 plink, | |
161 ICQ_TCP_ACK, | |
162 ICQ_TCP_MSG_CHAT, | |
163 0, | |
164 0, /* status */ | |
165 ICQ_TCP_MSG_ACK); | |
166 | |
167 icq_PacketAppendString(p, 0); | |
168 | |
169 icq_PacketAppend16(p, htons(port)); | |
170 icq_PacketAppend16(p, 0x0000); | |
171 icq_PacketAppend32(p, port); | |
172 | |
173 return p; | |
174 } | |
175 | |
176 icq_Packet *icq_TCPCreateChatReqRefuse(icq_TCPLink *plink, WORD port, | |
177 const char *reason) | |
178 { | |
179 icq_Packet *p=icq_TCPCreateStdPacket( | |
180 plink, | |
181 ICQ_TCP_ACK, | |
182 ICQ_TCP_MSG_CHAT, | |
183 reason, | |
184 ICQ_TCP_STATUS_REFUSE, | |
185 ICQ_TCP_MSG_ACK); | |
186 | |
187 icq_PacketAppendString(p, 0); | |
188 | |
189 icq_PacketAppend16(p, htons(port)); | |
190 icq_PacketAppend16(p, 0x0000); | |
191 icq_PacketAppend32(p, port); | |
192 | |
193 return p; | |
194 } | |
195 | |
196 icq_Packet *icq_TCPCreateChatReqCancel(icq_TCPLink *plink, WORD port) | |
197 { | |
198 icq_Packet *p=icq_TCPCreateStdPacket( | |
199 plink, | |
200 ICQ_TCP_CANCEL, | |
201 ICQ_TCP_MSG_CHAT, | |
202 0, | |
203 0, /* status */ | |
204 ICQ_TCP_MSG_ACK); | |
205 | |
206 icq_PacketAppendString(p, 0); | |
207 | |
208 icq_PacketAppend16(p, htons(port)); | |
209 icq_PacketAppend16(p, 0x0000); | |
210 icq_PacketAppend32(p, port); | |
211 | |
212 return p; | |
213 } | |
214 | |
215 icq_Packet *icq_TCPCreateFileReqAck(icq_TCPLink *plink, WORD port) | |
216 { | |
217 icq_Packet *p=icq_TCPCreateStdPacket( | |
218 plink, | |
219 ICQ_TCP_ACK, | |
220 ICQ_TCP_MSG_FILE, | |
221 0, | |
222 0, /* status */ | |
223 ICQ_TCP_MSG_ACK); | |
224 | |
225 icq_PacketAppend16(p, htons(port)); | |
226 icq_PacketAppend16(p, 0x0000); | |
227 icq_PacketAppendString(p, 0); | |
228 icq_PacketAppend32(p, 0x00000000); | |
229 icq_PacketAppend32(p, port); | |
230 | |
231 return p; | |
232 } | |
233 | |
234 icq_Packet *icq_TCPCreateFileReqRefuse(icq_TCPLink *plink, WORD port, | |
235 const char *reason) | |
236 { | |
237 icq_Packet *p=icq_TCPCreateStdPacket( | |
238 plink, | |
239 ICQ_TCP_ACK, | |
240 ICQ_TCP_MSG_FILE, | |
241 reason, | |
242 ICQ_TCP_STATUS_REFUSE, | |
243 ICQ_TCP_MSG_ACK); | |
244 | |
245 icq_PacketAppend16(p, htons(port)); | |
246 icq_PacketAppend16(p, 0x0000); | |
247 icq_PacketAppendString(p, 0); | |
248 icq_PacketAppend32(p, 0x00000000); | |
249 icq_PacketAppend32(p, port); | |
250 | |
251 return p; | |
252 } | |
253 | |
254 icq_Packet *icq_TCPCreateFileReqCancel(icq_TCPLink *plink, WORD port) | |
255 { | |
256 icq_Packet *p=icq_TCPCreateStdPacket( | |
257 plink, | |
258 ICQ_TCP_CANCEL, | |
259 ICQ_TCP_MSG_FILE, | |
260 0, | |
261 0, /* status */ | |
262 ICQ_TCP_MSG_ACK); | |
263 | |
264 icq_PacketAppend16(p, htons(port)); | |
265 icq_PacketAppend16(p, 0x0000); | |
266 icq_PacketAppendString(p, 0); | |
267 icq_PacketAppend32(p, 0x00000000); | |
268 icq_PacketAppend32(p, port); | |
269 | |
270 return p; | |
271 } | |
272 | |
273 icq_Packet *icq_TCPCreateChatInfoPacket(icq_TCPLink *plink, const char *name, | |
274 DWORD foreground, DWORD background) | |
275 { | |
276 icq_Packet *p=icq_PacketNew(); | |
277 | |
278 icq_PacketAppend32(p, 0x00000065); | |
279 icq_PacketAppend32(p, 0xfffffffa); | |
280 icq_PacketAppend32(p, plink->icqlink->icq_Uin); | |
281 icq_PacketAppendString(p, name); | |
282 icq_PacketAppend16(p, plink->socket_address.sin_port); | |
283 icq_PacketAppend32(p, foreground); | |
284 icq_PacketAppend32(p, background); | |
285 icq_PacketAppend8(p, 0x00); | |
286 | |
287 return p; | |
288 | |
289 } | |
290 | |
291 icq_Packet *icq_TCPCreateChatInfo2Packet(icq_TCPLink *plink, const char *name, | |
292 DWORD foreground, DWORD background) | |
293 { | |
294 icq_Packet *p=icq_PacketNew(); | |
295 | |
296 icq_PacketAppend32(p, 0x00000064); | |
297 icq_PacketAppend32(p, plink->icqlink->icq_Uin); | |
298 icq_PacketAppendString(p, name); | |
299 icq_PacketAppend32(p, foreground); | |
300 icq_PacketAppend32(p, background); | |
301 | |
302 icq_PacketAppend32(p, 0x00070004); | |
303 icq_PacketAppend32(p, 0x00000000); | |
304 icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); | |
305 icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); | |
306 icq_PacketAppend8(p, 0x04); | |
307 icq_PacketAppend16(p, 0x0000); | |
308 icq_PacketAppend32(p, 0x000a); | |
309 icq_PacketAppend32(p, 0x0000); | |
310 icq_PacketAppendString(p, "Courier New"); | |
311 icq_PacketAppend8(p, 204); | |
312 icq_PacketAppend8(p, 49); | |
313 icq_PacketAppend8(p, 0x00); | |
314 | |
315 return p; | |
316 } | |
317 | |
318 icq_Packet *icq_TCPCreateChatFontInfoPacket(icq_TCPLink *plink) | |
319 { | |
320 icq_Packet *p=icq_PacketNew(); | |
321 | |
322 icq_PacketAppend32(p, 0x00070004); | |
323 icq_PacketAppend32(p, 0x00000000); | |
324 icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); | |
325 icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); | |
326 icq_PacketAppend8(p, 0x04); | |
327 icq_PacketAppend16(p, ntohs(plink->socket_address.sin_port)); /* Zero ? */ | |
328 icq_PacketAppend32(p, 0x000a); | |
329 icq_PacketAppend32(p, 0x0000); | |
330 icq_PacketAppendString(p, "Courier New"); | |
331 icq_PacketAppend8(p, 204); | |
332 icq_PacketAppend8(p, 49); | |
333 icq_PacketAppend8(p, 0x00); | |
334 | |
335 return p; | |
336 } | |
337 | |
338 | |
339 icq_Packet *icq_TCPCreateFileReqPacket(icq_TCPLink *plink, | |
340 const char *message, const char *filename, unsigned long size) | |
341 { | |
342 icq_Packet *p=icq_TCPCreateStdPacket( | |
343 plink, | |
344 ICQ_TCP_MESSAGE, | |
345 ICQ_TCP_MSG_FILE, | |
346 (const char*)message, | |
347 0, /* status */ | |
348 ICQ_TCP_MSG_REAL); | |
349 | |
350 icq_PacketAppend16(p, 0x0000); | |
351 icq_PacketAppend16(p, 0x0000); | |
352 | |
353 icq_PacketAppendString(p, filename); | |
354 | |
355 icq_PacketAppend32(p, size); | |
356 icq_PacketAppend32(p, 0x00000000); | |
357 | |
358 return p; | |
359 } | |
360 | |
361 void icq_TCPAppendSequence(icq_Link *icqlink, icq_Packet *p) | |
362 { | |
363 p->id=icqlink->d->icq_TCPSequence--; | |
364 icq_PacketEnd(p); | |
365 icq_PacketAppend32(p, p->id); | |
366 } | |
367 | |
368 void icq_TCPAppendSequenceN(icq_Link *icqlink, icq_Packet *p, DWORD seq) | |
369 { | |
370 (void)icqlink; | |
371 p->id=seq; | |
372 icq_PacketEnd(p); | |
373 icq_PacketAppend32(p, p->id); | |
374 } | |
375 | |
376 icq_Packet *icq_TCPCreateMessageAck(icq_TCPLink *plink, const char *message) | |
377 { | |
378 icq_Packet *p=icq_TCPCreateStdPacket( | |
379 plink, | |
380 ICQ_TCP_ACK, | |
381 ICQ_TCP_MSG_MSG, | |
382 message, | |
383 0, /* status */ | |
384 ICQ_TCP_MSG_ACK); | |
385 | |
386 return p; | |
387 } | |
388 | |
389 icq_Packet *icq_TCPCreateURLAck(icq_TCPLink *plink, const char *message) | |
390 { | |
391 icq_Packet *p=icq_TCPCreateStdPacket( | |
392 plink, | |
393 ICQ_TCP_ACK, | |
394 ICQ_TCP_MSG_URL, | |
395 message, | |
396 0, /* status */ | |
397 ICQ_TCP_MSG_ACK); | |
398 | |
399 return p; | |
400 } | |
401 | |
402 icq_Packet *icq_TCPCreateContactListAck(icq_TCPLink *plink, const char *message) | |
403 { | |
404 icq_Packet *p=icq_TCPCreateStdPacket( | |
405 plink, | |
406 ICQ_TCP_ACK, | |
407 ICQ_TCP_MSG_CONTACTLIST, | |
408 message, | |
409 0, /* status */ | |
410 ICQ_TCP_MSG_ACK); | |
411 | |
412 return p; | |
413 } | |
414 | |
415 icq_Packet *icq_TCPCreateFile00Packet(DWORD num_files, DWORD total_bytes, | |
416 DWORD speed, const char *name) | |
417 { | |
418 icq_Packet *p=icq_PacketNew(); | |
419 | |
420 if(p) | |
421 { | |
422 icq_PacketAppend8(p, 0x00); | |
423 icq_PacketAppend32(p, 0x00000000); | |
424 icq_PacketAppend32(p, num_files); | |
425 icq_PacketAppend32(p, total_bytes); | |
426 icq_PacketAppend32(p, speed); | |
427 icq_PacketAppendString(p, name); | |
428 } | |
429 | |
430 return p; | |
431 } | |
432 | |
433 icq_Packet *icq_TCPCreateFile01Packet(DWORD speed, const char *name) | |
434 { | |
435 icq_Packet *p=icq_PacketNew(); | |
436 | |
437 if(p) | |
438 { | |
439 icq_PacketAppend8(p, 0x01); | |
440 icq_PacketAppend32(p, speed); | |
441 icq_PacketAppendString(p, name); | |
442 } | |
443 | |
444 return p; | |
445 } | |
446 | |
447 icq_Packet *icq_TCPCreateFile02Packet(const char *filename, DWORD filesize, | |
448 DWORD speed) | |
449 { | |
450 icq_Packet *p=icq_PacketNew(); | |
451 | |
452 if(p) | |
453 { | |
454 icq_PacketAppend8(p, 0x02); | |
455 icq_PacketAppend8(p, 0x00); | |
456 icq_PacketAppendString(p, filename); | |
457 icq_PacketAppendString(p, 0); | |
458 icq_PacketAppend32(p, filesize); | |
459 icq_PacketAppend32(p, 0x00000000); | |
460 icq_PacketAppend32(p, speed); | |
461 } | |
462 | |
463 return p; | |
464 } | |
465 | |
466 icq_Packet *icq_TCPCreateFile03Packet(DWORD filesize, DWORD speed) | |
467 { | |
468 icq_Packet *p=icq_PacketNew(); | |
469 | |
470 if(p) | |
471 { | |
472 icq_PacketAppend8(p, 0x03); | |
473 icq_PacketAppend32(p, filesize); | |
474 icq_PacketAppend32(p, 0x00000000); | |
475 icq_PacketAppend32(p, speed); | |
476 } | |
477 | |
478 return p; | |
479 } | |
480 | |
481 icq_Packet *icq_TCPCreateFile04Packet(DWORD filenum) | |
482 { | |
483 icq_Packet *p=icq_PacketNew(); | |
484 | |
485 if(p) | |
486 { | |
487 icq_PacketAppend8(p, 0x04); | |
488 icq_PacketAppend32(p, filenum); | |
489 } | |
490 | |
491 return p; | |
492 } | |
493 | |
494 icq_Packet *icq_TCPCreateFile05Packet(DWORD speed) | |
495 { | |
496 icq_Packet *p=icq_PacketNew(); | |
497 | |
498 if(p) | |
499 { | |
500 icq_PacketAppend8(p, 0x05); | |
501 icq_PacketAppend32(p, speed); | |
502 } | |
503 | |
504 return p; | |
505 } | |
506 | |
507 icq_Packet *icq_TCPCreateFile06Packet(int length, void *data) | |
508 { | |
509 icq_Packet *p=icq_PacketNew(); | |
510 | |
511 if(p) | |
512 { | |
513 icq_PacketAppend8(p, 0x06); | |
514 icq_PacketAppend(p, data, length); | |
515 } | |
516 | |
517 return p; | |
518 } | |
519 | |
520 icq_Packet *icq_UDPCreateStdPacket(icq_Link *icqlink, WORD cmd) | |
521 { | |
522 icq_Packet *p = icq_PacketNew(); | |
523 | |
524 /* if(!link->d->icq_UDPSession) | |
525 link->d->icq_UDPSession = rand() & 0x3FFFFFFF; | |
526 if(!link->d->icq_UDPSeqNum2) | |
527 link->d->icq_UDPSeqNum2 = rand() & 0x7FFF;*/ | |
528 | |
529 icq_PacketAppend16(p, ICQ_UDP_VER); /* ver */ | |
530 icq_PacketAppend32(p, 0); /* zero */ | |
531 icq_PacketAppend32(p, icqlink->icq_Uin); /* uin */ | |
532 icq_PacketAppend32(p, icqlink->d->icq_UDPSession); /* session */ | |
533 icq_PacketAppend16(p, cmd); /* cmd */ | |
534 icq_PacketAppend16(p, icqlink->d->icq_UDPSeqNum1++); /* seq1 */ | |
535 icq_PacketAppend16(p, icqlink->d->icq_UDPSeqNum2++); /* seq2 */ | |
536 icq_PacketAppend32(p, 0); /* checkcode */ | |
537 | |
538 return p; | |
539 } | |
540 | |
541 icq_Packet *icq_UDPCreateStdSeqPacket(icq_Link *icqlink, WORD cmd, WORD seq) | |
542 { | |
543 icq_Packet *p = icq_PacketNew(); | |
544 | |
545 icq_PacketAppend16(p, ICQ_UDP_VER); /* ver */ | |
546 icq_PacketAppend32(p, 0); /* zero */ | |
547 icq_PacketAppend32(p, icqlink->icq_Uin); /* uin */ | |
548 icq_PacketAppend32(p, icqlink->d->icq_UDPSession); /* session */ | |
549 icq_PacketAppend16(p, cmd); /* cmd */ | |
550 icq_PacketAppend16(p, seq); /* seq1 */ | |
551 icq_PacketAppend16(p, 0); /* seq2 */ | |
552 icq_PacketAppend32(p, 0); /* checkcode */ | |
553 | |
554 return p; | |
555 } |