Leaked source code of windows server 2003
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.
|
|
#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; }
|