+struct aim_directim_priv {
+ unsigned char cookie[8];
+ char sn[MAXSNLEN+1];
+};
+
+int aim_send_im_direct(struct aim_session_t *sess,
+ struct aim_conn_t *conn,
+ char *msg)
+{
+ struct command_tx_struct *newpacket;
+ struct aim_directim_priv *priv = NULL;
+ int i;
+
+ if (strlen(msg) >= MAXMSGLEN)
+ return -1;
+
+ if (!sess || !conn || (conn->type != AIM_CONN_TYPE_RENDEZVOUS) || !conn->priv) {
+ printf("faim: directim: invalid arguments\n");
+ return -1;
+ }
+
+ if (!(newpacket = aim_tx_new(AIM_FRAMETYPE_OFT, 0x0001, conn, strlen(msg)))) {
+ printf("faim: directim: tx_new failed\n");
+ return -1;
+ }
+
+ newpacket->lock = 1; /* lock struct */
+
+ priv = (struct aim_directim_priv *)conn->priv;
+
+ newpacket->hdr.oft.hdr2len = 0x44;
+
+ if (!(newpacket->hdr.oft.hdr2 = malloc(newpacket->hdr.oft.hdr2len))) {
+ free(newpacket);
+ return -1;
+ }
+
+ i = 0;
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0006);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+
+ i += aimutil_putstr(newpacket->hdr.oft.hdr2+i, priv->cookie, 8);
+
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+
+ i += aimutil_put32(newpacket->hdr.oft.hdr2+i, strlen(msg));
+
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+
+ i += aimutil_putstr(newpacket->hdr.oft.hdr2+i, sess->logininfo.screen_name, strlen(sess->logininfo.screen_name));
+
+ i = 52;
+ i += aimutil_put8(newpacket->hdr.oft.hdr2+i, 0x00);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+ i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0000);
+
+ memcpy(newpacket->data, msg, strlen(msg));
+
+ newpacket->lock = 0;
+
+ aim_tx_enqueue(sess, newpacket);
+
+ return 0;
+}
+