Mon Nov 24 15:34:22 2008

Asterisk developer's documentation


app_forkcdr.c File Reference

Fork CDR application. More...

#include "asterisk.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/cdr.h"
#include "asterisk/app.h"
#include "asterisk/module.h"

Go to the source code of this file.

Enumerations

enum  {
  OPT_SETANS = (1 << 0), OPT_SETDISP = (1 << 1), OPT_RESETDEST = (1 << 2), OPT_ENDCDR = (1 << 3),
  OPT_NORESET = (1 << 4), OPT_KEEPVARS = (1 << 5), OPT_VARSET = (1 << 6), OPT_ANSLOCK = (1 << 7),
  OPT_DONTOUCH = (1 << 8)
}
enum  { OPT_ARG_VARSET = 0, OPT_ARG_ARRAY_SIZE }

Functions

 AST_APP_OPTIONS (forkcdr_exec_options,{AST_APP_OPTION('a', OPT_SETANS), AST_APP_OPTION('A', OPT_ANSLOCK), AST_APP_OPTION('d', OPT_SETDISP), AST_APP_OPTION('D', OPT_RESETDEST), AST_APP_OPTION('e', OPT_ENDCDR), AST_APP_OPTION('R', OPT_NORESET), AST_APP_OPTION_ARG('s', OPT_VARSET, OPT_ARG_VARSET), AST_APP_OPTION('T', OPT_DONTOUCH), AST_APP_OPTION('v', OPT_KEEPVARS),})
static void ast_cdr_fork (struct ast_channel *chan, struct ast_flags optflags, char *set)
 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Fork The CDR into 2 separate entities")
static int forkcdr_exec (struct ast_channel *chan, void *data)
static int load_module (void)
static int unload_module (void)

Variables

static char * app = "ForkCDR"
static char * descrip
static char * synopsis


Detailed Description

Fork CDR application.

Author:
Anthony Minessale anthmct@yahoo.com
Note:
Development of this app Sponsored/Funded by TAAN Softworks Corp

Definition in file app_forkcdr.c.


Enumeration Type Documentation

anonymous enum

Enumerator:
OPT_SETANS 
OPT_SETDISP 
OPT_RESETDEST 
OPT_ENDCDR 
OPT_NORESET 
OPT_KEEPVARS 
OPT_VARSET 
OPT_ANSLOCK 
OPT_DONTOUCH 

Definition at line 132 of file app_forkcdr.c.

00132      {
00133    OPT_SETANS =            (1 << 0),
00134    OPT_SETDISP =           (1 << 1),
00135    OPT_RESETDEST =         (1 << 2),
00136    OPT_ENDCDR =            (1 << 3),
00137    OPT_NORESET =           (1 << 4),
00138    OPT_KEEPVARS =          (1 << 5),
00139    OPT_VARSET =            (1 << 6),
00140    OPT_ANSLOCK =           (1 << 7),
00141    OPT_DONTOUCH =          (1 << 8),
00142 };

anonymous enum

Enumerator:
OPT_ARG_VARSET 
OPT_ARG_ARRAY_SIZE 

Definition at line 144 of file app_forkcdr.c.

00144      {
00145    OPT_ARG_VARSET = 0,
00146    /* note: this entry _MUST_ be the last one in the enum */
00147    OPT_ARG_ARRAY_SIZE,
00148 };


Function Documentation

AST_APP_OPTIONS ( forkcdr_exec_options   ) 

static void ast_cdr_fork ( struct ast_channel chan,
struct ast_flags  optflags,
char *  set 
) [static]

Definition at line 162 of file app_forkcdr.c.

References ast_cdr_append(), ast_cdr_dup(), ast_cdr_end(), AST_CDR_FLAG_ANSLOCKED, AST_CDR_FLAG_CHILD, AST_CDR_FLAG_DONT_TOUCH, AST_CDR_FLAG_KEEP_VARS, AST_CDR_FLAG_LOCKED, ast_cdr_free_vars(), ast_cdr_reset(), ast_cdr_setvar(), ast_set_flag, ast_strdupa, ast_strlen_zero(), ast_test_flag, ast_channel::cdr, ast_flags::flags, ast_cdr::next, OPT_ANSLOCK, OPT_DONTOUCH, OPT_ENDCDR, OPT_NORESET, OPT_RESETDEST, OPT_SETANS, and OPT_SETDISP.

