Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

app.h File Reference

Go to the source code of this file.

Functions

int ast_app_getdata (struct ast_channel *c, char *prompt, char *s, int maxlen, int timeout)
 Plays a stream and gets DTMF data from a channel.

int ast_app_getdata_full (struct ast_channel *c, char *prompt, char *s, int maxlen, int timeout, int audiofd, int ctrlfd)
int ast_app_getvoice (struct ast_channel *c, char *dest, char *dstfmt, char *prompt, int silence, int maxsec)
 Record voice (after playing prompt if specified), waiting for silence (in ms) up to a given timeout (in s) or '#'.

int ast_app_has_voicemail (const char *mailbox)
 Determine if a given mailbox has any voicemail.

int ast_app_messagecount (const char *mailbox, int *newmsgs, int *oldmsgs)
 Determine number of new/old messages in a mailbox.


Function Documentation

int ast_app_getdata struct ast_channel c,
char *  prompt,
char *  s,
int  maxlen,
int  timeout
 

Plays a stream and gets DTMF data from a channel.

Parameters:
c Which channel one is interacting with
prompt File to pass to ast_streamfile (the one that you wish to play)
s The location where the DTMF data will be stored
maxlen Max Length of the data
timeout Timeout length waiting for data(in milliseconds). Set to 0 for standard timeout(six seconds), or -1 for no time out.
This function was designed for application programmers for situations where they need to play a message and then get some DTMF data in response to the message. If a digit is pressed during playback, it will immediately break out of the message and continue execution of your code.

Definition at line 35 of file app.c.

References ast_readstring(), ast_streamfile(), ast_pbx::dtimeout, ast_channel::language, ast_channel::pbx, and ast_pbx::rtimeout.

00036 {
00037    int res,to,fto;
00038    /* XXX Merge with full version? XXX */
00039    if (prompt) {
00040       res = ast_streamfile(c, prompt, c->language);
00041       if (res < 0)
00042          return res;
00043    }
00044    fto = c->pbx ? c->pbx->rtimeout * 1000 : 6000;
00045    to = c->pbx ? c->pbx->dtimeout * 1000 : 2000;
00046 
00047    if (timeout > 0) fto = to = timeout;
00048    if (timeout < 0) fto = to = 1000000000;
00049    res = ast_readstring(c, s, maxlen, to, fto, "#");
00050    return res;
00051 }

int ast_app_getdata_full struct ast_channel c,
char *  prompt,
char *  s,
int  maxlen,
int  timeout,
int  audiofd,
int  ctrlfd
 

Definition at line 54 of file app.c.

References ast_readstring_full(), ast_streamfile(), and ast_channel::language.

00055 {
00056    int res,to,fto;
00057    if (prompt) {
00058       res = ast_streamfile(c, prompt, c->language);
00059       if (res < 0)
00060          return res;
00061    }
00062    fto = 6000;
00063    to = 2000;
00064    if (timeout > 0) fto = to = timeout;
00065    if (timeout < 0) fto = to = 1000000000;
00066    res = ast_readstring_full(c, s, maxlen, to, fto, "#", audiofd, ctrlfd);
00067    return res;
00068 }

int ast_app_getvoice struct ast_channel c,
char *  dest,
char *  dstfmt,
char *  prompt,
int  silence,
int  maxsec
 

Record voice (after playing prompt if specified), waiting for silence (in ms) up to a given timeout (in s) or '#'.

Definition at line 70 of file app.c.

References ast_closestream(), ast_dsp_free(), ast_dsp_new(), ast_dsp_silence(), AST_FORMAT_SLINEAR, AST_FRAME_DTMF, AST_FRAME_VOICE, ast_frfree(), ast_log(), ast_read(), ast_set_read_format(), ast_streamfile(), ast_waitfor(), ast_waitstream(), ast_writefile(), ast_channel::language, LOG_NOTICE, LOG_WARNING, ast_channel::name, and ast_channel::readformat.

00071 {
00072    int res;
00073    struct ast_filestream *writer;
00074    int rfmt;
00075    int totalms=0, total;
00076    
00077    struct ast_frame *f;
00078    struct ast_dsp *sildet;
00079    /* Play prompt if requested */
00080    if (prompt) {
00081       res = ast_streamfile(c, prompt, c->language);
00082       if (res < 0)
00083          return res;
00084       res = ast_waitstream(c,"");
00085       if (res < 0)
00086          return res;
00087    }
00088    rfmt = c->readformat;
00089    res = ast_set_read_format(c, AST_FORMAT_SLINEAR);
00090    if (res < 0) {
00091       ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
00092       return -1;
00093    }
00094    sildet = ast_dsp_new();
00095    if (!sildet) {
00096       ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
00097       return -1;
00098    }
00099    writer = ast_writefile(dest, dstfmt, "Voice file", 0, 0, 0666);
00100    if (!writer) {
00101       ast_log(LOG_WARNING, "Unable to open file '%s' in format '%s' for writing\n", dest, dstfmt);
00102       ast_dsp_free(sildet);
00103       return -1;
00104    }
00105    for(;;) {
00106       if ((res = ast_waitfor(c, 2000)) < 0) {
00107          ast_log(LOG_NOTICE, "Waitfor failed while recording file '%s' format '%s'\n", dest, dstfmt);
00108          break;
00109       }
00110       if (res) {
00111          f = ast_read(c);
00112          if (!f) {
00113             ast_log(LOG_NOTICE, "Hungup while recording file '%s' format '%s'\n", dest, dstfmt);
00114             break;
00115          }
00116          if ((f->frametype == AST_FRAME_DTMF) && (f->subclass == '#')) {
00117             /* Ended happily with DTMF */
00118             ast_frfree(f);
00119             break;
00120          } else if (f->frametype == AST_FRAME_VOICE) {
00121             ast_dsp_silence(sildet, f, &total); 
00122             if (total > silence) {
00123                /* Ended happily with silence */
00124                ast_frfree(f);
00125                break;
00126             }
00127             totalms += f->samples / 8;
00128             if (totalms > maxsec * 1000) {
00129                /* Ended happily with too much stuff */
00130                ast_log(LOG_NOTICE, "Constraining voice on '%s' to %d seconds\n", c->name, maxsec);
00131                ast_frfree(f);
00132                break;
00133             }
00134          }
00135          ast_frfree(f);
00136       }
00137    }
00138    res = ast_set_read_format(c, rfmt);
00139    if (res)
00140       ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", c->name);
00141    ast_dsp_free(sildet);
00142    ast_closestream(writer);
00143    return 0;
00144 }

