Mon Oct 8 12:39:07 2012

Asterisk developer's documentation


app_forkcdr.c File Reference

Fork CDR application. More...

#include "asterisk.h"
#include "asterisk/file.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, const char *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_LOAD_ORDER , .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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static char * app = "ForkCDR"
static struct ast_module_infoast_module_info = &__mod_info
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 },}


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 150 of file app_forkcdr.c.

00150      {
00151    OPT_SETANS =            (1 << 0),
00152    OPT_SETDISP =           (1 << 1),
00153    OPT_RESETDEST =         (1 << 2),
00154    OPT_ENDCDR =            (1 << 3),
00155    OPT_NORESET =           (1 << 4),
00156    OPT_KEEPVARS =          (1 << 5),
00157    OPT_VARSET =            (1 << 6),
00158    OPT_ANSLOCK =           (1 << 7),
00159    OPT_DONTOUCH =          (1 << 8),
00160 };

anonymous enum

Enumerator:
OPT_ARG_VARSET 
OPT_ARG_ARRAY_SIZE 

Definition at line 162 of file app_forkcdr.c.

00162      {
00163    OPT_ARG_VARSET = 0,
00164    /* note: this entry _MUST_ be the last one in the enum */
00165    OPT_ARG_ARRAY_SIZE,
00166 };


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 282 of file app_forkcdr.c.

static void __unreg_module ( void   )  [static]

Definition at line 282 of file app_forkcdr.c.

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

Definition at line 180 of file app_forkcdr.c.

References ast_cdr_append(), ast_cdr_dup_unique(), 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.

00181 {
00182    struct ast_cdr *cdr;
00183    struct ast_cdr *newcdr;
00184    struct ast_flags flags = { AST_CDR_FLAG_KEEP_VARS };
00185 
00186    cdr = chan->cdr;
00187 
00188    while (cdr->next)
00189       cdr = cdr->next;
00190    
00191    if (!(newcdr = ast_cdr_dup_unique(cdr)))
00192       return;
00193    
00194    /*
00195     * End the original CDR if requested BEFORE appending the new CDR
00196     * otherwise we incorrectly end the new CDR also.
00197     */
00198    if (ast_test_flag(&optflags, OPT_ENDCDR)) {
00199       ast_cdr_end(cdr);
00200    }
00201 
00202    ast_cdr_append(cdr, newcdr);
00203 
00204    if (!ast_test_flag(&optflags, OPT_NORESET))
00205       ast_cdr_reset(newcdr, &flags);
00206       
00207    if (!ast_test_flag(cdr, AST_CDR_FLAG_KEEP_VARS))
00208       ast_cdr_free_vars(cdr, 0);
00209    
00210    if (!ast_strlen_zero(set)) {
00211       char *varname = ast_strdupa(set), *varval;
00212       varval = strchr(varname,'=');
00213       if (varval) {
00214          *varval = 0;
00215          varval++;
00216          ast_cdr_setvar(cdr, varname, varval, 0);
00217       }
00218    }
00219    
00220    if (ast_test_flag(&optflags, OPT_SETANS) && !ast_tvzero(cdr->answer))
00221       newcdr->answer = newcdr->start;
00222 
00223    if (ast_test_flag(&optflags, OPT_SETDISP))
00224       newcdr->disposition = cdr->disposition;
00225    
00226    if (ast_test_flag(&optflags, OPT_RESETDEST))
00227       newcdr->dstchannel[0] = 0;
00228    
00229    if (ast_test_flag(&optflags, OPT_ANSLOCK))
00230       ast_set_flag(cdr, AST_CDR_FLAG_ANSLOCKED);
00231    
00232    if (ast_test_flag(&optflags, OPT_DONTOUCH))
00233       ast_set_flag(cdr, AST_CDR_FLAG_DONT_TOUCH);
00234       
00235    ast_set_flag(cdr, AST_CDR_FLAG_CHILD | AST_CDR_FLAG_LOCKED);
00236 }

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

Definition at line 238 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().

00239 {
00240    int res = 0;
00241    char *argcopy = NULL;
00242    struct ast_flags flags = {0};
00243    char *opts[OPT_ARG_ARRAY_SIZE];
00244    AST_DECLARE_APP_ARGS(arglist,
00245       AST_APP_ARG(options);
00246    );
00247 
00248    if (!chan->cdr) {
00249       ast_log(LOG_WARNING, "Channel does not have a CDR\n");
00250       return 0;
00251    }
00252 
00253    argcopy = ast_strdupa(data);
00254 
00255    AST_STANDARD_APP_ARGS(arglist, argcopy);
00256 
00257    opts[OPT_ARG_VARSET] = 0;
00258 
00259    if (!ast_strlen_zero(arglist.options))
00260       ast_app_parse_options(forkcdr_exec_options, &flags, opts, arglist.options);
00261 
00262    if (!ast_strlen_zero(data)) {
00263       int keepvars = ast_test_flag(&flags, OPT_KEEPVARS) ? 1 : 0;
00264       ast_set2_flag(chan->cdr, keepvars, AST_CDR_FLAG_KEEP_VARS);
00265    }
00266    
00267    ast_cdr_fork(chan, flags, opts[OPT_ARG_VARSET]);
00268 
00269    return res;
00270 }

static int load_module ( void   )  [static]

Definition at line 277 of file app_forkcdr.c.

References ast_register_application_xml, and forkcdr_exec().

00278 {
00279    return ast_register_application_xml(app, forkcdr_exec);
00280 }

static int unload_module ( void   )  [static]

Definition at line 272 of file app_forkcdr.c.

References ast_unregister_application().

00273 {
00274    return ast_unregister_application(app);
00275 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 282 of file app_forkcdr.c.

char* app = "ForkCDR" [static]

Definition at line 148 of file app_forkcdr.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 282 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 178 of file app_forkcdr.c.


Generated on Mon Oct 8 12:39:07 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7