Allow use of resource PLCI instead of NULL PLCI, initial test

This commit is contained in:
MelwareDE 2009-04-09 22:44:44 +00:00
parent e9ef3dcb7f
commit 979d0b7c64
5 changed files with 109 additions and 48 deletions

View File

@ -532,7 +532,7 @@ static void capi_echo_canceller(struct capi_pvt *i, int function)
if ((i->isdnstate & CAPI_ISDN_STATE_DISCONNECT))
return;
if (i->channeltype == CAPI_CHANNELTYPE_NULL) {
if (i->channeltype == CAPI_CHANNELTYPE_NULL && i->resource_plci_type != CAPI_RESOURCE_PLCI_DATA) {
return;
}
@ -593,7 +593,7 @@ static int capi_check_diva_tone_function_allowed(struct capi_pvt *i)
if ((i->isdnstate & CAPI_ISDN_STATE_DISCONNECT))
return (-1);
if (i->channeltype == CAPI_CHANNELTYPE_NULL) {
if (i->channeltype == CAPI_CHANNELTYPE_NULL && i->resource_plci_type != CAPI_RESOURCE_PLCI_DATA) {
return (-1);
}
@ -700,7 +700,7 @@ static int capi_detect_dtmf(struct capi_pvt *i, int flag)
if ((i->isdnstate & CAPI_ISDN_STATE_DISCONNECT))
return 0;
if (i->channeltype == CAPI_CHANNELTYPE_NULL) {
if (i->channeltype == CAPI_CHANNELTYPE_NULL && i->resource_plci_type != CAPI_RESOURCE_PLCI_DATA) {
return 0;
}
@ -5250,9 +5250,13 @@ static int pbx_capi_getplci(struct ast_channel *c, char *param)
*/
static int pbx_capi_clamping(struct ast_channel *c, char *param)
{
struct capi_pvt *i = CC_CHANNEL_PVT(c);
struct capi_pvt *i;
int duration = 0;
i = pbx_check_resource_plci (c);
if (i == 0)
i = CC_CHANNEL_PVT(c);
if (param != 0) {
duration = atoi(param);
if (duration != 0 && duration < 10)
@ -5824,53 +5828,55 @@ static struct capicommands_s {
char *cmdname;
pbx_capi_command_proc_t cmd;
int capionly;
int resourceplcisupported;
} capicommands[] = {
{ "getid", pbx_capi_get_id, 0 },
{ "peerlink", pbx_capi_peer_link, 0 },
{ "progress", pbx_capi_signal_progress, 1 },
{ "deflect", pbx_capi_call_deflect, 1 },
{ "receivefax", pbx_capi_receive_fax, 1 },
{ "sendfax", pbx_capi_send_fax, 1 },
{ "echosquelch", pbx_capi_echosquelch, 1 },
{ "echocancel", pbx_capi_echocancel, 1 },
{ "getid", pbx_capi_get_id, 0, 0 },
{ "peerlink", pbx_capi_peer_link, 0, 0 },
{ "progress", pbx_capi_signal_progress, 1, 0 },
{ "deflect", pbx_capi_call_deflect, 1, 0 },
{ "receivefax", pbx_capi_receive_fax, 1, 0 },
{ "sendfax", pbx_capi_send_fax, 1, 0 },
{ "echosquelch", pbx_capi_echosquelch, 1, 0 },
{ "echocancel", pbx_capi_echocancel, 1, 1 },
{ "noisesuppressor", pbx_capi_noisesuppressor, 1 },
{ "rxagc", pbx_capi_rxagc, 1 },
{ "txagc", pbx_capi_txagc, 1 },
{ "rxdgain", pbx_capi_rxdgain, 1 },
{ "incrxdgain", pbx_capi_incrxdgain, 1 },
{ "txdgain", pbx_capi_txdgain, 1 },
{ "inctxdgain", pbx_capi_inctxdgain, 1 },
{ "clamping", pbx_capi_clamping, 1 },
{ "mftonedetection", pbx_capi_mftonedetection, 1 },
{ "pulsedetection", pbx_capi_pulsedetection, 1 },
{ "sendtone", pbx_capi_sendtone, 1 },
{ "stoptone", pbx_capi_stoptone, 1 },
{ "starttonedetection", pbx_capi_starttonedetection, 1 },
{ "stoptonedetection", pbx_capi_stoptonedetection, 1 },
{ "pitchcontrol", pbx_capi_pitchcontrol, 1 },
{ "incpitchcontrol", pbx_capi_incpitchcontrol, 1 },
{ "noisesuppressor", pbx_capi_noisesuppressor, 1, 1 },
{ "rxagc", pbx_capi_rxagc, 1, 1 },
{ "txagc", pbx_capi_txagc, 1, 1 },
{ "rxdgain", pbx_capi_rxdgain, 1, 1 },
{ "incrxdgain", pbx_capi_incrxdgain, 1, 1 },
{ "txdgain", pbx_capi_txdgain, 1, 1 },
{ "inctxdgain", pbx_capi_inctxdgain, 1, 1 },
{ "clamping", pbx_capi_clamping, 1, 1 },
{ "mftonedetection", pbx_capi_mftonedetection, 1, 1 },
{ "pulsedetection", pbx_capi_pulsedetection, 1, 1 },
{ "sendtone", pbx_capi_sendtone, 1, 1 },
{ "stoptone", pbx_capi_stoptone, 1, 1 },
{ "starttonedetection", pbx_capi_starttonedetection, 1, 1 },
{ "stoptonedetection", pbx_capi_stoptonedetection, 1, 1 },
{ "pitchcontrol", pbx_capi_pitchcontrol, 1, 1 },
{ "incpitchcontrol", pbx_capi_incpitchcontrol, 1, 1 },
{ "vc", pbx_capi_voicecommand, 1 },
{ "vctransparency", pbx_capi_voicecommand_transparency, 1 },
{ "vc", pbx_capi_voicecommand, 1, 1 },
{ "vctransparency", pbx_capi_voicecommand_transparency, 1, 1 },
{ "getplci", pbx_capi_getplci, 1 },
{ "getplci", pbx_capi_getplci, 1, 0 },
{ "malicious", pbx_capi_malicious, 1 },
{ "hold", pbx_capi_hold, 1 },
{ "holdtype", pbx_capi_holdtype, 1 },
{ "retrieve", pbx_capi_retrieve, 0 },
{ "ect", pbx_capi_ect, 1 },
{ "3pty_begin", pbx_capi_3pty_begin, 1 },
{ "ccbs", pbx_capi_ccbs, 0 },
{ "ccbsstop", pbx_capi_ccbsstop, 0 },
{ "ccpartybusy", pbx_capi_ccpartybusy, 0 },
{ "chat", pbx_capi_chat, 0 },
{ "hangup", pbx_capi_realhangup, 0 },
{ "qsig_ssct", pbx_capi_qsig_ssct, 1 },
{ "qsig_ct", pbx_capi_qsig_ct, 1 },
{ "qsig_callmark",pbx_capi_qsig_callmark, 1 },
{ "qsig_getplci", pbx_capi_qsig_getplci, 1 },
{ "malicious", pbx_capi_malicious, 1, 0 },
{ "hold", pbx_capi_hold, 1, 0 },
{ "holdtype", pbx_capi_holdtype, 1, 0 },
{ "retrieve", pbx_capi_retrieve, 0, 0 },
{ "ect", pbx_capi_ect, 1, 0 },
{ "3pty_begin", pbx_capi_3pty_begin, 1, 0 },
{ "ccbs", pbx_capi_ccbs, 0, 0 },
{ "ccbsstop", pbx_capi_ccbsstop, 0, 0 },
{ "ccpartybusy", pbx_capi_ccpartybusy, 0, 0 },
{ "chat", pbx_capi_chat, 0, 0 },
{ "resource", pbx_capi_chat_associate_resource_plci, 0, 0 },
{ "hangup", pbx_capi_realhangup, 0, 0 },
{ "qsig_ssct", pbx_capi_qsig_ssct, 1, 0 },
{ "qsig_ct", pbx_capi_qsig_ct, 1, 0 },
{ "qsig_callmark",pbx_capi_qsig_callmark, 1, 0 },
{ "qsig_getplci", pbx_capi_qsig_getplci, 1, 0 },
{ NULL, NULL, 0 }
};
@ -5937,7 +5943,7 @@ static int pbx_capicommand_exec(struct ast_channel *chan, void *data)
return -1;
}
if ((capicmd->capionly) && (chan->tech != &capi_tech)) {
if ((capicmd->capionly != 0 && capicmd->resourceplcisupported == 0) && (chan->tech != &capi_tech)) {
#ifdef CC_AST_HAS_VERSION_1_4
ast_module_user_remove(u);
#else

View File

@ -263,6 +263,10 @@ struct cc_capi_gains {
#define CAPI_CHANNELTYPE_D 1
#define CAPI_CHANNELTYPE_NULL 2
#define CAPI_RESOURCE_PLCI_NULL 0
#define CAPI_RESOURCE_PLCI_DATA 1
#define CAPI_RESOURCE_PLCI_LINE 2
/* the lower word is reserved for capi commands */
#define CAPI_WAITEVENT_B3_UP 0x00010000
#define CAPI_WAITEVENT_B3_DOWN 0x00020000
@ -483,6 +487,9 @@ struct capi_pvt {
/* Q.SIG features */
int qsigfeat;
struct cc_qsig_data qsig_data;
/* Resource PLCI data */
int resource_plci_type; /* NULL PLCI, DATA, LINE */
/*! Next channel in list */
struct capi_pvt *next;

View File

@ -424,7 +424,10 @@ int pbx_capi_chat(struct ast_channel *c, char *param)
i = CC_CHANNEL_PVT(c);
} else {
/* virtual CAPI channel */
i = capi_mknullif(c, contr);
i = pbx_check_resource_plci (c);
if (i == 0)
i = capi_mknullif(c, contr);
if (!i) {
return -1;
}
@ -456,6 +459,48 @@ out:
return 0;
}
struct capi_pvt* pbx_check_resource_plci (struct ast_channel *c)
{
struct capi_pvt *i = NULL;
const char* id = pbx_builtin_getvar_helper(c, "RESOURCEPLCI");
if (id != 0) {
i = (struct capi_pvt*)strtoul(id, NULL, 0);
}
return (i);
}
int pbx_capi_chat_associate_resource_plci(struct ast_channel *c, char *param)
{
struct capi_pvt *i = NULL;
char *controller;
char *p;
ast_group_t tmpcntr;
unsigned long long contr = 0;
controller = param;
if (controller) {
for (p = controller; p && *p; p++) {
if (*p == '|') *p = ',';
}
tmpcntr = ast_get_group(controller);
contr = (unsigned long long)(tmpcntr >> 1);
}
if (c->tech != &capi_tech) {
i = capi_mkresourceif(c, contr);
if (i != 0) {
char buffer[24];
snprintf(buffer, sizeof(buffer)-1, "%p", i);
pbx_builtin_setvar_helper(c, "RESOURCEPLCI", buffer);
}
}
return ((i != 0) ? 0 : -1);
}
/*
* do command capi chatinfo
*/

View File

@ -16,6 +16,8 @@
* prototypes
*/
extern int pbx_capi_chat(struct ast_channel *c, char *param);
extern int pbx_capi_chat_associate_resource_plci(struct ast_channel *c, char *param);
extern struct capi_pvt* pbx_check_resource_plci (struct ast_channel *c);
#ifdef CC_AST_HAS_VERSION_1_6
extern char *pbxcli_capi_chatinfo(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
#else

View File

@ -245,6 +245,7 @@ struct capi_pvt *capi_mkresourceif(struct ast_channel *c, unsigned long long con
snprintf(data_ifc->vname, sizeof(data_ifc->vname) - 1, "%s", data_ifc->name);
data_ifc->channeltype = CAPI_CHANNELTYPE_NULL;
data_ifc->resource_plci_type = CAPI_RESOURCE_PLCI_DATA;
data_ifc->used = c;
data_ifc->peer = c;