Mon Oct 8 12:39:07 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 = "ac1f6a56484a8820659555499174e588" , .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 214 of file app_chanisavail.c.

static void __unreg_module ( void   )  [static]

Definition at line 214 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_DEVICE_UNKNOWN, 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          status = AST_DEVICE_UNKNOWN;
00157 
00158          if (string_compare) {
00159             /* ast_parse_device_state checks for "SIP/1234" as a channel name.
00160                ast_device_state will ask the SIP driver for the channel state. */
00161 
00162             snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
00163             status = inuse = ast_parse_device_state(trychan);
00164          } else if (option_state) {
00165             /* If the pbx says in use then don't bother trying further.
00166                This is to permit testing if someone's on a call, even if the
00167                channel can permit more calls (ie callwaiting, sip calls, etc).  */
00168 
00169             snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
00170             status = inuse = ast_device_state(trychan);
00171          }
00172          snprintf(tmp, sizeof(tmp), "%d", status);
00173          ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp);
00174          if ((inuse <= 1) && (tempchan = ast_request(tech, chan->nativeformats, chan, number, &status))) {
00175                ast_str_append(&tmp_availchan, 0, "%s%s", ast_str_strlen(tmp_availchan) ? "&" : "", tempchan->name);
00176                
00177                snprintf(tmp, sizeof(tmp), "%s/%s", tech, number);
00178                ast_str_append(&tmp_availorig, 0, "%s%s", ast_str_strlen(tmp_availorig) ? "&" : "", tmp);
00179 
00180                snprintf(tmp, sizeof(tmp), "%d", status);
00181                ast_str_append(&tmp_availcause, 0, "%s%s", ast_str_strlen(tmp_availcause) ? "&" : "", tmp);
00182 
00183                ast_hangup(tempchan);
00184                tempchan = NULL;
00185 
00186                if (!option_all_avail) {
00187                   break;
00188                }
00189          }
00190          cur = rest;
00191       } while (cur);
00192    }
00193 
00194    pbx_builtin_setvar_helper(chan, "AVAILCHAN", ast_str_buffer(tmp_availchan));
00195    /* Store the originally used channel too */
00196    pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", ast_str_buffer(tmp_availorig));
00197    pbx_builtin_setvar_helper(chan, "AVAILSTATUS", ast_str_buffer(tmp_availstat));
00198    pbx_builtin_setvar_helper(chan, "AVAILCAUSECODE", ast_str_buffer(tmp_availcause));
00199 
00200    return 0;
00201 }

static int load_module ( void   )  [static]

Definition at line 208 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 203 of file app_chanisavail.c.

References ast_unregister_application().

00204 {
00205    return ast_unregister_application(app);
00206 }


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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 214 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 214 of file app_chanisavail.c.


Generated on Mon Oct 8 12:39:07 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7