comparison libfaim/aim_rxhandlers.c @ 1248:920c86b753d7

[gaim-migrate @ 1258] bah committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Wed, 13 Dec 2000 03:31:15 +0000
parents c00fc3adfd66
children 385c1a1d96aa
comparison
equal deleted inserted replaced
1247:f50146ce818e 1248:920c86b753d7
732 } 732 }
733 733
734 faim_internal int aim_handleredirect_middle(struct aim_session_t *sess, 734 faim_internal int aim_handleredirect_middle(struct aim_session_t *sess,
735 struct command_rx_struct *command, ...) 735 struct command_rx_struct *command, ...)
736 { 736 {
737 struct aim_tlv_t *tmptlv = NULL; 737 int serviceid = 0;
738 int serviceid = 0x00; 738 unsigned char *cookie = NULL;
739 unsigned char cookie[AIM_COOKIELEN];
740 char *ip = NULL; 739 char *ip = NULL;
741 rxcallback_t userfunc = NULL; 740 rxcallback_t userfunc = NULL;
742 struct aim_tlvlist_t *tlvlist; 741 struct aim_tlvlist_t *tlvlist;
743 int ret = 1; 742 int ret = 1;
744 743
745 if (!(tlvlist = aim_readtlvchain(command->data+10, command->commandlen-10))) 744 tlvlist = aim_readtlvchain(command->data+10, command->commandlen-10);
746 { 745
747 printf("libfaim: major bug: unable to read tlvchain from redirect\n"); 746 if (aim_gettlv(tlvlist, 0x000d, 1))
748 return ret; 747 serviceid = aim_gettlv16(tlvlist, 0x000d, 1);
749 } 748 if (aim_gettlv(tlvlist, 0x0005, 1))
750 749 ip = aim_gettlv_str(tlvlist, 0x0005, 1);
751 if (!(tmptlv = aim_gettlv(tlvlist, 0x000d, 1))) 750 if (aim_gettlv(tlvlist, 0x0006, 1))
752 { 751 cookie = aim_gettlv_str(tlvlist, 0x0006, 1);
753 printf("libfaim: major bug: no service ID in tlvchain from redirect\n"); 752
754 aim_freetlvchain(&tlvlist); 753 if ((serviceid == AIM_CONN_TYPE_CHAT) && sess->pendingjoin) {
755 return ret; 754
756 } 755 /*
757 serviceid = aimutil_get16(tmptlv->value); 756 * Chat hack.
758 757 *
759 if (!(ip = aim_gettlv_str(tlvlist, 0x0005, 1))) 758 */
760 { 759 if ((userfunc = aim_callhandler(command->conn, 0x0001, 0x0005)))
761 printf("libfaim: major bug: no IP in tlvchain from redirect (service 0x%02x)\n", serviceid); 760 ret = userfunc(sess, command, serviceid, ip, cookie, sess->pendingjoin, (int)sess->pendingjoinexchange);
762 free(ip);
763 aim_freetlvchain(&tlvlist);
764 return ret;
765 }
766
767 if (!(tmptlv = aim_gettlv(tlvlist, 0x0006, 1)))
768 {
769 printf("libfaim: major bug: no cookie in tlvchain from redirect (service 0x%02x)\n", serviceid);
770 free(ip);
771 aim_freetlvchain(&tlvlist);
772 return ret;
773 }
774 memcpy(cookie, tmptlv->value, AIM_COOKIELEN);
775
776 if (serviceid == AIM_CONN_TYPE_CHAT)
777 {
778 /*
779 * Chat hack.
780 *
781 */
782 userfunc = aim_callhandler(command->conn, 0x0001, 0x0005);
783 if (userfunc)
784 ret = userfunc(sess, command, serviceid, ip, cookie, sess->pendingjoin, (int)sess->pendingjoinexchange);
785 free(sess->pendingjoin); 761 free(sess->pendingjoin);
786 sess->pendingjoin = NULL; 762 sess->pendingjoin = NULL;
787 sess->pendingjoinexchange = 0; 763 sess->pendingjoinexchange = 0;
788 } 764 } else if (!serviceid || !ip || !cookie) { /* yeep! */
789 else 765 ret = 1;
790 { 766 } else {
791 userfunc = aim_callhandler(command->conn, 0x0001, 0x0005); 767 if ((userfunc = aim_callhandler(command->conn, 0x0001, 0x0005)))
792 if (userfunc) 768 ret = userfunc(sess, command, serviceid, ip, cookie);
793 ret = userfunc(sess, command, serviceid, ip, cookie); 769 }
794 } 770
795 771 if (ip)
796 free(ip); 772 free(ip);
773 if (cookie)
774 free(cookie);
775
797 aim_freetlvchain(&tlvlist); 776 aim_freetlvchain(&tlvlist);
798 777
799 return ret; 778 return ret;
800 } 779 }
801 780
827 struct command_rx_struct *command) 806 struct command_rx_struct *command)
828 { 807 {
829 struct aim_tlvlist_t *tlvlist; 808 struct aim_tlvlist_t *tlvlist;
830 char *msg = NULL; 809 char *msg = NULL;
831 unsigned short code = 0; 810 unsigned short code = 0;
832 struct aim_tlv_t *tmptlv;
833 rxcallback_t userfunc = NULL; 811 rxcallback_t userfunc = NULL;
834 int ret = 1; 812 int ret = 1;
835 813
836 tlvlist = aim_readtlvchain(command->data, command->commandlen); 814 tlvlist = aim_readtlvchain(command->data, command->commandlen);
837 815
838 if ((tmptlv = aim_gettlv(tlvlist, 0x0009, 1))) 816 if (aim_gettlv(tlvlist, 0x0009, 1))
839 code = aimutil_get16(tmptlv->value); 817 code = aim_gettlv16(tlvlist, 0x0009, 1);
840 818
841 if ((tmptlv = aim_gettlv(tlvlist, 0x000b, 1))) 819 if (aim_gettlv(tlvlist, 0x000b, 1))
842 msg = aim_gettlv_str(tlvlist, 0x000b, 1); 820 msg = aim_gettlv_str(tlvlist, 0x000b, 1);
843 821
844 userfunc = aim_callhandler(command->conn, 822 if ((userfunc = aim_callhandler(command->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR)))
845 AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR);
846 if (userfunc)
847 ret = userfunc(sess, command, code, msg); 823 ret = userfunc(sess, command, code, msg);
848 824
849 aim_freetlvchain(&tlvlist); 825 aim_freetlvchain(&tlvlist);
850 free(msg); 826
827 if (msg)
828 free(msg);
851 829
852 return ret; 830 return ret;
853 } 831 }
854 832
855 /* 833 /*