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: http://svn.digium.com/svn/asterisk/trunk@309640 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
daef48f984
commit
77bc3aa8e3
5
CHANGES
5
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 ----------------
|
||||
------------------------------------------------------------------------------
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Reference in New Issue