| 19 * Should set your current idle time in seconds. Idealy, OSCAR should |
19 * Should set your current idle time in seconds. Idealy, OSCAR should |
| 20 * do this for us. But, it doesn't. The client must call this to set idle |
20 * do this for us. But, it doesn't. The client must call this to set idle |
| 21 * time. |
21 * time. |
| 22 * |
22 * |
| 23 */ |
23 */ |
| 24 u_long aim_bos_setidle(struct aim_session_t *sess, |
24 faim_export unsigned long aim_bos_setidle(struct aim_session_t *sess, |
| 25 struct aim_conn_t *conn, |
25 struct aim_conn_t *conn, |
| 26 u_long idletime) |
26 u_long idletime) |
| 27 { |
27 { |
| 28 return aim_genericreq_l(sess, conn, 0x0001, 0x0011, &idletime); |
28 return aim_genericreq_l(sess, conn, 0x0001, 0x0011, &idletime); |
| 29 } |
29 } |
| 30 |
30 |
| 31 |
31 |
| 55 * - Block the users below: Send an AIM_VISIBILITYCHANGE_DENYADD with |
55 * - Block the users below: Send an AIM_VISIBILITYCHANGE_DENYADD with |
| 56 * the list of users to be blocked |
56 * the list of users to be blocked |
| 57 * |
57 * |
| 58 * |
58 * |
| 59 */ |
59 */ |
| 60 u_long aim_bos_changevisibility(struct aim_session_t *sess, |
60 faim_export unsigned long aim_bos_changevisibility(struct aim_session_t *sess, |
| 61 struct aim_conn_t *conn, |
61 struct aim_conn_t *conn, |
| 62 int changetype, char *denylist) |
62 int changetype, |
| |
63 char *denylist) |
| 63 { |
64 { |
| 64 struct command_tx_struct *newpacket; |
65 struct command_tx_struct *newpacket; |
| 65 int packlen = 0; |
66 int packlen = 0; |
| 66 u_short subtype; |
67 u_short subtype; |
| 67 |
68 |
| 132 * TODO: Clean this up. |
133 * TODO: Clean this up. |
| 133 * |
134 * |
| 134 * XXX: I can't stress the TODO enough. |
135 * XXX: I can't stress the TODO enough. |
| 135 * |
136 * |
| 136 */ |
137 */ |
| 137 u_long aim_bos_setbuddylist(struct aim_session_t *sess, |
138 faim_export unsigned long aim_bos_setbuddylist(struct aim_session_t *sess, |
| 138 struct aim_conn_t *conn, |
139 struct aim_conn_t *conn, |
| 139 char *buddy_list) |
140 char *buddy_list) |
| 140 { |
141 { |
| 141 int i, j; |
142 int i, j; |
| 142 |
143 |
| 143 struct command_tx_struct *newpacket; |
144 struct command_tx_struct *newpacket; |
| 144 |
145 |
| 204 * |
205 * |
| 205 * Gives BOS your profile. |
206 * Gives BOS your profile. |
| 206 * |
207 * |
| 207 * |
208 * |
| 208 */ |
209 */ |
| 209 u_long aim_bos_setprofile(struct aim_session_t *sess, |
210 faim_export unsigned long aim_bos_setprofile(struct aim_session_t *sess, |
| 210 struct aim_conn_t *conn, |
211 struct aim_conn_t *conn, |
| 211 char *profile, |
212 char *profile, |
| 212 char *awaymsg, |
213 char *awaymsg, |
| 213 unsigned int caps) |
214 unsigned short caps) |
| 214 { |
215 { |
| 215 struct command_tx_struct *newpacket; |
216 struct command_tx_struct *newpacket; |
| 216 int i = 0, tmp, caplen; |
217 int i = 0, tmp, caplen; |
| 217 |
218 |
| 218 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0)))) |
219 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 1152+strlen(profile)+1+(awaymsg?strlen(awaymsg):0)))) |
| 251 * The group permission mask allows you to keep users of a certain |
252 * The group permission mask allows you to keep users of a certain |
| 252 * class or classes from talking to you. The mask should be |
253 * class or classes from talking to you. The mask should be |
| 253 * a bitwise OR of all the user classes you want to see you. |
254 * a bitwise OR of all the user classes you want to see you. |
| 254 * |
255 * |
| 255 */ |
256 */ |
| 256 u_long aim_bos_setgroupperm(struct aim_session_t *sess, |
257 faim_export unsigned long aim_bos_setgroupperm(struct aim_session_t *sess, |
| 257 struct aim_conn_t *conn, |
258 struct aim_conn_t *conn, |
| 258 u_long mask) |
259 u_long mask) |
| 259 { |
260 { |
| 260 return aim_genericreq_l(sess, conn, 0x0009, 0x0004, &mask); |
261 return aim_genericreq_l(sess, conn, 0x0009, 0x0004, &mask); |
| 261 } |
262 } |
| 262 |
263 |
| 263 int aim_parse_bosrights(struct aim_session_t *sess, |
264 faim_internal int aim_parse_bosrights(struct aim_session_t *sess, |
| 264 struct command_rx_struct *command, ...) |
265 struct command_rx_struct *command, ...) |
| 265 { |
266 { |
| 266 rxcallback_t userfunc = NULL; |
267 rxcallback_t userfunc = NULL; |
| 267 int ret=1; |
268 int ret=1; |
| 268 struct aim_tlvlist_t *tlvlist; |
269 struct aim_tlvlist_t *tlvlist; |
| 269 struct aim_tlv_t *tlv; |
270 struct aim_tlv_t *tlv; |
| 305 * Send Client Ready. |
306 * Send Client Ready. |
| 306 * |
307 * |
| 307 * TODO: Dynamisize. |
308 * TODO: Dynamisize. |
| 308 * |
309 * |
| 309 */ |
310 */ |
| 310 u_long aim_bos_clientready(struct aim_session_t *sess, |
311 faim_export unsigned long aim_bos_clientready(struct aim_session_t *sess, |
| 311 struct aim_conn_t *conn) |
312 struct aim_conn_t *conn) |
| 312 { |
313 { |
| 313 u_char command_2[] = { |
314 u_char command_2[] = { |
| 314 /* placeholders for dynamic data */ |
315 /* placeholders for dynamic data */ |
| 315 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
316 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
| 316 0xff, 0xff, |
317 0xff, 0xff, |
| 317 /* real data */ |
318 /* real data */ |
| 318 0x00, 0x01, |
319 0x00, 0x01, |
| 319 0x00, 0x03, |
320 0x00, 0x03, |
| 320 0x00, 0x04, |
321 0x00, 0x04, |
| 321 0x07, 0xda, |
322 0x06, 0x86, /* the good ones */ |
| |
323 #if 0 |
| |
324 0x07, 0xda, /* DUPLE OF DEATH! */ |
| |
325 #endif |
| 322 |
326 |
| 323 0x00, 0x02, |
327 0x00, 0x02, |
| 324 0x00, 0x01, |
328 0x00, 0x01, |
| 325 0x00, 0x04, |
329 0x00, 0x04, |
| 326 0x00, 0x01, |
330 0x00, 0x01, |
| 378 |
382 |
| 379 /* |
383 /* |
| 380 * Request Rate Information. |
384 * Request Rate Information. |
| 381 * |
385 * |
| 382 */ |
386 */ |
| 383 u_long aim_bos_reqrate(struct aim_session_t *sess, |
387 faim_export unsigned long aim_bos_reqrate(struct aim_session_t *sess, |
| 384 struct aim_conn_t *conn) |
388 struct aim_conn_t *conn) |
| 385 { |
389 { |
| 386 return aim_genericreq_n(sess, conn, 0x0001, 0x0006); |
390 return aim_genericreq_n(sess, conn, 0x0001, 0x0006); |
| 387 } |
391 } |
| 388 |
392 |
| 389 /* |
393 /* |
| 390 * Rate Information Response Acknowledge. |
394 * Rate Information Response Acknowledge. |
| 391 * |
395 * |
| 392 */ |
396 */ |
| 393 u_long aim_bos_ackrateresp(struct aim_session_t *sess, |
397 faim_export unsigned long aim_bos_ackrateresp(struct aim_session_t *sess, |
| 394 struct aim_conn_t *conn) |
398 struct aim_conn_t *conn) |
| 395 { |
399 { |
| 396 struct command_tx_struct *newpacket; |
400 struct command_tx_struct *newpacket; |
| 397 int packlen = 20, i=0; |
401 int packlen = 20, i=0; |
| 398 |
402 |
| 399 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen))) |
403 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen))) |
| 405 i += aimutil_put16(newpacket->data+i, 0x0001); |
409 i += aimutil_put16(newpacket->data+i, 0x0001); |
| 406 i += aimutil_put16(newpacket->data+i, 0x0002); |
410 i += aimutil_put16(newpacket->data+i, 0x0002); |
| 407 i += aimutil_put16(newpacket->data+i, 0x0003); |
411 i += aimutil_put16(newpacket->data+i, 0x0003); |
| 408 i += aimutil_put16(newpacket->data+i, 0x0004); |
412 i += aimutil_put16(newpacket->data+i, 0x0004); |
| 409 i += aimutil_put16(newpacket->data+i, 0x0005); |
413 i += aimutil_put16(newpacket->data+i, 0x0005); |
| 410 |
414 |
| |
415 newpacket->commandlen = i; |
| |
416 newpacket->lock = 0; |
| |
417 |
| 411 aim_tx_enqueue(sess, newpacket); |
418 aim_tx_enqueue(sess, newpacket); |
| 412 |
419 |
| 413 return (sess->snac_nextid); |
420 return (sess->snac_nextid); |
| 414 } |
421 } |
| 415 |
422 |
| 420 * |
427 * |
| 421 * Bit 1: Allows other AIM users to see how long you've been idle. |
428 * Bit 1: Allows other AIM users to see how long you've been idle. |
| 422 * Bit 2: Allows other AIM users to see how long you've been a member. |
429 * Bit 2: Allows other AIM users to see how long you've been a member. |
| 423 * |
430 * |
| 424 */ |
431 */ |
| 425 u_long aim_bos_setprivacyflags(struct aim_session_t *sess, |
432 faim_export unsigned long aim_bos_setprivacyflags(struct aim_session_t *sess, |
| 426 struct aim_conn_t *conn, |
433 struct aim_conn_t *conn, |
| 427 u_long flags) |
434 u_long flags) |
| 428 { |
435 { |
| 429 return aim_genericreq_l(sess, conn, 0x0001, 0x0014, &flags); |
436 return aim_genericreq_l(sess, conn, 0x0001, 0x0014, &flags); |
| 430 } |
437 } |
| 431 |
438 |
| 432 /* |
439 /* |
| 434 * |
441 * |
| 435 * Requests the current user's information. Can't go generic on this one |
442 * Requests the current user's information. Can't go generic on this one |
| 436 * because aparently it uses SNAC flags. |
443 * because aparently it uses SNAC flags. |
| 437 * |
444 * |
| 438 */ |
445 */ |
| 439 u_long aim_bos_reqpersonalinfo(struct aim_session_t *sess, |
446 faim_export unsigned long aim_bos_reqpersonalinfo(struct aim_session_t *sess, |
| 440 struct aim_conn_t *conn) |
447 struct aim_conn_t *conn) |
| 441 { |
448 { |
| 442 return aim_genericreq_n(sess, conn, 0x0001, 0x000e); |
449 return aim_genericreq_n(sess, conn, 0x0001, 0x000e); |
| 443 } |
450 } |
| 444 |
451 |
| 445 u_long aim_setversions(struct aim_session_t *sess, |
452 faim_export unsigned long aim_setversions(struct aim_session_t *sess, |
| 446 struct aim_conn_t *conn) |
453 struct aim_conn_t *conn) |
| 447 { |
454 { |
| 448 struct command_tx_struct *newpacket; |
455 struct command_tx_struct *newpacket; |
| 449 int i; |
456 int i; |
| 450 |
457 |
| 451 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10 + (4*12)))) |
458 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10 + (4*12)))) |
| 495 for (j = 0; j < 0x10; j++) { |
502 for (j = 0; j < 0x10; j++) { |
| 496 i += aimutil_put16(newpacket->data+i, j); /* family */ |
503 i += aimutil_put16(newpacket->data+i, j); /* family */ |
| 497 i += aimutil_put16(newpacket->data+i, 0x0003); /* version */ |
504 i += aimutil_put16(newpacket->data+i, 0x0003); /* version */ |
| 498 } |
505 } |
| 499 #endif |
506 #endif |
| |
507 |
| |
508 newpacket->commandlen = i; |
| 500 newpacket->lock = 0; |
509 newpacket->lock = 0; |
| 501 aim_tx_enqueue(sess, newpacket); |
510 aim_tx_enqueue(sess, newpacket); |
| 502 |
511 |
| 503 return (sess->snac_nextid++); |
512 return (sess->snac_nextid++); |
| 504 } |
513 } |
| 508 * aim_bos_reqservice(serviceid) |
517 * aim_bos_reqservice(serviceid) |
| 509 * |
518 * |
| 510 * Service request. |
519 * Service request. |
| 511 * |
520 * |
| 512 */ |
521 */ |
| 513 u_long aim_bos_reqservice(struct aim_session_t *sess, |
522 faim_export unsigned long aim_bos_reqservice(struct aim_session_t *sess, |
| 514 struct aim_conn_t *conn, |
523 struct aim_conn_t *conn, |
| 515 u_short serviceid) |
524 u_short serviceid) |
| 516 { |
525 { |
| 517 return aim_genericreq_s(sess, conn, 0x0001, 0x0004, &serviceid); |
526 return aim_genericreq_s(sess, conn, 0x0001, 0x0004, &serviceid); |
| 518 } |
527 } |
| 522 * |
531 * |
| 523 * No-op. WinAIM sends these every 4min or so to keep |
532 * No-op. WinAIM sends these every 4min or so to keep |
| 524 * the connection alive. Its not real necessary. |
533 * the connection alive. Its not real necessary. |
| 525 * |
534 * |
| 526 */ |
535 */ |
| 527 u_long aim_bos_nop(struct aim_session_t *sess, |
536 faim_export unsigned long aim_bos_nop(struct aim_session_t *sess, |
| 528 struct aim_conn_t *conn) |
537 struct aim_conn_t *conn) |
| 529 { |
538 { |
| 530 return aim_genericreq_n(sess, conn, 0x0001, 0x0016); |
539 return aim_genericreq_n(sess, conn, 0x0001, 0x0016); |
| 531 } |
540 } |
| 532 |
541 |
| 533 /* |
542 /* |
| 534 * aim_bos_reqrights() |
543 * aim_bos_reqrights() |
| 535 * |
544 * |
| 536 * Request BOS rights. |
545 * Request BOS rights. |
| 537 * |
546 * |
| 538 */ |
547 */ |
| 539 u_long aim_bos_reqrights(struct aim_session_t *sess, |
548 faim_export unsigned long aim_bos_reqrights(struct aim_session_t *sess, |
| 540 struct aim_conn_t *conn) |
549 struct aim_conn_t *conn) |
| 541 { |
550 { |
| 542 return aim_genericreq_n(sess, conn, 0x0009, 0x0002); |
551 return aim_genericreq_n(sess, conn, 0x0009, 0x0002); |
| 543 } |
552 } |
| 544 |
553 |
| 545 /* |
554 /* |
| 546 * aim_bos_reqbuddyrights() |
555 * aim_bos_reqbuddyrights() |
| 547 * |
556 * |
| 548 * Request Buddy List rights. |
557 * Request Buddy List rights. |
| 549 * |
558 * |
| 550 */ |
559 */ |
| 551 u_long aim_bos_reqbuddyrights(struct aim_session_t *sess, |
560 faim_export unsigned long aim_bos_reqbuddyrights(struct aim_session_t *sess, |
| 552 struct aim_conn_t *conn) |
561 struct aim_conn_t *conn) |
| 553 { |
562 { |
| 554 return aim_genericreq_n(sess, conn, 0x0003, 0x0002); |
563 return aim_genericreq_n(sess, conn, 0x0003, 0x0002); |
| 555 } |
564 } |
| 556 |
565 |
| 557 /* |
566 /* |
| 562 * AIM_WARN_ANON anonymous |
571 * AIM_WARN_ANON anonymous |
| 563 * |
572 * |
| 564 * returns -1 on error (couldn't alloc packet), next snacid on success. |
573 * returns -1 on error (couldn't alloc packet), next snacid on success. |
| 565 * |
574 * |
| 566 */ |
575 */ |
| 567 int aim_send_warning(struct aim_session_t *sess, struct aim_conn_t *conn, char *destsn, int anon) |
576 faim_export int aim_send_warning(struct aim_session_t *sess, struct aim_conn_t *conn, char *destsn, int anon) |
| 568 { |
577 { |
| 569 struct command_tx_struct *newpacket; |
578 struct command_tx_struct *newpacket; |
| 570 int curbyte; |
579 int curbyte; |
| 571 |
580 |
| 572 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, strlen(destsn)+13))) |
581 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, strlen(destsn)+13))) |
| 590 aim_tx_enqueue(sess, newpacket); |
599 aim_tx_enqueue(sess, newpacket); |
| 591 |
600 |
| 592 return (sess->snac_nextid++); |
601 return (sess->snac_nextid++); |
| 593 } |
602 } |
| 594 |
603 |
| 595 |
|
| 596 |
|
| 597 /* |
604 /* |
| 598 * aim_debugconn_sendconnect() |
605 * aim_debugconn_sendconnect() |
| 599 * |
606 * |
| 600 * For aimdebugd. If you don't know what it is, you don't want to. |
607 * For aimdebugd. If you don't know what it is, you don't want to. |
| 601 */ |
608 */ |
| 602 u_long aim_debugconn_sendconnect(struct aim_session_t *sess, |
609 faim_export unsigned long aim_debugconn_sendconnect(struct aim_session_t *sess, |
| 603 struct aim_conn_t *conn) |
610 struct aim_conn_t *conn) |
| 604 { |
611 { |
| 605 return aim_genericreq_n(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEBUGCONN_CONNECT); |
612 return aim_genericreq_n(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DEBUGCONN_CONNECT); |
| 606 } |
613 } |
| 607 |
614 |
| 608 /* |
615 /* |
| 615 * I had one big function that handled all three cases, but then it broke |
622 * I had one big function that handled all three cases, but then it broke |
| 616 * and I split it up into three. But then I fixed it. I just never went |
623 * and I split it up into three. But then I fixed it. I just never went |
| 617 * back to the single. I don't see any advantage to doing it either way. |
624 * back to the single. I don't see any advantage to doing it either way. |
| 618 * |
625 * |
| 619 */ |
626 */ |
| 620 u_long aim_genericreq_n(struct aim_session_t *sess, |
627 faim_internal unsigned long aim_genericreq_n(struct aim_session_t *sess, |
| 621 struct aim_conn_t *conn, |
628 struct aim_conn_t *conn, |
| 622 u_short family, u_short subtype) |
629 u_short family, u_short subtype) |
| 623 { |
630 { |
| 624 struct command_tx_struct *newpacket; |
631 struct command_tx_struct *newpacket; |
| 625 |
632 |
| 626 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10))) |
633 if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10))) |
| 627 return 0; |
634 return 0; |
| 636 |
643 |
| 637 /* |
644 /* |
| 638 * |
645 * |
| 639 * |
646 * |
| 640 */ |
647 */ |
| 641 u_long aim_genericreq_l(struct aim_session_t *sess, |
648 faim_internal unsigned long aim_genericreq_l(struct aim_session_t *sess, |
| 642 struct aim_conn_t *conn, |
649 struct aim_conn_t *conn, |
| 643 u_short family, u_short subtype, u_long *longdata) |
650 u_short family, u_short subtype, |
| |
651 u_long *longdata) |
| 644 { |
652 { |
| 645 struct command_tx_struct *newpacket; |
653 struct command_tx_struct *newpacket; |
| 646 u_long newlong; |
654 u_long newlong; |
| 647 |
655 |
| 648 /* If we don't have data, there's no reason to use this function */ |
656 /* If we don't have data, there's no reason to use this function */ |
| 662 |
670 |
| 663 aim_tx_enqueue(sess, newpacket); |
671 aim_tx_enqueue(sess, newpacket); |
| 664 return (sess->snac_nextid++); |
672 return (sess->snac_nextid++); |
| 665 } |
673 } |
| 666 |
674 |
| 667 u_long aim_genericreq_s(struct aim_session_t *sess, |
675 faim_internal unsigned long aim_genericreq_s(struct aim_session_t *sess, |
| 668 struct aim_conn_t *conn, |
676 struct aim_conn_t *conn, |
| 669 u_short family, u_short subtype, u_short *shortdata) |
677 u_short family, u_short subtype, |
| |
678 u_short *shortdata) |
| 670 { |
679 { |
| 671 struct command_tx_struct *newpacket; |
680 struct command_tx_struct *newpacket; |
| 672 u_short newshort; |
681 u_short newshort; |
| 673 |
682 |
| 674 /* If we don't have data, there's no reason to use this function */ |
683 /* If we don't have data, there's no reason to use this function */ |
| 694 * aim_bos_reqlocaterights() |
703 * aim_bos_reqlocaterights() |
| 695 * |
704 * |
| 696 * Request Location services rights. |
705 * Request Location services rights. |
| 697 * |
706 * |
| 698 */ |
707 */ |
| 699 u_long aim_bos_reqlocaterights(struct aim_session_t *sess, |
708 faim_export unsigned long aim_bos_reqlocaterights(struct aim_session_t *sess, |
| 700 struct aim_conn_t *conn) |
709 struct aim_conn_t *conn) |
| 701 { |
710 { |
| 702 return aim_genericreq_n(sess, conn, 0x0002, 0x0002); |
711 return aim_genericreq_n(sess, conn, 0x0002, 0x0002); |
| 703 } |
712 } |
| 704 |
713 |
| 705 /* |
714 /* |
| 706 * aim_bos_reqicbmparaminfo() |
715 * aim_bos_reqicbmparaminfo() |
| 707 * |
716 * |
| 708 * Request ICBM parameter information. |
717 * Request ICBM parameter information. |
| 709 * |
718 * |
| 710 */ |
719 */ |
| 711 u_long aim_bos_reqicbmparaminfo(struct aim_session_t *sess, |
720 faim_export unsigned long aim_bos_reqicbmparaminfo(struct aim_session_t *sess, |
| 712 struct aim_conn_t *conn) |
721 struct aim_conn_t *conn) |
| 713 { |
722 { |
| 714 return aim_genericreq_n(sess, conn, 0x0004, 0x0004); |
723 return aim_genericreq_n(sess, conn, 0x0004, 0x0004); |
| 715 } |
724 } |
| 716 |
725 |
| 717 /* |
726 /* |
| 718 * Add ICBM parameter? Huh? |
727 * Add ICBM parameter? Huh? |
| 719 */ |
728 */ |
| 720 unsigned long aim_addicbmparam(struct aim_session_t *sess, |
729 faim_export unsigned long aim_addicbmparam(struct aim_session_t *sess, |
| 721 struct aim_conn_t *conn) |
730 struct aim_conn_t *conn) |
| 722 { |
731 { |
| 723 struct command_tx_struct *newpacket; |
732 struct command_tx_struct *newpacket; |
| 724 int packlen = 10+16, i=0; |
733 int packlen = 10+16, i=0; |
| 725 |
734 |
| 726 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen))) |
735 if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, packlen))) |