Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv22930

Modified Files:
        channel.c 
Log Message:
optimize ast_recvchar/ast_recvtext (bug #4591)


Index: channel.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channel.c,v
retrieving revision 1.207
retrieving revision 1.208
diff -u -d -r1.207 -r1.208
--- channel.c   21 Jun 2005 23:10:29 -0000      1.207
+++ channel.c   23 Jun 2005 21:28:09 -0000      1.208
@@ -1625,65 +1625,40 @@
 
 int ast_recvchar(struct ast_channel *chan, int timeout)
 {
-       int res,ourto,c;
-       struct ast_frame *f;
-       
-       ourto = timeout;
-       for(;;)
-          {
-               if (ast_check_hangup(chan)) return -1;
-               res = ast_waitfor(chan,ourto);
-               if (res <= 0) /* if timeout */
-                  {
-                       return 0;
-                  }
-               ourto = res;
-               f = ast_read(chan);
-               if (f == NULL) return -1; /* if hangup */
-               if ((f->frametype == AST_FRAME_CONTROL) &&
-                   (f->subclass == AST_CONTROL_HANGUP)) return -1; /* if 
hangup */
-               if (f->frametype == AST_FRAME_TEXT)  /* if a text frame */
-                  {
-                       c = *((char *)f->data);  /* get the data */
-                       ast_frfree(f);
-                       return(c);
-                  }
-               ast_frfree(f);
-       }
+       int c;
+       char *buf = ast_recvtext(chan, timeout);
+       if (buf == NULL)
+               return -1;      /* error or timeout */
+       c = *(unsigned char *)buf;
+       free(buf);
+       return c;
 }
 
 char *ast_recvtext(struct ast_channel *chan, int timeout)
 {
-       int res,ourto;
-       struct ast_frame *f;
-       char *buf;
+       int res, done = 0;
+       char *buf = NULL;
        
-       ourto = timeout;
-       for(;;) {
-               if (ast_check_hangup(chan)) return NULL;
-               res = ast_waitfor(chan,ourto);
-               if (res <= 0) { 
-                       /* if timeout */
-                       return NULL;
-               }
-               ourto = res;
+       while (!done) {
+               struct ast_frame *f;
+               if (ast_check_hangup(chan))
+                       break;
+               res = ast_waitfor(chan, timeout);
+               if (res <= 0) /* timeout or error */
+                       break;
+               timeout = res;  /* update timeout */
                f = ast_read(chan);
-               if (f == NULL) return NULL; /* no frame */
-               if ((f->frametype == AST_FRAME_CONTROL) && 
-                       (f->subclass == AST_CONTROL_HANGUP)) return NULL; /* if 
hangup */
-               if (f->frametype == AST_FRAME_TEXT) {
-                       /* if a text frame */
-                       buf = (char *)malloc(strlen((char *)f->data));
-                       if (buf) {
-                               strcpy(buf, (char *)f->data);
-                               ast_frfree(f);
-                               return(buf);
-                       } else {
-                               return NULL;
-                       }
+               if (f == NULL)
+                       break; /* no frame */
+               if (f->frametype == AST_FRAME_CONTROL && f->subclass == 
AST_CONTROL_HANGUP)
+                       done = 1;       /* force a break */
+               else if (f->frametype == AST_FRAME_TEXT) {      /* what we want 
*/
+                       buf = strdup((char *)f->data);  /* dup and break */
+                       done = 1;
                }
                ast_frfree(f);
        }
+       return buf;
 }
 
 int ast_sendtext(struct ast_channel *chan, char *text)

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to