aboutsummaryrefslogtreecommitdiffstats
path: root/manager.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2005-07-15 23:24:51 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2005-07-15 23:24:51 +0000
commit195245925855327e6d12be2293c8e9fcc57662cd (patch)
tree1d145d53531c453391f74d30f64b85c38318a447 /manager.c
parentff15e0fa53156b9994da3f726bfe91232de6195a (diff)
Allow manager originate to specifiy more than one variable to be set.
Allow manager originate and spool files to set writable dialplan functions, including those that use the pipe symbol to seperate arguments. Allow CDR dialplan function to be able to set the account code and userfield. This deprecates the use of the Account header in manager originate and spool files, as well as the SetAccount and SetCDRUserField applications. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6147 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'manager.c')
-rwxr-xr-xmanager.c51
1 files changed, 39 insertions, 12 deletions
diff --git a/manager.c b/manager.c
index 1ebd22318..306c21795 100755
--- a/manager.c
+++ b/manager.c
@@ -46,8 +46,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/acl.h"
#include "asterisk/utils.h"
-struct fast_originate_helper
-{
+struct fast_originate_helper {
char tech[256];
char data[256];
int timeout;
@@ -55,12 +54,11 @@ struct fast_originate_helper
char appdata[256];
char cid_name[256];
char cid_num[256];
- char variable[256];
- char account[256];
char context[256];
char exten[256];
char idtext[256];
int priority;
+ struct ast_variable *vars;
};
static int enabled = 0;
@@ -283,6 +281,30 @@ char *astman_get_header(struct message *m, char *var)
return "";
}
+struct ast_variable *astman_get_variables(struct message *m)
+{
+ int varlen, x;
+ struct ast_variable *head = NULL, *cur;
+ char *var, *val;
+
+ varlen = strlen("Variable: ");
+
+ for (x = 0; x < m->hdrcount; x++) {
+ if (!strncasecmp("Variable: ", m->headers[x], varlen)) {
+ var = val = ast_strdupa(m->headers[x] + varlen);
+ strsep(&val, "=");
+ cur = ast_variable_new(var, val);
+ if (head) {
+ cur->next = head;
+ head = cur;
+ } else
+ head = cur;
+ }
+ }
+
+ return head;
+}
+
void astman_send_error(struct mansession *s, struct message *m, char *error)
{
char *id = astman_get_header(m,"ActionID");
@@ -864,12 +886,12 @@ static void *fast_originate(void *data)
res = ast_pbx_outgoing_app(in->tech, AST_FORMAT_SLINEAR, in->data, in->timeout, in->app, in->appdata, &reason, 1,
!ast_strlen_zero(in->cid_num) ? in->cid_num : NULL,
!ast_strlen_zero(in->cid_name) ? in->cid_name : NULL,
- in->variable, in->account, &chan);
+ in->vars, &chan);
} else {
res = ast_pbx_outgoing_exten(in->tech, AST_FORMAT_SLINEAR, in->data, in->timeout, in->context, in->exten, in->priority, &reason, 1,
!ast_strlen_zero(in->cid_num) ? in->cid_num : NULL,
!ast_strlen_zero(in->cid_name) ? in->cid_name : NULL,
- in->variable, in->account, &chan);
+ in->vars, &chan);
}
if (!res)
manager_event(EVENT_FLAG_CALL,
@@ -923,12 +945,12 @@ static int action_originate(struct mansession *s, struct message *m)
char *priority = astman_get_header(m, "Priority");
char *timeout = astman_get_header(m, "Timeout");
char *callerid = astman_get_header(m, "CallerID");
- char *variable = astman_get_header(m, "Variable");
char *account = astman_get_header(m, "Account");
char *app = astman_get_header(m, "Application");
char *appdata = astman_get_header(m, "Data");
char *async = astman_get_header(m, "Async");
char *id = astman_get_header(m, "ActionID");
+ struct ast_variable *vars = astman_get_variables(m);
char *tech, *data;
char *l=NULL, *n=NULL;
int pi = 0;
@@ -936,7 +958,7 @@ static int action_originate(struct mansession *s, struct message *m)
int to = 30000;
int reason = 0;
char tmp[256];
- char tmp2[256]="";
+ char tmp2[256];
pthread_t th;
pthread_attr_t attr;
@@ -972,6 +994,12 @@ static int action_originate(struct mansession *s, struct message *m)
if (ast_strlen_zero(l))
l = NULL;
}
+ if (account) {
+ struct ast_variable *newvar;
+ newvar = ast_variable_new("CDR(accountcode|r)", account);
+ newvar->next = vars;
+ vars = newvar;
+ }
if (ast_true(async)) {
struct fast_originate_helper *fast = malloc(sizeof(struct fast_originate_helper));
if (!fast) {
@@ -988,8 +1016,7 @@ static int action_originate(struct mansession *s, struct message *m)
ast_copy_string(fast->cid_num, l, sizeof(fast->cid_num));
if (n)
ast_copy_string(fast->cid_name, n, sizeof(fast->cid_name));
- ast_copy_string(fast->variable, variable, sizeof(fast->variable));
- ast_copy_string(fast->account, account, sizeof(fast->account));
+ fast->vars = vars;
ast_copy_string(fast->context, context, sizeof(fast->context));
ast_copy_string(fast->exten, exten, sizeof(fast->exten));
fast->timeout = to;
@@ -1003,10 +1030,10 @@ static int action_originate(struct mansession *s, struct message *m)
}
}
} else if (!ast_strlen_zero(app)) {
- res = ast_pbx_outgoing_app(tech, AST_FORMAT_SLINEAR, data, to, app, appdata, &reason, 1, l, n, variable, account, NULL);
+ res = ast_pbx_outgoing_app(tech, AST_FORMAT_SLINEAR, data, to, app, appdata, &reason, 1, l, n, vars, NULL);
} else {
if (exten && context && pi)
- res = ast_pbx_outgoing_exten(tech, AST_FORMAT_SLINEAR, data, to, context, exten, pi, &reason, 1, l, n, variable, account, NULL);
+ res = ast_pbx_outgoing_exten(tech, AST_FORMAT_SLINEAR, data, to, context, exten, pi, &reason, 1, l, n, vars, NULL);
else {
astman_send_error(s, m, "Originate with 'Exten' requires 'Context' and 'Priority'");
return 0;