00163 {
00164    struct ast_cdr *cdr;
00165    struct ast_cdr *newcdr;
00166    struct ast_flags flags = { AST_CDR_FLAG_KEEP_VARS };
00167 
00168    cdr = chan->cdr;
00169 
00170    while (cdr->next)
00171       cdr = cdr->next;
00172    
00173    if (!(newcdr = ast_cdr_dup(cdr)))
00174       return;
00175    
00176    ast_cdr_append(cdr, newcdr);
00177 
00178    if (!ast_test_flag(&optflags, OPT_NORESET))
00179       ast_cdr_reset(newcdr, &flags);
00180       
00181    if (!ast_test_flag(cdr, AST_CDR_FLAG_KEEP_VARS))
00182       ast_cdr_free_vars(cdr, 0);
00183    
00184    if (!ast_strlen_zero(set)) {
00185       char *varname = ast_strdupa(set), *varval;
00186       varval = strchr(varname,'=');
00187       if (varval) {
00188          *varval = 0;
00189          varval++;
00190          ast_cdr_setvar(cdr, varname, varval, 0);
00191       }
00192    }
00193    
00194    if (ast_test_flag(&optflags, OPT_SETANS) && !ast_tvzero(cdr->answer))
00195       newcdr->answer = newcdr->start;
00196 
00197    if (ast_test_flag(&optflags, OPT_SETDISP))
00198       newcdr->disposition = cdr->disposition;
00199    
00200    if (ast_test_flag(&optflags, OPT_RESETDEST))
00201       newcdr->dstchannel[0] = 0;
00202    
00203    if (ast_test_flag(&optflags, OPT_ENDCDR))
00204       ast_cdr_end(cdr);
00205 
00206    if (ast_test_flag(&optflags, OPT_ANSLOCK))
00207       ast_set_flag(cdr, AST_CDR_FLAG_ANSLOCKED);
00208    
00209    if (ast_test_flag(&optflags, OPT_DONTOUCH))
00210       ast_set_flag(cdr, AST_CDR_FLAG_DONT_TOUCH);
00211       
00212    ast_set_flag(cdr, AST_CDR_FLAG_CHILD | AST_CDR_FLAG_LOCKED);
00213 }

AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Fork The CDR into 2 separate entities"   
)

static int forkcdr_exec ( struct ast_channel chan,
void *  data 
) [static]

Definition at line 215 of file app_forkcdr.c.

References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), ast_channel::cdr, ast_flags::flags, LOG_WARNING, and OPT_ARG_ARRAY_SIZE.

Referenced by load_module().

00216 {
00217    int res = 0;
00218    struct ast_module_user *u;
00219    char *argcopy = NULL;
00220    struct ast_flags flags = {0};
00221    char *opts[OPT_ARG_ARRAY_SIZE];
00222    AST_DECLARE_APP_ARGS(arglist,
00223       AST_APP_ARG(options);
00224    );
00225 
00226    if (!chan->cdr) {
00227       ast_log(LOG_WARNING, "Channel does not have a CDR\n");
00228       return 0;
00229    }
00230 
00231    u = ast_module_user_add(chan);
00232 
00233    argcopy = ast_strdupa(data);
00234 
00235    AST_STANDARD_APP_ARGS(arglist, argcopy);
00236 
00237    opts[OPT_ARG_VARSET] = 0;
00238 
00239    if (!ast_strlen_zero(arglist.options))
00240       ast_app_parse_options(forkcdr_exec_options, &flags, opts, arglist.options);
00241    
00242    if (!ast_strlen_zero(data))
00243       ast_set2_flag(chan->cdr, ast_test_flag(&flags, OPT_KEEPVARS), AST_CDR_FLAG_KEEP_VARS);
00244    
00245    ast_cdr_fork(chan, flags, opts[OPT_ARG_VARSET]);
00246 
00247    ast_module_user_remove(u);
00248    return res;
00249 }

static int load_module ( void   )  [static]

Definition at line 262 of file app_forkcdr.c.

References ast_register_application(), and forkcdr_exec().

00263 {
00264    return ast_register_application(app, forkcdr_exec, synopsis, descrip);
00265 }

static int unload_module ( void   )  [static]

Definition at line 251 of file app_forkcdr.c.

References ast_module_user_hangup_all, and ast_unregister_application().

00252 {
00253    int res;
00254 
00255    res = ast_unregister_application(app);
00256 
00257    ast_module_user_hangup_all();
00258 
00259    return res; 
00260 }


Variable Documentation

char* app = "ForkCDR" [static]

Definition at line 46 of file app_forkcdr.c.

char* descrip [static]

Definition at line 49 of file app_forkcdr.c.

char* synopsis [static]

Initial value:

 
"Forks the Call Data Record"

Definition at line 47 of file app_forkcdr.c.


Generated on Mon Nov 24 15:34:22 2008 for Asterisk - the Open Source PBX by  doxygen 1.4.7