From cae2014e7634fb67f5df43ac1cf1a8fe94305306 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sat, 16 Jun 2007 15:52:49 +0000 Subject: [PATCH] pretty damn close to being operational git-svn-id: http://svn.openzap.org/svn/openzap/trunk@266 a93c3328-9c30-0410-af19-c9cd2b2d52af --- libs/openzap/mod_openzap/mod_openzap.c | 4 ++-- libs/openzap/src/isdn/Q931ie.c | 3 ++- libs/openzap/src/zap_io.c | 13 +++++++++++++ libs/openzap/src/zap_isdn.c | 9 ++++++--- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/libs/openzap/mod_openzap/mod_openzap.c b/libs/openzap/mod_openzap/mod_openzap.c index 0b07afbe2c..76436f8fb7 100644 --- a/libs/openzap/mod_openzap/mod_openzap.c +++ b/libs/openzap/mod_openzap/mod_openzap.c @@ -318,7 +318,7 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) break; case ZAP_CHAN_TYPE_B: { - if (tech_pvt->zchan->state != ZAP_CHANNEL_STATE_DOWN) { + if (tech_pvt->zchan->state != ZAP_CHANNEL_STATE_DOWN && tech_pvt->zchan->state != ZAP_CHANNEL_STATE_TERMINATING) { tech_pvt->zchan->caller_data.hangup_cause = switch_channel_get_cause(channel); zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_HANGUP); } @@ -977,7 +977,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_isdn_signal) while((session = zap_channel_get_session(sigmsg->channel, 0))) { zap_channel_clear_token(sigmsg->channel, 0); channel = switch_core_session_get_channel(session); - switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + switch_channel_hangup(channel, sigmsg->channel->caller_data.hangup_cause); switch_core_session_rwunlock(session); } } diff --git a/libs/openzap/src/isdn/Q931ie.c b/libs/openzap/src/isdn/Q931ie.c index 9ed580568b..70a7e228e4 100644 --- a/libs/openzap/src/isdn/Q931ie.c +++ b/libs/openzap/src/isdn/Q931ie.c @@ -1018,7 +1018,7 @@ L3INT Q931Uie_Cause(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *pMsg, L3UCHAR * I pie->Location = IBuf[Octet+Off] & 0x0f; /* Octet 3a */ - if((IBuf[Octet+Off] & 0x80) != 0) + if((IBuf[Octet+Off] & 0x80) == 0) { Off++; pie->Recom = IBuf[Octet+Off] & 0x7f; @@ -1027,6 +1027,7 @@ L3INT Q931Uie_Cause(Q931_TrunkInfo_t *pTrunk, Q931mes_Generic *pMsg, L3UCHAR * I /* Octet 4 */ pie->Value = IBuf[Octet+Off] & 0x7f; + Octet++; Q931IESizeTest(Q931E_CAUSE); diff --git a/libs/openzap/src/zap_io.c b/libs/openzap/src/zap_io.c index 2ba9f8e2fc..22bd482a9b 100644 --- a/libs/openzap/src/zap_io.c +++ b/libs/openzap/src/zap_io.c @@ -516,6 +516,19 @@ zap_status_t zap_channel_set_state(zap_channel_t *zchan, zap_channel_state_t sta } switch(zchan->state) { + case ZAP_CHANNEL_STATE_HANGUP: + case ZAP_CHANNEL_STATE_TERMINATING: + { + ok = 0; + switch(state) { + case ZAP_CHANNEL_STATE_DOWN: + ok = 1; + break; + default: + break; + } + } + break; case ZAP_CHANNEL_STATE_UP: { switch(state) { diff --git a/libs/openzap/src/zap_isdn.c b/libs/openzap/src/zap_isdn.c index dd870087d1..b6f2d27b20 100644 --- a/libs/openzap/src/zap_isdn.c +++ b/libs/openzap/src/zap_isdn.c @@ -105,6 +105,8 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen) break; case Q931mes_DISCONNECT: { + Q931ie_Cause *cause = Q931GetIEPtr(gen->Cause, gen->buf); + zchan->caller_data.hangup_cause = cause->Value; zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_TERMINATING); } break; @@ -172,8 +174,8 @@ static int zap_isdn_921_23(void *pvt, L2UCHAR *msg, L2INT mlen) { int ret; char bb[4096] = ""; - print_hex_bytes(msg, mlen, bb, sizeof(bb)); - zap_log(ZAP_LOG_DEBUG, "READ %d\n%s\n%s\n\n", (int)mlen, LINE, bb); + print_hex_bytes(msg+4, mlen-2, bb, sizeof(bb)); + zap_log(ZAP_LOG_DEBUG, "READ %d\n%s\n%s\n\n", (int)mlen-2, LINE, bb); ret = Q931Rx23(pvt, msg, mlen); if (ret != 0) @@ -342,7 +344,6 @@ static __inline__ void state_advance(zap_channel_t *zchan) #endif CalledNum.TypNum = 2; CalledNum.NumPlanID = 1; - printf("WTF: [%s]\n", zchan->caller_data.ani); CalledNum.Size += strlen(zchan->caller_data.ani); gen->CalledNum = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &CalledNum); ptrCalledNum = Q931GetIEPtr(gen->CalledNum, gen->buf); @@ -370,6 +371,8 @@ static __inline__ void state_advance(zap_channel_t *zchan) break; case ZAP_CHANNEL_STATE_TERMINATING: { + sig.event_id = ZAP_SIGEVENT_STOP; + status = data->sig_cb(&sig); gen->MesType = Q931mes_RELEASE; Q931Rx43(&data->q931, (void *)gen, gen->Size); }