Mon Mar 19 11:30:31 2012

Asterisk developer's documentation


app_chanisavail.c File Reference

Check if Channel is Available. More...

#include "asterisk.h"
#include <sys/ioctl.h>
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/app.h"
#include "asterisk/devicestate.h"

Go to the source code of this file.

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int chanavail_exec (struct ast_channel *chan, const char *data)
static int load_module (void)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Check channel availability" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static const char app [] = "ChanIsAvail"
static struct ast_module_infoast_module_info = &__mod_info


Detailed Description

Check if Channel is Available.

Author:
Mark Spencer <markster@digium.com>

James Golovich <james@gnuinter.net>

Definition in file app_chanisavail.c.


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 212 of file app_chanisavail.c.

static void __unreg_module ( void   )  [static]

Definition at line 212 of file app_chanisavail.c.

static int chanavail_exec ( struct ast_channel chan,
const char *  data 
) [static]

Definition at line 102 of file app_chanisavail.c.

References args, AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_device_state(), ast_hangup(), ast_log(), ast_parse_device_state(), ast_request(), AST_STANDARD_APP_ARGS, ast_str_alloca, ast_str_append(), ast_str_buffer(), ast_str_strlen(), ast_strdupa, ast_strlen_zero(), LOG_WARNING, ast_channel::name, ast_channel::nativeformats, pbx_builtin_setvar_helper(), and status.

Referenced by load_module().

00103 {
00104    int inuse=-1, option_state=0, string_compare=0, option_all_avail=0;
00105    int status;
00106    char *info, tmp[512], trychan[512], *peers, *tech, *number, *rest, *cur;
00107    struct ast_str *tmp_availchan = ast_str_alloca(2048);
00108    struct ast_str *tmp_availorig = ast_str_alloca(2048);
00109    struct ast_str *tmp_availstat = ast_str_alloca(2048);
00110    struct ast_str *tmp_availcause = ast_str_alloca(2048);
00111    struct ast_channel *tempchan;
00112    AST_DECLARE_APP_ARGS(args,
00113       AST_APP_ARG(reqchans);
00114       AST_APP_ARG(options);
00115    );
00116 
00117    if (ast_strlen_zero(data)) {
00118       ast_log(LOG_WARNING, "ChanIsAvail requires an argument (DAHDI/1&DAHDI/2)\n");
00119       return -1;
00120    }
00121 
00122    info = ast_strdupa(data);
00123 
00124    AST_STANDARD_APP_ARGS(args, info);
00125 
00126    if (args.options) {
00127       if (strchr(args.options, 'a')) {
00128          option_all_avail = 1;
00129       }
00130       if (strchr(args.options, 's')) {
00131          option_state = 1;
00132       }
00133       if (strchr(args.options, 't')) {
00134          string_compare = 1;
00135       }
00136    }
00137    peers = args.reqchans;
00138    if (peers) {
00139       cur = peers;
00140       do {
00141          /* remember where to start next time */
00142          rest = strchr(cur, '&');
00143          if (rest) {
00144             *rest = 0;
00145             rest++;
00146          }
00147          tech = cur;
00148          number = strchr(tech, '/');
00149          if (!number) {
00150             ast_log(LOG_WARNING, "ChanIsAvail argument takes format ([technology]/[device])\n");
00151             return -1;
00152          }
00153          *number = '\0';
00154          number++;
00155          
00156          if (string_compare) {
00157             /* ast_parse_device_state checks for "SIP/1234" as a channel name.
00158                ast_device_state will ask the SIP driver for the channel state. */
00159 
00160             snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
00161             status = inuse = ast_parse_device_state(trychan);
00162          } else if (option_state) {
00163             /* If the pbx says in use then don't bother trying further.
00164                This is to permit testing if someone's on a call, even if the
00165                channel can permit more calls (ie callwaiting, sip calls, etc).  */
00166 
00167             snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
00168             status = inuse = ast_device_state(trychan);
00169          }
00170          snprintf(tmp, sizeof(tmp), "%d", status);
00171          ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp);
00172          if ((inuse <= 1) && (tempchan = ast_request(tech, chan->nativeformats, chan, number, &status))) {
00173                ast_str_append(&tmp_availchan, 0, "%s%s", ast_str_strlen(tmp_availchan) ? "&" : "", tempchan->name);
00174                
00175                snprintf(tmp, sizeof(tmp), "%s/%s", tech, number);
00176                ast_str_append(&tmp_availorig, 0, "%s%s", ast_str_strlen(tmp_availorig) ? "&" : "", tmp);
00177 
00178                snprintf(tmp, sizeof(tmp), "%d", status);
00179                ast_str_append(&tmp_availcause, 0, "%s%s", ast_str_strlen(tmp_availcause) ? "&" : "", tmp);
00180 
00181                ast_hangup(tempchan);
00182                tempchan = NULL;
00183 
00184                if (!option_all_avail) {
00185                   break;
00186                }
00187          }
00188          cur = rest;
00189       } while (cur);
00190    }
00191 
00192    pbx_builtin_setvar_helper(chan, "AVAILCHAN", ast_str_buffer(tmp_availchan));
00193    /* Store the originally used channel too */
00194    pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", ast_str_buffer(tmp_availorig));
00195    pbx_builtin_setvar_helper(chan, "AVAILSTATUS", ast_str_buffer(tmp_availstat));
00196    pbx_builtin_setvar_helper(chan, "AVAILCAUSECODE", ast_str_buffer(tmp_availcause));
00197 
00198    return 0;
00199 }

static int load_module ( void   )  [static]

Definition at line 206 of file app_chanisavail.c.

References AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_register_application_xml, and chanavail_exec().

static int unload_module ( void   )  [static]

Definition at line 201 of file app_chanisavail.c.

References ast_unregister_application().

00202 {
00203    return ast_unregister_application(app);
00204 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Check channel availability" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 212 of file app_chanisavail.c.

const char app[] = "ChanIsAvail" [static]

Definition at line 48 of file app_chanisavail.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 212 of file app_chanisavail.c.


Generated on Mon Mar 19 11:30:31 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7