4 static int directim_connect(aim_session_t *sess, aim_frame_t *fr, ...)
8 struct aim_directim_priv *priv;
11 priv = va_arg(ap, struct aim_directim_priv *);
15 dprintf("faimtest: directim_connect\n");
20 static int directim_incoming(aim_session_t *sess, aim_frame_t *fr, ...)
26 sn = va_arg(ap, char *);
27 msg = va_arg(ap, char *);
30 dvprintf("faimtest: Directim from %s: %s\n", sn, msg);
32 if (strstr(msg, "sendmsg")) {
35 i = atoi(strstr(msg, "sendmsg")+8);
41 for (z = 0; z < i; z++)
42 newbuf[z] = (z % 10)+0x30;
44 aim_send_im_direct(sess, fr->conn, newbuf);
48 } else if (strstr(msg, "goodday")) {
50 aim_send_im_direct(sess, fr->conn, "Good day to you, too");
55 snprintf(newmsg, sizeof(newmsg), "unknown (%s)\n", msg);
56 aim_send_im_direct(sess, fr->conn, newmsg);
62 static int directim_disconnect(aim_session_t *sess, aim_frame_t *fr, ...)
68 sn = va_arg(ap, char *);
71 dvprintf("faimtest: directim: disconnected from %s\n", sn);
73 aim_conn_kill(sess, &fr->conn);
78 static int directim_typing(aim_session_t *sess, aim_frame_t *fr, ...)
84 sn = va_arg(ap, char *);
87 dvprintf("faimtest: ohmigod! %s has started typing (DirectIM). He's going to send you a message! *squeal*\n", sn);
92 static int faimtest_directim_initiate(aim_session_t *sess, aim_frame_t *fr, ...)
95 aim_conn_t *newconn, *listenerconn;
98 newconn = va_arg(ap, aim_conn_t *);
99 listenerconn = va_arg(ap, aim_conn_t *);
102 aim_conn_close(listenerconn);
103 aim_conn_kill(sess, &listenerconn);
105 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, directim_incoming, 0);
106 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMDISCONNECT, directim_disconnect, 0);
107 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, directim_typing, 0);
109 aim_send_im_direct(sess, newconn, "goodday");
111 dvprintf("faimtest: OFT: DirectIM: connected to %s\n", aim_directim_getsn(newconn));
116 static int faimtest_getfile_filereq(aim_session_t *ses, aim_frame_t *fr, ...)
120 struct aim_fileheader_t *fh;
124 oftconn = va_arg(ap, aim_conn_t *);
125 fh = va_arg(ap, struct aim_fileheader_t *);
126 cookie = va_arg(ap, fu8_t *);
129 dvprintf("faimtest: request for file %s.\n", fh->name);
134 static int faimtest_getfile_filesend(aim_session_t *sess, aim_frame_t *fr, ...)
136 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
139 struct aim_fileheader_t *fh;
142 int pos, bufpos = 0, bufsize = 2048, i;
147 oftconn = va_arg(ap, aim_conn_t *);
148 fh = va_arg(ap, struct aim_fileheader_t *);
149 cookie = va_arg(ap, fu8_t *);
152 dvprintf("faimtest: sending file %s(%ld).\n", fh->name, fh->size);
154 if (!(buf = malloc(2048)))
157 if (!(path = (char *)calloc(1, strlen(priv->listingpath) +strlen(fh->name)+2))) {
159 dprintf("faimtest: error in calloc of path\n");
161 return 0; /* XXX: no idea what winaim expects here =) */
164 snprintf(path, strlen(priv->listingpath)+strlen(fh->name)+2, "%s/%s", priv->listingpath, fh->name);
166 if (!(file = fopen(path, "r"))) {
167 dvprintf("faimtest: getfile_send fopen failed for %s. damn.\n", path);
172 * This is a mess. Remember that faimtest is demonstration code
173 * only and for the sake of the gods, don't use this code in any
174 * of your clients. --mid
176 for(pos = 0; pos < fh->size; pos++) {
178 bufpos = pos % bufsize;
180 if (bufpos == 0 && pos > 0) { /* filled our buffer. spit it across the wire */
181 if ( (i = send(oftconn->fd, buf, bufsize, 0)) != bufsize ) {
182 dperror("faim: getfile_send: write1");
183 dprintf("faim: getfile_send: whoopsy, didn't write it all...\n");
189 if( (buf[bufpos] = fgetc(file)) == EOF) {
190 if(pos != fh->size) {
191 dvprintf("faim: getfile_send: hrm... apparent early EOF at pos 0x%x of 0x%lx\n", pos, fh->size);
196 dvprintf("%c(0x%02x) ", buf[pos], buf[pos]);
199 if( (i = send(oftconn->fd, buf, bufpos+1, 0)) != (bufpos+1)) {
200 dperror("faim: getfile_send: write2");
201 dprintf("faim: getfile_send cleanup: whoopsy, didn't write it all...\n");
212 static int faimtest_getfile_complete(aim_session_t *sess, aim_frame_t *fr, ...)
216 struct aim_fileheader_t *fh;
219 conn = va_arg(ap, aim_conn_t *);
220 fh = va_arg(ap, struct aim_fileheader_t *);
223 dvprintf("faimtest: completed file transfer for %s.\n", fh->name);
225 aim_conn_close(conn);
226 aim_conn_kill(sess, &conn);
231 static int faimtest_getfile_disconnect(aim_session_t *sess, aim_frame_t *fr, ...)
238 conn = va_arg(ap, aim_conn_t *);
239 sn = va_arg(ap, char *);
242 aim_conn_kill(sess, &conn);
244 dvprintf("faimtest: getfile: disconnected from %s\n", sn);
249 static int faimtest_getfile_listing(aim_session_t *sess, aim_frame_t *fr, ...)
254 struct aim_filetransfer_priv *ft;
255 char *filename, *nameend, *sizec;
256 int filesize, namelen;
259 conn = va_arg(ap, aim_conn_t *);
260 ft = va_arg(ap, struct aim_filetransfer_priv *);
261 listing = va_arg(ap, char *);
264 dvprintf("listing on %d==================\n%s\n===========\n", conn->fd, listing);
266 nameend = strstr(listing+0x1a, "\r");
268 namelen = nameend - (listing + 0x1a);
270 filename = malloc(namelen + 1);
271 strncpy(filename, listing+0x1a, namelen);
272 filename[namelen] = 0x00;
275 memcpy(sizec, listing + 0x11, 8);
278 filesize = strtol(sizec, (char **)NULL, 10);
280 dvprintf("faimtest: requesting %d %s(%d long)\n", namelen, filename, filesize);
282 aim_oft_getfile_request(sess, conn, filename, filesize);
290 static int faimtest_getfile_listingreq(aim_session_t *sess, aim_frame_t *fr, ...)
292 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
295 struct aim_fileheader_t *fh;
296 int pos, bufpos = 0, bufsize = 2048, i;
300 oftconn = va_arg(ap, aim_conn_t *);
301 fh = va_arg(ap, struct aim_fileheader_t *);
304 dvprintf("faimtest: sending listing of size %ld\n", fh->size);
306 if(!(buf = malloc(2048)))
309 for(pos = 0; pos < fh->size; pos++) {
311 bufpos = pos % bufsize;
313 if(bufpos == 0 && pos > 0) { /* filled our buffer. spit it across the wire */
314 if ( (i = send(oftconn->fd, buf, bufsize, 0)) != bufsize ) {
315 dperror("faim: getfile_send: write1");
316 dprintf("faim: getfile_send: whoopsy, didn't write it all...\n");
321 if( (buf[bufpos] = fgetc(priv->listingfile)) == EOF) {
322 if(pos != fh->size) {
323 dvprintf("faim: getfile_send: hrm... apparent early EOF at pos 0x%x of 0x%lx\n", pos, fh->size);
330 if( (i = send(oftconn->fd, buf, bufpos+1, 0)) != (bufpos+1)) {
331 dperror("faim: getfile_send: write2");
332 dprintf("faim: getfile_send cleanup: whoopsy, didn't write it all...\n");
337 dprintf("faimtest: sent listing\n");
343 static int faimtest_getfile_receive(aim_session_t *sess, aim_frame_t *fr, ...)
347 struct aim_filetransfer_priv *ft;
352 conn = va_arg(ap, aim_conn_t *);
353 ft = va_arg(ap, struct aim_filetransfer_priv *);
356 dvprintf("faimtest: receiving %ld bytes of file data for %s:\n\t", ft->fh.size, ft->fh.name);
358 for(pos = 0; pos < ft->fh.size; pos++) {
359 read(conn->fd, &data, 1);
360 printf("%c(%02x) ", data, data);
365 aim_oft_getfile_end(sess, conn);
370 static int faimtest_getfile_state4(aim_session_t *sess, aim_frame_t *fr, ...)
376 conn = va_arg(ap, aim_conn_t *);
379 aim_conn_close(conn);
380 aim_conn_kill(sess, &conn);
385 static int faimtest_getfile_initiate(aim_session_t *sess, aim_frame_t *fr, ...)
388 aim_conn_t *conn, *listenerconn;
389 struct aim_filetransfer_priv *priv;
392 conn = va_arg(ap, aim_conn_t *);
393 listenerconn = va_arg(ap, aim_conn_t *);
396 aim_conn_close(listenerconn);
397 aim_conn_kill(sess, &listenerconn);
399 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ, faimtest_getfile_filereq, 0);
400 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND, faimtest_getfile_filesend, 0);
401 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE, faimtest_getfile_complete, 0);
402 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT, faimtest_getfile_disconnect, 0);
403 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTING, faimtest_getfile_listing, 0);
404 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGREQ, faimtest_getfile_listingreq, 0);
405 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILERECEIVE, faimtest_getfile_receive, 0);
406 aim_conn_addhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILESTATE4, faimtest_getfile_state4, 0);
408 priv = (struct aim_filetransfer_priv *)conn->priv;
410 dvprintf("faimtest: getfile: %s (%s) connected to us on %d\n", priv->sn, priv->ip, conn->fd);
415 void getfile_start(aim_session_t *sess, aim_conn_t *conn, const char *sn)
419 newconn = aim_getfile_initiate(sess, conn, sn);
420 dvprintf("faimtest: getting file listing from %s\n", sn);
421 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEINITIATE, faimtest_getfile_initiate,0);
426 void getfile_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
428 struct faimtest_priv *priv = (struct faimtest_priv *)sess->aux_data;
430 struct aim_fileheader_t *fh;
432 dvprintf("faimtest: get file request from %s (at %s) %x\n", userinfo->sn, args->info.getfile.ip, args->reqclass);
434 fh = aim_getlisting(sess, priv->listingfile);
436 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);
440 if ( (!newconn) || (newconn->fd == -1) ) {
442 dprintf("faimtest: getfile: requestconn: apparent error in accepttransfer\n");
445 aim_conn_kill(sess, &newconn);
451 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGREQ, faimtest_getfile_listingreq, 0);
452 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ, faimtest_getfile_filereq, 0);
453 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND, faimtest_getfile_filesend, 0);
454 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE, faimtest_getfile_complete, 0);
456 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT, faimtest_getfile_disconnect, 0);
458 dprintf("faimtest: getfile connect succeeded, handlers added.\n");
463 void directim_start(aim_session_t *sess, aim_conn_t *conn, const char *sn)
467 printf("faimtest: opening directim to %s\n", sn);
469 newconn = aim_directim_initiate(sess, conn, sn);
471 if (!newconn || (newconn->fd == -1)) {
473 printf("connection failed!\n");
476 aim_conn_kill(sess, &newconn);
479 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINITIATE, faimtest_directim_initiate, 0);
484 void directim_requested(aim_session_t *sess, aim_conn_t *conn, struct aim_userinfo_s *userinfo, struct aim_incomingim_ch2_args *args)
488 dvprintf("faimtest: OFT: DirectIM: request from %s (%s)\n", userinfo->sn, args->info.imimage.ip);
490 newconn = aim_directim_connect(sess, userinfo->sn, args->info.imimage.ip, args->cookie);
492 if (!newconn || (newconn->fd == -1)) {
494 dprintf("faimtest: icbm: imimage: could not connect\n");
497 aim_conn_kill(sess, &newconn);
501 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, directim_incoming, 0);
502 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMDISCONNECT, directim_disconnect, 0);
503 aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, directim_typing, 0);
505 dvprintf("faimtest: OFT: DirectIM: connected to %s\n", userinfo->sn);
507 aim_send_im_direct(sess, newconn, "goodday");