4 static int faimtest_chat_join(aim_session_t *sess, aim_frame_t *fr, ...)
7 struct aim_userinfo_s *userinfo;
11 count = va_arg(ap, int);
12 userinfo = va_arg(ap, struct aim_userinfo_s *);
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);
22 static int faimtest_chat_leave(aim_session_t *sess, aim_frame_t *fr, ...)
25 struct aim_userinfo_s *userinfo;
29 count = va_arg(ap, int);
30 userinfo = va_arg(ap, struct aim_userinfo_s *);
33 dvprintf("faimtest: chat: %s: Some occupants have left:\n", (char *)fr->conn->priv);
35 for (i = 0; i < count; i++)
36 dvprintf("faimtest: chat: %s: \t%s\n", (char *)fr->conn->priv, userinfo[i].sn);
41 static int faimtest_chat_infoupdate(aim_session_t *sess, aim_frame_t *fr, ...)
44 struct aim_userinfo_s *userinfo;
45 struct aim_chat_roominfo *roominfo;
49 fu16_t unknown_c9, unknown_d2, unknown_d5, maxmsglen, maxvisiblemsglen;
51 const char *croomname = (const char *)fr->conn->priv;
54 roominfo = va_arg(ap, struct aim_chat_roominfo *);
55 roomname = va_arg(ap, char *);
56 usercount = va_arg(ap, int);
57 userinfo = va_arg(ap, struct aim_userinfo_s *);
58 roomdesc = va_arg(ap, char *);
59 unknown_c9 = (fu16_t)va_arg(ap, unsigned int);
60 creationtime = va_arg(ap, fu32_t);
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);
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);
73 for (i = 0; i < usercount; i++)
74 dvprintf("faimtest: chat: %s: \t\t%s\n", croomname, userinfo[i].sn);
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);
86 static int faimtest_chat_incomingmsg(aim_session_t *sess, aim_frame_t *fr, ...)
89 struct aim_userinfo_s *userinfo;
94 userinfo = va_arg(ap, struct aim_userinfo_s *);
95 msg = va_arg(ap, char *);
98 dvprintf("faimtest: chat: %s: incoming msg from %s: %s\n", (char *)fr->conn->priv, userinfo->sn, msg);
101 * Do an echo for testing purposes. But not for ourselves ("oops!")
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));
111 static int faimtest_chatnav_info(aim_session_t *sess, aim_frame_t *fr, ...)
117 type = (fu16_t)va_arg(ap, unsigned int);
119 if (type == 0x0002) {
121 struct aim_chat_exchangeinfo *exchanges;
122 int exchangecount, i;
124 maxrooms = va_arg(ap, int);
125 exchangecount = va_arg(ap, int);
126 exchanges = va_arg(ap, struct aim_chat_exchangeinfo *);
129 dprintf("faimtest: chat info: Chat Rights:\n");
130 dvprintf("faimtest: chat info: \tMax Concurrent Rooms: %d\n", maxrooms);
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",
137 exchanges[i].charset1,
141 } else if (type == 0x0008) {
142 char *fqcn, *name, *ck;
143 fu16_t instance, flags, maxmsglen, maxoccupancy, unknown, exchange;
147 fqcn = va_arg(ap, char *);
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);
151 createtime = va_arg(ap, fu32_t);
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);
156 name = va_arg(ap, char *);
157 ck = va_arg(ap, char *);
160 dvprintf("faimtest: received room create reply for %s/0x%04x\n", fqcn, exchange);
164 dvprintf("faimtest: chatnav info: unknown type (%04x)\n", type);
170 static int chat_serverready(aim_session_t *sess, aim_frame_t *fr, ...)
177 famcount = va_arg(ap, int);
178 families = va_arg(ap, fu16_t *);
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]);
186 if (fr->conn->type == AIM_CONN_TYPE_CHATNAV) {
188 dprintf("chatnav got server ready\n");
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);
196 } else if (fr->conn->type == AIM_CONN_TYPE_CHAT) {
198 dprintf("chat got server ready\n");
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);
212 void chatnav_redirect(aim_session_t *sess, const char *ip, const fu8_t *cookie)
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");
220 aim_conn_kill(sess, &tstconn);
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);
228 dprintf("chatnav: connected\n");
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)
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");
242 aim_conn_kill(sess, &tstconn);
245 dvprintf("faimtest: chat: connected to %s on exchange %d\n", roomname, exchange);
248 * We must do this to attach the stored name to the connection!
250 aim_chat_attachname(tstconn, roomname);
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);