[svn-commits] murf: branch murf/newcdr r62094 - in /team/murf/newcdr: cel/ configs/ funcs/ ...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Thu Apr 26 21:09:44 MST 2007


Author: murf
Date: Thu Apr 26 23:09:43 2007
New Revision: 62094

URL: http://svn.digium.com/view/asterisk?view=rev&rev=62094
Log:
Hmmm. Hit me while I was going over the cdr struct, that most of these fields are copies of what's in the channel. So I got rid of them. UserField? Could be a simple channel var. Put a channel ptr in the cel struct. Now down really to event time and type.

Added:
    team/murf/newcdr/funcs/func_cel.c   (with props)
Modified:
    team/murf/newcdr/cel/cel_custom.c
    team/murf/newcdr/configs/cel_custom.conf.sample
    team/murf/newcdr/include/asterisk/cel.h
    team/murf/newcdr/main/cel.c

Modified: team/murf/newcdr/cel/cel_custom.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/cel/cel_custom.c?view=diff&rev=62094&r1=62093&r2=62094
==============================================================================
--- team/murf/newcdr/cel/cel_custom.c (original)
+++ team/murf/newcdr/cel/cel_custom.c Thu Apr 26 23:09:43 2007
@@ -118,9 +118,7 @@
 	memset(buf, 0 , sizeof(buf));
 	/* Quite possibly the first use of a static struct ast_channel, we need it so the var funcs will work */
 	/* fix this code */
