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