187 lines
4.8 KiB
C++
187 lines
4.8 KiB
C++
|
|
||
|
#include "stdafx.h"
|
||
|
#include "portmgmt.h"
|
||
|
#include "timerval.h"
|
||
|
#include "cbridge.h"
|
||
|
|
||
|
void LOGICAL_CHANNEL::IncrementLifetimeCounter (void) { GetCallBridge().AddRef (); }
|
||
|
void LOGICAL_CHANNEL::DecrementLifetimeCounter (void) { GetCallBridge().Release (); }
|
||
|
|
||
|
// Code common for both RTP and T.120 logical channels
|
||
|
// Only OpenLogicalChannel and OpenLogicalChannelAck need to
|
||
|
// be handled differently for RTP and T.120 logical channels
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
LOGICAL_CHANNEL::CreateTimer(DWORD TimeoutValue)
|
||
|
{
|
||
|
DWORD RetCode;
|
||
|
|
||
|
RetCode = TimprocCreateTimer (TimeoutValue);
|
||
|
|
||
|
return HRESULT_FROM_WIN32(RetCode);
|
||
|
}
|
||
|
|
||
|
// the event manager tells us about timer expiry via this method
|
||
|
/* virtual */ void
|
||
|
LOGICAL_CHANNEL::TimerCallback (void)
|
||
|
{
|
||
|
CALL_BRIDGE *pCallBridge = &GetCallBridge();
|
||
|
|
||
|
///////////////////////////////
|
||
|
//// LOCK the CALL_BRIDGE
|
||
|
///////////////////////////////
|
||
|
pCallBridge->Lock ();
|
||
|
|
||
|
// Clear the timer - Note that Terminate () will try to
|
||
|
// cancel all the timers in this CALL_BRIDGE
|
||
|
TimprocCancelTimer();
|
||
|
DebugF (_T("LC : 0x%x cancelled timer.\n"),
|
||
|
&GetCallBridge ());
|
||
|
|
||
|
// Don't do anything if the CALL_BRIDGE is already terminated.
|
||
|
if (!pCallBridge->IsTerminated ())
|
||
|
{
|
||
|
// CODE WORK *** TO DO
|
||
|
// if the current state is LC_STATE_OPEN_RCVD, send close LC PDU to
|
||
|
// both the source and the destination
|
||
|
|
||
|
// if the current state is LC_STATE_CLOSE_RCVD or
|
||
|
// LC_STATE_OPENED_CLOSE_RCVD, send close LC PDU to just
|
||
|
// the destination
|
||
|
|
||
|
// delete self and remove the pointer from the logical channel array
|
||
|
DeleteAndRemoveSelf ();
|
||
|
}
|
||
|
|
||
|
///////////////////////////////
|
||
|
//// UNLOCK the CALL_BRIDGE
|
||
|
///////////////////////////////
|
||
|
pCallBridge -> Unlock ();
|
||
|
|
||
|
pCallBridge -> Release ();
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
LOGICAL_CHANNEL::HandleCloseLogicalChannelPDU(
|
||
|
IN MultimediaSystemControlMessage *pH245pdu
|
||
|
)
|
||
|
{
|
||
|
HRESULT HResult = E_FAIL;
|
||
|
switch(m_LogicalChannelState)
|
||
|
{
|
||
|
case LC_STATE_OPEN_RCVD:
|
||
|
case LC_STATE_OPEN_ACK_RCVD:
|
||
|
{
|
||
|
#if 0 // 0 ******* Region Commented Out Begins *******
|
||
|
// start timer, if we don't receive a response in this time,
|
||
|
// we must close this logical channel
|
||
|
HResult = CreateTimer(LC_POST_CLOSE_TIMER_VALUE);
|
||
|
if (FAILED(HResult))
|
||
|
{
|
||
|
DebugF( _T("LOGICAL_CHANNEL::HandleCloseLogicalChannelPDU, ")
|
||
|
_T("couldn't create timer, returning 0x%x\n"),
|
||
|
HResult));
|
||
|
return HResult;
|
||
|
}
|
||
|
#endif // 0 ******* Region Commented Out Ends *******
|
||
|
|
||
|
// save the reason for closing the logical channel
|
||
|
|
||
|
// forward the PDU to the other H245 instance
|
||
|
HResult = m_pH245Info->GetOtherH245Info().ProcessMessage(pH245pdu);
|
||
|
if (FAILED(HResult))
|
||
|
{
|
||
|
return HResult;
|
||
|
}
|
||
|
_ASSERTE(S_OK == HResult);
|
||
|
|
||
|
// Don't wait for CLCAck. Just CLC is sufficient to delete the
|
||
|
// logical channel. CLCAck is just forwarded without doing anything.
|
||
|
// delete self and remove the pointer from the logical channel array
|
||
|
DeleteAndRemoveSelf();
|
||
|
|
||
|
#if 0 // 0 ******* Region Commented Out Begins *******
|
||
|
// state trasition
|
||
|
if (LC_STATE_OPEN_ACK_RCVD == m_LogicalChannelState)
|
||
|
{
|
||
|
// we had opened the logical channel
|
||
|
m_LogicalChannelState = LC_STATE_OPENED_CLOSE_RCVD;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// the logical channel was never opened
|
||
|
m_LogicalChannelState = LC_STATE_CLOSE_RCVD;
|
||
|
}
|
||
|
#endif // 0 ******* Region Commented Out Ends *******
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case LC_STATE_CLOSE_RCVD:
|
||
|
case LC_STATE_OPENED_CLOSE_RCVD:
|
||
|
{
|
||
|
return E_INVALIDARG;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case LC_STATE_NOT_INIT:
|
||
|
default:
|
||
|
{
|
||
|
_ASSERTE(FALSE);
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
return HResult;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
LOGICAL_CHANNEL::ProcessOpenLogicalChannelRejectPDU(
|
||
|
IN MultimediaSystemControlMessage *pH245pdu
|
||
|
)
|
||
|
{
|
||
|
// delete self and remove the pointer from the logical channel array
|
||
|
DeleteAndRemoveSelf();
|
||
|
|
||
|
// shouldn't access any members of the logical channel as it may have
|
||
|
// been destroyed already
|
||
|
// NOTE: Since we return S_OK, the PDU gets forwarded to the other end
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Unused.
|
||
|
|
||
|
HRESULT
|
||
|
LOGICAL_CHANNEL::ProcessCloseLogicalChannelAckPDU(
|
||
|
IN MultimediaSystemControlMessage *pH245pdu
|
||
|
)
|
||
|
{
|
||
|
DebugF( _T("LOGICAL_CHANNEL::ProcessCloseLogicalChannelAckPDU(&%x) called ")
|
||
|
_T("m_LogicalChannelState: %d, LCN: %d\n"),
|
||
|
pH245pdu,
|
||
|
m_LogicalChannelState, m_LogicalChannelNumber);
|
||
|
|
||
|
|
||
|
// cancel timer
|
||
|
|
||
|
// CODEWORK: Make some checks on the PDU and current state ??
|
||
|
|
||
|
// delete self and remove the pointer from the logical channel array
|
||
|
DeleteAndRemoveSelf();
|
||
|
|
||
|
// shouldn't access any members of the logical channel as it may have
|
||
|
// been destroyed already
|
||
|
DebugF( _T("LOGICAL_CHANNEL::ProcessCloseLogicalChannelAckPDU(&%x) ")
|
||
|
_T("returning S_OK\n"),
|
||
|
pH245pdu);
|
||
|
return S_OK;
|
||
|
}
|