-	memset(&dummy, 0, sizeof(dummy));
-	dummy.cdr = cel;
-	pbx_substitute_variables_helper(&dummy, format, buf, sizeof(buf) - 1);
+	pbx_substitute_variables_helper(cel->chan, format, buf, sizeof(buf) - 1);
 
 	/* because of the absolutely unconditional need for the
 	   highest reliability possible in writing billing records,

Modified: team/murf/newcdr/configs/cel_custom.conf.sample
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/configs/cel_custom.conf.sample?view=diff&rev=62094&r1=62093&r2=62094
==============================================================================
--- team/murf/newcdr/configs/cel_custom.conf.sample (original)
+++ team/murf/newcdr/configs/cel_custom.conf.sample Thu Apr 26 23:09:43 2007
@@ -6,5 +6,5 @@
 ; 
 ;
 ;[mappings]
-;Master.csv => "${CEL(eventtype)}","${CEL(eventname)}","${CEL(eventtime)}","${CEL(clid)}","${CEL(src)}","${CEL(exten)}","${CEL(context)}","${CEL(channel)}","${CEL(app)}","${CEL(appdata)}","${CEL(disposition)}","${CEL(amaflags)}","${CEL(accountcode)}","${CEL(uniqueid)}","${CEL(userfield)}"
+;Master.csv => "${CEL(eventtype)}","${CEL(eventname)}","${CEL(eventtime)}","${CEL(clid)}","${CEL(clidnum)}","${CEL(exten)}","${CEL(context)}","${CEL(channel)}","${CEL(app)}","${CEL(appdata)}","${CEL(amaflags)}","${CEL(accountcode)}","${CEL(uniqueid)}"
 

Added: team/murf/newcdr/funcs/func_cel.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/funcs/func_cel.c?view=auto&rev=62094
==============================================================================
--- team/murf/newcdr/funcs/func_cel.c (added)
+++ team/murf/newcdr/funcs/func_cel.c Thu Apr 26 23:09:43 2007
@@ -1,0 +1,160 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2007, Digium, Inc.
+ *
+ * Portions Copyright (C) 2005, Anthony Minessale II
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief  Call Detail Record related dialplan functions
+ *
+ * \author Steve Murphy, using basis from:
+ * \author Anthony Minessale II 
+ *
+ * \ingroup functions
+ */
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "asterisk/module.h"
+#include "asterisk/channel.h"
+#include "asterisk/pbx.h"
+#include "asterisk/logger.h"
+#include "asterisk/utils.h"
+#include "asterisk/app.h"
+#include "asterisk/cel.h"
+
+enum {
+	OPT_RECURSIVE = (1 << 0),
+	OPT_UNPARSED = (1 << 1),
+	OPT_LAST = (1 << 2),
+} cel_option_flags;
+
+AST_APP_OPTIONS(cel_func_options, {
+	AST_APP_OPTION('u', OPT_UNPARSED),
+});
+
+static int cel_read(struct ast_channel *chan, const char *cmd, char *parse,
+		    char *buf, size_t len)
+{
+	char *ret;
+	struct ast_flags flags = { 0 };
+	struct ast_cel *cel = chan ? chan->cel : NULL;
+	AST_DECLARE_APP_ARGS(args,
+			     AST_APP_ARG(variable);
+			     AST_APP_ARG(options);
+	);
+
+	if (ast_strlen_zero(parse))
+		return -1;
+
+	if (!cel)
+		return -1;
+
+	AST_STANDARD_APP_ARGS(args, parse);
+
+	if (!ast_strlen_zero(args.options))
+		ast_app_parse_options(cel_func_options, &flags, NULL, args.options);
+
+	ast_cel_getvar(cel, args.variable, &ret, buf, len,
+			   ast_test_flag(&flags, OPT_UNPARSED));
+
+	return 0;
+}
+
+static int cel_write(struct ast_channel *chan, const char *cmd, char *parse,
+		     const char *value)
+{
+	struct ast_flags flags = { 0 };
+	AST_DECLARE_APP_ARGS(args,
+			     AST_APP_ARG(variable);
+			     AST_APP_ARG(options);
+	);
+
+	if (ast_strlen_zero(parse) || !value || !chan)
+		return -1;
+
+	AST_STANDARD_APP_ARGS(args, parse);
+
+	if (!ast_strlen_zero(args.options))
+		ast_app_parse_options(cel_func_options, &flags, NULL, args.options);
+
+	if (!strcasecmp(args.variable, "accountcode"))
+		ast_cel_setaccount(chan, value);
+	else if (!strcasecmp(args.variable, "amaflags"))
+		ast_cel_setamaflags(chan, value);
+	else
+		ast_cel_setvar(chan->cel, args.variable, value, ast_test_flag(&flags, OPT_RECURSIVE));
+		/* No need to worry about the u flag, as all fields for which setting
+		 * 'u' would do anything are marked as readonly. */
+
+	return 0;
+}
+
+static struct ast_custom_function cel_function = {
+	.name = "CEL",
+	.synopsis = "Gets or sets a CEL variable",
+	.syntax = "CEL(<name>[|options])",
+	.read = cel_read,
+	.write = cel_write,
+	.desc =
+"Options:\n"
+"  'u' retrieves the raw, unprocessed value\n"
+"  For example, 'eventtime', will be retrieved as epoch\n"
+"  values, when the 'u' option is passed, but formatted as YYYY-MM-DD HH:MM:SS\n"
+"  otherwise.  Similarly, disposition and amaflags will return their raw\n"
+"  integral values.\n"
+"  For the most part, these are channel fields; in some cases, info specific\n"
+"   to the Channel Event will be stored into the channel variables for the possible\n"
+"   use of the various CEL backends. These are not readable, or modifiable except by\n"
+"     eventtime = epoch value (raw) of the time the event occurred.\n"
+"     eventtype = an ascii string representing the type of event\n"
+"     usereventname = if eventtype = USER_EVENT, then this field\n"
+"                     contains the designated name of the event\n"
+"  Here is a list of all the available channel field names:\n"
+"    clid          appdata\n"
+"    clidnum       amaflags\n"
+"    exten         accountcode\n"
+"    context       uniqueid\n"
+"    channel       app\n"
+"  All of the above variables are read-only, except for accountcode,\n"
+"  and amaflags. You may, however,  supply\n"
+"  a name not on the above list, and create your own\n"
+"  variable, whose value can be changed with this function,\n"
+"  and this variable will be stored on the channel.\n"
+"    raw values for amaflags:\n"
+"       1 = OMIT\n"
+"       2 = BILLING\n"
+"       3 = DOCUMENTATION\n",
+};
+
+static int unload_module(void)
+{
+	return ast_custom_function_unregister(&cel_function);
+}
+
+static int load_module(void)
+{
+	return ast_custom_function_register(&cel_function);
+}
+
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "CEL dialplan function");

