comparison src/protocols/oscar/service.c @ 2821:9467e4ee81be

[gaim-migrate @ 2834] new libfaim stuff. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Sat, 01 Dec 2001 00:56:31 +0000
parents 9fc65bb80596
children 6d62d4520460
comparison
equal deleted inserted replaced
2820:b917845dad3c 2821:9467e4ee81be
98 } 98 }
99 99
100 /* Redirect (group 1, type 5) */ 100 /* Redirect (group 1, type 5) */
101 static int redirect(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs) 101 static int redirect(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
102 { 102 {
103 int serviceid; 103 struct aim_redirect_data redir;
104 fu8_t *cookie;
105 char *ip;
106 aim_rxcallback_t userfunc; 104 aim_rxcallback_t userfunc;
107 aim_tlvlist_t *tlvlist; 105 aim_tlvlist_t *tlvlist;
108 char *chathack = NULL; 106 aim_snac_t *origsnac = NULL;
109 int chathackex = 0;
110 int ret = 0; 107 int ret = 0;
108
109 memset(&redir, 0, sizeof(redir));
111 110
112 tlvlist = aim_readtlvchain(bs); 111 tlvlist = aim_readtlvchain(bs);
113 112
114 if (!aim_gettlv(tlvlist, 0x000d, 1) || 113 if (!aim_gettlv(tlvlist, 0x000d, 1) ||
115 !aim_gettlv(tlvlist, 0x0005, 1) || 114 !aim_gettlv(tlvlist, 0x0005, 1) ||
116 !aim_gettlv(tlvlist, 0x0006, 1)) { 115 !aim_gettlv(tlvlist, 0x0006, 1)) {
117 aim_freetlvchain(&tlvlist); 116 aim_freetlvchain(&tlvlist);
118 return 0; 117 return 0;
119 } 118 }
120 119
121 serviceid = aim_gettlv16(tlvlist, 0x000d, 1); 120 redir.group = aim_gettlv16(tlvlist, 0x000d, 1);
122 ip = aim_gettlv_str(tlvlist, 0x0005, 1); 121 redir.ip = aim_gettlv_str(tlvlist, 0x0005, 1);
123 cookie = aim_gettlv_str(tlvlist, 0x0006, 1); 122 redir.cookie = aim_gettlv_str(tlvlist, 0x0006, 1);
124 123
125 /* 124 /* Fetch original SNAC so we can get csi if needed */
126 * Chat hack. 125 origsnac = aim_remsnac(sess, snac->id);
127 */ 126
128 if ((serviceid == AIM_CONN_TYPE_CHAT) && sess->pendingjoin) { 127 if ((redir.group == AIM_CONN_TYPE_CHAT) && origsnac) {
129 chathack = sess->pendingjoin; 128 struct chatsnacinfo *csi = (struct chatsnacinfo *)origsnac->data;
130 chathackex = sess->pendingjoinexchange; 129
131 sess->pendingjoin = NULL; 130 redir.chat.exchange = csi->exchange;
132 sess->pendingjoinexchange = 0; 131 redir.chat.room = csi->name;
132 redir.chat.instance = csi->instance;
133 } 133 }
134 134
135 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) 135 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
136 ret = userfunc(sess, rx, serviceid, ip, cookie, chathack, chathackex); 136 ret = userfunc(sess, rx, &redir);
137 137
138 free(ip); 138 free((void *)redir.ip);
139 free(cookie); 139 free((void *)redir.cookie);
140 free(chathack); 140
141 if (origsnac)
142 free(origsnac->data);
143 free(origsnac);
141 144
142 aim_freetlvchain(&tlvlist); 145 aim_freetlvchain(&tlvlist);
143 146
144 return ret; 147 return ret;
145 } 148 }