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