- int channel;
- va_list ap;
-
- va_start(ap, command);
- channel = va_arg(ap, int);
-
- /*
- * Channel 1: Standard Message
- */
- if (channel == 1) {
- struct aim_userinfo_s *userinfo;
- char *msg = NULL;
- u_int icbmflags = 0;
- char *tmpstr = NULL;
- unsigned short flag1, flag2;
- int finlen = 0;
- unsigned char *fingerprint = NULL;
- int clienttype = AIM_CLIENTTYPE_UNKNOWN;
-
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- msg = va_arg(ap, char *);
- icbmflags = va_arg(ap, u_int);
- flag1 = va_arg(ap, int);
- flag2 = va_arg(ap, int);
- finlen = va_arg(ap, int);
- fingerprint = va_arg(ap, unsigned char *);
- va_end(ap);
-
- clienttype = aim_fingerprintclient(fingerprint, finlen);
-
- dvprintf("faimtest: icbm: sn = \"%s\"\n", userinfo->sn);
- dvprintf("faimtest: icbm: probable client type: %d\n", clienttype);
- dvprintf("faimtest: icbm: warnlevel = 0x%04x\n", userinfo->warnlevel);
- dvprintf("faimtest: icbm: flags = 0x%04x = ", userinfo->flags);
- printuserflags(userinfo->flags);
- dinlineprintf("\n");
-
- dvprintf("faimtest: icbm: membersince = %lu\n", userinfo->membersince);
- dvprintf("faimtest: icbm: onlinesince = %lu\n", userinfo->onlinesince);
- dvprintf("faimtest: icbm: idletime = 0x%04x\n", userinfo->idletime);
- dvprintf("faimtest: icbm: capabilities = 0x%04x\n", userinfo->capabilities);
-
- dprintf("faimtest: icbm: icbmflags = ");
- if (icbmflags & AIM_IMFLAGS_AWAY)
- dinlineprintf("away ");
- if (icbmflags & AIM_IMFLAGS_ACK)
- dinlineprintf("ackrequest ");
- dinlineprintf("\n");
-
- dvprintf("faimtest: icbm: encoding flags = {%04x, %04x}\n", flag1, flag2);
-
- dvprintf("faimtest: icbm: message: %s\n", msg);
-
- if (msg) {
- int i = 0;
-
- while (msg[i] == '<') {
- if (msg[i] == '<') {
- while (msg[i] != '>')
- i++;
- i++;
- }
- }
- tmpstr = msg+i;
-
- faimtest_handlecmd(sess, command, userinfo, tmpstr);
-
- }
- }
- /*
- * Channel 2: Rendevous Request
- */
- else if (channel == 2) {
- struct aim_userinfo_s *userinfo;
- unsigned short reqclass;
-
- reqclass = va_arg(ap, int);
- switch (reqclass) {
- case AIM_CAPS_VOICE: {
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- va_end(ap);
-
- dvprintf("faimtest: voice invitation: source sn = %s\n", userinfo->sn);
- dvprintf("faimtest: voice invitation: \twarnlevel = 0x%04x\n", userinfo->warnlevel);
- dvprintf("faimtest: voice invitation: \tclass = 0x%04x = ", userinfo->flags);
- printuserflags(userinfo->flags);
- dinlineprintf("\n");
-
- /* we dont get membersince on chat invites! */
- dvprintf("faimtest: voice invitation: \tonlinesince = %lu\n", userinfo->onlinesince);
- dvprintf("faimtest: voice invitation: \tidletime = 0x%04x\n", userinfo->idletime);
-
- break;
- }
- case AIM_CAPS_GETFILE: {
- char *ip, *cookie;
- struct aim_conn_t *newconn;
- struct aim_fileheader_t *fh;
-
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- ip = va_arg(ap, char *);
- cookie = va_arg(ap, char *);
- va_end(ap);
-
- dvprintf("faimtest: get file request from %s (at %s) %x\n", userinfo->sn, ip, reqclass);
-
- fh = aim_getlisting(sess, listingfile);
-
- newconn = aim_accepttransfer(sess, command->conn, userinfo->sn, cookie, ip, fh->totfiles, fh->totsize, fh->size, fh->checksum, reqclass);
-
- if( (!newconn) || (newconn->fd == -1) ) {
- dprintf("faimtest: getfile: requestconn: apparent error in accepttransfer\n");
- if(newconn)
- aim_conn_kill(sess, &newconn);
- break;
- }
-
- free(fh);
-
- aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILELISTINGREQ, faimtest_getfile_listingreq, 0);
- aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ, faimtest_getfile_filereq, 0);
- aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND, faimtest_getfile_filesend, 0);
- aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE, faimtest_getfile_complete, 0);
-
- aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT, faimtest_getfile_disconnect, 0);
-
- dprintf("faimtest: getfile connect succeeded, handlers added.\n");
-
- break;
- }
- case AIM_CAPS_SENDFILE: {
- dprintf("faimtest: send file!\n");
- break;
- }
- case AIM_CAPS_CHAT: {
- char *msg,*encoding,*lang;
- struct aim_chat_roominfo *roominfo;
-
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- roominfo = va_arg(ap, struct aim_chat_roominfo *);
- msg = va_arg(ap, char *);
- encoding = va_arg(ap, char *);
- lang = va_arg(ap, char *);
- va_end(ap);
-
- dvprintf("faimtest: chat invitation: source sn = %s\n", userinfo->sn);
- dvprintf("faimtest: chat invitation: \twarnlevel = 0x%04x\n", userinfo->warnlevel);
- dvprintf("faimtest: chat invitation: \tclass = 0x%04x = ", userinfo->flags);
- printuserflags(userinfo->flags);
- dinlineprintf("\n");
-
- /* we dont get membersince on chat invites! */
- dvprintf("faimtest: chat invitation: \tonlinesince = %lu\n", userinfo->onlinesince);
- dvprintf("faimtest: chat invitation: \tidletime = 0x%04x\n", userinfo->idletime);
-
- dvprintf("faimtest: chat invitation: message = %s\n", msg);
- dvprintf("faimtest: chat invitation: room name = %s\n", roominfo->name);
- dvprintf("faimtest: chat invitation: encoding = %s\n", encoding);
- dvprintf("faimtest: chat invitation: language = %s\n", lang);
- dvprintf("faimtest: chat invitation: exchange = 0x%04x\n", roominfo->exchange);
- dvprintf("faimtest: chat invitation: instance = 0x%04x\n", roominfo->instance);
- dvprintf("faimtest: chat invitiation: autojoining %s...\n", roominfo->name);
- /*
- * Automatically join room...
- */
- aim_chat_join(sess, command->conn, 0x0004, roominfo->name);
- break;
- }
- case AIM_CAPS_IMIMAGE: {
- struct aim_directim_priv *priv;
- struct aim_conn_t *newconn;
-
- dprintf("faimtest: icbm: rendezvous imimage\n");
-
- userinfo = va_arg(ap, struct aim_userinfo_s *);
- priv = va_arg(ap, struct aim_directim_priv *);
- va_end(ap);
-
- dvprintf("faimtest: OFT: DirectIM: request from %s (%s)\n", userinfo->sn, priv->ip);
-
- newconn = aim_directim_connect(sess, command->conn, priv);
-
- if ( (!newconn) || (newconn->fd == -1) ) {
- dprintf("faimtest: icbm: imimage: could not connect\n");
-
- if (newconn)
- aim_conn_kill(sess, &newconn);
-
- break;
- }
-
- aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, faimtest_directim_incoming, 0);
- aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMDISCONNECT, faimtest_directim_disconnect, 0);
- aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, faimtest_directim_typing, 0);
-
- dvprintf("faimtest: OFT: DirectIM: connected to %s\n", userinfo->sn);
-
- aim_send_im_direct(sess, newconn, "goodday");
-
- break;
- }
- default:
- dvprintf("faimtest: icbm: unknown reqclass (%d)\n", reqclass);
- } /* switch */
- } else
- dvprintf("faimtest does not support channels > 2 (chan = %02x)\n", channel);
- dprintf("faimtest: icbm: done with ICBM handling\n");
-
- return 1;