diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2001-07-26 20:24:30 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2001-07-26 20:24:30 +0000 |
commit | d8aef9d8163407c1d86148bab9ff6578d4aaad93 (patch) | |
tree | 4875cf036a71f422e7176f955875fe9163d20002 /pbx | |
parent | 7db29792054596cf338088a08a846e34ffacbd4f (diff) |
Version 0.1.9 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@345 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'pbx')
-rwxr-xr-x | pbx/pbx_wilcalu.c | 251 |
1 files changed, 186 insertions, 65 deletions
diff --git a/pbx/pbx_wilcalu.c b/pbx/pbx_wilcalu.c index 9a98cda7d..d0abb8d9c 100755 --- a/pbx/pbx_wilcalu.c +++ b/pbx/pbx_wilcalu.c @@ -1,4 +1,5 @@ -/* +/** @file pbx_wilcalu.c + * * Asterisk -- A telephony toolkit for Linux. * * Trivial application to playback a sound file @@ -9,6 +10,11 @@ * * This program is free software, distributed under the terms of * the GNU General Public License + + * Autodialer for Asterisk + * Redirect dialstring thru fifo "/var/run/autodial.ctl" + * Format of string is : + * "tech/tele,filename&" ie. "tor1/23,file&" */ #include <asterisk/file.h> @@ -17,6 +23,7 @@ #include <asterisk/pbx.h> #include <asterisk/module.h> #include <asterisk/translate.h> +#include <unistd.h> #include <string.h> #include <stdlib.h> #include <pthread.h> @@ -24,93 +31,207 @@ #include <sys/stat.h> #include <errno.h> + +// Globals const char *dialfile="/var/run/autodial.ctl"; static char *tdesc = "Wil Cal U (Auto Dialer)"; static pthread_t autodialer_thread; -static char buf[256]; +static char buf[257]; +static char lastbuf[257];//contains last partial buffer +static char sendbuf[257]; extern int errno; STANDARD_LOCAL_USER; LOCAL_USER_DECL; +//prototype +static void *dialstring(void *string); + +// types +struct alarm_data { +time_t alarm_time; +int snooze_len; +void *dialstr; +}; + static void *autodial(void *ignore) { + pthread_t dialstring_thread; + char * sendbufptr=sendbuf; + int fd=open(dialfile,O_RDONLY); + printf("Entered Wil-Calu fd=%d\n",fd); + if(fd<0) { + printf("Autodial: Unable to open file\n"); + pthread_exit(NULL); + } + memset(buf,0,257); + memset(lastbuf,0,257); + memset(sendbuf,0,257); while(1){ - struct ast_channel *channel; - int fd=open(dialfile,O_RDONLY); - char *bufptr,*destptr; - int ms=10000; - int cnt=0,first; - char tech[256]; - char tele[256]; - char filename[256]; + ssize_t bytes; + void *pass; - if(fd<0) { - printf("Autodial: Unable to open file\n"); - pthread_exit(NULL); - } - memset(buf,0,256); - read(fd,buf,256); - for(first=0,bufptr=buf,destptr=tech;*bufptr&&cnt<256;cnt++){ - if(*bufptr=='/' && !first){ - *destptr=0; - destptr=tele; - first=1; + memset(buf,0,257); + bytes=read(fd,buf,256); + buf[(int)bytes]=0; + + if(bytes){ + int x; + printf("WilCalu : Read Buf %s\n",buf); + sendbufptr=sendbuf; + for(x=0;lastbuf[x]!=0 && x<257;x++); + if(x) { + memcpy(sendbuf,lastbuf,x); + sendbufptr+=x; + memset(lastbuf,0,257); } - else if(*bufptr==','){ - *destptr=0; - destptr=filename; - } else { - *destptr=*bufptr; - destptr++; + /* Process bytes read */ + for(x=0;x<bytes;x++){ + /* if & then string is complete */ + if(buf[x]=='&'){ + if(NULL!=(pass=(void *)strdup(sendbuf))){ + pthread_create(&dialstring_thread,NULL,dialstring,pass); + sendbufptr=sendbuf; + memset(sendbuf,0,257); + } + else { + perror("Autodial:Strdup failed"); + close(fd); + pthread_exit(NULL); + } + } else { + if(buf[x]=='\n') + continue; + *sendbufptr=buf[x]; + sendbufptr++; + *sendbufptr=0; + } } - bufptr++; - } destptr--;*destptr=0; - if(strlen(tech)+strlen(tele)+strlen(filename)>256){ - printf("Autodial:Error string Error too long\n"); - pthread_exit(NULL); + if(sendbufptr!=sendbuf) + memcpy(lastbuf,sendbuf,sendbufptr-sendbuf+1); } + } + close(fd); + pthread_exit(NULL); + return NULL; +} + +static void *snooze_alarm(void *pass){ + + pthread_t dialstring_thread; + struct alarm_data *data=(struct alarm_data *)pass; + sleep(data->snooze_len); + pthread_create(&dialstring_thread,NULL,dialstring,data->dialstr); + // dialstring will free data->dialstr + free(pass); + pthread_exit(NULL); + return NULL; +} +static void set_snooze_alarm(char *dialstr,int snooze_len){ + pthread_t snooze_alarm_thread; + struct alarm_data *pass; + printf("Answered: Snooze Requested\n"); + if(NULL==(pass=malloc(sizeof(struct alarm_data)))){ + perror("snooze_alarm: data"); + pthread_exit(NULL); + } + if(NULL==(pass->dialstr=(void *)strdup(dialstr))){ + free(pass); + perror("snooze_alarm: dialstr"); + pthread_exit(NULL); + } + pass->snooze_len=snooze_len; + pthread_create(&snooze_alarm_thread,NULL,snooze_alarm,pass); +} -#if 0 - printf("Autodial Tech %s(%d) Tele %s(%d) Filename %s(%d)\n",tech,strlen(tech),tele,strlen(tele),filename,strlen(filename)); -#endif - channel=ast_request(tech,AST_FORMAT_SLINEAR,tele); - if(channel!=NULL){ - ast_call(channel,tele,10000); +static void *dialstring(void *string){ + struct ast_channel *channel; + char *bufptr,*destptr; + // ms affects number of rings + int ms=10000; + int cnt=0,first; + char tech[256]; + char tele[256]; + char filename[256]; + int answered=0; + for(first=0,bufptr=(char *)string,destptr=tech;*bufptr&&cnt<256;cnt++){ + if(*bufptr=='/' && !first){ + *destptr=0; + destptr=tele; + first=1; } - else { - printf("Autodial:Sorry unable to obtain channel\n"); - continue; + else if(*bufptr==','){ + *destptr=0; + destptr=filename; + } else { + *destptr=*bufptr; + destptr++; } - if(channel->state==AST_STATE_UP) - printf("Autodial:Line is Up\n"); - while(ms>0){ - struct ast_frame *f; - ms=ast_waitfor(channel,ms); - f=ast_read(channel); - if(!f){ - printf("Autodial:Hung Up\n"); - break; - } - if(f->frametype==AST_FRAME_CONTROL){ - if(f->subclass==AST_CONTROL_ANSWER){ - printf("Autodial:Phone Answered\n"); - if(channel->state==AST_STATE_UP){ - ast_streamfile(channel,filename,0); + bufptr++; + } + *destptr=0; + printf("Printing string arg: "); + printf((char *)string); + printf(" Eos\n"); + if(strlen(tech)+strlen(tele)+strlen(filename)>256){ + printf("Autodial:Error string too long\n"); + free(string); + pthread_exit(NULL); + } + printf("Autodial Tech %s(%d) Tele %s(%d) Filename %s(%d)\n",tech,strlen(tech),tele,strlen(tele),filename,strlen(filename)); + + channel=ast_request(tech,AST_FORMAT_SLINEAR,tele); + if(channel!=NULL){ + ast_call(channel,tele,10000); + } + else { + printf("Autodial:Sorry unable to obtain channel\n"); + free(string); + pthread_exit(NULL); + } + if(channel->state==AST_STATE_UP) + printf("Autodial:Line is Up\n"); + while(ms>0){ + struct ast_frame *f; + ms=ast_waitfor(channel,ms); + f=ast_read(channel); + if(!f){ + printf("Autodial:Hung Up\n"); + break; + } + if(f->frametype==AST_FRAME_CONTROL){ + if(f->subclass==AST_CONTROL_ANSWER){ + printf("Autodial:Phone Answered\n"); + if(channel->state==AST_STATE_UP){ + char res; + ast_streamfile(channel,filename,0); + // Press Five for snooze + res=ast_waitstream(channel, "37"); + if(res=='3'){ + answered=1; + set_snooze_alarm((char *)string,60); + ast_streamfile(channel,"demo-thanks",0); + ast_waitstream(channel, ""); + } + else if(res=='7'){ + answered=1; + ast_streamfile(channel,"demo-thanks",0); ast_waitstream(channel, ""); - ast_stopstream(channel); - ms=0; } + ast_stopstream(channel); + ms=0; } - else if(f->subclass==AST_CONTROL_RINGING) - printf("Autodial:Phone Ringing end\n"); } - ast_frfree(f); + else if(f->subclass==AST_CONTROL_RINGING) + printf("Autodial:Phone Ringing end\n"); } - ast_hangup(channel); - printf("Autodial:Hung up channel\n"); - close(fd); + ast_frfree(f); } - // never reached + if(!answered) + set_snooze_alarm((char *)string,5); + free(string); + ast_hangup(channel); + printf("Autodial:Hung up channel\n"); + pthread_exit(NULL); return NULL; } int unload_module(void) |