Merging in xylome's beaerer capabilty patch (bug 3547)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5342 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2-netsec
Matthew Fredrickson 20 years ago
parent 41c684c4a3
commit b81f233e68

@ -31,7 +31,7 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_mp3.so\
app_talkdetect.so app_alarmreceiver.so app_userevent.so app_verbose.so \ app_talkdetect.so app_alarmreceiver.so app_userevent.so app_verbose.so \
app_test.so app_forkcdr.so app_math.so app_realtime.so \ app_test.so app_forkcdr.so app_math.so app_realtime.so \
app_dumpchan.so app_waitforsilence.so app_while.so app_setrdnis.so \ app_dumpchan.so app_waitforsilence.so app_while.so app_setrdnis.so \
app_md5.so app_readfile.so app_chanspy.so app_md5.so app_readfile.so app_chanspy.so app_settransfercapability.so
ifneq (${OSARCH},Darwin) ifneq (${OSARCH},Darwin)
ifneq (${OSARCH},SunOS) ifneq (${OSARCH},SunOS)

@ -77,7 +77,7 @@ static char *descrip =
" 'r' -- indicate ringing to the calling party, pass no audio until answered.\n" " 'r' -- indicate ringing to the calling party, pass no audio until answered.\n"
" 'm[(class)]' -- provide hold music to the calling party until answered (optionally\n" " 'm[(class)]' -- provide hold music to the calling party until answered (optionally\n"
" with the specified class.\n" " with the specified class.\n"
" 'M(x[^arg]) -- Executes the macro (x with ^ delim arg list) upon connect of the call.\n" " 'M(x[^arg])' -- Executes the macro (x with ^ delim arg list) upon connect of the call.\n"
" Also, the macro can set the MACRO_RESULT variable to do the following:\n" " Also, the macro can set the MACRO_RESULT variable to do the following:\n"
" -- ABORT - Hangup both legs of the call.\n" " -- ABORT - Hangup both legs of the call.\n"
" -- CONGESTION - Behave as if line congestion was encountered.\n" " -- CONGESTION - Behave as if line congestion was encountered.\n"
@ -1039,8 +1039,8 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
tmp->chan->cid.cid_tns = chan->cid.cid_tns; tmp->chan->cid.cid_tns = chan->cid.cid_tns;
/* Presense of ADSI CPE on outgoing channel follows ours */ /* Presense of ADSI CPE on outgoing channel follows ours */
tmp->chan->adsicpe = chan->adsicpe; tmp->chan->adsicpe = chan->adsicpe;
/* pass the digital flag */ /* Pass the transfer capability */
ast_copy_flags(tmp->chan, chan, AST_FLAG_DIGITAL); tmp->chan->transfercapability = chan->transfercapability;
/* If we have an outbound group, set this peer channel to it */ /* If we have an outbound group, set this peer channel to it */
if (outbound_group) if (outbound_group)

