]> andersk Git - libfaim.git/blob - utils/faimtest/chat.c
e9a5f8009e67e2f3cb32b7c0c20ef86fa0bb2198
[libfaim.git] / utils / faimtest / chat.c
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;
7         struct aim_userinfo_s *userinfo;
8         int count, i;
9
10         va_start(ap, fr);
11         count = va_arg(ap, int);
12         userinfo = va_arg(ap, struct aim_userinfo_s *);
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;
25         struct aim_userinfo_s *userinfo;
26         int count , i;
27
28         va_start(ap, fr);
29         count = va_arg(ap, int);
30         userinfo = va_arg(ap, struct aim_userinfo_s *);
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;
44         struct aim_userinfo_s *userinfo;
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);
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);
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;
89         struct aim_userinfo_s *userinfo;
90         char *msg;
91         char tmpbuf[1152];
92
93         va_start(ap, fr);
94         userinfo = va_arg(ap, struct aim_userinfo_s *); 
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);
117         type = (fu16_t)va_arg(ap, unsigned int);
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 *);
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 *);
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
This page took 0.08063 seconds and 3 git commands to generate.