[Asterisk-cvs] asterisk/apps app_zapscan.c,1.7,1.8
citats at lists.digium.com
citats at lists.digium.com
Fri Apr 9 22:47:46 CDT 2004
Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/home/citats/cvs/asterisk/apps
Modified Files:
app_zapscan.c
Log Message:
Allow zapscan to select a specific channel (bug 1371)
Index: app_zapscan.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_zapscan.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- app_zapscan.c 6 Apr 2004 22:17:31 -0000 1.7
+++ app_zapscan.c 10 Apr 2004 02:49:06 -0000 1.8
@@ -54,6 +54,24 @@
#define CONF_SIZE 160
+static struct ast_channel *get_zap_channel(int num) {
+ struct ast_channel *c=NULL;
+ char name[80];
+
+ snprintf(name,sizeof(name),"Zap/%d-1",num);
+ c = ast_channel_walk(NULL);
+ while(c) {
+ if (!strcasecmp(c->name, name)) {
+ break;
+ }
+ c = ast_channel_walk(c);
+ }
+ if (c)
+ return c;
+
+ return NULL;
+}
+
static int careful_write(int fd, unsigned char *data, int len)
{
int res;
@@ -87,6 +105,8 @@
int retryzap;
int origfd;
int ret = -1;
+ char input[4];
+ int ic=0;
ZT_BUFFERINFO bi;
char __buf[CONF_SIZE + AST_FRIENDLY_OFFSET];
@@ -188,14 +208,30 @@
f = ast_read(c);
if (!f)
break;
- if ((f->frametype == AST_FRAME_DTMF) && (f->subclass == '#')) {
- ret = 0;
+ if(f->frametype == AST_FRAME_DTMF) {
+ if(f->subclass == '#') {
+ ret = 0;
break;
- } else if ((f->frametype == AST_FRAME_DTMF) && (f->subclass == '*')) {
- ret = -1;
- break;
- } else if (fd != chan->fds[0]) {
- if (f->frametype == AST_FRAME_VOICE) {
+ }
+ else if (f->subclass == '*') {
+ ret = -1;
+ break;
+
+ }
+ else {
+ input[ic++] = f->subclass;
+ }
+ if(ic == 3) {
+ input[ic++] = '\0';
+ ic=0;
+ ret = atoi(input);
+ ast_verbose(VERBOSE_PREFIX_3 "Zapscan: change channel to %d\n",ret);
+ break;
+ }
+ }
+
+ if (fd != chan->fds[0]) {
+ if (f->frametype == AST_FRAME_VOICE) {
if (f->subclass == AST_FORMAT_ULAW) {
/* Carefully write */
careful_write(fd, f->data, f->datalen);
@@ -247,9 +283,10 @@
int confflags = 0;
int confno = 0;
char confstr[80], *tmp;
- struct ast_channel *tempchan = NULL, *lastchan = NULL;
- struct ast_frame *f;
-
+ struct ast_channel *tempchan = NULL, *lastchan = NULL,*ichan = NULL;
+ struct ast_frame *f;
+ int input=0;
+
LOCAL_USER_ADD(u);
if (chan->_state != AST_STATE_UP)
@@ -266,22 +303,31 @@
break;
}
ast_frfree(f);
- tempchan = ast_channel_walk(tempchan);
- if ( !tempchan && !lastchan )
- break;
- if ( tempchan && tempchan->type && (!strcmp(tempchan->type, "Zap")) && (tempchan != chan) ) {
- ast_verbose(VERBOSE_PREFIX_3 "Zap channel %s is in-use, monitoring...\n", tempchan->name);
- strcpy(confstr, tempchan->name);
- if ((tmp = strchr(confstr,'-'))) {
- *tmp = '\0';
+ ichan = NULL;
+ if(input) {
+ ichan = get_zap_channel(input);
+ input = 0;
+ }
+
+ tempchan = ichan ? ichan : ast_channel_walk(tempchan);
+
+
+ if ( !tempchan && !lastchan )
+ break;
+ if ( tempchan && tempchan->type && (!strcmp(tempchan->type, "Zap")) && (tempchan != chan) ) {
+ ast_verbose(VERBOSE_PREFIX_3 "Zap channel %s is in-use, monitoring...\n", tempchan->name);
+ strcpy(confstr, tempchan->name);
+ if ((tmp = strchr(confstr,'-'))) {
+ *tmp = '\0';
}
- confno = atoi(strchr(confstr,'/') + 1);
- ast_stopstream(chan);
- ast_say_number(chan, confno, AST_DIGIT_ANY, chan->language);
- res = conf_run(chan, confno, confflags);
- if (res<0) break;
- }
- lastchan = tempchan;
+ confno = atoi(strchr(confstr,'/') + 1);
+ ast_stopstream(chan);
+ ast_say_number(chan, confno, AST_DIGIT_ANY, chan->language);
+ res = conf_run(chan, confno, confflags);
+ if (res<0) break;
+ input = res;
+ }
+ lastchan = tempchan;
}
LOCAL_USER_REMOVE(u);
More information about the svn-commits
mailing list