libfaim/aim_im.c

changeset 503
308fa214f11a
parent 445
f7ef3b61a842
child 835
ae8ae0549dd5
--- a/libfaim/aim_im.c	Tue Jul 18 05:23:25 2000 +0000
+++ b/libfaim/aim_im.c	Tue Jul 18 05:37:39 2000 +0000
@@ -139,88 +139,6 @@
   return (sess->snac_nextid++);
 }
 
-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;
-}
-
 int aim_parse_outgoing_im_middle(struct aim_session_t *sess,
 				 struct command_rx_struct *command)
 {
@@ -382,7 +300,7 @@
      u_int j = 0, y = 0, z = 0;
       char *msg = NULL;
       u_int icbmflags = 0;
-      struct aim_tlv_t *msgblocktlv, *tmptlv;
+      struct aim_tlv_t *msgblocktlv;
       u_char *msgblock;
       u_short flag1,flag2;
            
@@ -535,8 +453,11 @@
       
       if (!list2 || ((reqclass != AIM_CAPS_IMIMAGE) && !(aim_gettlv(list2, 0x2711, 1)))) {
 	struct aim_msgcookie_t *cook;
+	int type;
+	
+	type = aim_msgcookie_gettype(reqclass); /* XXX: fix this shitty code */
 
-	if ((cook = aim_uncachecookie(sess, cookie)) == NULL) {
+	if ((cook = aim_uncachecookie(sess, cookie, type)) == NULL) {
 	  printf("faim: non-data rendezvous thats not in cache!\n");
 	  aim_freetlvchain(&list2);
 	  aim_freetlvchain(&tlvlist);
@@ -544,21 +465,21 @@
 	}
 
 	if (cook->type == AIM_CAPS_SENDFILE) {
-	  struct aim_filetransfer_t *ft;
+	  struct aim_filetransfer_priv *ft;
 
 	  if (cook->data) {
 	    struct aim_tlv_t *errortlv;
 	    int errorcode = -1;
 
-	    ft = (struct aim_filetransfer_t *)cook->data;
+	    ft = (struct aim_filetransfer_priv *)cook->data;
 
 	    if ((errortlv = aim_gettlv(list2, 0x000b, 1))) {
 	      errorcode = aimutil_get16(errortlv->value);
 	    }
 	    if (errorcode) {
-	      printf("faim: transfer from %s (%s) for %s cancelled (error code %d)\n", ft->sender, ft->ip, ft->filename, errorcode);
+	      printf("faim: transfer from %s (%s) for %s cancelled (error code %d)\n", ft->sn, ft->ip, ft->fh.name, errorcode);
 	    } else if (status == 0x0002) { /* connection accepted */
-	      printf("faim: transfer from %s (%s) for %s accepted\n", ft->sender, ft->ip, ft->filename);
+	      printf("faim: transfer from %s (%s) for %s accepted\n", ft->sn, ft->ip, ft->fh.name);
 	    }
 	    free(cook->data);
 	  } else {
@@ -594,14 +515,18 @@
 		       &userinfo);
 
       } else if (reqclass & AIM_CAPS_VOICE) {
-	struct aim_msgcookie_t cachedcook;
+	struct aim_msgcookie_t *cachedcook;
 
 	printf("faim: rend: voice!\n");
 
-	memcpy(cachedcook.cookie, cookie, 8);
-	cachedcook.type = AIM_CAPS_VOICE;
-	cachedcook.data = NULL;
-	if (aim_cachecookie(sess, &cachedcook) != 0)
+	if(!(cachedcook = (struct aim_msgcookie_t*)calloc(1, sizeof(struct aim_msgcookie_t))))
+	  return 1;
+
+	memcpy(cachedcook->cookie, cookie, 8);
+	cachedcook->type = AIM_COOKIETYPE_OFTVOICE;
+	cachedcook->data = NULL;
+
+	if (aim_cachecookie(sess, cachedcook) != 0)
 	  printf("faim: ERROR caching message cookie\n");
 
 	/* XXX: implement all this */
@@ -611,19 +536,15 @@
 	 */
 	userfunc = aim_callhandler(command->conn, 0x0004, 0x0007);
 	if (userfunc || (i = 0)) {
-	  i = userfunc(sess, 
-		       command, 
-		       channel, 
-		       reqclass,
-		       &userinfo);
+	  i = userfunc(sess, command, channel, reqclass, &userinfo);
 	}
-      } else if (reqclass & AIM_CAPS_IMIMAGE) {
+      } else if ((reqclass & AIM_CAPS_IMIMAGE) || (reqclass & AIM_CAPS_BUDDYICON)) {
 	char ip[30];
-	struct aim_msgcookie_t cachedcook;
+	struct aim_directim_priv *priv;
 
 	memset(ip, 0, sizeof(ip));
 	
-	if (aim_gettlv(list2, 0x0003, 1) && aim_gettlv(list2, 0x0003, 1)) {
+	if (aim_gettlv(list2, 0x0003, 1) && aim_gettlv(list2, 0x0005, 1)) {
 	  struct aim_tlv_t *iptlv, *porttlv;
 	  
 	  iptlv = aim_gettlv(list2, 0x0003, 1);
@@ -641,39 +562,13 @@
 	       userinfo.sn,
 	       ip);
 
-#if 0
-	{
-	  struct aim_conn_t *newconn;
-	  
-	  newconn = aim_newconn(sess, AIM_CONN_TYPE_RENDEZVOUS, ip);
-	  if (!newconn || (newconn->fd == -1)) { 
-	    printf("could not connect to %s\n", ip);
-	    perror("aim_newconn");
-	    aim_conn_kill(sess, &newconn);
-	  } else {
-	    struct aim_directim_priv *priv;
-	    priv = (struct aim_directim_priv *)malloc(sizeof(struct aim_directim_priv));
-	    memcpy(priv->cookie, cookie, 8);
-	    strncpy(priv->sn, userinfo.sn, MAXSNLEN);
-	    newconn->priv = priv;
-	    printf("faim: connected to peer (fd = %d)\n", newconn->fd);
-	  }
-	}
-#endif
+       /* XXX: there are a couple of different request packets for
+	*          different things */
 	
-#if 0
-	memcpy(cachedcook.cookie, cookie, 8);
-	
-	ft = malloc(sizeof(struct aim_filetransfer_t));
-	strncpy(ft->sender, userinfo.sn, sizeof(ft->sender));
-	strncpy(ft->ip, ip, sizeof(ft->ip));
-	ft->filename = strdup(miscinfo->value+8);
-	cachedcook.type = AIM_CAPS_SENDFILE; 
-	cachedcook.data = ft;
-
-	if (aim_cachecookie(sess, &cachedcook) != 0)
-	  printf("faim: ERROR caching message cookie\n");
-#endif	
+	priv = (struct aim_directim_priv *)calloc(1, sizeof(struct aim_directim_priv));
+	memcpy(priv->ip, ip, sizeof(priv->ip));
+	memcpy(priv->sn, userinfo.sn, sizeof(priv->sn));
+	memcpy(priv->cookie, cookie, sizeof(priv->cookie));
 
 	/*
 	 * Call client.
@@ -684,7 +579,7 @@
 		       command, 
 		       channel, 
 		       reqclass,
-		       &userinfo);
+		       &userinfo, priv);
 
       } else if (reqclass & AIM_CAPS_CHAT) {
 	struct aim_tlv_t *miscinfo;
@@ -722,7 +617,75 @@
 	  free(encoding);
 	  free(lang);
       } else if (reqclass & AIM_CAPS_GETFILE) {
+	char ip[30];
+	char *desc = NULL;
+	struct aim_msgcookie_t *cachedcook;
+	struct aim_filetransfer_priv *ft;
+	struct aim_tlv_t *miscinfo;
+	struct aim_conn_t *newconn;
 
+	if (!(cachedcook = calloc(1, sizeof(struct aim_msgcookie_t))))
+	  return 0;
+
+	memset(ip, 0, sizeof(ip));
+
+	if (!(miscinfo = aim_gettlv(list2, 0x2711, 1))) {
+	  free(cachedcook);
+	  return 0;
+	}
+
+	if (aim_gettlv(list2, 0x0003, 1) && aim_gettlv(list2, 0x0005, 1)) {
+	  struct aim_tlv_t *iptlv, *porttlv;
+
+	  if (!(iptlv = aim_gettlv(list2, 0x0003, 1)) || !(porttlv = aim_gettlv(list2, 0x0005, 1))) {
+	    free(cachedcook);
+	    return 0;
+	  }
+
+	  snprintf(ip, sizeof(ip)-1, "%d.%d.%d.%d:%d",
+		   aimutil_get8(iptlv->value+0),
+		   aimutil_get8(iptlv->value+1),
+		   aimutil_get8(iptlv->value+2),
+		   aimutil_get8(iptlv->value+3),
+		   aimutil_get16(porttlv->value));
+	}
+
+	printf("faim: rend: file get request from %s (%s)\n", userinfo.sn, ip);
+
+#if 0 /* XXX finish this */
+	newconn = aim_newconn(sess, AIM_CONN_TYPE_RENDEZVOUS, ip);
+	if (!newconn || (newconn->fd == -1)) {
+	  printf("could not connect to %s\n", ip);
+	  perror("aim_newconn");
+	  aim_conn_kill(sess, &newconn);
+	} else {
+	  struct aim_filetransfer_priv *priv;
+	  priv = (struct aim_filetransfer_priv *)calloc(1, sizeof(struct aim_filetransfer_priv));
+	  memcpy(priv->cookie, cookie, 8);
+	  strncpy(priv->sn, userinfo.sn, MAXSNLEN);
+	  newconn->priv = priv;
+	  printf("faim: connected to peer (fd = %d)\n", newconn->fd);
+	}
+
+	memcpy(cachedcook->cookie, cookie, 8);
+
+	ft = malloc(sizeof(struct aim_filetransfer_priv));
+	ft->state = 1;
+	strncpy(ft->sn, userinfo.sn, sizeof(ft->sn));
+	strncpy(ft->ip, ip, sizeof(ft->ip));
+#if 0
+	strncpy(ft->fh.name, miscinfo->value+8, sizeof(ft->fh.name));
+#endif
+	cachedcook->type = AIM_COOKIETYPE_OFTGET;
+	cachedcook->data = ft;
+
+	if (aim_cachecookie(sess, cachedcook) != 0)
+	  printf("faim: ERROR caching message cookie\n");
+
+	aim_accepttransfer(sess, command->conn, newconn, ft->sn, cookie, AIM_CAPS_GETFILE);
+
+	free(desc);
+#endif
 	/*
 	 * Call client.
 	 */
@@ -735,26 +698,17 @@
 		       &userinfo);
 
       } else if (reqclass & AIM_CAPS_SENDFILE) {
-	/*
-	 * Call client.
-	 */
-	userfunc = aim_callhandler(command->conn, 0x0004, 0x0007);
-	if (userfunc || (i = 0))
-	  i = userfunc(sess, 
-		       command, 
-		       channel, 
-		       reqclass,
-		       &userinfo);
 #if 0
-	char ip[30];
-	char *desc = NULL;
-	struct aim_msgcookie_t cachedcook;
-	struct aim_filetransfer_t *ft;
-	struct aim_tlv_t *miscinfo;
+       char ip[30];
+       char *desc = NULL;
+       struct aim_msgcookie_t *cachedcook;
+       struct aim_filetransfer_priv *ft;
+       struct aim_tlv_t *miscinfo;
 
 	memset(ip, 0, sizeof(ip));
 	
-	miscinfo = aim_gettlv(list2, 0x2711, 1);
+	if (!(miscinfo = aim_gettlv(list2, 0x2711, 1)))
+	  return 0;
 
 	if (aim_gettlv(list2, 0x0003, 1) && aim_gettlv(list2, 0x0003, 1)) {
 	  struct aim_tlv_t *iptlv, *porttlv;
@@ -780,24 +734,34 @@
 	       desc, 
 	       ip);
 	
-	memcpy(cachedcook.cookie, cookie, 8);
+	memcpy(cachedcook->cookie, cookie, 8);
 	
-	ft = malloc(sizeof(struct aim_filetransfer_t));
-	strncpy(ft->sender, userinfo.sn, sizeof(ft->sender));
+	ft = malloc(sizeof(struct aim_filetransfer_priv));
+	strncpy(ft->sn, userinfo.sn, sizeof(ft->sn));
 	strncpy(ft->ip, ip, sizeof(ft->ip));
-	ft->filename = strdup(miscinfo->value+8);
-	cachedcook.type = AIM_CAPS_SENDFILE; 
-	cachedcook.data = ft;
+	strncpy(ft->fh.name, miscinfo->value+8, sizeof(ft->fh.name));
+	cachedcook->type = AIM_COOKIETYPE_OFTSEND;
+	cachedcook->data = ft;
 
-	if (aim_cachecookie(sess, &cachedcook) != 0)
+	if (aim_cachecookie(sess, cachedcook) != 0)
 	  printf("faim: ERROR caching message cookie\n");
 	
 	
-	aim_accepttransfer(sess, command->conn, ft->sender, cookie, AIM_CAPS_SENDFILE);
-
-	free(desc);
+	aim_accepttransfer(sess, command->conn, ft->sn, cookie, AIM_CAPS_SENDFILE);
+	
+	if (desc)
+	  free(desc);
 #endif	
-	i = 1;
+	/*
+	 * Call client.
+	 */
+	userfunc = aim_callhandler(command->conn, 0x0004, 0x0007);
+	if (userfunc || (i = 0))
+	  i = userfunc(sess, 
+		       command, 
+		       channel, 
+		       reqclass,
+		       &userinfo);
       } else {
 	printf("faim: rend: unknown rendezvous 0x%04x\n", reqclass);
       }
@@ -814,39 +778,6 @@
   return i;
 }
 
-u_long aim_accepttransfer(struct aim_session_t *sess,
-			  struct aim_conn_t *conn, 
-			  char *sender,
-			  char *cookie,
-			  unsigned short rendid)
-{
-  struct command_tx_struct *newpacket;
-  int curbyte, i;
-
-  if(!(newpacket = aim_tx_new(AIM_FRAMETYPE_OSCAR, 0x0002, conn, 10+8+2+1+strlen(sender)+4+2+8+16)))
-    return -1;
-
-  newpacket->lock = 1;
-
-  curbyte = aim_putsnac(newpacket->data, 0x0004, 0x0006, 0x0000, sess->snac_nextid);
-  for (i = 0; i < 8; i++)
-    curbyte += aimutil_put8(newpacket->data+curbyte, cookie[i]);
-  curbyte += aimutil_put16(newpacket->data+curbyte, 0x0002);
-  curbyte += aimutil_put8(newpacket->data+curbyte, strlen(sender));
-  curbyte += aimutil_putstr(newpacket->data+curbyte, sender, strlen(sender));
-  curbyte += aimutil_put16(newpacket->data+curbyte, 0x0005);
-  curbyte += aimutil_put16(newpacket->data+curbyte, 0x001a);
-  curbyte += aimutil_put16(newpacket->data+curbyte, 0x0002 /* accept */);
-  for (i = 0; i < 8; i++)
-    curbyte += aimutil_put8(newpacket->data+curbyte, cookie[i]);
-  curbyte += aim_putcap(newpacket->data+curbyte, 0x10, rendid);
-
-  newpacket->lock = 0;
-  aim_tx_enqueue(sess, newpacket);
-
-  return (sess->snac_nextid++);
-}
-
 /*
  * Possible codes:
  *    AIM_TRANSFER_DENY_NOTSUPPORTED -- "client does not support"

mercurial