4 static int faimtest_directim_connect(aim_session_t *sess, aim_frame_t *fr, ...)
7 struct aim_directim_priv *priv;
10 priv = va_arg(ap, struct aim_directim_priv *);
14 dprintf("faimtest: directim_connect\n");
19 static int faimtest_directim_incoming(aim_session_t *sess, aim_frame_t *fr, ...)
24 struct aim_directim_priv *priv;
27 conn = va_arg(ap, aim_conn_t *);
28 msg = va_arg(ap, char *);
31 if (!(priv = conn->priv)) {
32 dvprintf("faimtest: directim: no private struct on conn with fd %d\n", conn->fd);
36 dvprintf("faimtest: Directim from %s: %s\n", priv->sn, msg);
38 if (!strncmp(msg, "sendmsg", 7)) {
47 for (z = 0; z < i; z++)
48 newbuf[z] = (z % 10)+0x30;
50 aim_send_im_direct(sess, conn, newbuf);
54 } else if (!strncmp(msg, "goodday", 7)) {
56 aim_send_im_direct(sess, conn, "Good day to you, too");
61 snprintf(newmsg, sizeof(newmsg), "unknown (%s)\n", msg);
62 aim_send_im_direct(sess, conn, newmsg);
68 static int faimtest_directim_disconnect(aim_session_t *sess, aim_frame_t *fr, ...)
75 conn = va_arg(ap, aim_conn_t *);
76 sn = va_arg(ap, char *);
79 dvprintf("faimtest: directim: disconnected from %s\n", sn);
81 aim_conn_kill(sess, &conn);
86 static int faimtest_directim_typing(aim_session_t *sess, aim_frame_t *fr, ...)
90 struct aim_directim_priv *priv;
93 conn = va_arg(ap, aim_conn_t *);
96 if (!(priv = (struct aim_directim_priv *)conn->priv)) {
97 dvprintf("faimtest: no private struct on conn with fd %d!\n", conn->fd);
101 dvprintf("faimtest: ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", priv->sn);
106 static int faimtest_directim_initiate(aim_session_t *sess, aim_frame_t *fr, ...)
109 struct aim_directim_priv *priv;
110 aim_conn_t *newconn, *listenerconn;
113 newconn = va_arg(ap, aim_conn_t *);
114 listenerconn = va_arg(ap, aim_conn_t *);
117 aim_conn_close(listenerconn);
118 aim_conn_kill(sess, &listenerconn);
120 priv = (struct aim_directim_priv *)newconn->priv;
122 dvprintf("faimtest: OFT: DirectIM: intitiate success to %s\n", priv->ip);
124 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, faimtest_directim_incoming, 0);
125 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMDISCONNECT, faimtest_directim_disconnect, 0);
126 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, faimtest_directim_typing, 0);
128 aim_send_im_direct(sess, newconn, "goodday");
130 dvprintf("faimtest: OFT: DirectIM: connected to %s\n", priv->sn);
135 static int faimtest_getfile_filereq(aim_session_t *ses, aim_frame_t *fr, ...)
139 struct aim_fileheader_t *fh;
143 oftconn = va_arg(ap, aim_conn_t *);
144 fh = va_arg(ap, struct aim_fileheader_t *);
145 cookie = va_arg(ap, fu8_t *);
148 dvprintf("faimtest: request for file %s.\n", fh->name);
153 static int faimtest_getfile_filesend(aim_session_t *sess, aim_frame_t *fr, ...)
155 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
158 struct aim_fileheader_t *fh;
161 int pos, bufpos = 0, bufsize = 2048, i;
166 oftconn = va_arg(ap, aim_conn_t *);
167 fh = va_arg(ap, struct aim_fileheader_t *);
168 cookie = va_arg(ap, fu8_t *);
171 dvprintf("faimtest: sending file %s(%ld).\n", fh->name, fh->size);
173 if (!(buf = malloc(2048)))
176 if (!(path = (char *)calloc(1, strlen(priv->listingpath) +strlen(fh->name)+2))) {
178 dprintf("faimtest: error in calloc of path\n");
180 return 0; /* XXX: no idea what winaim expects here =) */
183 snprintf(path, strlen(priv->listingpath)+strlen(fh->name)+2, "%s/%s", priv->listingpath, fh->name);
185 if (!(file = fopen(path, "r"))) {
186 dvprintf("faimtest: getfile_send fopen failed for %s. damn.\n", path);
191 * This is a mess. Remember that faimtest is demonstration code
192 * only and for the sake of the gods, don't use this code in any
193 * of your clients. --mid
195 for(pos = 0; pos < fh->size; pos++) {
197 bufpos = pos % bufsize;
199 if (bufpos == 0 && pos > 0) { /* filled our buffer. spit it across the wire */
200 if ( (i = send(oftconn->fd, buf, bufsize, 0)) != bufsize ) {
201 dperror("faim: getfile_send: write1");
202 dprintf("faim: getfile_send: whoopsy, didn't write it all...\n");
208 if( (buf[bufpos] = fgetc(file)) == EOF) {
209 if(pos != fh->size) {
210 dvprintf("faim: getfile_send: hrm... apparent early EOF at pos 0x%x of 0x%lx\n", pos, fh->size);
215 dvprintf("%c(0x%02x) ", buf[pos], buf[pos]);
218 if( (i = send(oftconn->fd, buf, bufpos+1, 0)) != (bufpos+1)) {
219 dperror("faim: getfile_send: write2");
220 dprintf("faim: getfile_send cleanup: whoopsy, didn't write it all...\n");
231 static int faimtest_getfile_complete(aim_session_t *sess, aim_frame_t *fr, ...)
235 struct aim_fileheader_t *fh;
238 conn = va_arg(ap, aim_conn_t *);
239 fh = va_arg(ap, struct aim_fileheader_t *);
242 dvprintf("faimtest: completed file transfer for %s.\n", fh->name);
244 aim_conn_close(conn);
245 aim_conn_kill(sess, &conn);
250 static int faimtest_getfile_disconnect(aim_session_t *sess, aim_frame_t *fr, ...)
257 conn = va_arg(ap, aim_conn_t *);
258 sn = va_arg(ap, char *);
261 aim_conn_kill(sess, &conn);
263 dvprintf("faimtest: getfile: disconnected from %s\n", sn);
268 static int faimtest_getfile_listing(aim_session_t *sess, aim_frame_t *fr, ...)
273 struct aim_filetransfer_priv *ft;
274 char *filename, *nameend, *sizec;
275 int filesize, namelen;
278 conn = va_arg(ap, aim_conn_t *);
279 ft = va_arg(ap, struct aim_filetransfer_priv *);
280 listing = va_arg(ap, char *);
283 dvprintf("listing on %d==================\n%s\n===========\n", conn->fd, listing);
285 nameend = strstr(listing+0x1a, "\r");
287 namelen = nameend - (listing + 0x1a);
289 filename = malloc(namelen + 1);
290 strncpy(filename, listing+0x1a, namelen);
291 filename[namelen] = 0x00;
294 memcpy(sizec, listing + 0x11, 8);
297 filesize = strtol(sizec, (char **)NULL, 10);
299 dvprintf("faimtest: requesting %d %s(%d long)\n", namelen, filename, filesize);
301 aim_oft_getfile_request(sess, conn, filename, filesize);
309 static int faimtest_getfile_listingreq(aim_session_t *sess, aim_frame_t *fr, ...)
311 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
314 struct aim_fileheader_t *fh;
315 int pos, bufpos = 0, bufsize = 2048, i;
319 oftconn = va_arg(ap, aim_conn_t *);
320 fh = va_arg(ap, struct aim_fileheader_t *);
323 dvprintf("faimtest: sending listing of size %ld\n", fh->size);
325 if(!(buf = malloc(2048)))
328 for(pos = 0; pos < fh->size; pos++) {
330 bufpos = pos % bufsize;
332 if(bufpos == 0 && pos > 0) { /* filled our buffer. spit it across the wire */
333 if ( (i = send(oftconn->fd, buf, bufsize, 0)) != bufsize ) {
334 dperror("faim: getfile_send: write1");
335 dprintf("faim: getfile_send: whoopsy, didn't write it all...\n");
340 if( (buf[bufpos] = fgetc(priv->listingfile)) == EOF) {
341 if(pos != fh->size) {
342 dvprintf("faim: getfile_send: hrm... apparent early EOF at pos 0x%x of 0x%lx\n", pos, fh->size);
349 if( (i = send(oftconn->fd, buf, bufpos+1, 0)) != (bufpos+1)) {
350 dperror("faim: getfile_send: write2");
351 dprintf("faim: getfile_send cleanup: whoopsy, didn't write it all...\n");
356 dprintf("faimtest: sent listing\n");
362 static int faimtest_getfile_receive(aim_session_t *sess, aim_frame_t *fr, ...)
366 struct aim_filetransfer_priv *ft;
371 conn = va_arg(ap, aim_conn_t *);
372 ft = va_arg(ap, struct aim_filetransfer_priv *);
375 dvprintf("faimtest: receiving %ld bytes of file data for %s:\n\t", ft->fh.size, ft->fh.name);
377 for(pos = 0; pos < ft->fh.size; pos++) {
378 read(conn->fd, &data, 1);
379 printf("%c(%02x) ", data, data);
384 aim_oft_getfile_end(sess, conn);
389 static int faimtest_getfile_state4(aim_session_t *sess, aim_frame_t *fr, ...)
395 conn = va_arg(ap, aim_conn_t *);
398 aim_conn_close(conn);
399 aim_conn_kill(sess, &conn);
404 static int faimtest_getfile_initiate(aim_session_t *sess, aim_frame_t *fr, ...)
407 aim_conn_t *conn, *listenerconn;
408 struct aim_filetransfer_priv *priv;
411 conn = va_arg(ap, aim_conn_t *);
412 listenerconn = va_arg(ap, aim_conn_t *);
415 aim_conn_close(listenerconn);
416 aim_conn_kill(sess, &listenerconn);
418 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ, faimtest_getfile_filereq, 0);
419 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND, faimtest_getfile_filesend, 0);
420 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE, faimtest_getfile_complete, 0);
421 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT, faimtest_getfile_disconnect, 0);
422 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTING, faimtest_getfile_listing, 0);
423 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGREQ, faimtest_getfile_listingreq, 0);
424 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILERECEIVE, faimtest_getfile_receive, 0);
425 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILESTATE4, faimtest_getfile_state4, 0);
427 priv = (struct aim_filetransfer_priv *)conn->priv;
429 dvprintf("faimtest: getfile: %s (%s) connected to us on %d\n", priv->sn, priv->ip, conn->fd);
434 void getfile_start(aim_session_t *sess, aim_conn_t *conn, const char *sn)
438 newconn = aim_getfile_initiate(sess, conn, sn);
439 dvprintf("faimtest: getting file listing from %s\n", sn);
440 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEINITIATE, faimtest_getfile_initiate,0);
445 void getfile_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
447 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
449 struct aim_fileheader_t *fh;
451 dvprintf("faimtest: get file request from %s (at %s) %x\n", userinfo->sn, args->info.getfile.ip, args->reqclass);
453 fh = aim_getlisting(sess, priv->listingfile);
455 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);
459 if ( (!newconn) || (newconn->fd == -1) ) {
461 dprintf("faimtest: getfile: requestconn: apparent error in accepttransfer\n");
464 aim_conn_kill(sess, &newconn);
470 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGREQ, faimtest_getfile_listingreq, 0);
471 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ, faimtest_getfile_filereq, 0);
472 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND, faimtest_getfile_filesend, 0);
473 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE, faimtest_getfile_complete, 0);
475 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT, faimtest_getfile_disconnect, 0);
477 dprintf("faimtest: getfile connect succeeded, handlers added.\n");
482 void directim_start(aim_session_t *sess, aim_conn_t *conn, const char *sn)
486 printf("faimtest: opening directim to %s\n", sn);
488 newconn = aim_directim_initiate(sess, conn, NULL, sn);
490 if (!newconn || (newconn->fd == -1)) {
492 printf("connection failed!\n");
495 aim_conn_kill(sess, &newconn);
498 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINITIATE, faimtest_directim_initiate, 0);
503 void directim_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
508 dvprintf("faimtest: OFT: DirectIM: request from %s (%s)\n", userinfo->sn, args->info.directim->ip);
510 /* XXX why does these need conn? */
511 newconn = aim_directim_connect(sess, conn, args->info.directim);
513 if (!newconn || (newconn->fd == -1)) {
514 dprintf("faimtest: icbm: imimage: could not connect\n");
517 aim_conn_kill(sess, &newconn);
520 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, faimtest_directim_incoming, 0);
521 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMDISCONNECT, faimtest_directim_disconnect, 0);
522 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, faimtest_directim_typing, 0);
524 dvprintf("faimtest: OFT: DirectIM: connected to %s\n", userinfo->sn);
526 aim_send_im_direct(sess, newconn, "goodday");