]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
pretty damn close to being operational
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 16 Jun 2007 15:52:49 +0000 (15:52 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 16 Jun 2007 15:52:49 +0000 (15:52 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@266 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/mod_openzap/mod_openzap.c
libs/freetdm/src/isdn/Q931ie.c
libs/freetdm/src/zap_io.c
libs/freetdm/src/zap_isdn.c

index 0b07afbe2cbf88c11b9e94c07d9aa020e2fc82eb..76436f8fb7b3da75c096ebfb9ca7dabcd2e1e76a 100644 (file)
@@ -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);
                        }
                }
index 9ed580568b35d17595f109ef7ff6ba98aeea22b3..70a7e228e4f804eef2a4b6c679e02baa2e02275d 100644 (file)
@@ -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);
 
index 2ba9f8e2fcbcaa3b5657305116615c07d77e0a70..22bd482a9bd331445910d3c7c531bec1674741d0 100644 (file)
@@ -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) {
index dd870087d1d54cad9030d5a34e738deaba757215..b6f2d27b20351f360f80dd449d3d06003ceb9177 100644 (file)
@@ -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);
                }