From cae2014e7634fb67f5df43ac1cf1a8fe94305306 Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthony.minessale@gmail.com>
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);
 		}