]> andersk Git - libfaim.git/blobdiff - aim_txqueue.c
- Mon Feb 26 01:46:34 UTC 2001
[libfaim.git] / aim_txqueue.c
index 9871f938c523691feec5ab0905175e4eb8ec04d2..23ef74f81617b9713eabcff154b3e8ce19745a1d 100644 (file)
@@ -5,6 +5,7 @@
  *
  */
 
+#define FAIM_INTERNAL
 #include <faim/aim.h>
 
 #ifndef _WIN32
@@ -74,8 +75,7 @@ faim_internal struct command_tx_struct *aim_tx_new(unsigned char framing, int ch
  * that is, when sess->tx_enqueue is set to &aim_tx_enqueue__queuebased.
  *
  */
-faim_internal int aim_tx_enqueue__queuebased(struct aim_session_t *sess,
-                                            struct command_tx_struct *newpacket)
+static int aim_tx_enqueue__queuebased(struct aim_session_t *sess, struct command_tx_struct *newpacket)
 {
   struct command_tx_struct *cur;
 
@@ -126,7 +126,7 @@ faim_internal int aim_tx_enqueue__queuebased(struct aim_session_t *sess,
  * right here. 
  * 
  */
-faim_internal int aim_tx_enqueue__immediate(struct aim_session_t *sess, struct command_tx_struct *newpacket)
+static int aim_tx_enqueue__immediate(struct aim_session_t *sess, struct command_tx_struct *newpacket)
 {
   if (newpacket->conn == NULL) {
     faimdprintf(1, "aim_tx_enqueue: ERROR: packet has no connection\n");
@@ -151,6 +151,25 @@ faim_internal int aim_tx_enqueue__immediate(struct aim_session_t *sess, struct c
   return 0;
 }
 
+faim_export int aim_tx_setenqueue(struct aim_session_t *sess, int what,  int (*func)(struct aim_session_t *, struct command_tx_struct *))
+{
+  if (!sess)
+    return -1;
+
+  if (what == AIM_TX_QUEUED)
+    sess->tx_enqueue = &aim_tx_enqueue__queuebased;
+  else if (what == AIM_TX_IMMEDIATE) 
+    sess->tx_enqueue = &aim_tx_enqueue__immediate;
+  else if (what == AIM_TX_USER) {
+    if (!func)
+      return -1;
+    sess->tx_enqueue = func;
+  } else
+    return -1; /* unknown action */
+
+  return 0;
+}
+
 faim_internal int aim_tx_enqueue(struct aim_session_t *sess, struct command_tx_struct *command)
 {
   /*
@@ -206,7 +225,7 @@ faim_internal int aim_tx_printqueue(struct aim_session_t *sess)
          faimdprintf(2, "\t  %2x  %2x   %4x %4x   %1d    %1d\n", 
                      cur->hdrtype,
                      (cur->hdrtype==AIM_FRAMETYPE_OFT)?cur->hdr.oft.type:cur->hdr.oscar.type, 
-                     (cur->hdrtype==AIM_FRAMETYPE_OSCAR)?cur->seqnum:0, 
+                     (cur->hdrtype==AIM_FRAMETYPE_OSCAR)?cur->hdr.oscar.seqnum:0, 
                      cur->commandlen, cur->lock, 
                      cur->sent);
       }
@@ -306,17 +325,26 @@ faim_internal int aim_tx_sendframe(struct aim_session_t *sess, struct command_tx
   if (send(cur->conn->fd, curPacket, buflen, 0) != buflen) {
     faim_mutex_unlock(&cur->conn->active);
     cur->sent = 1;
-    aim_conn_kill(sess, &cur->conn);
+    aim_conn_close(cur->conn);
     return 0; /* bail out */
   }
 
   if ((cur->hdrtype == AIM_FRAMETYPE_OFT) && cur->commandlen) {
+    int curposi;
+    for(curposi = 0; curposi < cur->commandlen; curposi++)
+      printf("%02x ", cur->data[curposi]);
+
     if (send(cur->conn->fd, cur->data, cur->commandlen, 0) != (int)cur->commandlen) {
       /* 
        * Theres nothing we can do about this since we've already sent the 
        * header!  The connection is unstable.
        */
+      faim_mutex_unlock(&cur->conn->active);
+      cur->sent = 1;
+      aim_conn_close(cur->conn);
+      return 0; /* bail out */
     }
+
   }
 
   cur->sent = 1; /* mark the struct as sent */
@@ -348,10 +376,6 @@ faim_export int aim_tx_flushqueue(struct aim_session_t *sess)
 {
   struct command_tx_struct *cur;
    
-#if debug > 1
-  int i = 0;
-#endif
-
   if (sess->queue_outgoing == NULL)
     return 0;
 
@@ -372,6 +396,7 @@ faim_export int aim_tx_flushqueue(struct aim_session_t *sess)
        sleep((cur->conn->lastactivity + cur->conn->forcedlatency) - time(NULL));
       }
 
+      /* XXX XXX XXX this should call the custom "queuing" function!! */
       if (aim_tx_sendframe(sess, cur) == -1)
        break;
     }
This page took 0.045234 seconds and 4 git commands to generate.