diff --git a/CHANGES b/CHANGES index b55fb47bf0..f6ad2ffe83 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 ad3ce09834..82b8702f01 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 8b970ae696..a02570bf32 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 af81c183f8..235eedc4e9 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); }