Sun Jun 12 16:37:48 2011

Asterisk developer's documentation


app_chanisavail.c File Reference

Check if Channel is Available. More...

#include "asterisk.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ioctl.h>
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/app.h"
#include "asterisk/devicestate.h"
#include "asterisk/options.h"

Include dependency graph for app_chanisavail.c:

Go to the source code of this file.

Functions

 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Check channel availability")
static int chanavail_exec (struct ast_channel *chan, void *data)
static int load_module (void)
static int unload_module (void)

Variables

static char * app = "ChanIsAvail"
static char * descrip
static char * synopsis = "Check channel availability"


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

AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Check channel availability"   
)

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

Definition at line 67 of file app_chanisavail.c.

References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_device_state(), ast_goto_if_exists(), ast_hangup(), ast_log(), ast_module_user_add, ast_module_user_remove, ast_opt_priority_jumping, ast_request(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_strlen_zero(), ast_channel::context, ast_channel::exten, inuse, LOG_WARNING, ast_channel::nativeformats, pbx_builtin_setvar_helper(), peers, and ast_channel::priority.

Referenced by load_module().

00068 {
00069    int res=-1, inuse=-1, option_state=0, priority_jump=0;
00070    int status;
00071    struct ast_module_user *u;
00072    char *info, tmp[512], trychan[512], *peers, *tech, *number, *rest, *cur;
00073    struct ast_channel *tempchan;
00074    AST_DECLARE_APP_ARGS(args,
00075       AST_APP_ARG(reqchans);
00076       AST_APP_ARG(options);
00077    );
00078 
00079    if (ast_strlen_zero(data)) {
00080       ast_log(LOG_WARNING, "ChanIsAvail requires an argument (Zap/1&Zap/2)\n");
00081       return -1;
00082    }
00083 
00084    u = ast_module_user_add(chan);
00085 
00086    info = ast_strdupa(data); 
00087 
00088    AST_STANDARD_APP_ARGS(args, info);
00089 
00090    if (args.options) {
00091       if (strchr(args.options, 's'))
00092          option_state = 1;
00093       if (strchr(args.options, 'j'))
00094          priority_jump = 1;
00095    }
00096    peers = args.reqchans;
00097    if (peers) {
00098       cur = peers;
00099       do {
00100          /* remember where to start next time */
00101          rest = strchr(cur, '&');
00102          if (rest) {
00103             *rest = 0;
00104             rest++;
00105          }
00106          tech = cur;
00107          number = strchr(tech, '/');
00108          if (!number) {
00109             ast_log(LOG_WARNING, "ChanIsAvail argument takes format ([technology]/[device])\n");
00110             ast_module_user_remove(u);
00111             return -1;
00112          }
00113          *number = '\0';
00114          number++;
00115          
00116          if (option_state) {
00117             /* If the pbx says in use then don't bother trying further.
00118                This is to permit testing if someone's on a call, even if the 
00119                channel can permit more calls (ie callwaiting, sip calls, etc).  */
00120                                
00121             snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
00122             status = inuse = ast_device_state(trychan);
00123          }
00124          if ((inuse <= 1) && (tempchan = ast_request(tech, chan->nativeformats, number, &status))) {
00125                pbx_builtin_setvar_helper(chan, "AVAILCHAN", tempchan->name);
00126                /* Store the originally used channel too */
00127                snprintf(tmp, sizeof(tmp), "%s/%s", tech, number);
00128                pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", tmp);
00129                snprintf(tmp, sizeof(tmp), "%d", status);
00130                pbx_builtin_setvar_helper(chan, "AVAILSTATUS", tmp);
00131                ast_hangup(tempchan);
00132                tempchan = NULL;
00133                res = 1;
00134                break;
00135          } else {
00136             snprintf(tmp, sizeof(tmp), "%d", status);
00137             pbx_builtin_setvar_helper(chan, "AVAILSTATUS", tmp);
00138          }
00139          cur = rest;
00140       } while (cur);
00141    }
00142    if (res < 1) {
00143       pbx_builtin_setvar_helper(chan, "AVAILCHAN", "");
00144       pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", "");
00145       if (priority_jump || ast_opt_priority_jumping) {
00146          if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101)) {
00147             ast_module_user_remove(u);
00148             return -1;
00149          }
00150       }
00151    }
00152 
00153    ast_module_user_remove(u);
00154    return 0;
00155 }

static int load_module ( void   )  [static]

Definition at line 168 of file app_chanisavail.c.

References ast_register_application(), and chanavail_exec().

00169 {
00170    return ast_register_application(app, chanavail_exec, synopsis, descrip);
00171 }

static int unload_module ( void   )  [static]

Definition at line 157 of file app_chanisavail.c.

References ast_module_user_hangup_all, and ast_unregister_application().

00158 {
00159    int res = 0;
00160 
00161    res = ast_unregister_application(app);
00162 
00163    ast_module_user_hangup_all();
00164    
00165    return res;
00166 }


Variable Documentation

char* app = "ChanIsAvail" [static]

Definition at line 51 of file app_chanisavail.c.

char* descrip [static]

Definition at line 55 of file app_chanisavail.c.

char* synopsis = "Check channel availability" [static]

Definition at line 53 of file app_chanisavail.c.


Generated on Sun Jun 12 16:37:48 2011 for Asterisk - the Open Source PBX by  doxygen 1.5.6