@ -39,6 +39,7 @@
#include <asterisk/utils.h> #include <asterisk/utils.h>
#include <asterisk/lock.h> #include <asterisk/lock.h>
#include <asterisk/app.h> #include <asterisk/app.h>
#include <asterisk/transcap.h>
#ifdef ZAPTEL_OPTIMIZATIONS #ifdef ZAPTEL_OPTIMIZATIONS
#include <sys/ioctl.h> #include <sys/ioctl.h>
#ifdef __linux__ #ifdef __linux__
@ -243,6 +244,25 @@ char *ast_state2str(int state)
} }
} }
char *ast_transfercapability2str(int transfercapability)
{
switch(transfercapability) {
case AST_TRANS_CAP_SPEECH:
return "SPEECH";
case AST_TRANS_CAP_DIGITAL:
return "DIGITAL";
case AST_TRANS_CAP_RESTRICTED_DIGITAL:
return "RESTRICTED_DIGITAL";
case AST_TRANS_CAP_3_1K_AUDIO:
return "3K1AUDIO";
case AST_TRANS_CAP_DIGITAL_W_TONES:
return "DIGITAL_W_TONES";
case AST_TRANS_CAP_VIDEO:
return "VIDEO";
default:
return "UNKNOWN";
}
}
int ast_best_codec(int fmts) int ast_best_codec(int fmts)
{ {

@ -38,6 +38,7 @@
#include <asterisk/causes.h> #include <asterisk/causes.h>
#include <asterisk/term.h> #include <asterisk/term.h>
#include <asterisk/utils.h> #include <asterisk/utils.h>
#include <asterisk/transcap.h>
#include <sys/signal.h> #include <sys/signal.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
@ -1866,12 +1867,14 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
ast_log(LOG_DEBUG, "I'm being setup with no bearer right now...\n"); ast_log(LOG_DEBUG, "I'm being setup with no bearer right now...\n");
pri_set_crv(p->pri->pri, p->call, p->channel, 0); pri_set_crv(p->pri->pri, p->call, p->channel, 0);
} }
p->digital = ast_test_flag(ast,AST_FLAG_DIGITAL); p->digital = IS_DIGITAL(ast->transfercapability);
pri_sr_set_channel(sr, p->bearer ? PVT_TO_CHANNEL(p->bearer) : PVT_TO_CHANNEL(p), pri_sr_set_channel(sr, p->bearer ? PVT_TO_CHANNEL(p->bearer) : PVT_TO_CHANNEL(p),
p->pri->nodetype == PRI_NETWORK ? 0 : 1, 1); p->pri->nodetype == PRI_NETWORK ? 0 : 1, 1);
pri_sr_set_bearer(sr, p->digital ? PRI_TRANS_CAP_DIGITAL : PRI_TRANS_CAP_SPEECH, pri_sr_set_bearer(sr, p->digital ? PRI_TRANS_CAP_DIGITAL : ast->transfercapability,
(p->digital ? -1 : (p->digital ? -1 :
((p->law == ZT_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW))); ((p->law == ZT_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW)));
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Requested transfer capability: 0x%.2x - %s\n", ast->transfercapability, ast_transfercapability2str(ast->transfercapability));
dp_strip = 0; dp_strip = 0;
pridialplan = p->pri->dialplan - 1; pridialplan = p->pri->dialplan - 1;
if (pridialplan == -2) { /* compute dynamically */ if (pridialplan == -2) { /* compute dynamically */
@ -4604,35 +4607,7 @@ static int zt_indicate(struct ast_channel *chan, int condition)
return res; return res;
} }
#ifdef ZAPATA_PRI static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int index, int law, int transfercapability)
static void set_calltype(struct ast_channel *chan, int ctype)
{
char *s = "UNKNOWN";
switch(ctype) {
case PRI_TRANS_CAP_SPEECH:
s = "SPEECH";
break;
case PRI_TRANS_CAP_DIGITAL:
s = "DIGITAL";
break;
case PRI_TRANS_CAP_RESTRICTED_DIGITAL:
s = "RESTRICTED_DIGITAL";
break;
case PRI_TRANS_CAP_3_1K_AUDIO:
s = "31KAUDIO";
break;
case PRI_TRANS_CAP_7K_AUDIO:
s = "7KAUDIO";
break;
case PRI_TRANS_CAP_VIDEO:
s = "VIDEO";
break;
}
pbx_builtin_setvar_helper(chan, "CALLTYPE", s);
}
#endif
static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int index, int law, int ctype)
{ {
struct ast_channel *tmp; struct ast_channel *tmp;
int deflaw; int deflaw;
@ -4764,14 +4739,14 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
tmp->cid.cid_pres = i->callingpres; tmp->cid.cid_pres = i->callingpres;
tmp->cid.cid_ton = i->cid_ton; tmp->cid.cid_ton = i->cid_ton;
#ifdef ZAPATA_PRI #ifdef ZAPATA_PRI
set_calltype(tmp, ctype); tmp->transfercapability = transfercapability;
pbx_builtin_setvar_helper(tmp, "TRANSFERCAPABILITY", ast_transfercapability2str(transfercapability));
if (transfercapability & PRI_TRANS_CAP_DIGITAL) {
i->digital = 1;
}
/* Assume calls are not idle calls unless we're told differently */ /* Assume calls are not idle calls unless we're told differently */
i->isidlecall = 0; i->isidlecall = 0;
i->alreadyhungup = 0; i->alreadyhungup = 0;
if (ctype & PRI_TRANS_CAP_DIGITAL) {
i->digital = 1;
ast_set_flag(tmp, AST_FLAG_DIGITAL);
}
#endif #endif
/* clear the fake event in case we posted one before we had ast_chanenl */ /* clear the fake event in case we posted one before we had ast_chanenl */
i->fake_event = 0; i->fake_event = 0;

@ -315,6 +315,9 @@ struct ast_channel {
/*! channel flags of AST_FLAG_ type */ /*! channel flags of AST_FLAG_ type */
unsigned int flags; unsigned int flags;
/* ISDN Transfer Capbility - AST_FLAG_DIGITAL is not enough */
unsigned short transfercapability;
struct ast_frame *readq; struct ast_frame *readq;
int alertpipe[2]; int alertpipe[2];
/*! Write translation path */ /*! Write translation path */
@ -338,7 +341,8 @@ struct ast_channel {
/* Channels have this property if they can accept input with jitter; i.e. most VoIP channels */ /* Channels have this property if they can accept input with jitter; i.e. most VoIP channels */
#define AST_CHAN_TP_WANTSJITTER (1 << 0) #define AST_CHAN_TP_WANTSJITTER (1 << 0)
#define AST_FLAG_DIGITAL (1 << 0) /* if the call is a digital ISDN call */ /* This flag has been deprecated by the transfercapbilty data member in struct ast_channel */
/* #define AST_FLAG_DIGITAL (1 << 0) */ /* if the call is a digital ISDN call */
#define AST_FLAG_DEFER_DTMF (1 << 1) /* if dtmf should be deferred */ #define AST_FLAG_DEFER_DTMF (1 << 1) /* if dtmf should be deferred */
#define AST_FLAG_WRITE_INT (1 << 2) /* if write should be interrupt generator */ #define AST_FLAG_WRITE_INT (1 << 2) /* if write should be interrupt generator */
#define AST_FLAG_BLOCKING (1 << 3) /* if we are blocking */ #define AST_FLAG_BLOCKING (1 << 3) /* if we are blocking */
@ -811,6 +815,15 @@ int ast_channel_masquerade(struct ast_channel *original, struct ast_channel *clo
*/ */
char *ast_state2str(int state); char *ast_state2str(int state);
/*! Gives the string form of a given transfer capability */
/*!
* \param transercapability transfercapabilty to get the name of
* Give a name to a transfercapbility
* See above
* Returns the text form of the binary transfer capbility
*/
char *ast_transfercapability2str(int transfercapability);
/* Options: Some low-level drivers may implement "options" allowing fine tuning of the /* Options: Some low-level drivers may implement "options" allowing fine tuning of the
low level channel. See frame.h for options. Note that many channel drivers may support low level channel. See frame.h for options. Note that many channel drivers may support
none or a subset of those features, and you should not count on this if you want your none or a subset of those features, and you should not count on this if you want your

@ -0,0 +1,33 @@
/*
* Asterisk -- A telephony toolkit for Linux.
*
* General Asterisk channel definitions.
*
* Copyright (C) 1999 - 2005, Digium, Inc.
*
* Matthew Fredrickson <creslin@digium.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License
*/
#ifndef _ASTERISK_TRANSCAP_H
#define _ASTERISK_TRANSCAP_H
/* These definitions are taken directly out of libpri.h and used here.
* DO NOT change them as it will cause unexpected behavior in channels
* that utilize these fields.
*/
#define AST_TRANS_CAP_SPEECH 0x0
#define AST_TRANS_CAP_DIGITAL 0x08
#define AST_TRANS_CAP_RESTRICTED_DIGITAL 0x09
#define AST_TRANS_CAP_3_1K_AUDIO 0x10
#define AST_TRANS_CAP_7K_AUDIO 0x11 /* Depriciated ITU Q.931 (05/1998)*/
#define AST_TRANS_CAP_DIGITAL_W_TONES 0x11
#define AST_TRANS_CAP_VIDEO 0x18
#define IS_DIGITAL(cap)\
(cap) & AST_TRANS_CAP_DIGITAL ? 1 : 0
#endif /* _ASTERISK_TRANSCAP_H */
Loading…
Cancel
Save