Add setvar option to calendaring
authorTerry Wilson <twilson@digium.com>
Fri, 4 Mar 2011 23:22:39 +0000 (23:22 +0000)
committerTerry Wilson <twilson@digium.com>
Fri, 4 Mar 2011 23:22:39 +0000 (23:22 +0000)
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

CHANGES
configs/calendar.conf.sample
include/asterisk/calendar.h
res/res_calendar.c

diff --git a/CHANGES b/CHANGES
index b55fb47..f6ad2ff 100644 (file)
--- 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 ----------------
 ------------------------------------------------------------------------------
index ad3ce09..82b8702 100644 (file)
 ;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 
index 8b970ae..a02570b 100644 (file)
@@ -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 */
index af81c18..235eedc 100644 (file)
@@ -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);
        }