Add new AMI action for app_voicemail
[asterisk/asterisk.git] / apps / app_chanisavail.c
index 556bafd..af4b616 100644 (file)
  * \ingroup applications
  */
 
-#include "asterisk.h"
+/*** MODULEINFO
+       <support_level>extended</support_level>
+ ***/
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+#include "asterisk.h"
 
 #include <sys/ioctl.h>
 
@@ -41,7 +43,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/app.h"
 #include "asterisk/devicestate.h"
 
-static char *app = "ChanIsAvail";
+static const char app[] = "ChanIsAvail";
 
 /*** DOCUMENTATION
        <application name="ChanIsAvail" language="en_US">
@@ -52,10 +54,10 @@ static char *app = "ChanIsAvail";
                        <parameter name="Technology/Resource" required="true" argsep="&amp;">
                                <argument name="Technology2/Resource2" multiple="true">
                                        <para>Optional extra devices to check</para>
-                                       <para>If you need more then one enter them as
-                                       Technology2/Resource2&amp;Technology3/Resourse3&amp;.....</para>
+                                       <para>If you need more than one enter them as
+                                       Technology2/Resource2&amp;Technology3/Resource3&amp;.....</para>
                                </argument>
-                               <para>Specification of the device(s) to check.  These must be in the format of 
+                               <para>Specification of the device(s) to check.  These must be in the format of
                                <literal>Technology/Resource</literal>, where <replaceable>Technology</replaceable>
                                represents a particular channel driver, and <replaceable>Resource</replaceable>
                                represents a resource available to that particular channel driver.</para>
@@ -85,14 +87,17 @@ static char *app = "ChanIsAvail";
                                        <para>The canonical channel name that was used to create the channel</para>
                                </variable>
                                <variable name="AVAILSTATUS">
-                                       <para>The status code for the available channel</para>
+                                       <para>The device state for the device</para>
                                </variable>
+                               <variable name="AVAILCAUSECODE">
+                                       <para>The cause code returned when requesting the channel</para>
+                               </variable>     
                        </variablelist>
                </description>
        </application>
  ***/
 
-static int chanavail_exec(struct ast_channel *chan, void *data)
+static int chanavail_exec(struct ast_channel *chan, const char *data)
 {
        int inuse=-1, option_state=0, string_compare=0, option_all_avail=0;
        int status;
@@ -100,6 +105,7 @@ static int chanavail_exec(struct ast_channel *chan, void *data)
        struct ast_str *tmp_availchan = ast_str_alloca(2048);
        struct ast_str *tmp_availorig = ast_str_alloca(2048);
        struct ast_str *tmp_availstat = ast_str_alloca(2048);
+       struct ast_str *tmp_availcause = ast_str_alloca(2048);
        struct ast_channel *tempchan;
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(reqchans);
@@ -144,7 +150,9 @@ static int chanavail_exec(struct ast_channel *chan, void *data)
                        }
                        *number = '\0';
                        number++;
-                       
+
+                       status = AST_DEVICE_UNKNOWN;
+
                        if (string_compare) {
                                /* ast_parse_device_state checks for "SIP/1234" as a channel name.
                                   ast_device_state will ask the SIP driver for the channel state. */
@@ -159,14 +167,16 @@ static int chanavail_exec(struct ast_channel *chan, void *data)
                                snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
                                status = inuse = ast_device_state(trychan);
                        }
-                       if ((inuse <= 1) && (tempchan = ast_request(tech, chan->nativeformats, number, &status))) {
-                                       ast_str_append(&tmp_availchan, 0, "%s%s", ast_str_strlen(tmp_availchan) ? "&" : "", tempchan->name);
+                       snprintf(tmp, sizeof(tmp), "%d", status);
+                       ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp);
+                       if ((inuse <= 1) && (tempchan = ast_request(tech, ast_channel_nativeformats(chan), NULL, chan, number, &status))) {
+                                       ast_str_append(&tmp_availchan, 0, "%s%s", ast_str_strlen(tmp_availchan) ? "&" : "", ast_channel_name(tempchan));
                                        
                                        snprintf(tmp, sizeof(tmp), "%s/%s", tech, number);
                                        ast_str_append(&tmp_availorig, 0, "%s%s", ast_str_strlen(tmp_availorig) ? "&" : "", tmp);
 
                                        snprintf(tmp, sizeof(tmp), "%d", status);
-                                       ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp);
+                                       ast_str_append(&tmp_availcause, 0, "%s%s", ast_str_strlen(tmp_availcause) ? "&" : "", tmp);
 
                                        ast_hangup(tempchan);
                                        tempchan = NULL;
@@ -174,9 +184,6 @@ static int chanavail_exec(struct ast_channel *chan, void *data)
                                        if (!option_all_avail) {
                                                break;
                                        }
-                       } else {
-                               snprintf(tmp, sizeof(tmp), "%d", status);
-                               ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp);
                        }
                        cur = rest;
                } while (cur);
@@ -186,6 +193,7 @@ static int chanavail_exec(struct ast_channel *chan, void *data)
        /* Store the originally used channel too */
        pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", ast_str_buffer(tmp_availorig));
        pbx_builtin_setvar_helper(chan, "AVAILSTATUS", ast_str_buffer(tmp_availstat));
+       pbx_builtin_setvar_helper(chan, "AVAILCAUSECODE", ast_str_buffer(tmp_availcause));
 
        return 0;
 }
@@ -201,4 +209,5 @@ static int load_module(void)
                AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
 }
 
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Check channel availability");
+AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Check channel availability");
+