]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
polish
authorAnthony Minessale <anthm@freeswitch.org>
Sat, 26 Jan 2013 03:19:22 +0000 (21:19 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 1 Apr 2013 02:27:21 +0000 (21:27 -0500)
libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c
libs/sofia-sip/libsofia-sip-ua/tport/ws.c
libs/sofia-sip/libsofia-sip-ua/tport/ws.h

index fabd68e349762fcc9a9eb511e2de1922cc895dbb..de354a1e15034213d829d9bde2ae0ebb9de653e6 100644 (file)
@@ -205,7 +205,7 @@ int tport_recv_stream_ws(tport_t *self)
   ws_opcode_t oc;
 
   if ( !wstp->ws_initialized ) {
-         if (ws_init(ws, self->tp_socket, 65336, wstp->ws_secure ? wspri->ssl_ctx : NULL) == -2) {
+         if (ws_init(ws, self->tp_socket, 65336, wstp->ws_secure ? wspri->ssl_ctx : NULL, 0) == -2) {
                  return 2;
          }
          wstp->ws_initialized = 1;
@@ -266,13 +266,9 @@ ssize_t tport_send_stream_ws(tport_t const *self, msg_t *msg,
   ssize_t nerror;
   tport_ws_t *wstp = (tport_ws_t *)self;
   wsh_t *ws = wstp->ws;
-  char xbuf[65536] = "";
-  int blen = 0;
-
 
   enum { WSBUFSIZE = 2048 };
 
-
   for (i = 0; i < iovlen; i = j) {
     char *buf = wstp->wstp_buffer;
     unsigned wsbufsize = WSBUFSIZE;
@@ -303,18 +299,9 @@ ssize_t tport_send_stream_ws(tport_t const *self, msg_t *msg,
        } else {
       iov[j].siv_base = buf, iov[j].siv_len = m;
        }
-       
-       //* hacked to push to buffer
-       if (blen + m < sizeof(xbuf)) {
-               memcpy(xbuf+blen, buf, m);
-               nerror = m;
-               blen += m;
-       } else {
-               nerror = -1;
-       }
-       //*/
-       //nerror = ws_write_frame(ws, WSOC_TEXT, buf, m);
 
+       nerror = ws_feed_buf(ws, buf, m);
+       
     SU_DEBUG_9(("tport_ws_writevec: vec %p %p %lu ("MOD_ZD")\n",
                (void *)ws, (void *)iov[i].siv_base, (LU)iov[i].siv_len,
                nerror));
@@ -335,11 +322,8 @@ ssize_t tport_send_stream_ws(tport_t const *self, msg_t *msg,
       break;
   }
 
-  //* hacked .... 
-  if (size) {
-         size = ws_write_frame(ws, WSOC_TEXT, xbuf, blen);
-  }
-  //*/
+  ws_send_buf(ws, WSOC_TEXT);
+
 
   return size;
 }
index bdbef0aebc3ede2000ba3f072eab9bf0be63846c..65fa826e1c50221b176cb25b0d40f994cead486b 100644 (file)
@@ -288,7 +288,7 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
        if (wsh->ssl) {
                do {
                        r = SSL_read(wsh->ssl, data, bytes);
-                       if (x++) {usleep(10000);
+                       if (x++) usleep(10000);
                } while (r == -1 && SSL_get_error(wsh->ssl, r) == SSL_ERROR_WANT_READ && x < 100);
 
                return r;
@@ -296,12 +296,12 @@ ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes)
 
        do {
                r = recv(wsh->sock, data, bytes, 0);
-               if (x++) {usleep(10000);
+               if (x++) usleep(10000);
        } while (r == -1 && (errno == EAGAIN || errno == EINTR) && x < 100);
 
-       if (r<0) {
+       //if (r<0) {
                //printf("READ FAIL: %s\n", strerror(errno));
-       }
+       //}
 
        return r;
 }
@@ -322,18 +322,22 @@ ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes)
                r = send(wsh->sock, data, bytes, 0);
        } while (r == -1 && (errno == EAGAIN || errno == EINTR));
 
-       if (r<0) {
+       //if (r<0) {
                //printf("wRITE FAIL: %s\n", strerror(errno));
-       }
+       //}
 
        return r;
 }
 
-int ws_init(wsh_t *wsh, ws_socket_t sock, size_t buflen, SSL_CTX *ssl_ctx)
+int ws_init(wsh_t *wsh, ws_socket_t sock, size_t buflen, SSL_CTX *ssl_ctx, int close_sock)
 {
        memset(wsh, 0, sizeof(*wsh));
        wsh->sock = sock;
 
+       if (close_sock) {
+               wsh->close_sock = 1;
+       }
+
        if (buflen > MAXLEN) {
                buflen = MAXLEN;
        }
@@ -396,7 +400,10 @@ ssize_t ws_close(wsh_t *wsh, int16_t reason)
                wsh->ssl = NULL;
        }
 
-       //close(wsh->sock);
+       if (wsh->close_sock) {
+               close(wsh->sock);
+       }
+
        wsh->sock = ws_sock_invalid;
 
        if (wsh->buffer) {
@@ -404,6 +411,11 @@ ssize_t ws_close(wsh_t *wsh, int16_t reason)
                wsh->buffer = NULL;
        }
 
+       if (wsh->wbuffer) {
+               free(wsh->wbuffer);
+               wsh->wbuffer = NULL;
+       }
+
 
        return reason * -1;
        
@@ -560,6 +572,42 @@ ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data)
        }
 }
 
+ssize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes)
+{
+
+       if (bytes + wsh->wdatalen > wsh->buflen) {
+               return -1;
+       }
+
+
+       if (!wsh->wbuffer) {
+               wsh->wbuffer = malloc(wsh->buflen);
+               assert(wsh->wbuffer);
+       }
+       
+
+       memcpy(wsh->wbuffer + wsh->wdatalen, data, bytes);
+       
+       wsh->wdatalen += bytes;
+
+       return bytes;
+}
+
+ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc)
+{
+       ssize_t r = 0;
+
+       if (!wsh->wdatalen) {
+               return -1;
+       }
+       
+       r = ws_write_frame(wsh, oc, wsh->wbuffer, wsh->wdatalen);
+       
+       wsh->wdatalen = 0;
+
+       return r;
+}
+
 
 ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes)
 {
index 58c74eee83772e0528d0675f0a61337cdbf5ecaa..2b4d13909741f08d2f54272b83ccbd4ec2acfd99 100644 (file)
@@ -53,8 +53,10 @@ typedef enum {
 typedef struct wsh_s {
        ws_socket_t sock;
        char *buffer;
+       char *wbuffer;
        size_t buflen;
        ssize_t datalen;
+       ssize_t wdatalen;
        char *payload;
        ssize_t plen;
        ssize_t rplen;
@@ -62,13 +64,19 @@ typedef struct wsh_s {
        int handshake;
        uint8_t down;
        int secure;
+       unsigned close_sock:1;
+       unsigned :0;
 } wsh_t;
 
+ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
+ssize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes);
+
+
 ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes);
 ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes);
 ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data);
 ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes);
-int ws_init(wsh_t *wsh, ws_socket_t sock, size_t buflen, SSL_CTX *ssl_ctx);
+int ws_init(wsh_t *wsh, ws_socket_t sock, size_t buflen, SSL_CTX *ssl_ctx, int close_sock);
 ssize_t ws_close(wsh_t *wsh, int16_t reason);
 void init_ssl(void);
 void deinit_ssl(void);