Add 's' option to Page application which checks devicestate before dialing. (issue...
authorJoshua Colp <jcolp@digium.com>
Thu, 18 Jan 2007 05:24:08 +0000 (05:24 +0000)
committerJoshua Colp <jcolp@digium.com>
Thu, 18 Jan 2007 05:24:08 +0000 (05:24 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@51215 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
apps/app_page.c

diff --git a/CHANGES b/CHANGES
index e033c59..51c88b2 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -63,6 +63,7 @@ Changes since Asterisk 1.4-beta was branched:
   * Added the trunkmaxsize configuration option to chan_iax2.
   * Added G729 passthrough support to chan_phone for Sigma Designs boards.
   * Added the parkedcalltransfers option to features.conf
+  * Added 's' option to Page application.
 
 SIP changes
 -----------
index dd4c9f2..dc6e450 100644 (file)
@@ -48,6 +48,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/app.h"
 #include "asterisk/chanvars.h"
 #include "asterisk/utils.h"
+#include "asterisk/devicestate.h"
 
 static const char *app_page= "Page";
 
@@ -61,19 +62,21 @@ static const char *page_descrip =
 "destroyed when the original caller leaves.  Valid options are:\n"
 "        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";
-
+"        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";
 
 enum {
        PAGE_DUPLEX = (1 << 0),
        PAGE_QUIET = (1 << 1),
        PAGE_RECORD = (1 << 2),
+       PAGE_SKIP = (1 << 3),
 } page_opt_flags;
 
 AST_APP_OPTIONS(page_opts, {
        AST_APP_OPTION('d', PAGE_DUPLEX),
        AST_APP_OPTION('q', PAGE_QUIET),
        AST_APP_OPTION('r', PAGE_RECORD),
+       AST_APP_OPTION('s', PAGE_SKIP),
 });
 
 struct calloutdata {
@@ -187,16 +190,25 @@ static int page_exec(struct ast_channel *chan, void *data)
                (ast_test_flag(&flags, PAGE_RECORD) ? "r" : "") );
 
        while ((tech = strsep(&tmp, "&"))) {
+               int state = 0;
+
                /* don't call the originating device */
                if (!strcasecmp(tech, originator))
                        continue;
 
-               if ((resource = strchr(tech, '/'))) {
-                       *resource++ = '\0';
-                       launch_page(chan, meetmeopts, tech, resource);
-               } else {
+               if (!(resource = strchr(tech, '/'))) {
                        ast_log(LOG_WARNING, "Incomplete destination '%s' supplied.\n", tech);
+                       continue;
                }
+
+               /* Ensure device is not in use if skip option is enabled */
+               if (ast_test_flag(&flags, PAGE_SKIP) && (state = ast_device_state(tech)) != AST_DEVICE_NOT_INUSE) {
+                       ast_log(LOG_WARNING, "Destination '%s' has device state '%s'.\n", tech, devstate2str(state));
+                       continue;
+               }
+               
+               *resource++ = '\0';
+               launch_page(chan, meetmeopts, tech, resource);
        }
 
        if (!ast_test_flag(&flags, PAGE_QUIET)) {