]> andersk Git - libfaim.git/blame - utils/faimtest/chat.c
- Wed Oct 3 11:07:22 PDT 2001
[libfaim.git] / utils / faimtest / chat.c
CommitLineData
d410cf58 1
2#include "faimtest.h"
3
4static 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
22static 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
41static 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
86static 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
111static 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
170static 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
212void 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 */
234void 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
This page took 0.256089 seconds and 5 git commands to generate.