Mercurial > pidgin.yaz
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 |