summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorTerry Wilson <twilson@digium.com>2011-03-04 23:22:39 +0000
committerTerry Wilson <twilson@digium.com>2011-03-04 23:22:39 +0000
commit01a453351d06aa8e89101972d10c7d24ef073064 (patch)
treecc06645a95460a214cd95f3b8a3d95c16a0c6f0d /res
parentf6c2ebff45deaba14e450c09c6deb9d9500c88a2 (diff)
Add setvar option to calendaring
Adding the setvar option with variable substitution on the value allows things like setting the outbound caller id name to the summary of a calendar event, etc. Values could be chained together as they are appended in order to do some scripting if necessary. Review: https://reviewboard.asterisk.org/r/1134/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@309640 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r--res/res_calendar.c41
1 files changed, 39 insertions, 2 deletions
diff --git a/res/res_calendar.c b/res/res_calendar.c
index af81c183f..235eedc4e 100644
--- a/res/res_calendar.c
+++ b/res/res_calendar.c
@@ -313,6 +313,10 @@ static void calendar_destructor(void *obj)
}
ast_calendar_clear_events(cal);
ast_string_field_free_memory(cal);
+ if (cal->vars) {
+ ast_variables_destroy(cal->vars);
+ cal->vars = NULL;
+ }
ao2_ref(cal->events, -1);
ao2_unlock(cal);
}
@@ -369,7 +373,7 @@ static enum ast_device_state calendarstate(const char *data)
static struct ast_calendar *build_calendar(struct ast_config *cfg, const char *cat, const struct ast_calendar_tech *tech)
{
struct ast_calendar *cal;
- struct ast_variable *v;
+ struct ast_variable *v, *last = NULL;
int new_calendar = 0;
if (!(cal = find_calendar(cat))) {
@@ -423,6 +427,26 @@ static struct ast_calendar *build_calendar(struct ast_config *cfg, const char *c
cal->refresh = atoi(v->value);
} else if (!strcasecmp(v->name, "timeframe")) {
cal->timeframe = atoi(v->value);
+ } else if (!strcasecmp(v->name, "setvar")) {
+ char *name, *value;
+ struct ast_variable *var;
+
+ if ((name = (value = ast_strdup(v->value)))) {
+ strsep(&value, "=");
+ if (value) {
+ if ((var = ast_variable_new(ast_strip(name), ast_strip(value), ""))) {
+ if (last) {
+ last->next = var;
+ } else {
+ cal->vars = var;
+ }
+ last = var;
+ }
+ } else {
+ ast_log(LOG_WARNING, "Malformed argument. Should be '%s: variable=value'\n", v->name);
+ }
+ ast_free(name);
+ }
}
}
@@ -666,10 +690,11 @@ static void *do_notify(void *data)
{
struct ast_calendar_event *event = data;
struct ast_dial *dial = NULL;
- struct ast_str *apptext = NULL;
+ struct ast_str *apptext = NULL, *tmpstr;
struct ast_datastore *datastore;
enum ast_dial_result res;
struct ast_channel *chan = NULL;
+ struct ast_variable *itervar;
char *tech, *dest;
char buf[8];
@@ -720,6 +745,15 @@ static void *do_notify(void *data)
ao2_ref(event, +1);
res = ast_channel_datastore_add(chan, datastore);
+ if (!(tmpstr = ast_str_create(32))) {
+ goto notify_cleanup;
+ }
+
+ for (itervar = event->owner->vars; itervar; itervar = itervar->next) {
+ ast_str_substitute_variables(&tmpstr, 0, chan, itervar->value);
+ pbx_builtin_setvar_helper(chan, itervar->name, tmpstr->str);
+ }
+
if (!(apptext = ast_str_create(32))) {
goto notify_cleanup;
}
@@ -751,6 +785,9 @@ notify_cleanup:
if (apptext) {
ast_free(apptext);
}
+ if (tmpstr) {
+ ast_free(tmpstr);
+ }
if (dial) {
ast_dial_destroy(dial);
}