Propchange: team/murf/newcdr/funcs/func_cel.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/murf/newcdr/funcs/func_cel.c
------------------------------------------------------------------------------
    svn:keywords = Author Id Date Revision

Propchange: team/murf/newcdr/funcs/func_cel.c
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: team/murf/newcdr/include/asterisk/cel.h
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/include/asterisk/cel.h?view=diff&rev=62094&r1=62093&r2=62094
==============================================================================
--- team/murf/newcdr/include/asterisk/cel.h (original)
+++ team/murf/newcdr/include/asterisk/cel.h Thu Apr 26 23:09:43 2007
@@ -36,6 +36,7 @@
 /* Include channel.h after relevant declarations it will need */
 #include "asterisk/channel.h"
 #include "asterisk/utils.h"
+#include "asterisk/event.h"
 
 enum ast_cel_eventtype {
 	/*! channel birth */
@@ -70,46 +71,22 @@
 	
 /*! Responsible for call detail data */
 struct ast_cel {
+	/*! the channel involved */
+	struct ast_channel *chan;
 	/*! At what time did this event occur? */
 	struct timeval eventtime;
 	/*! wha' happened? */
 	enum ast_cel_eventtype eventtype;
 	/*! Which userEvent? */
 	char usereventname[AST_MAX_EXTENSION];
-	/*! Caller*ID with text */
-	char clid[AST_MAX_EXTENSION];
-	/*! Caller*ID number */
-	char clidnum[AST_MAX_EXTENSION];		
-	/*! Extension */
-	char exten[AST_MAX_EXTENSION];		
-	/*! Context */
-	char context[AST_MAX_EXTENSION];	
-	/*! Channel name */
-	char channel[AST_MAX_EXTENSION];
-
-	/*! Application if appropriate */
-	char app[AST_MAX_EXTENSION];	
-	/*! Last application data/args */
-	char appdata[AST_MAX_EXTENSION];	
-	
-	/*! What flags to use */
-	long int amaflags;				
-	/*! What account number to use */
-	char accountcode[AST_MAX_ACCOUNT_CODE];			
-	/* Unique Channel Identifier */
-	char uniqueid[32];
-	/* User field */
-	char userfield[AST_MAX_USER_FIELD];
-
-	/* A linked list for variables */
-	struct varshead varshead;
+	/* we got rid of userfield in favor of just plain vars */
 };
 
 /*! \brief Return TRUE if CDR subsystem is enabled */
 int check_cel_enabled(void);
 
-/*! \brief Allocate a CDR record 
- * Returns a malloc'd ast_cdr structure, returns NULL on error (malloc failure)
+/*! \brief Allocate a CEL record 
+ * Returns a malloc'd ast_cel structure, returns NULL on error (malloc failure)
  */
 struct ast_cdr *ast_cel_alloc(void);
 

Modified: team/murf/newcdr/main/cel.c
URL: http://svn.digium.com/view/asterisk/team/murf/newcdr/main/cel.c?view=diff&rev=62094&r1=62093&r2=62094
==============================================================================
--- team/murf/newcdr/main/cel.c (original)
+++ team/murf/newcdr/main/cel.c Thu Apr 26 23:09:43 2007
@@ -168,10 +168,102 @@
 	return "Unknown";
 }
 
