2086
|
1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
2
|
|
3 /*
|
|
4 * $Id: stdpackets.c 2096 2001-07-31 01:00:39Z warmenhoven $
|
|
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,
|
|
107 statusMode, //one of the icq_tcp_msg_read... constants
|
|
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 }
|