From 979d0b7c6470bcd34830ab4ff656cffaca7b2f90 Mon Sep 17 00:00:00 2001 From: MelwareDE Date: Thu, 9 Apr 2009 22:44:44 +0000 Subject: [PATCH] Allow use of resource PLCI instead of NULL PLCI, initial test --- chan_capi.c | 100 ++++++++++++++++++++++++---------------------- chan_capi.h | 7 ++++ chan_capi_chat.c | 47 +++++++++++++++++++++- chan_capi_chat.h | 2 + chan_capi_utils.c | 1 + 5 files changed, 109 insertions(+), 48 deletions(-) diff --git a/chan_capi.c b/chan_capi.c index 1bc1987..5fdb8fc 100644 --- a/chan_capi.c +++ b/chan_capi.c @@ -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 diff --git a/chan_capi.h b/chan_capi.h index c25f985..7f5a384 100644 --- a/chan_capi.h +++ b/chan_capi.h @@ -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; diff --git a/chan_capi_chat.c b/chan_capi_chat.c index 96c9379..4ab6e5d 100644 --- a/chan_capi_chat.c +++ b/chan_capi_chat.c @@ -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 */ diff --git a/chan_capi_chat.h b/chan_capi_chat.h index 1c46140..4410782 100644 --- a/chan_capi_chat.h +++ b/chan_capi_chat.h @@ -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 diff --git a/chan_capi_utils.c b/chan_capi_utils.c index 2844d75..02f3be3 100644 --- a/chan_capi_utils.c +++ b/chan_capi_utils.c @@ -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;