4 static int directim_incoming(aim_session_t *sess, aim_frame_t *fr, ...)
10 sn = va_arg(ap, char *);
11 msg = va_arg(ap, char *);
14 dvprintf("faimtest: Directim from %s: %s\n", sn, msg);
16 if (strstr(msg, "sendmsg")) {
19 i = atoi(strstr(msg, "sendmsg")+8);
25 for (z = 0; z < i; z++)
26 newbuf[z] = (z % 10)+0x30;
28 aim_send_im_direct(sess, fr->conn, newbuf);
32 } else if (strstr(msg, "goodday")) {
34 aim_send_im_direct(sess, fr->conn, "Good day to you, too");
39 snprintf(newmsg, sizeof(newmsg), "unknown (%s)\n", msg);
40 aim_send_im_direct(sess, fr->conn, newmsg);
46 static int directim_typing(aim_session_t *sess, aim_frame_t *fr, ...)
52 sn = va_arg(ap, char *);
55 dvprintf("faimtest: ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn);
60 static int faimtest_directim_initiate(aim_session_t *sess, aim_frame_t *fr, ...)
63 aim_conn_t *newconn, *listenerconn;
66 newconn = va_arg(ap, aim_conn_t *);
67 listenerconn = va_arg(ap, aim_conn_t *);
70 aim_conn_close(listenerconn);
71 aim_conn_kill(sess, &listenerconn);
73 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, directim_incoming, 0);
74 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, directim_typing, 0);
76 aim_send_im_direct(sess, newconn, "goodday");
78 dvprintf("faimtest: OFT: DirectIM: connected to %s\n", aim_directim_getsn(newconn));
83 static int faimtest_getfile_filereq(aim_session_t *ses, aim_frame_t *fr, ...)
87 struct aim_fileheader_t *fh;
91 oftconn = va_arg(ap, aim_conn_t *);
92 fh = va_arg(ap, struct aim_fileheader_t *);
93 cookie = va_arg(ap, fu8_t *);
96 dvprintf("faimtest: request for file %s.\n", fh->name);
101 static int faimtest_getfile_filesend(aim_session_t *sess, aim_frame_t *fr, ...)
103 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
106 struct aim_fileheader_t *fh;
109 int pos, bufpos = 0, bufsize = 2048, i;
114 oftconn = va_arg(ap, aim_conn_t *);
115 fh = va_arg(ap, struct aim_fileheader_t *);
116 cookie = va_arg(ap, fu8_t *);
119 dvprintf("faimtest: sending file %s(%ld).\n", fh->name, fh->size);
121 if (!(buf = malloc(2048)))
124 if (!(path = (char *)calloc(1, strlen(priv->listingpath) +strlen(fh->name)+2))) {
126 dprintf("faimtest: error in calloc of path\n");
128 return 0; /* XXX: no idea what winaim expects here =) */
131 snprintf(path, strlen(priv->listingpath)+strlen(fh->name)+2, "%s/%s", priv->listingpath, fh->name);
133 if (!(file = fopen(path, "r"))) {
134 dvprintf("faimtest: getfile_send fopen failed for %s. damn.\n", path);
139 * This is a mess. Remember that faimtest is demonstration code
140 * only and for the sake of the gods, don't use this code in any
141 * of your clients. --mid
143 for(pos = 0; pos < fh->size; pos++) {
145 bufpos = pos % bufsize;
147 if (bufpos == 0 && pos > 0) { /* filled our buffer. spit it across the wire */
148 if ( (i = send(oftconn->fd, buf, bufsize, 0)) != bufsize ) {
149 dperror("faim: getfile_send: write1");
150 dprintf("faim: getfile_send: whoopsy, didn't write it all...\n");
156 if( (buf[bufpos] = fgetc(file)) == EOF) {
157 if(pos != fh->size) {
158 dvprintf("faim: getfile_send: hrm... apparent early EOF at pos 0x%x of 0x%lx\n", pos, fh->size);
163 dvprintf("%c(0x%02x) ", buf[pos], buf[pos]);
166 if( (i = send(oftconn->fd, buf, bufpos+1, 0)) != (bufpos+1)) {
167 dperror("faim: getfile_send: write2");
168 dprintf("faim: getfile_send cleanup: whoopsy, didn't write it all...\n");
179 static int faimtest_getfile_complete(aim_session_t *sess, aim_frame_t *fr, ...)
183 struct aim_fileheader_t *fh;
186 conn = va_arg(ap, aim_conn_t *);
187 fh = va_arg(ap, struct aim_fileheader_t *);
190 dvprintf("faimtest: completed file transfer for %s.\n", fh->name);
192 aim_conn_close(conn);
193 aim_conn_kill(sess, &conn);
198 static int faimtest_getfile_disconnect(aim_session_t *sess, aim_frame_t *fr, ...)
205 conn = va_arg(ap, aim_conn_t *);
206 sn = va_arg(ap, char *);
209 aim_conn_kill(sess, &conn);
211 dvprintf("faimtest: getfile: disconnected from %s\n", sn);
216 static int faimtest_getfile_listing(aim_session_t *sess, aim_frame_t *fr, ...)
221 struct aim_filetransfer_priv *ft;
222 char *filename, *nameend, *sizec;
223 int filesize, namelen;
226 conn = va_arg(ap, aim_conn_t *);
227 ft = va_arg(ap, struct aim_filetransfer_priv *);
228 listing = va_arg(ap, char *);
231 dvprintf("listing on %d==================\n%s\n===========\n", conn->fd, listing);
233 nameend = strstr(listing+0x1a, "\r");
235 namelen = nameend - (listing + 0x1a);
237 filename = malloc(namelen + 1);
238 strncpy(filename, listing+0x1a, namelen);
239 filename[namelen] = 0x00;
242 memcpy(sizec, listing + 0x11, 8);
245 filesize = strtol(sizec, (char **)NULL, 10);
247 dvprintf("faimtest: requesting %d %s(%d long)\n", namelen, filename, filesize);
249 aim_oft_getfile_request(sess, conn, filename, filesize);
257 static int faimtest_getfile_listingreq(aim_session_t *sess, aim_frame_t *fr, ...)
259 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
262 struct aim_fileheader_t *fh;
263 int pos, bufpos = 0, bufsize = 2048, i;
267 oftconn = va_arg(ap, aim_conn_t *);
268 fh = va_arg(ap, struct aim_fileheader_t *);
271 dvprintf("faimtest: sending listing of size %ld\n", fh->size);
273 if(!(buf = malloc(2048)))
276 for(pos = 0; pos < fh->size; pos++) {
278 bufpos = pos % bufsize;
280 if(bufpos == 0 && pos > 0) { /* filled our buffer. spit it across the wire */
281 if ( (i = send(oftconn->fd, buf, bufsize, 0)) != bufsize ) {
282 dperror("faim: getfile_send: write1");
283 dprintf("faim: getfile_send: whoopsy, didn't write it all...\n");
288 if( (buf[bufpos] = fgetc(priv->listingfile)) == EOF) {
289 if(pos != fh->size) {
290 dvprintf("faim: getfile_send: hrm... apparent early EOF at pos 0x%x of 0x%lx\n", pos, fh->size);
297 if( (i = send(oftconn->fd, buf, bufpos+1, 0)) != (bufpos+1)) {
298 dperror("faim: getfile_send: write2");
299 dprintf("faim: getfile_send cleanup: whoopsy, didn't write it all...\n");
304 dprintf("faimtest: sent listing\n");
310 static int faimtest_getfile_receive(aim_session_t *sess, aim_frame_t *fr, ...)
314 struct aim_filetransfer_priv *ft;
319 conn = va_arg(ap, aim_conn_t *);
320 ft = va_arg(ap, struct aim_filetransfer_priv *);
323 dvprintf("faimtest: receiving %ld bytes of file data for %s:\n\t", ft->fh.size, ft->fh.name);
325 for(pos = 0; pos < ft->fh.size; pos++) {
326 read(conn->fd, &data, 1);
327 printf("%c(%02x) ", data, data);
332 aim_oft_getfile_end(sess, conn);
337 static int faimtest_getfile_state4(aim_session_t *sess, aim_frame_t *fr, ...)
343 conn = va_arg(ap, aim_conn_t *);
346 aim_conn_close(conn);
347 aim_conn_kill(sess, &conn);
352 static int faimtest_getfile_initiate(aim_session_t *sess, aim_frame_t *fr, ...)
355 aim_conn_t *conn, *listenerconn;
356 struct aim_filetransfer_priv *priv;
359 conn = va_arg(ap, aim_conn_t *);
360 listenerconn = va_arg(ap, aim_conn_t *);
363 aim_conn_close(listenerconn);
364 aim_conn_kill(sess, &listenerconn);
366 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ, faimtest_getfile_filereq, 0);
367 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND, faimtest_getfile_filesend, 0);
368 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE, faimtest_getfile_complete, 0);
369 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT, faimtest_getfile_disconnect, 0);
370 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTING, faimtest_getfile_listing, 0);
371 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGREQ, faimtest_getfile_listingreq, 0);
372 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILERECEIVE, faimtest_getfile_receive, 0);
373 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILESTATE4, faimtest_getfile_state4, 0);
375 priv = (struct aim_filetransfer_priv *)conn->priv;
377 dvprintf("faimtest: getfile: %s (%s) connected to us on %d\n", priv->sn, priv->ip, conn->fd);
382 void getfile_start(aim_session_t *sess, aim_conn_t *conn, const char *sn)
386 newconn = aim_getfile_initiate(sess, conn, sn);
387 dvprintf("faimtest: getting file listing from %s\n", sn);
388 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEINITIATE, faimtest_getfile_initiate,0);
393 void getfile_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
395 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
397 struct aim_fileheader_t *fh;
399 dvprintf("faimtest: get file request from %s (at %s) %x\n", userinfo->sn, args->info.getfile.ip, args->reqclass);
401 fh = aim_getlisting(sess, priv->listingfile);
403 newconn = aim_accepttransfer(sess, conn, userinfo->sn, args->info.getfile.cookie, args->info.getfile.ip, fh->totfiles, fh->totsize, fh->size, fh->checksum, args->reqclass);
407 if ( (!newconn) || (newconn->fd == -1) ) {
409 dprintf("faimtest: getfile: requestconn: apparent error in accepttransfer\n");
412 aim_conn_kill(sess, &newconn);
418 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGREQ, faimtest_getfile_listingreq, 0);
419 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ, faimtest_getfile_filereq, 0);
420 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND, faimtest_getfile_filesend, 0);
421 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE, faimtest_getfile_complete, 0);
423 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT, faimtest_getfile_disconnect, 0);
425 dprintf("faimtest: getfile connect succeeded, handlers added.\n");
430 void directim_start(aim_session_t *sess, aim_conn_t *conn, const char *sn)
434 printf("faimtest: opening directim to %s\n", sn);
436 newconn = aim_directim_initiate(sess, conn, sn);
438 if (!newconn || (newconn->fd == -1)) {
440 printf("connection failed!\n");
443 aim_conn_kill(sess, &newconn);
446 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINITIATE, faimtest_directim_initiate, 0);
451 void directim_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
455 dvprintf("faimtest: OFT: DirectIM: request from %s (%s)\n", userinfo->sn, args->info.imimage.ip);
457 newconn = aim_directim_connect(sess, userinfo->sn, args->info.imimage.ip, args->cookie);
459 if (!newconn || (newconn->fd == -1)) {
461 dprintf("faimtest: icbm: imimage: could not connect\n");
464 aim_conn_kill(sess, &newconn);
468 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, directim_incoming, 0);
469 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, directim_typing, 0);
471 dvprintf("faimtest: OFT: DirectIM: connected to %s\n", userinfo->sn);
473 aim_send_im_direct(sess, newconn, "goodday");