Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

186 lines
4.8 KiB

#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;
}