diff --git addons/ooh323c/src/ooCalls.c addons/ooh323c/src/ooCalls.c index 350befd..c6fd302 100644 --- addons/ooh323c/src/ooCalls.c +++ addons/ooh323c/src/ooCalls.c @@ -233,18 +233,29 @@ int ooEndCall(OOH323CallData *call) return OO_OK; } - if(call->logicalChans) - { - OOTRACEINFO3("Clearing all logical channels. (%s, %s)\n", call->callType, - call->callToken); - ooClearAllLogicalChannels(call); + if(OO_TESTFLAG(call->flags, OO_M_ENDSESSION_BUILT)) { + if(call->h245SessionState == OO_H245SESSION_ACTIVE || + call->h245SessionState == OO_H245SESSION_ENDRECVD || call->h245SessionState == OO_H245SESSION_ENDSENT) { + return OO_OK; // h.245 close pending + } } if(!OO_TESTFLAG(call->flags, OO_M_ENDSESSION_BUILT)) { + OOTRACEINFO4("Closing H.245 sessions. %d (%s, %s)\n", call->h245SessionState, call->callType, call->callToken); if(call->h245SessionState == OO_H245SESSION_ACTIVE || call->h245SessionState == OO_H245SESSION_ENDRECVD) { + if(call->logicalChans) { + OOTRACEINFO3("Clearing all logical channels. (%s, %s)\n", call->callType, + call->callToken); + if (!OO_TESTFLAG(call->flags, OO_M_CLOSE_LC_SENT)) { + ooCloseAllLogicalChannels(call, NULL); + OO_SETFLAG(call->flags, OO_M_CLOSE_LC_SENT); + } + return OO_OK; + } + ooSendEndSessionCommand(call); OO_SETFLAG(call->flags, OO_M_ENDSESSION_BUILT); } diff --git addons/ooh323c/src/ooCalls.h addons/ooh323c/src/ooCalls.h index d05ccf0..ea1f43b 100644 --- addons/ooh323c/src/ooCalls.h +++ addons/ooh323c/src/ooCalls.h @@ -45,6 +45,7 @@ extern "C" { #define OO_M_ENDSESSION_BUILT ASN1UINTCNT(0x00800000) #define OO_M_RELEASE_BUILT ASN1UINTCNT(0x00400000) #define OO_M_FASTSTARTANSWERED ASN1UINTCNT(0x04000000) +#define OO_M_CLOSE_LC_SENT ASN1UINTCNT(0x40000000) #define OO_M_ENDPOINTCREATED ASN1UINTCNT(0x00010000) #define OO_M_GKROUTED ASN1UINTCNT(0x00200000) diff --git addons/ooh323c/src/oochannels.c addons/ooh323c/src/oochannels.c index f7dd7c5..619cf70 100644 --- addons/ooh323c/src/oochannels.c +++ addons/ooh323c/src/oochannels.c @@ -225,9 +225,9 @@ int ooSendH225Msg(OOH323CallData *call, Q931Message *msg) if(encodebuf[0] == OOReleaseComplete || (encodebuf[0]==OOFacility && encodebuf[1]==OOEndSessionCommand)) { - dListFreeAll(call->pctxt, &call->pH225Channel->outQueue); + // dListFreeAll(call->pctxt, &call->pH225Channel->outQueue); dListAppend (call->pctxt, &call->pH225Channel->outQueue, encodebuf); - // ooSendMsg(call, OOQ931MSG); + ooSendMsg(call, OOQ931MSG); } else{ dListAppend (call->pctxt, &call->pH225Channel->outQueue, encodebuf); diff --git addons/ooh323c/src/ooh245.c addons/ooh323c/src/ooh245.c index fe8ff28..4b151a5 100644 --- addons/ooh323c/src/ooh245.c +++ addons/ooh323c/src/ooh245.c @@ -272,7 +272,7 @@ int ooSendH245Msg(OOH323CallData *call, H245Message *msg) if(!OO_TESTFLAG(call->flags, OO_M_TUNNELING)){ if(encodebuf[0]== OOEndSessionCommand) /* High priority message */ { - dListFreeAll(call->pctxt, &call->pH245Channel->outQueue); + // dListFreeAll(call->pctxt, &call->pH245Channel->outQueue); dListAppend (call->pctxt, &call->pH245Channel->outQueue, encodebuf); ooSendMsg(call, OOH245MSG); } @@ -281,6 +281,7 @@ int ooSendH245Msg(OOH323CallData *call, H245Message *msg) OOTRACEDBGC4("Queued H245 messages %d. (%s, %s)\n", call->pH245Channel->outQueue.count, call->callType, call->callToken); + ooSendMsg(call, OOH245MSG); } } else{ @@ -3095,7 +3096,7 @@ int ooHandleH245Message(OOH323CallData *call, H245Message * pmsg) call->TCSPending = FALSE; call->localTermCapState = OO_LocalTermCapExchange_Idle; ooSendTermCapMsg(call); - } else if (!ooGetTransmitLogicalChannel(call)) { + } else if (call->callState < OO_CALL_CLEAR && !ooGetTransmitLogicalChannel(call)) { ooOpenLogicalChannels(call); } break; @@ -3632,6 +3633,13 @@ int ooSendH245UserInputIndication_signal int ooOpenLogicalChannels(OOH323CallData *call) { int ret=0; + + if (call->callState >= OO_CALL_CLEAR) { + OOTRACEINFO3("Not open logical channels on closing call(%s, %s)\n", call->callType, + call->callToken); + return OO_OK; + + } OOTRACEINFO3("Opening logical channels (%s, %s)\n", call->callType, call->callToken); diff --git addons/ooh323c/src/ooh323.c addons/ooh323c/src/ooh323.c index be02f8f..0c8b182 100644 --- addons/ooh323c/src/ooh323.c +++ addons/ooh323c/src/ooh323.c @@ -366,7 +366,7 @@ int ooOnReceivedReleaseComplete(OOH323CallData *call, Q931Message *q931Msg) } } } - call->callState = OO_CALL_CLEARED; + call->callState = OO_CALL_CLEAR; return ret; }