-void ast_cel_destroy(struct ast_cel *cel)
-{
-	ast_cdr_free_vars(cdr, 0);
-}
+int ast_cel_setaccount(struct ast_channel *chan, const char *account)
+{
+
+	ast_string_field_set(chan, accountcode, account);
+	return 0;
+}
+
+int ast_cel_setamaflags(struct ast_channel *chan, const char *flag)
+{
+	int newflag = ast_cel_amaflags2int(flag);
+	chan->amaflags = newflag;
+	return 0;
+}
+
+int ast_cel_amaflags2int(const char *flag)
+{
+	if (!strcasecmp(flag, "default"))
+		return 0;
+	if (!strcasecmp(flag, "omit"))
+		return AST_CDR_OMIT;
+	if (!strcasecmp(flag, "billing"))
+		return AST_CDR_BILLING;
+	if (!strcasecmp(flag, "documentation"))
+		return AST_CDR_DOCUMENTATION;
+	return -1;
+}
+
+static const char *ast_cel_getvar_internal(struct ast_channel *chan, const char *name) 
+{
+	struct ast_var_t *variables;
+	struct varshead *headp = &chan->varshead;
+	
+	if (ast_strlen_zero(name))
+		return NULL;
+
+	AST_LIST_TRAVERSE(headp, variables, entries) {
+		if (!strcasecmp(name, ast_var_name(variables)))
+			return ast_var_value(variables);
+	}
+	
+	return NULL;
+}
+
+/*! CDR channel variable retrieval */
+void ast_cel_getvar(struct ast_channel *chan, const char *name, char **ret, char *workspace, int workspacelen, int raw) 
+{
+	const char *fmt = "%Y-%m-%d %T";
+	const char *varbuf;
+
+	if (!chan)  /* don't die if the cdr is null */
+		return;
+
+	*ret = NULL;
+
+	if (!strcasecmp(name, "clid"))
+		ast_copy_string(workspace, chan->cid->cid_name, workspacelen);
+	else if (!strcasecmp(name, "clidnum"))
+		ast_copy_string(workspace, chan->cid->cid_num, workspacelen);
+	else if (!strcasecmp(name, "clidani"))
+		ast_copy_string(workspace, chan->cid->cid_ani, workspacelen);
+	else if (!strcasecmp(name, "clidrdnis"))
+		ast_copy_string(workspace, chan->cid->cid_rdnis, workspacelen);
+	else if (!strcasecmp(name, "exten"))
+		ast_copy_string(workspace, chan->exten, workspacelen);
+	else if (!strcasecmp(name, "context"))
+		ast_copy_string(workspace, chan->context, workspacelen);
+	else if (!strcasecmp(name, "channel"))
+		ast_copy_string(workspace, chan->name, workspacelen);
+	else if (!strcasecmp(name, "app"))
+		ast_copy_string(workspace, chan->appl, workspacelen);
+	else if (!strcasecmp(name, "appdata"))
+		ast_copy_string(workspace, chan->data, workspacelen);
+	} else if (!strcasecmp(name, "amaflags")) {
+		if (raw) {
+			snprintf(workspace, workspacelen, "%ld", chan->amaflags);
+		} else {
+			ast_copy_string(workspace, ast_cel_flags2str(chan->amaflags), workspacelen);
+		}
+	} else if (!strcasecmp(name, "accountcode"))
+		ast_copy_string(workspace, chan->accountcode, workspacelen);
+	else if (!strcasecmp(name, "uniqueid"))
+		ast_copy_string(workspace, chan->uniqueid, workspacelen);
+	else if ((varbuf = ast_cel_getvar_internal(chan, name)))
+		ast_copy_string(workspace, varbuf, workspacelen);
+	else
+		workspace[0] = '\0';
+
+	if (!ast_strlen_zero(workspace))
+		*ret = workspace;
+}
+
+/* readonly channel variables */
+static	const char *cel_readonly_vars[] = { "clid", "clidnum", "exten", "context", "channel",
+											"app", "appdata", "eventtype", "eventname", "usereventname",
+											"uniqueid",
+											NULL };
 
 /*! Frees the cel struct */
 void ast_cel_destroy(struct ast_cel *cel)
@@ -179,3 +271,4 @@
 	ast_cel_free_vars(cel, 0);
 	free(cel);
 }
+



More information about the svn-commits mailing list