comparison libfaim/rxhandlers.c @ 1612:fd5d27358418

[gaim-migrate @ 1622] libfaim updates. also, we don't need CHANGES.gaim and README.gaim anymore, especially since libfaim/oscar isn't the only library/protocol we're using besides toc anymore. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sun, 18 Mar 2001 02:24:41 +0000
parents 1e2cc8c8bf3c
children 3fe5799b7823
comparison
equal deleted inserted replaced
1611:9ff8cac19352 1612:fd5d27358418
313 faimdprintf(sess, 1, "parse_generic: incoming packet queue empty.\n"); 313 faimdprintf(sess, 1, "parse_generic: incoming packet queue empty.\n");
314 return 0; 314 return 0;
315 } else { 315 } else {
316 workingPtr = sess->queue_incoming; 316 workingPtr = sess->queue_incoming;
317 for (i = 0; workingPtr != NULL; workingPtr = workingPtr->next, i++) { 317 for (i = 0; workingPtr != NULL; workingPtr = workingPtr->next, i++) {
318 unsigned short family,subtype;
319
318 /* 320 /*
319 * XXX: This is still fairly ugly. 321 * XXX: This is still fairly ugly.
320 */ 322 */
321 if (workingPtr->handled) 323 if (workingPtr->handled)
322 continue; 324 continue;
332 faimdprintf(sess, 0, "rxhandlers: incompatible frame type %d on connection type 0x%04x\n", workingPtr->hdrtype, workingPtr->conn->type); 334 faimdprintf(sess, 0, "rxhandlers: incompatible frame type %d on connection type 0x%04x\n", workingPtr->hdrtype, workingPtr->conn->type);
333 workingPtr->handled = 1; 335 workingPtr->handled = 1;
334 continue; 336 continue;
335 } 337 }
336 338
337 switch(workingPtr->conn->type) { 339 if (workingPtr->conn->type == AIM_CONN_TYPE_RENDEZVOUS) {
338 case -1:
339 /*
340 * This can happen if we have a queued command
341 * that was recieved after a connection has
342 * been terminated. In which case, the handler
343 * list has been cleared, and there's nothing we
344 * can do for it. We can only cancel it.
345 */
346 workingPtr->handled = 1;
347 break;
348 case AIM_CONN_TYPE_AUTH: {
349 unsigned long head;
350
351 head = aimutil_get32(workingPtr->data);
352 if ((head == 0x00000001) && (workingPtr->commandlen == 4)) {
353 faimdprintf(sess, 1, "got connection ack on auth line\n");
354 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
355 } else if (workingPtr->hdr.oscar.type == 0x04) {
356 /* Used only by the older login protocol */
357 workingPtr->handled = aim_authparse(sess, workingPtr);
358 } else {
359 unsigned short family,subtype;
360
361 family = aimutil_get16(workingPtr->data);
362 subtype = aimutil_get16(workingPtr->data+2);
363
364 switch (family) {
365 /* New login protocol */
366 case 0x0017:
367 if (subtype == 0x0001)
368 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0x0001, workingPtr);
369 else if (subtype == 0x0003)
370 workingPtr->handled = aim_authparse(sess, workingPtr);
371 else if (subtype == 0x0007)
372 workingPtr->handled = aim_authkeyparse(sess, workingPtr);
373 else
374 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
375 break;
376
377 case 0x0001:
378 if (subtype == 0x0003)
379 workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
380 else if (subtype == 0x0007)
381 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr);
382 else if (subtype == 0x0018)
383 workingPtr->handled = aim_parse_hostversions(sess, workingPtr);
384 else
385 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0xffff, workingPtr);
386 break;
387
388 case 0x0007:
389 if (subtype == 0x0003)
390 workingPtr->handled = aim_parse_infochange(sess, workingPtr);
391 else if (subtype == 0x0005)
392 workingPtr->handled = aim_parse_infochange(sess, workingPtr);
393 else if (subtype == 0x0007)
394 workingPtr->handled = aim_parse_accountconfirm(sess, workingPtr);
395 break;
396
397 case AIM_CB_FAM_SPECIAL:
398 if (subtype == AIM_CB_SPECIAL_DEBUGCONN_CONNECT) {
399 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
400 break;
401 } else
402 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
403 break;
404
405 default:
406 break;
407 }
408 }
409 break;
410 }
411 case AIM_CONN_TYPE_BOS: {
412 u_short family;
413 u_short subtype;
414
415 if (workingPtr->hdr.oscar.type == 0x04) {
416 workingPtr->handled = aim_negchan_middle(sess, workingPtr);
417 break;
418 }
419
420 family = aimutil_get16(workingPtr->data);
421 subtype = aimutil_get16(workingPtr->data+2);
422
423 switch (family) {
424 case 0x0000: /* not really a family, but it works */
425 if (subtype == 0x0001)
426 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
427 else
428 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_UNKNOWN, workingPtr);
429 break;
430 case 0x0001: /* Family: General */
431 switch (subtype) {
432 case 0x0001:
433 workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
434 break;
435 case 0x0003:
436 workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
437 break;
438 case 0x0005:
439 workingPtr->handled = aim_handleredirect_middle(sess, workingPtr);
440 break;
441 case 0x0007:
442 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr);
443 break;
444 case 0x000a:
445 workingPtr->handled = aim_parse_ratechange_middle(sess, workingPtr);
446 break;
447 case 0x000f:
448 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x000f, workingPtr);
449 break;
450 case 0x0010:
451 workingPtr->handled = aim_parse_evilnotify_middle(sess, workingPtr);
452 break;
453 case 0x0013:
454 workingPtr->handled = aim_parsemotd_middle(sess, workingPtr);
455 break;
456 case 0x0018:
457 workingPtr->handled = aim_parse_hostversions(sess, workingPtr);
458 break;
459 default:
460 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_GEN, AIM_CB_GEN_DEFAULT, workingPtr);
461 break;
462 }
463 break;
464 case 0x0002: /* Family: Location */
465 switch (subtype) {
466 case 0x0001:
467 workingPtr->handled = aim_parse_locateerr(sess, workingPtr);
468 break;
469 case 0x0003:
470 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0002, 0x0003, workingPtr);
471 break;
472 case 0x0006:
473 workingPtr->handled = aim_parse_userinfo_middle(sess, workingPtr);
474 break;
475 default:
476 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_LOC, AIM_CB_LOC_DEFAULT, workingPtr);
477 break;
478 }
479 break;
480 case 0x0003: /* Family: Buddy List */
481 switch (subtype) {
482 case 0x0001:
483 workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
484 break;
485 case 0x0003:
486 workingPtr->handled = aim_parse_buddyrights(sess, workingPtr);
487 break;
488 case 0x000b: /* oncoming buddy */
489 workingPtr->handled = aim_parse_oncoming_middle(sess, workingPtr);
490 break;
491 case 0x000c: /* offgoing buddy */
492 workingPtr->handled = aim_parse_offgoing_middle(sess, workingPtr);
493 break;
494 default:
495 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_BUD, AIM_CB_BUD_DEFAULT, workingPtr);
496 }
497 break;
498 case 0x0004: /* Family: Messaging */
499 switch (subtype) {
500 case 0x0001:
501 workingPtr->handled = aim_parse_msgerror_middle(sess, workingPtr);
502 break;
503 case 0x0005:
504 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0004, 0x0005, workingPtr);
505 break;
506 case 0x0006:
507 workingPtr->handled = aim_parse_outgoing_im_middle(sess, workingPtr);
508 break;
509 case 0x0007:
510 workingPtr->handled = aim_parse_incoming_im_middle(sess, workingPtr);
511 break;
512 case 0x000a:
513 workingPtr->handled = aim_parse_missedcall(sess, workingPtr);
514 break;
515 case 0x000c:
516 workingPtr->handled = aim_parse_msgack_middle(sess, workingPtr);
517 break;
518 default:
519 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_MSG, AIM_CB_MSG_DEFAULT, workingPtr);
520 }
521 break;
522 case 0x0009:
523 if (subtype == 0x0001)
524 workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
525 else if (subtype == 0x0003)
526 workingPtr->handled = aim_parse_bosrights(sess, workingPtr);
527 else
528 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_BOS, AIM_CB_BOS_DEFAULT, workingPtr);
529 break;
530 case 0x000a: /* Family: User lookup */
531 switch (subtype) {
532 case 0x0001:
533 workingPtr->handled = aim_parse_searcherror(sess, workingPtr);
534 break;
535 case 0x0003:
536 workingPtr->handled = aim_parse_searchreply(sess, workingPtr);
537 break;
538 default:
539 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_LOK, AIM_CB_LOK_DEFAULT, workingPtr);
540 }
541 break;
542 case 0x000b: {
543 if (subtype == 0x0001)
544 workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
545 else if (subtype == 0x0002)
546 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x000b, 0x0002, workingPtr);
547 else
548 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_STS, AIM_CB_STS_DEFAULT, workingPtr);
549 break;
550 }
551 case 0x0013: {
552 faimdprintf(sess, 0, "lalala: 0x%04x/0x%04x\n", family, subtype);
553 break;
554 }
555 case AIM_CB_FAM_SPECIAL:
556 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
557 break;
558 default:
559 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_UNKNOWN, workingPtr);
560 break;
561 } /* switch(family) */
562 break;
563 } /* AIM_CONN_TYPE_BOS */
564 case AIM_CONN_TYPE_ADS: {
565 unsigned short family;
566 unsigned short subtype;
567
568 family = aimutil_get16(workingPtr->data);
569 subtype= aimutil_get16(workingPtr->data+2);
570
571 if ((family == 0x0000) && (subtype == 0x00001)) {
572 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
573 } else if ((family == 0x0001) && (subtype == 0x0003)) {
574 workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
575 } else {
576 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
577 }
578 break;
579 }
580 case AIM_CONN_TYPE_CHATNAV: {
581 u_short family;
582 u_short subtype;
583 family = aimutil_get16(workingPtr->data);
584 subtype= aimutil_get16(workingPtr->data+2);
585
586 if ((family == 0x0000) && (subtype == 0x00001)) {
587 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
588 } else if ((family == 0x0001) && (subtype == 0x0003)) {
589 workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
590 } else if ((family == 0x000d) && (subtype == 0x0009)) {
591 workingPtr->handled = aim_chatnav_parse_info(sess, workingPtr);
592 } else {
593 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
594 }
595 break;
596 }
597 case AIM_CONN_TYPE_CHAT: {
598 u_short family, subtype;
599
600 family = aimutil_get16(workingPtr->data);
601 subtype= aimutil_get16(workingPtr->data+2);
602
603 if ((family == 0x0000) && (subtype == 0x00001)) {
604 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
605 } else if (family == 0x0001) {
606 if (subtype == 0x0001)
607 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0001, workingPtr);
608 else if (subtype == 0x0003)
609 workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
610 else if (subtype == 0x0007)
611 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr);
612 else if (subtype == 0x000a)
613 workingPtr->handled = aim_parse_ratechange_middle(sess, workingPtr);
614 else
615 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
616 } else if (family == 0x000e) {
617 if (subtype == 0x0002)
618 workingPtr->handled = aim_chat_parse_infoupdate(sess, workingPtr);
619 else if (subtype == 0x0003)
620 workingPtr->handled = aim_chat_parse_joined(sess, workingPtr);
621 else if (subtype == 0x0004)
622 workingPtr->handled = aim_chat_parse_leave(sess, workingPtr);
623 else if (subtype == 0x0006)
624 workingPtr->handled = aim_chat_parse_incoming(sess, workingPtr);
625 else
626 faimdprintf(sess, 0, "Chat: unknown snac %04x/%04x\n", family, subtype);
627 } else {
628 faimdprintf(sess, 0, "Chat: unknown snac %04x/%04x\n", family, subtype);
629 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_DEFAULT, workingPtr);
630 }
631 break;
632 }
633 case AIM_CONN_TYPE_RENDEZVOUS: {
634 /* make sure that we only get OFT frames on these connections */ 340 /* make sure that we only get OFT frames on these connections */
635 if (workingPtr->hdrtype != AIM_FRAMETYPE_OFT) { 341 if (workingPtr->hdrtype != AIM_FRAMETYPE_OFT) {
636 faimdprintf(sess, 0, "internal error: non-OFT frames on OFT connection\n"); 342 faimdprintf(sess, 0, "internal error: non-OFT frames on OFT connection\n");
637 workingPtr->handled = 1; /* get rid of it */ 343 workingPtr->handled = 1; /* get rid of it */
638 break; 344 } else {
345 /* XXX: implement this */
346 faimdprintf(sess, 0, "faim: OFT frame!\n");
347 workingPtr->handled = 1; /* get rid of it */
639 } 348 }
640 349 continue;
641 /* XXX: implement this */ 350 }
642 faimdprintf(sess, 0, "faim: OFT frame!\n"); 351
643 352 if (workingPtr->conn->type == AIM_CONN_TYPE_RENDEZVOUS_OUT) {
353 /* not possible */
354 faimdprintf(sess, 0, "rxdispatch called on RENDEZVOUS_OUT connection!\n");
355 workingPtr->handled = 1;
356 continue;
357 }
358
359 if ((workingPtr->commandlen == 4) &&
360 (aimutil_get32(workingPtr->data) == 0x00000001)) {
361 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, workingPtr);
362 continue;
363 }
364
365 if (workingPtr->hdr.oscar.type == 0x04) {
366 workingPtr->handled = aim_negchan_middle(sess, workingPtr);
367 continue;
368 }
369
370 family = aimutil_get16(workingPtr->data);
371 subtype = aimutil_get16(workingPtr->data+2);
372
373 if (family == 0x0001) {
374
375 if (subtype == 0x0001)
376 workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
377 else if (subtype == 0x0003)
378 workingPtr->handled = aim_parse_hostonline(sess, workingPtr);
379 else if (subtype == 0x0005)
380 workingPtr->handled = aim_handleredirect_middle(sess, workingPtr);
381 else if (subtype == 0x0007)
382 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr);
383 else if (subtype == 0x000a)
384 workingPtr->handled = aim_parse_ratechange_middle(sess, workingPtr);
385 else if (subtype == 0x000f)
386 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x000f, workingPtr);
387 else if (subtype == 0x0010)
388 workingPtr->handled = aim_parse_evilnotify_middle(sess, workingPtr);
389 else if (subtype == 0x0013)
390 workingPtr->handled = aim_parsemotd_middle(sess, workingPtr);
391 else if (subtype == 0x0018)
392 workingPtr->handled = aim_parse_hostversions(sess, workingPtr);
393 else
394 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0xffff, workingPtr);
395
396 } else if (family == 0x0002) {
397
398 if (subtype == 0x0001)
399 workingPtr->handled = aim_parse_locateerr(sess, workingPtr);
400 else if (subtype == 0x0003)
401 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0002, 0x0003, workingPtr);
402 else if (subtype == 0x0006)
403 workingPtr->handled = aim_parse_userinfo_middle(sess, workingPtr);
404 else
405 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_LOC, AIM_CB_LOC_DEFAULT, workingPtr);
406
407 } else if (family == 0x0003) {
408
409 if (subtype == 0x0001)
410 workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
411 else if (subtype == 0x0003)
412 workingPtr->handled = aim_parse_buddyrights(sess, workingPtr);
413 else if (subtype == 0x000b)
414 workingPtr->handled = aim_parse_oncoming_middle(sess, workingPtr);
415 else if (subtype == 0x000c)
416 workingPtr->handled = aim_parse_offgoing_middle(sess, workingPtr);
417 else
418 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_BUD, AIM_CB_BUD_DEFAULT, workingPtr);
419
420 } else if (family == 0x0004) {
421
422 if (subtype == 0x0001)
423 workingPtr->handled = aim_parse_msgerror_middle(sess, workingPtr);
424 else if (subtype == 0x0005)
425 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0004, 0x0005, workingPtr);
426 else if (subtype == 0x0006)
427 workingPtr->handled = aim_parse_outgoing_im_middle(sess, workingPtr);
428 else if (subtype == 0x0007)
429 workingPtr->handled = aim_parse_incoming_im_middle(sess, workingPtr);
430 else if (subtype == 0x000a)
431 workingPtr->handled = aim_parse_missedcall(sess, workingPtr);
432 else if (subtype == 0x000c)
433 workingPtr->handled = aim_parse_msgack_middle(sess, workingPtr);
434 else
435 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_MSG, AIM_CB_MSG_DEFAULT, workingPtr);
436
437 } else if (family == 0x0007) {
438
439 if (subtype == 0x0003)
440 workingPtr->handled = aim_parse_infochange(sess, workingPtr);
441 else if (subtype == 0x0005)
442 workingPtr->handled = aim_parse_infochange(sess, workingPtr);
443 else if (subtype == 0x0007)
444 workingPtr->handled = aim_parse_accountconfirm(sess, workingPtr);
644 break; 445 break;
446
447 } else if (family == 0x0009) {
448
449 if (subtype == 0x0001)
450 workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
451 else if (subtype == 0x0003)
452 workingPtr->handled = aim_parse_bosrights(sess, workingPtr);
453 else
454 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_BOS, AIM_CB_BOS_DEFAULT, workingPtr);
455
456 } else if (family == 0x000a) {
457
458 if (subtype == 0x0001)
459 workingPtr->handled = aim_parse_searcherror(sess, workingPtr);
460 else if (subtype == 0x0003)
461 workingPtr->handled = aim_parse_searchreply(sess, workingPtr);
462 else
463 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_LOK, AIM_CB_LOK_DEFAULT, workingPtr);
464
465 } else if (family == 0x000b) {
466
467 if (subtype == 0x0001)
468 workingPtr->handled = aim_parse_generalerrs(sess, workingPtr);
469 else if (subtype == 0x0002)
470 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x000b, 0x0002, workingPtr);
471 else
472 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_STS, AIM_CB_STS_DEFAULT, workingPtr);
473
474 } else if (family == 0x000d) {
475
476 if (subtype == 0x0009)
477 workingPtr->handled = aim_chatnav_parse_info(sess, workingPtr);
478
479 } else if (family == 0x000e) {
480
481 if (subtype == 0x0002)
482 workingPtr->handled = aim_chat_parse_infoupdate(sess, workingPtr);
483 else if (subtype == 0x0003)
484 workingPtr->handled = aim_chat_parse_joined(sess, workingPtr);
485 else if (subtype == 0x0004)
486 workingPtr->handled = aim_chat_parse_leave(sess, workingPtr);
487 else if (subtype == 0x0006)
488 workingPtr->handled = aim_chat_parse_incoming(sess, workingPtr);
489
490 } else if (family == 0x0013) {
491
492 faimdprintf(sess, 0, "lalala: 0x%04x/0x%04x\n", family, subtype);
493
494 } else if (family == 0x0017) { /* New login protocol */
495
496 if (subtype == 0x0001)
497 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0x0001, workingPtr);
498 else if (subtype == 0x0003)
499 workingPtr->handled = aim_authparse(sess, workingPtr);
500 else if (subtype == 0x0007)
501 workingPtr->handled = aim_authkeyparse(sess, workingPtr);
502 else
503 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0017, 0xffff, workingPtr);
504
505 } else if (family == AIM_CB_FAM_SPECIAL) {
506
507 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
508
645 } 509 }
646 case AIM_CONN_TYPE_RENDEZVOUS_OUT: { 510
647 /* not possible */ 511 /* Try it raw and see if we can get it to happen... */
648 break; 512 if (!workingPtr->handled) /* XXX this is probably bad. */
649 } 513 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr);
650 default: 514
651 faimdprintf(sess, 0, "internal error: unknown connection type (very bad.) (type = %d, fd = %d, commandlen = %02x)\n\n", workingPtr->conn->type, workingPtr->conn->fd, workingPtr->commandlen);
652 workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_UNKNOWN, workingPtr);
653 break;
654 }
655 } 515 }
656 } 516 }
657 517
658 /* 518 /*
659 * This doesn't have to be called here. It could easily be done 519 * This doesn't have to be called here. It could easily be done
1029 char *msg = NULL; 889 char *msg = NULL;
1030 unsigned short code = 0; 890 unsigned short code = 0;
1031 rxcallback_t userfunc = NULL; 891 rxcallback_t userfunc = NULL;
1032 int ret = 1; 892 int ret = 1;
1033 893
894 /* Used only by the older login protocol */
895 /* XXX remove this special case? */
896 if (command->conn->type == AIM_CONN_TYPE_AUTH)
897 return aim_authparse(sess, command);
898
1034 tlvlist = aim_readtlvchain(command->data, command->commandlen); 899 tlvlist = aim_readtlvchain(command->data, command->commandlen);
1035 900
1036 if (aim_gettlv(tlvlist, 0x0009, 1)) 901 if (aim_gettlv(tlvlist, 0x0009, 1))
1037 code = aim_gettlv16(tlvlist, 0x0009, 1); 902 code = aim_gettlv16(tlvlist, 0x0009, 1);
1038 903