]>
Commit | Line | Data |
---|---|---|
d410cf58 | 1 | |
2 | #include "faimtest.h" | |
3 | ||
4 | static int faimtest_chat_join(aim_session_t *sess, aim_frame_t *fr, ...) | |
5 | { | |
6 | va_list ap; | |
7b0bc7f2 | 7 | aim_userinfo_t *userinfo; |
d410cf58 | 8 | int count, i; |
9 | ||
10 | va_start(ap, fr); | |
11 | count = va_arg(ap, int); | |
7b0bc7f2 | 12 | userinfo = va_arg(ap, aim_userinfo_t *); |
d410cf58 | 13 | va_end(ap); |
14 | ||
15 | dvprintf("faimtest: chat: %s: New occupants have joined:\n", (char *)fr->conn->priv); | |
16 | for (i = 0; i < count; i++) | |
17 | dvprintf("faimtest: chat: %s: \t%s\n", (char *)fr->conn->priv, userinfo[i].sn); | |
18 | ||
19 | return 1; | |
20 | } | |
21 | ||
22 | static int faimtest_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...) | |
23 | { | |
24 | va_list ap; | |
7b0bc7f2 | 25 | aim_userinfo_t *userinfo; |
d410cf58 | 26 | int count , i; |
27 | ||
28 | va_start(ap, fr); | |
29 | count = va_arg(ap, int); | |
7b0bc7f2 | 30 | userinfo = va_arg(ap, aim_userinfo_t *); |
d410cf58 | 31 | va_end(ap); |
32 | ||
33 | dvprintf("faimtest: chat: %s: Some occupants have left:\n", (char *)fr->conn->priv); | |
34 | ||
35 | for (i = 0; i < count; i++) | |
36 | dvprintf("faimtest: chat: %s: \t%s\n", (char *)fr->conn->priv, userinfo[i].sn); | |
37 | ||
38 | return 1; | |
39 | } | |
40 | ||
41 | static int faimtest_chat_infoupdate(aim_session_t *sess, aim_frame_t *fr, ...) | |
42 | { | |
43 | va_list ap; | |
7b0bc7f2 | 44 | aim_userinfo_t *userinfo; |
d410cf58 | 45 | struct aim_chat_roominfo *roominfo; |
46 | char *roomname; | |
47 | int usercount, i; | |
48 | char *roomdesc; | |
49 | fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen; | |
50 | fu32_t creationtime; | |
51 | const char *croomname = (const char *)fr->conn->priv; | |
52 | ||
53 | va_start(ap, fr); | |
54 | roominfo = va_arg(ap, struct aim_chat_roominfo *); | |
55 | roomname = va_arg(ap, char *); | |
56 | usercount = va_arg(ap, int); | |
7b0bc7f2 | 57 | userinfo = va_arg(ap, aim_userinfo_t *); |
d410cf58 | 58 | roomdesc = va_arg(ap, char *); |
36938f1e | 59 | unknown_c9 = (fu16_t)va_arg(ap, unsigned int); |
d410cf58 | 60 | creationtime = va_arg(ap, fu32_t); |
36938f1e | 61 | maxmsglen = (fu16_t)va_arg(ap, unsigned int); |
62 | unknown_d2 = (fu16_t)va_arg(ap, unsigned int); | |
63 | unknown_d5 = (fu16_t)va_arg(ap, unsigned int); | |
64 | maxvisiblemsglen = (fu16_t)va_arg(ap, unsigned int); | |
d410cf58 | 65 | va_end(ap); |
66 | ||
67 | dvprintf("faimtest: chat: %s: info update:\n", croomname); | |
68 | dvprintf("faimtest: chat: %s: \tRoominfo: {%04x, %s, %04x}\n", croomname, roominfo->exchange, roominfo->name, roominfo->instance); | |
69 | dvprintf("faimtest: chat: %s: \tRoomname: %s\n", croomname, roomname); | |
70 | dvprintf("faimtest: chat: %s: \tRoomdesc: %s\n", croomname, roomdesc); | |
71 | dvprintf("faimtest: chat: %s: \tOccupants: (%d)\n", croomname, usercount); | |
72 | ||
73 | for (i = 0; i < usercount; i++) | |
74 | dvprintf("faimtest: chat: %s: \t\t%s\n", croomname, userinfo[i].sn); | |
75 | ||
76 | dvprintf("faimtest: chat: %s: \tUnknown_c9: 0x%04x\n", croomname, unknown_c9); | |
77 | dvprintf("faimtest: chat: %s: \tCreation time: %lu (time_t)\n", croomname, creationtime); | |
78 | dvprintf("faimtest: chat: %s: \tUnknown_d2: 0x%04x\n", croomname, unknown_d2); | |
79 | dvprintf("faimtest: chat: %s: \tUnknown_d5: 0x%02x\n", croomname, unknown_d5); | |
80 | dvprintf("faimtest: chat: %s: \tMax message length: %d bytes\n", croomname, maxmsglen); | |
81 | dvprintf("faimtest: chat: %s: \tMax visible message length: %d bytes\n", croomname, maxvisiblemsglen); | |
82 | ||
83 | return 1; | |
84 | } | |
85 | ||
86 | static int faimtest_chat_incomingmsg(aim_session_t *sess, aim_frame_t *fr, ...) | |
87 | { | |
88 | va_list ap; | |
7b0bc7f2 | 89 | aim_userinfo_t *userinfo; |
d410cf58 | 90 | char *msg; |
91 | char tmpbuf[1152]; | |
92 | ||
93 | va_start(ap, fr); | |
7b0bc7f2 | 94 | userinfo = va_arg(ap, aim_userinfo_t *); |
d410cf58 | 95 | msg = va_arg(ap, char *); |
96 | va_end(ap); | |
97 | ||
98 | dvprintf("faimtest: chat: %s: incoming msg from %s: %s\n", (char *)fr->conn->priv, userinfo->sn, msg); | |
99 | ||
100 | /* | |
101 | * Do an echo for testing purposes. But not for ourselves ("oops!") | |
102 | */ | |
103 | if (strcmp(userinfo->sn, sess->sn) != 0) { | |
104 | sprintf(tmpbuf, "(%s said \"%s\")", userinfo->sn, msg); | |
105 | aim_chat_send_im(sess, fr->conn, 0, tmpbuf, strlen(tmpbuf)); | |
106 | } | |
107 | ||
108 | return 1; | |
109 | } | |
110 | ||
111 | static int faimtest_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...) | |
112 | { | |
113 | fu16_t type; | |
114 | va_list ap; | |
115 | ||
116 | va_start(ap, fr); | |
36938f1e | 117 | type = (fu16_t)va_arg(ap, unsigned int); |
d410cf58 | 118 | |
119 | if (type == 0x0002) { | |
120 | int maxrooms; | |
121 | struct aim_chat_exchangeinfo *exchanges; | |
122 | int exchangecount, i; | |
123 | ||
124 | maxrooms = va_arg(ap, int); | |
125 | exchangecount = va_arg(ap, int); | |
126 | exchanges = va_arg(ap, struct aim_chat_exchangeinfo *); | |
127 | va_end(ap); | |
128 | ||
129 | dprintf("faimtest: chat info: Chat Rights:\n"); | |
130 | dvprintf("faimtest: chat info: \tMax Concurrent Rooms: %d\n", maxrooms); | |
131 | ||
132 | dvprintf("faimtest: chat info: \tExchange List: (%d total)\n", exchangecount); | |
133 | for (i = 0; i < exchangecount; i++) { | |
134 | dvprintf("faimtest: chat info: \t\t%x: %s (%s/%s)\n", | |
135 | exchanges[i].number, | |
136 | exchanges[i].name, | |
137 | exchanges[i].charset1, | |
138 | exchanges[i].lang1); | |
139 | } | |
140 | ||
141 | } else if (type == 0x0008) { | |
142 | char *fqcn, *name, *ck; | |
143 | fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange; | |
144 | fu8_t createperms; | |
145 | fu32_t createtime; | |
146 | ||
147 | fqcn = va_arg(ap, char *); | |
36938f1e | 148 | instance = (fu16_t)va_arg(ap, unsigned int); |
149 | exchange = (fu16_t)va_arg(ap, unsigned int); | |
150 | flags = (fu16_t)va_arg(ap, unsigned int); | |
d410cf58 | 151 | createtime = va_arg(ap, fu32_t); |
36938f1e | 152 | maxmsglen = (fu16_t)va_arg(ap, unsigned int); |
153 | maxoccupancy = (fu16_t)va_arg(ap, unsigned int); | |
154 | createperms = (fu8_t)va_arg(ap, unsigned int); | |
155 | unknown = (fu16_t)va_arg(ap, unsigned int); | |
d410cf58 | 156 | name = va_arg(ap, char *); |
157 | ck = va_arg(ap, char *); | |
158 | va_end(ap); | |
159 | ||
160 | dvprintf("faimtest: received room create reply for %s/0x%04x\n", fqcn, exchange); | |
161 | ||
162 | } else { | |
163 | va_end(ap); | |
164 | dvprintf("faimtest: chatnav info: unknown type (%04x)\n", type); | |
165 | } | |
166 | ||
167 | return 1; | |
168 | } | |
169 | ||
170 | static int chat_serverready(aim_session_t *sess, aim_frame_t *fr, ...) | |
171 | { | |
172 | int famcount, i; | |
173 | fu16_t *families; | |
174 | va_list ap; | |
175 | ||
176 | va_start(ap, fr); | |
177 | famcount = va_arg(ap, int); | |
178 | families = va_arg(ap, fu16_t *); | |
179 | va_end(ap); | |
180 | ||
181 | dvprintf("chat: SNAC families supported by this host (type %d): ", fr->conn->type); | |
182 | for (i = 0; i < famcount; i++) | |
183 | dvinlineprintf("0x%04x ", families[i]); | |
184 | dinlineprintf("\n"); | |
185 | ||
186 | if (fr->conn->type == AIM_CONN_TYPE_CHATNAV) { | |
187 | ||
188 | dprintf("chatnav got server ready\n"); | |
189 | ||
190 | aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CTN, AIM_CB_CTN_INFO, faimtest_chatnav_info, 0); | |
191 | aim_bos_reqrate(sess, fr->conn); | |
192 | aim_bos_ackrateresp(sess, fr->conn); | |
193 | aim_chatnav_clientready(sess, fr->conn); | |
194 | aim_chatnav_reqrights(sess, fr->conn); | |
195 | ||
196 | } else if (fr->conn->type == AIM_CONN_TYPE_CHAT) { | |
197 | ||
198 | dprintf("chat got server ready\n"); | |
199 | ||
200 | aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERJOIN, faimtest_chat_join, 0); | |
201 | aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_USERLEAVE, faimtest_chat_leave, 0); | |
202 | aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_ROOMINFOUPDATE, faimtest_chat_infoupdate, 0); | |
203 | aim_conn_addhandler(sess, fr->conn, AIM_CB_FAM_CHT, AIM_CB_CHT_INCOMINGMSG, faimtest_chat_incomingmsg, 0); | |
204 | aim_bos_reqrate(sess, fr->conn); | |
205 | aim_bos_ackrateresp(sess, fr->conn); | |
206 | aim_chat_clientready(sess, fr->conn); | |
207 | } | |
208 | ||
209 | return 1; | |
210 | } | |
211 | ||
212 | void chatnav_redirect(aim_session_t *sess, const char *ip, const fu8_t *cookie) | |
213 | { | |
214 | aim_conn_t *tstconn; | |
215 | ||
216 | tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHATNAV, ip); | |
217 | if (!tstconn || (tstconn->status & AIM_CONN_STATUS_RESOLVERR)) { | |
218 | dprintf("faimtest: unable to connect to chat(nav) server\n"); | |
219 | if (tstconn) | |
220 | aim_conn_kill(sess, &tstconn); | |
221 | return; | |
222 | } | |
223 | ||
224 | aim_conn_addhandler(sess, tstconn, 0x0001, 0x0003, chat_serverready, 0); | |
225 | aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0); | |
226 | aim_auth_sendcookie(sess, tstconn, cookie); | |
227 | ||
228 | dprintf("chatnav: connected\n"); | |
229 | ||
230 | return; | |
231 | } | |
232 | ||
233 | /* XXX this needs instance too */ | |
234 | void chat_redirect(aim_session_t *sess, const char *ip, const fu8_t *cookie, const char *roomname, fu16_t exchange) | |
235 | { | |
236 | aim_conn_t *tstconn; | |
237 | ||
238 | tstconn = aim_newconn(sess, AIM_CONN_TYPE_CHAT, ip); | |
239 | if (!tstconn || (tstconn->status & AIM_CONN_STATUS_RESOLVERR)) { | |
240 | dprintf("faimtest: unable to connect to chat server\n"); | |
241 | if (tstconn) | |
242 | aim_conn_kill(sess, &tstconn); | |
243 | return; | |
244 | } | |
245 | dvprintf("faimtest: chat: connected to %s on exchange %d\n", roomname, exchange); | |
246 | ||
247 | /* | |
248 | * We must do this to attach the stored name to the connection! | |
249 | */ | |
250 | aim_chat_attachname(tstconn, roomname); | |
251 | ||
252 | aim_conn_addhandler(sess, tstconn, 0x0001, 0x0003, chat_serverready, 0); | |
253 | aim_conn_addhandler(sess, tstconn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNCOMPLETE, faimtest_conncomplete, 0); | |
254 | aim_auth_sendcookie(sess, tstconn, cookie); | |
255 | ||
256 | return; | |
257 | } | |
258 | ||
259 | ||
260 |