int ast_app_has_voicemail const char *  mailbox  ) 
 

Determine if a given mailbox has any voicemail.

Definition at line 146 of file app.c.

References ast_config_AST_SPOOL_DIR.

00147 {
00148    DIR *dir;
00149    struct dirent *de;
00150    char fn[256];
00151    char tmp[256]="";
00152    char *mb, *cur;
00153    char *context;
00154    int ret;
00155    /* If no mailbox, return immediately */
00156    if (!strlen(mailbox))
00157       return 0;
00158    if (strchr(mailbox, ',')) {
00159       strncpy(tmp, mailbox, sizeof(tmp));
00160       mb = tmp;
00161       ret = 0;
00162       while((cur = strsep(&mb, ","))) {
00163          if (strlen(cur)) {
00164             if (ast_app_has_voicemail(cur))
00165                return 1; 
00166          }
00167       }
00168       return 0;
00169    }
00170    strncpy(tmp, mailbox, sizeof(tmp) - 1);
00171    context = strchr(tmp, '@');
00172    if (context) {
00173       *context = '\0';
00174       context++;
00175    } else
00176       context = "default";
00177    snprintf(fn, sizeof(fn), "%s/voicemail/%s/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR, context, tmp);
00178    dir = opendir(fn);
00179    if (!dir)
00180       return 0;
00181    while ((de = readdir(dir))) {
00182       if (!strncasecmp(de->d_name, "msg", 3))
00183          break;
00184    }
00185    closedir(dir);
00186    if (de)
00187       return 1;
00188    return 0;
00189 }

int ast_app_messagecount const char *  mailbox,
int *  newmsgs,
int *  oldmsgs
 

Determine number of new/old messages in a mailbox.

Definition at line 191 of file app.c.

References ast_config_AST_SPOOL_DIR.

00192 {
00193    DIR *dir;
00194    struct dirent *de;
00195    char fn[256];
00196    char tmp[256]="";
00197    char *mb, *cur;
00198    char *context;
00199    int ret;
00200    if (newmsgs)
00201       *newmsgs = 0;
00202    if (oldmsgs)
00203       *oldmsgs = 0;
00204    /* If no mailbox, return immediately */
00205    if (!strlen(mailbox))
00206       return 0;
00207    if (strchr(mailbox, ',')) {
00208       int tmpnew, tmpold;
00209       strncpy(tmp, mailbox, sizeof(tmp));
00210       mb = tmp;
00211       ret = 0;
00212       while((cur = strsep(&mb, ", "))) {
00213          if (strlen(cur)) {
00214             if (ast_app_messagecount(cur, newmsgs ? &tmpnew : NULL, oldmsgs ? &tmpold : NULL))
00215                return -1;
00216             else {
00217                if (newmsgs)
00218                   *newmsgs += tmpnew; 
00219                if (oldmsgs)
00220                   *oldmsgs += tmpold;
00221             }
00222          }
00223       }
00224       return 0;
00225    }
00226    strncpy(tmp, mailbox, sizeof(tmp) - 1);
00227    context = strchr(tmp, '@');
00228    if (context) {
00229       *context = '\0';
00230       context++;
00231    } else
00232       context = "default";
00233    if (newmsgs) {
00234       snprintf(fn, sizeof(fn), "%s/voicemail/%s/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR, context, tmp);
00235       dir = opendir(fn);
00236       if (dir) {
00237          while ((de = readdir(dir))) {
00238             if ((strlen(de->d_name) > 3) && !strncasecmp(de->d_name, "msg", 3) &&
00239                !strcasecmp(de->d_name + strlen(de->d_name) - 3, "txt"))
00240                   (*newmsgs)++;
00241                
00242          }
00243          closedir(dir);
00244       }
00245    }
00246    if (oldmsgs) {
00247       snprintf(fn, sizeof(fn), "%s/voicemail/%s/%s/Old", (char *)ast_config_AST_SPOOL_DIR, context, tmp);
00248       dir = opendir(fn);
00249       if (dir) {
00250          while ((de = readdir(dir))) {
00251             if ((strlen(de->d_name) > 3) && !strncasecmp(de->d_name, "msg", 3) &&
00252                !strcasecmp(de->d_name + strlen(de->d_name) - 3, "txt"))
00253                   (*oldmsgs)++;
00254                
00255          }
00256          closedir(dir);
00257       }
00258    }
00259    return 0;
00260 }


Generated on Fri Oct 31 07:05:09 2003 for Asterisk by doxygen 1.3.4