From 58cf952292aa50c0dbc50485005355e7955c8227 Mon Sep 17 00:00:00 2001 From: MelwareDE Date: Tue, 21 Dec 2010 19:14:27 +0000 Subject: [PATCH] Add sending of CALL PROCEEDING messages --- chan_capi.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++-- chan_capi.h | 4 ++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/chan_capi.c b/chan_capi.c index 7aa3511..6c2710d 100644 --- a/chan_capi.c +++ b/chan_capi.c @@ -99,6 +99,7 @@ static char *commandtdesc = CC_MESSAGE_BIGNAME " command interface.\n" "\n" "capicommand() where () can be:\n" "\"progress\" send progress (for NT mode)\n" +"\"proceeding\" send proceeding (for NT mode)\n" "\"deflect,to_number\" forwards an unanswered call to number\n" "\"malicous\" report a call of malicious nature\n" "\"echocancel, or \" echo-cancel provided by driver/hardware\n" @@ -1081,6 +1082,46 @@ static int pbx_capi_alert(struct ast_channel *c) return 0; } +/*! + \brief Send CALL PROCEEDING (if supported by hardware) + + \note Sending of Proceeding is not defined by CAPI spec. + Diva hardware uses ALERT with sending complete set. + Other hardware can send alert only + + */ +static int pbx_capi_signal_proceeding(struct ast_channel *c, char *param) +{ + static const unsigned char sending_complete[] = { 2, 1, 0 }; + struct capi_pvt *i = CC_CHANNEL_PVT(c); + + if ((i->state != CAPI_STATE_INCALL) && + (i->state != CAPI_STATE_DID)) { + cc_verbose(2, 1, VERBOSE_PREFIX_3 "%s: attempting PROCEEDING in state %d\n", + i->vname, i->state); + } + + if ((i->ntmode == 0) + /*! \todo || (capi_controllers[i->controlle]->mnufacturer != ManufacturerDiva) */) { + return (pbx_capi_alert(c)); + } + + if (((i->isdnstate2 & CAPI_ISDN_STATE2_PROCEEDING) != 0) || + ((i->isdnstate2 & CAPI_ISDN_STATE2_PROCEEDING_PENDING) != 0)) { + return 0; + } + + + if (capi_sendf(NULL, 0, CAPI_ALERT_REQ, i->PLCI, get_capi_MessageNumber(), + "(()()()()s)", sending_complete) != 0) { + return -1; + } + + i->isdnstate2 |= CAPI_ISDN_STATE2_PROCEEDING_PENDING; + + return 0; +} + /* * cleanup the interface */ @@ -1108,6 +1149,7 @@ static void interface_cleanup(struct capi_pvt *i) } i->isdnstate = 0; + i->isdnstate2 = 0; i->cause = 0; i->fsetting = 0; @@ -5722,7 +5764,14 @@ static void capidev_handle_msg(_cmsg *CMSG) break; case CAPI_P_CONF(ALERT): wInfo = ALERT_CONF_INFO(CMSG); - if(i == NULL) break; + if (i == NULL) break; + if ((i->isdnstate2 & CAPI_ISDN_STATE2_PROCEEDING_PENDING) != 0) { + if ((wInfo & 0xff00) == 0) { + i->isdnstate2 |= CAPI_ISDN_STATE2_PROCEEDING; + } + i->isdnstate2 &= ~CAPI_ISDN_STATE2_PROCEEDING_PENDING; + break; + } if (!i->owner) break; if ((wInfo & 0xff00) == 0) { if (i->state != CAPI_STATE_DISCONNECTING) { @@ -7251,6 +7300,7 @@ static struct capicommands_s { { "getid", pbx_capi_get_id, 0, 0, 0 }, { "peerlink", pbx_capi_peer_link, 0, 0, 0 }, { "progress", pbx_capi_signal_progress, 1, 0, 0 }, + { "proceeding", pbx_capi_signal_proceeding, 1, 0, 0 }, { "deflect", pbx_capi_call_deflect, 1, 0, 0 }, { "receivefax", pbx_capi_receive_fax, 1, 1, 0 }, { "sendfax", pbx_capi_send_fax, 1, 1, 0 }, @@ -7485,7 +7535,7 @@ static int pbx_capi_indicate(struct ast_channel *c, int condition) case AST_CONTROL_PROCEEDING: cc_verbose(3, 1, VERBOSE_PREFIX_2 "%s: Requested PROCEEDING-Indication for %s\n", i->vname, c->name); - if (i->ntmode) pbx_capi_signal_progress(c, NULL); + pbx_capi_signal_proceeding(c, NULL); break; case AST_CONTROL_HOLD: cc_verbose(3, 1, VERBOSE_PREFIX_2 "%s: Requested HOLD-Indication for %s\n", diff --git a/chan_capi.h b/chan_capi.h index 5023522..2c80bb0 100644 --- a/chan_capi.h +++ b/chan_capi.h @@ -313,6 +313,9 @@ struct cc_capi_gains { #define CAPI_ISDN_STATE_PBX_DONT 0x40000000 #define CAPI_ISDN_STATE_PBX 0x80000000 +#define CAPI_ISDN_STATE2_PROCEEDING 0x00000001 +#define CAPI_ISDN_STATE2_PROCEEDING_PENDING 0x00000002 + #define CAPI_CHANNELTYPE_B 0 #define CAPI_CHANNELTYPE_D 1 #define CAPI_CHANNELTYPE_NULL 2 @@ -401,6 +404,7 @@ struct capi_pvt { /* the state of the line */ unsigned int isdnstate; + unsigned int isdnstate2; int cause; /* which b-protocol is active */