Merge the dialplan_aesthetics branch. Most of this patch simply converts applications
[asterisk/asterisk.git] / main / pbx.c
index bb9692a..34b3eee 100644 (file)
@@ -303,7 +303,7 @@ static struct pbx_builtin {
 
        { "BackGround", pbx_builtin_background,
        "Play an audio file while waiting for digits of an extension to go to.",
 
        { "BackGround", pbx_builtin_background,
        "Play an audio file while waiting for digits of an extension to go to.",
-       "  Background(filename1[&filename2...][|options[|langoverride][|context]]):\n"
+       "  Background(filename1[&filename2...][,options[,langoverride][,context]]):\n"
        "This application will play the given list of files while waiting for an\n"
        "extension to be dialed by the calling channel. To continue waiting for digits\n"
        "after this application has finished playing files, the WaitExten application\n"
        "This application will play the given list of files while waiting for an\n"
        "extension to be dialed by the calling channel. To continue waiting for digits\n"
        "after this application has finished playing files, the WaitExten application\n"
@@ -344,14 +344,14 @@ static struct pbx_builtin {
 
        { "ExecIfTime", pbx_builtin_execiftime,
        "Conditional application execution based on the current time",
 
        { "ExecIfTime", pbx_builtin_execiftime,
        "Conditional application execution based on the current time",
-       "  ExecIfTime(<times>|<weekdays>|<mdays>|<months>?appname[|appargs]):\n"
+       "  ExecIfTime(<times>,<weekdays>,<mdays>,<months>?appname[(appargs)]):\n"
        "This application will execute the specified dialplan application, with optional\n"
        "arguments, if the current time matches the given time specification.\n"
        },
 
        { "Goto", pbx_builtin_goto,
        "Jump to a particular priority, extension, or context",
        "This application will execute the specified dialplan application, with optional\n"
        "arguments, if the current time matches the given time specification.\n"
        },
 
        { "Goto", pbx_builtin_goto,
        "Jump to a particular priority, extension, or context",
-       "  Goto([[context|]extension|]priority): This application will set the current\n"
+       "  Goto([[context,]extension,]priority): This application will set the current\n"
        "context, extension, and priority in the channel structure. After it completes, the\n"
        "pbx engine will continue dialplan execution at the specified location.\n"
        "If no specific extension, or extension and context, are specified, then this\n"
        "context, extension, and priority in the channel structure. After it completes, the\n"
        "pbx engine will continue dialplan execution at the specified location.\n"
        "If no specific extension, or extension and context, are specified, then this\n"
@@ -391,7 +391,7 @@ static struct pbx_builtin {
 
        { "GotoIfTime", pbx_builtin_gotoiftime,
        "Conditional Goto based on the current time",
 
        { "GotoIfTime", pbx_builtin_gotoiftime,
        "Conditional Goto based on the current time",
-       "  GotoIfTime(<times>|<weekdays>|<mdays>|<months>?[[context|]exten|]priority):\n"
+       "  GotoIfTime(<times>,<weekdays>,<mdays>,<months>?[[context,]exten,]priority):\n"
        "This application will set the context, extension, and priority in the channel structure\n"
        "if the current time matches the given time specification. Otherwise, nothing is done.\n"
         "Further information on the time specification can be found in examples\n"
        "This application will set the context, extension, and priority in the channel structure\n"
        "if the current time matches the given time specification. Otherwise, nothing is done.\n"
         "Further information on the time specification can be found in examples\n"
@@ -401,7 +401,7 @@ static struct pbx_builtin {
 
        { "ImportVar", pbx_builtin_importvar,
        "Import a variable from a channel into a new variable",
 
        { "ImportVar", pbx_builtin_importvar,
        "Import a variable from a channel into a new variable",
-       "  ImportVar(newvar=channelname|variable): This application imports a variable\n"
+       "  ImportVar(newvar=channelname,variable): This application imports a variable\n"
        "from the specified channel (as opposed to the current one) and stores it as\n"
        "a variable in the current channel (the channel that is calling this\n"
        "application). Variables created by this application have the same inheritance\n"
        "from the specified channel (as opposed to the current one) and stores it as\n"
        "a variable in the current channel (the channel that is calling this\n"
        "application). Variables created by this application have the same inheritance\n"
@@ -476,16 +476,13 @@ static struct pbx_builtin {
 
        { "Set", pbx_builtin_setvar,
        "Set channel variable(s) or function value(s)",
 
        { "Set", pbx_builtin_setvar,
        "Set channel variable(s) or function value(s)",
-       "  Set(name1=value1|name2=value2|..[|options])\n"
+       "  Set(name1=value1)\n"
        "This function can be used to set the value of channel variables or dialplan\n"
        "functions. It will accept up to 24 name/value pairs. When setting variables,\n"
        "if the variable name is prefixed with _, the variable will be inherited into\n"
        "channels created from the current channel. If the variable name is prefixed\n"
        "with __, the variable will be inherited into channels created from the current\n"
        "channel and all children channels.\n"
        "This function can be used to set the value of channel variables or dialplan\n"
        "functions. It will accept up to 24 name/value pairs. When setting variables,\n"
        "if the variable name is prefixed with _, the variable will be inherited into\n"
        "channels created from the current channel. If the variable name is prefixed\n"
        "with __, the variable will be inherited into channels created from the current\n"
        "channel and all children channels.\n"
-       "  Options:\n"
-       "    g - Set variable globally instead of on the channel\n"
-       "        (applies only to variables, not functions)\n"
        },
 
        { "SetAMAFlags", pbx_builtin_setamaflags,
        },
 
        { "SetAMAFlags", pbx_builtin_setamaflags,
@@ -504,7 +501,7 @@ static struct pbx_builtin {
 
        { "WaitExten", pbx_builtin_waitexten,
        "Waits for an extension to be entered",
 
        { "WaitExten", pbx_builtin_waitexten,
        "Waits for an extension to be entered",
-       "  WaitExten([seconds][|options]): This application waits for the user to enter\n"
+       "  WaitExten([seconds][,options]): This application waits for the user to enter\n"
        "a new extension for a specified number of seconds.\n"
        "  Note that the seconds can be passed with fractions of a second. For example,\n"
        "'1.5' will ask the application to wait for 1.5 seconds.\n"
        "a new extension for a specified number of seconds.\n"
        "  Note that the seconds can be passed with fractions of a second. For example,\n"
        "'1.5' will ask the application to wait for 1.5 seconds.\n"
@@ -4252,13 +4249,13 @@ int ast_build_timing(struct ast_timing *i, const char *info_in)
        i->daymask = 0x7fffffffU; /* 31 bits */
        i->dowmask = 0x7f; /* 7 bits */
        /* on each call, use strsep() to move info to the next argument */
        i->daymask = 0x7fffffffU; /* 31 bits */
        i->dowmask = 0x7f; /* 7 bits */
        /* on each call, use strsep() to move info to the next argument */
-       get_timerange(i, strsep(&info, "|"));
+       get_timerange(i, strsep(&info, "|,"));
        if (info)
        if (info)
-               i->dowmask = get_range(strsep(&info, "|"), 7, days, "day of week");
+               i->dowmask = get_range(strsep(&info, "|,"), 7, days, "day of week");
        if (info)
        if (info)
-               i->daymask = get_range(strsep(&info, "|"), 31, NULL, "day");
+               i->daymask = get_range(strsep(&info, "|,"), 31, NULL, "day");
        if (info)
        if (info)
-               i->monthmask = get_range(strsep(&info, "|"), 12, months, "month");
+               i->monthmask = get_range(strsep(&info, "|,"), 12, months, "month");
        return 1;
 }
 
        return 1;
 }
 
@@ -4329,7 +4326,7 @@ int ast_context_add_include2(struct ast_context *con, const char *value,
        new_include->rname = p;
        strcpy(p, value);
        /* Strip off timing info, and process if it is there */
        new_include->rname = p;
        strcpy(p, value);
        /* Strip off timing info, and process if it is there */
-       if ( (c = strchr(p, '|')) ) {
+       if ( (c = strchr(p, ',')) ) {
                *c++ = '\0';
                new_include->hastime = ast_build_timing(&(new_include->timing), c);
        }
                *c++ = '\0';
                new_include->hastime = ast_build_timing(&(new_include->timing), c);
        }
@@ -5499,14 +5496,14 @@ static int pbx_builtin_gotoiftime(struct ast_channel *chan, void *data)
        struct ast_timing timing;
 
        if (ast_strlen_zero(data)) {
        struct ast_timing timing;
 
        if (ast_strlen_zero(data)) {
-               ast_log(LOG_WARNING, "GotoIfTime requires an argument:\n  <time range>|<days of week>|<days of month>|<months>?[[context|]extension|]priority\n");
+               ast_log(LOG_WARNING, "GotoIfTime requires an argument:\n  <time range>,<days of week>,<days of month>,<months>?[[context,]extension,]priority\n");
                return -1;
        }
 
        ts = s = ast_strdupa(data);
 
        /* Separate the Goto path */
                return -1;
        }
 
        ts = s = ast_strdupa(data);
 
        /* Separate the Goto path */
-       strsep(&ts,"?");
+       strsep(&ts, "?");
 
        /* struct ast_include include contained garbage here, fixed by zeroing it on get_timerange */
        if (ast_build_timing(&timing, s) && ast_check_timing(&timing))
 
        /* struct ast_include include contained garbage here, fixed by zeroing it on get_timerange */
        if (ast_build_timing(&timing, s) && ast_check_timing(&timing))
@@ -5523,7 +5520,7 @@ static int pbx_builtin_execiftime(struct ast_channel *chan, void *data)
        char *s, *appname;
        struct ast_timing timing;
        struct ast_app *app;
        char *s, *appname;
        struct ast_timing timing;
        struct ast_app *app;
-       static const char *usage = "ExecIfTime requires an argument:\n  <time range>|<days of week>|<days of month>|<months>?<appname>[|<appargs>]";
+       static const char *usage = "ExecIfTime requires an argument:\n  <time range>,<days of week>,<days of month>,<months>?<appname>[(<appargs>)]";
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "%s\n", usage);
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "%s\n", usage);
@@ -5532,7 +5529,7 @@ static int pbx_builtin_execiftime(struct ast_channel *chan, void *data)
 
        appname = ast_strdupa(data);
 
 
        appname = ast_strdupa(data);
 
-       s = strsep(&appname,"?");       /* Separate the timerange and application name/data */
+       s = strsep(&appname, "?");      /* Separate the timerange and application name/data */
        if (!appname) { /* missing application */
                ast_log(LOG_WARNING, "%s\n", usage);
                return -1;
        if (!appname) { /* missing application */
                ast_log(LOG_WARNING, "%s\n", usage);
                return -1;
@@ -5546,9 +5543,16 @@ static int pbx_builtin_execiftime(struct ast_channel *chan, void *data)
        if (!ast_check_timing(&timing)) /* outside the valid time window, just return */
                return 0;
 
        if (!ast_check_timing(&timing)) /* outside the valid time window, just return */
                return 0;
 
-       /* now split appname|appargs */
-       if ((s = strchr(appname, '|')))
+       /* now split appname(appargs) */
+       if ((s = strchr(appname, '('))) {
+               char *e;
                *s++ = '\0';
                *s++ = '\0';
+               if ((e = strrchr(s, ')')))
+                       *e = '\0';
+               else
+                       ast_log(LOG_WARNING, "Failed to find closing parenthesis\n");
+       }
+               
 
        if ((app = pbx_findapp(appname))) {
                return pbx_exec(chan, app, S_OR(s, ""));
 
        if ((app = pbx_findapp(appname))) {
                return pbx_exec(chan, app, S_OR(s, ""));
@@ -5568,7 +5572,7 @@ static int pbx_builtin_wait(struct ast_channel *chan, void *data)
 
        /* Wait for "n" seconds */
        if (data && (s = atof(data)) > 0.0) {
 
        /* Wait for "n" seconds */
        if (data && (s = atof(data)) > 0.0) {
-               ms = s*1000.0;
+               ms = s * 1000.0;
                return ast_safe_sleep(chan, ms);
        }
        return 0;
                return ast_safe_sleep(chan, ms);
        }
        return 0;
@@ -5720,7 +5724,7 @@ static int pbx_builtin_goto(struct ast_channel *chan, void *data)
 {
        int res = ast_parseable_goto(chan, data);
        if (!res)
 {
        int res = ast_parseable_goto(chan, data);
        if (!res)
-               ast_verb(3, "Goto (%s,%s,%d)\n", chan->context,chan->exten, chan->priority+1);
+               ast_verb(3, "Goto (%s,%s,%d)\n", chan->context, chan->exten, chan->priority + 1);
        return res;
 }
 
        return res;
 }
 
@@ -5738,7 +5742,7 @@ int pbx_builtin_serialize_variables(struct ast_channel *chan, struct ast_str **b
        (*buf)->str[0] = '\0';
 
        AST_LIST_TRAVERSE(&chan->varshead, variables, entries) {
        (*buf)->str[0] = '\0';
 
        AST_LIST_TRAVERSE(&chan->varshead, variables, entries) {
-               if ((var=ast_var_name(variables)) && (val=ast_var_value(variables))
+               if ((var = ast_var_name(variables)) && (val = ast_var_value(variables))
                   /* && !ast_strlen_zero(var) && !ast_strlen_zero(val) */
                   ) {
                        if (ast_str_append(buf, 0, "%s=%s\n", var, val) < 0) {
                   /* && !ast_strlen_zero(var) && !ast_strlen_zero(val) */
                   ) {
                        if (ast_str_append(buf, 0, "%s=%s\n", var, val) < 0) {
@@ -5819,7 +5823,7 @@ void pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const
        const char *nametail = name;
 
        /* XXX may need locking on the channel ? */
        const char *nametail = name;
 
        /* XXX may need locking on the channel ? */
-       if (name[strlen(name)-1] == ')') {
+       if (name[strlen(name) - 1] == ')') {
                char *function = ast_strdupa(name);
 
                ast_func_write(chan, function, value);
                char *function = ast_strdupa(name);
 
                ast_func_write(chan, function, value);
@@ -5867,35 +5871,17 @@ void pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const
 int pbx_builtin_setvar(struct ast_channel *chan, void *data)
 {
        char *name, *value, *mydata;
 int pbx_builtin_setvar(struct ast_channel *chan, void *data)
 {
        char *name, *value, *mydata;
-       int argc;
-       char *argv[24];         /* this will only support a maximum of 24 variables being set in a single operation */
-       int global = 0;
-       int x;
 
        if (ast_strlen_zero(data)) {
 
        if (ast_strlen_zero(data)) {
-               ast_log(LOG_WARNING, "Set requires at least one variable name/value pair.\n");
+               ast_log(LOG_WARNING, "Set requires one variable name/value pair.\n");
                return 0;
        }
 
        mydata = ast_strdupa(data);
                return 0;
        }
 
        mydata = ast_strdupa(data);
-       argc = ast_app_separate_args(mydata, '|', argv, sizeof(argv) / sizeof(argv[0]));
-
-       /* check for a trailing flags argument */
-       if ((argc > 1) && !strchr(argv[argc-1], '=')) {
-               argc--;
-               if (strchr(argv[argc], 'g'))
-                       global = 1;
-       }
-
-       for (x = 0; x < argc; x++) {
-               name = argv[x];
-               if ((value = strchr(name, '='))) {
-                       *value++ = '\0';
-                       pbx_builtin_setvar_helper((global) ? NULL : chan, name, value);
-               } else
-                       ast_log(LOG_WARNING, "Ignoring entry '%s' with no = (and not last 'options' entry)\n", name);
-       }
+       name = strsep(&mydata, "=");
+       value = mydata;
 
 
+       pbx_builtin_setvar_helper(chan, name, value);
        return(0);
 }
 
        return(0);
 }
 
@@ -5905,15 +5891,21 @@ int pbx_builtin_importvar(struct ast_channel *chan, void *data)
        char *value;
        char *channel;
        char tmp[VAR_BUF_SIZE]="";
        char *value;
        char *channel;
        char tmp[VAR_BUF_SIZE]="";
+       static int deprecation_warning = 0;
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "Ignoring, since there is no variable to set\n");
                return 0;
        }
 
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "Ignoring, since there is no variable to set\n");
                return 0;
        }
 
+       if (!deprecation_warning) {
+               ast_log(LOG_WARNING, "ImportVar is deprecated.  Please use Set(varname=${IMPORT(channel,variable)}) instead.\n");
+               deprecation_warning = 1;
+       }
+
        value = ast_strdupa(data);
        name = strsep(&value,"=");
        value = ast_strdupa(data);
        name = strsep(&value,"=");
-       channel = strsep(&value,"|");
+       channel = strsep(&value,",");
        if (channel && value && name) { /*! \todo XXX should do !ast_strlen_zero(..) of the args ? */
                struct ast_channel *chan2 = ast_get_channel_by_name_locked(channel);
                if (chan2) {
        if (channel && value && name) { /*! \todo XXX should do !ast_strlen_zero(..) of the args ? */
                struct ast_channel *chan2 = ast_get_channel_by_name_locked(channel);
                if (chan2) {
@@ -5958,7 +5950,6 @@ int pbx_checkcondition(const char *condition)
 static int pbx_builtin_gotoif(struct ast_channel *chan, void *data)
 {
        char *condition, *branch1, *branch2, *branch;
 static int pbx_builtin_gotoif(struct ast_channel *chan, void *data)
 {
        char *condition, *branch1, *branch2, *branch;
-       int rc;
        char *stringp;
 
        if (ast_strlen_zero(data)) {
        char *stringp;
 
        if (ast_strlen_zero(data)) {
@@ -5977,9 +5968,7 @@ static int pbx_builtin_gotoif(struct ast_channel *chan, void *data)
                return 0;
        }
 
                return 0;
        }
 
-       rc = pbx_builtin_goto(chan, branch);
-
-       return rc;
+       return pbx_builtin_goto(chan, branch);
 }
 
 static int pbx_builtin_saynumber(struct ast_channel *chan, void *data)
 }
 
 static int pbx_builtin_saynumber(struct ast_channel *chan, void *data)
@@ -5993,10 +5982,10 @@ static int pbx_builtin_saynumber(struct ast_channel *chan, void *data)
                return -1;
        }
        ast_copy_string(tmp, data, sizeof(tmp));
                return -1;
        }
        ast_copy_string(tmp, data, sizeof(tmp));
-       strsep(&number, "|");
-       options = strsep(&number, "|");
+       strsep(&number, ",");
+       options = strsep(&number, ",");
        if (options) {
        if (options) {
-               if ( strcasecmp(options, "f") && strcasecmp(options,"m") &&
+               if ( strcasecmp(options, "f") && strcasecmp(options, "m") &&
                        strcasecmp(options, "c") && strcasecmp(options, "n") ) {
                        ast_log(LOG_WARNING, "SayNumber gender option is either 'f', 'm', 'c' or 'n'\n");
                        return -1;
                        strcasecmp(options, "c") && strcasecmp(options, "n") ) {
                        ast_log(LOG_WARNING, "SayNumber gender option is either 'f', 'm', 'c' or 'n'\n");
                        return -1;
@@ -6313,13 +6302,13 @@ int ast_parseable_goto(struct ast_channel *chan, const char *goto_string)
        int mode = 0;
 
        if (ast_strlen_zero(goto_string)) {
        int mode = 0;
 
        if (ast_strlen_zero(goto_string)) {
-               ast_log(LOG_WARNING, "Goto requires an argument (optional context|optional extension|priority)\n");
+               ast_log(LOG_WARNING, "Goto requires an argument ([[context,]extension,]priority)\n");
                return -1;
        }
        stringp = ast_strdupa(goto_string);
                return -1;
        }
        stringp = ast_strdupa(goto_string);
-       context = strsep(&stringp, "|");        /* guaranteed non-null */
-       exten = strsep(&stringp, "|");
-       pri = strsep(&stringp, "|");
+       context = strsep(&stringp, ",");        /* guaranteed non-null */
+       exten = strsep(&stringp, ",");
+       pri = strsep(&stringp, ",");
        if (!exten) {   /* Only a priority in this one */
                pri = context;
                exten = NULL;
        if (!exten) {   /* Only a priority in this one */
                pri = context;
                exten = NULL;