mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
optimize ast_recvchar/ast_recvtext (bug #4591)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5989 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
75
channel.c
75
channel.c
@@ -1625,65 +1625,40 @@ int ast_indicate(struct ast_channel *chan, int condition)
|
||||
|
||||
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)
|
||||
|
Reference in New Issue
Block a user