Sat Aug 6 00:39:34 2011

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

static void __reg_module (void)
static void __unreg_module (void)
static void ast_cdr_fork (struct ast_channel *chan, struct ast_flags optflags, char *set)
static int forkcdr_exec (struct ast_channel *chan, void *data)
static int load_module (void)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Fork The CDR into 2 separate entities" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, }
static char * app = "ForkCDR"
static const struct ast_module_infoast_module_info = &__mod_info
static char * descrip
static struct ast_app_option forkcdr_exec_options [128] = { [ 'a' ] = { .flag = OPT_SETANS }, [ 'A' ] = { .flag = OPT_ANSLOCK }, [ 'd' ] = { .flag = OPT_SETDISP }, [ 'D' ] = { .flag = OPT_RESETDEST }, [ 'e' ] = { .flag = OPT_ENDCDR }, [ 'R' ] = { .flag = OPT_NORESET }, [ 's' ] = { .flag = OPT_VARSET , .arg_index = OPT_ARG_VARSET + 1 }, [ 'T' ] = { .flag = OPT_DONTOUCH }, [ 'v' ] = { .flag = OPT_KEEPVARS },}
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

static void __reg_module ( void   )  [static]

Definition at line 267 of file app_forkcdr.c.

static void __unreg_module ( void   )  [static]

Definition at line 267 of file app_forkcdr.c.

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_tvzero(), 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 }

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

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Fork The CDR into 2 separate entities" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, } [static]

Definition at line 267 of file app_forkcdr.c.

char* app = "ForkCDR" [static]

Definition at line 46 of file app_forkcdr.c.

const struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 267 of file app_forkcdr.c.

char* descrip [static]

Definition at line 49 of file app_forkcdr.c.

struct ast_app_option forkcdr_exec_options[128] = { [ 'a' ] = { .flag = OPT_SETANS }, [ 'A' ] = { .flag = OPT_ANSLOCK }, [ 'd' ] = { .flag = OPT_SETDISP }, [ 'D' ] = { .flag = OPT_RESETDEST }, [ 'e' ] = { .flag = OPT_ENDCDR }, [ 'R' ] = { .flag = OPT_NORESET }, [ 's' ] = { .flag = OPT_VARSET , .arg_index = OPT_ARG_VARSET + 1 }, [ 'T' ] = { .flag = OPT_DONTOUCH }, [ 'v' ] = { .flag = OPT_KEEPVARS },} [static]

Definition at line 160 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 Sat Aug 6 00:39:34 2011 for Asterisk - the Open Source PBX by  doxygen 1.4.7