summaryrefslogtreecommitdiff
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
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
-rw-r--r--CHANGES5
-rw-r--r--configs/calendar.conf.sample7
-rw-r--r--include/asterisk/calendar.h1
-rw-r--r--res/res_calendar.c41
4 files changed, 52 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index b55fb47bf..f6ad2ffe8 100644
--- a/CHANGES
+++ b/CHANGES
@@ -65,6 +65,11 @@ libpri channel driver (chan_dahdi) DAHDI changes
application when the option is enabled.
* Added mcid_send option to allow sending a MCID request on a span.
+Calendaring
+--------------------------
+ * Added setvar option to calendar.conf to allow setting channel variables on
+ notification channels.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 1.6.2 to Asterisk 1.8 ----------------
------------------------------------------------------------------------------
diff --git a/configs/calendar.conf.sample b/configs/calendar.conf.sample
index ad3ce0983..82b8702f0 100644
--- a/configs/calendar.conf.sample
+++ b/configs/calendar.conf.sample
@@ -32,6 +32,13 @@
;appdata = tt-weasels ; Data part of application to execute on answer
;
;waittime = 30 ; How long to wait for an answer, defaults to 30 seconds
+;
+; Channel variables can be set on the notification channel. The format is
+; setvar=name=value. Variable subsitution is done on the value to allow the use of dialplan
+; functions like CALENDAR_EVENT. The variables are set in order, so one can use the value
+; of earlier variables in the definition of later ones.
+;
+;setvar = CALLERID(name)=${CALENDAR_EVENT(summary)}
;[calendar2]
; Note: Support for Exchange Server 2003
diff --git a/include/asterisk/calendar.h b/include/asterisk/calendar.h
index 8b970ae69..a02570bf3 100644
--- a/include/asterisk/calendar.h
+++ b/include/asterisk/calendar.h
@@ -123,6 +123,7 @@ struct ast_calendar {
AST_STRING_FIELD(notify_app); /*!< Optional dialplan app to execute for notification */
AST_STRING_FIELD(notify_appdata); /*!< Optional arguments for dialplan app */
);
+ struct ast_variable *vars; /*!< Channel variables to pass to notification channel */
int autoreminder; /*!< If set, override any calendar_tech specific notification times and use this time (in mins) */
int notify_waittime; /*!< Maxiumum time to allow for a notification attempt */
int refresh; /*!< When to refresh the calendar events */
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);
}