major re-work of dialplan functions, including:
[asterisk/asterisk.git] / funcs / func_cdr.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * MD5 digest related dialplan functions
5  * 
6  * Copyright (C) 2005, Digium, Inc.
7  *
8  * This program is free software, distributed under the terms of
9  * the GNU General Public License
10  */
11
12 #include <stdlib.h>
13 #include <string.h>
14 #include <sys/types.h>
15
16 #include "asterisk/channel.h"
17 #include "asterisk/pbx.h"
18 #include "asterisk/logger.h"
19 #include "asterisk/utils.h"
20 #include "asterisk/app.h"
21 #include "asterisk/cdr.h"
22
23 static char *builtin_function_cdr_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
24 {
25         char *ret;
26         char *mydata;
27         int argc;
28         char *argv[2];
29         int recursive = 0;
30
31         if (!data || ast_strlen_zero(data))
32                 return NULL;
33         
34         if (!chan->cdr)
35                 return NULL;
36
37         mydata = ast_strdupa(data);
38         argc = ast_separate_app_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0]));
39
40         /* check for a trailing flags argument */
41         if (argc > 1) {
42                 argc--;
43                 if (strchr(argv[argc], 'r'))
44                         recursive = 1;
45         }
46
47         ast_cdr_getvar(chan->cdr, argv[0], &ret, buf, len, recursive);
48
49         return ret;
50 }
51
52 static void builtin_function_cdr_write(struct ast_channel *chan, char *cmd, char *data, const char *value) 
53 {
54         char *mydata;
55         int argc;
56         char *argv[2];
57         int recursive = 0;
58
59         if (!data || ast_strlen_zero(data) || !value)
60                 return;
61         
62         if (!chan->cdr)
63                 return;
64
65         mydata = ast_strdupa(data);
66         argc = ast_separate_app_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0]));
67
68         /* check for a trailing flags argument */
69         if (argc > 1) {
70                 argc--;
71                 if (strchr(argv[argc], 'r'))
72                         recursive = 1;
73         }
74
75         ast_cdr_setvar(chan->cdr, argv[0], value, recursive);
76 }
77
78 #ifndef BUILTIN_FUNC
79 static
80 #endif
81 struct ast_custom_function cdr_function = {
82         .name = "CDR",
83         .synopsis = "Gets or sets a CDR variable",
84         .desc= "Option 'r' searches the entire stack of CDRs on the channel\n",
85         .syntax = "CDR(<name>[|options])",
86         .read = builtin_function_cdr_read,
87         .write = builtin_function_cdr_write,
88 };
89