Add proper "false" case behavior to GotoIfTime
authorMark Michelson <mmichelson@digium.com>
Fri, 15 Feb 2008 23:07:12 +0000 (23:07 +0000)
committerMark Michelson <mmichelson@digium.com>
Fri, 15 Feb 2008 23:07:12 +0000 (23:07 +0000)
(closes issue #11719)
Reported by: kshumard
Patches:
      gotoiftime.twobranches.patch uploaded by kshumard (license 92)
  Tested by: kshumard

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@103738 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/pbx.c

index 0638333..2df2032 100644 (file)
@@ -529,12 +529,17 @@ static struct pbx_builtin {
 
        { "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>?[labeliftrue]:[labeliffalse]):\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"
+       "based on the evaluation of the given time specification. After this application completes,\n"
+       "the pbx engine will continue dialplan execution at the specified location in the dialplan.\n"
+       "If the current time is within the given time specification, the channel will continue at\n"
+       "'labeliftrue'. Otherwise the channel will continue at 'labeliffalse'. If the label chosen\n"
+       "by the condition is omitted, no jump is performed, and execution passes to the next\n"
+       "instruction. If the target jump location is bogus, the same actions would be taken as for\n"
+       "Goto.\n"
         "Further information on the time specification can be found in examples\n"
-        "illustrating how to do time-based context includes in the dialplan.\n" 
-       "If the target jump location is bogus, the same actions would be taken as for Goto.\n"
+        "illustrating how to do time-based context includes in the dialplan.\n"
        },
 
        { "ImportVar", pbx_builtin_importvar,
@@ -6903,12 +6908,11 @@ static int pbx_builtin_hangup(struct ast_channel *chan, void *data)
  */
 static int pbx_builtin_gotoiftime(struct ast_channel *chan, void *data)
 {
-       int res = 0;
-       char *s, *ts;
+       char *s, *ts, *branch1, *branch2, *branch;
        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>?'labeliftrue':'labeliffalse'\n");
                return -1;
        }
 
@@ -6916,12 +6920,21 @@ static int pbx_builtin_gotoiftime(struct ast_channel *chan, void *data)
 
        /* Separate the Goto path */
        strsep(&ts, "?");
+       branch1 = strsep(&ts,":");
+       branch2 = 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))
-               res = pbx_builtin_goto(chan, ts);
-       
-       return res;
+               branch = branch1;
+       else
+               branch = branch2;
+
+       if (ast_strlen_zero(branch)) {
+               ast_debug(1, "Not taking any branch\n");
+               return 0;
+       }
+
+       return pbx_builtin_goto(chan, branch);
 }
 
 /*!