* Fixed timeout logic in the dialing API as setting timeouts
authorMark Michelson <mmichelson@digium.com>
Fri, 31 Oct 2008 20:05:46 +0000 (20:05 +0000)
committerMark Michelson <mmichelson@digium.com>
Fri, 31 Oct 2008 20:05:46 +0000 (20:05 +0000)
  had no effect
* Updated dialing API documentation to indicate that timeouts
  are specified in milliseconds
* Added a new timeout argument to the Page application. If time
  expires, any endpoints which have not answered will be hung up.

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

CHANGES
apps/app_page.c
include/asterisk/dial.h
main/dial.c

diff --git a/CHANGES b/CHANGES
index 9bb9ce2..d508c3f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -685,6 +685,7 @@ Other Dialplan Application Changes
      WaitForRing() now takes floating pt timeout arg.
      SpeechBackground() -- clarified in the docstrings that the timeout is an integer seconds.
   * Added 's' option to Page application.
+  * Added an optional timeout argument to the Page application.
   * Added 'E', 'V', and 'P' commands to ExternalIVR.
   * Added 'o' and 'X' options to Chanspy.
   * Added a new dialplan application, Bridge, which allows you to bridge the
index 9f94b49..33ff1b4 100644 (file)
@@ -49,7 +49,7 @@ static const char *app_page= "Page";
 static const char *page_synopsis = "Pages phones";
 
 static const char *page_descrip =
-"Page(Technology/Resource&Technology2/Resource2[,options])\n"
+"Page(Technology/Resource&Technology2/Resource2[,options][,timeout])\n"
 "  Places outbound calls to the given technology / resource and dumps\n"
 "them into a conference bridge as muted participants.  The original\n"
 "caller is dumped into the conference as a speaker and the room is\n"
@@ -57,7 +57,10 @@ static const char *page_descrip =
 "        d - full duplex audio\n"
 "        q - quiet, do not play beep to caller\n"
 "        r - record the page into a file (see 'r' for app_meetme)\n"
-"        s - only dial channel if devicestate says it is not in use\n";
+"        s - only dial channel if devicestate says it is not in use\n"
+"The timeout parameter specifies the length of time that the system\n"
+"will attempt to connect a call. After this duration, any intercom\n"
+"calls that have not been answered will be hung up by the system.\n";
 
 enum {
        PAGE_DUPLEX = (1 << 0),
@@ -77,13 +80,21 @@ AST_APP_OPTIONS(page_opts, {
 
 static int page_exec(struct ast_channel *chan, void *data)
 {
-       char *options, *tech, *resource, *tmp;
+       char *tech, *resource, *tmp;
        char meetmeopts[88], originator[AST_CHANNEL_NAME], *opts[0];
        struct ast_flags flags = { 0 };
        unsigned int confid = ast_random();
        struct ast_app *app;
        int res = 0, pos = 0, i = 0;
        struct ast_dial *dials[MAX_DIALS];
+       int timeout = 0;
+       char *parse;
+
+       AST_DECLARE_APP_ARGS(args,
+               AST_APP_ARG(devices);
+               AST_APP_ARG(options);
+               AST_APP_ARG(timeout);
+       );
 
        if (ast_strlen_zero(data)) {
                ast_log(LOG_WARNING, "This application requires at least one argument (destination(s) to page)\n");
@@ -95,21 +106,28 @@ static int page_exec(struct ast_channel *chan, void *data)
                return -1;
        };
 
-       options = ast_strdupa(data);
+       parse = ast_strdupa(data);
+
+       AST_STANDARD_APP_ARGS(args, parse);
 
        ast_copy_string(originator, chan->name, sizeof(originator));
-       if ((tmp = strchr(originator, '-')))
+       if ((tmp = strchr(originator, '-'))) {
                *tmp = '\0';
+       }
+
+       if (!ast_strlen_zero(args.options)) {
+               ast_app_parse_options(page_opts, &flags, opts, args.options);
+       }
 
-       tmp = strsep(&options, ",");
-       if (options)
-               ast_app_parse_options(page_opts, &flags, opts, options);
+       if (!ast_strlen_zero(args.timeout)) {
+               timeout = atoi(args.timeout);
+       }
 
        snprintf(meetmeopts, sizeof(meetmeopts), "MeetMe,%ud,%s%sqxdw(5)", confid, (ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "m"),
                (ast_test_flag(&flags, PAGE_RECORD) ? "r" : "") );
 
        /* Go through parsing/calling each device */
-       while ((tech = strsep(&tmp, "&"))) {
+       while ((tech = strsep(&args.devices, "&"))) {
                int state = 0;
                struct ast_dial *dial = NULL;
 
@@ -143,11 +161,18 @@ static int page_exec(struct ast_channel *chan, void *data)
                }
 
                /* Append technology and resource */
-               ast_dial_append(dial, tech, resource);
+               if (ast_dial_append(dial, tech, resource) == -1) {
+                       ast_log(LOG_ERROR, "Failed to add %s to outbound dial\n", tech);
+                       continue;
+               }
 
                /* Set ANSWER_EXEC as global option */
                ast_dial_option_global_enable(dial, AST_DIAL_OPTION_ANSWER_EXEC, meetmeopts);
 
+               if (timeout) {
+                       ast_dial_set_global_timeout(dial, timeout * 1000);
+               }
+
                /* Run this dial in async mode */
                ast_dial_run(dial, chan, 1);
 
index fe4b63e..e023fb3 100644 (file)
@@ -154,7 +154,7 @@ void ast_dial_set_state_callback(struct ast_dial *dial, ast_dial_state_callback
 
 /*! \brief Set the maximum time (globally) allowed for trying to ring phones
  * \param dial The dial structure to apply the time limit to
- * \param timeout Maximum time allowed
+ * \param timeout Maximum time allowed in milliseconds
  * \return nothing
  */
 void ast_dial_set_global_timeout(struct ast_dial *dial, int timeout);
@@ -162,7 +162,7 @@ void ast_dial_set_global_timeout(struct ast_dial *dial, int timeout);
 /*! \brief Set the maximum time (per channel) allowed for trying to ring the phone
  * \param dial The dial structure the channel belongs to
  * \param num Channel number to set timeout on
- * \param timeout Maximum time allowed
+ * \param timeout Maximum time allowed in milliseconds
  * \return nothing
  */
 void ast_dial_set_timeout(struct ast_dial *dial, int num, int timeout);
index 54654a9..e8c9ca2 100644 (file)
@@ -1038,7 +1038,7 @@ void ast_dial_set_global_timeout(struct ast_dial *dial, int timeout)
 {
        dial->timeout = timeout;
 
-       if (dial->timeout > 0 && dial->actual_timeout > dial->timeout)
+       if (dial->timeout > 0 && (dial->actual_timeout > dial->timeout || dial->actual_timeout == -1))
                dial->actual_timeout = dial->timeout;
 
        return;
@@ -1059,7 +1059,7 @@ void ast_dial_set_timeout(struct ast_dial *dial, int num, int timeout)
 
        channel->timeout = timeout;
 
-       if (channel->timeout > 0 && dial->actual_timeout > channel->timeout)
+       if (channel->timeout > 0 && (dial->actual_timeout > channel->timeout || dial->actual_timeout == -1))
                dial->actual_timeout = channel->timeout;
 
        return;