windows-nt/Source/XPSP1/NT/net/rras/ip/nath323/h245info.h
2020-09-26 16:20:57 +08:00

358 lines
7.2 KiB
C++

#ifndef _cbridge_h245_h_
#define _cbridge_h245_h_
// H245 states
// H245_STATE_CON_LISTEN is only applicable to the source side
// H245_STATE_CON_INFO is only applicable to the dest side
enum H245_STATE
{
H245_STATE_NOT_INIT = 0,
H245_STATE_INIT,
H245_STATE_CON_LISTEN,
H245_STATE_CON_INFO,
H245_STATE_CON_ESTD
};
class H245_INFO :
public OVERLAPPED_PROCESSOR
{
// we need to let the LOGICAL_CHANNEL send PDUs using the
// H245 sockets and transition to shutdown mode
friend HRESULT
LOGICAL_CHANNEL::ProcessOpenLogicalChannelRejectPDU (
IN MultimediaSystemControlMessage *pH245pdu
);
// XXX Is this the only way out ?
friend HRESULT
T120_LOGICAL_CHANNEL::HandleOpenLogicalChannelPDU(
IN H245_INFO &H245Info,
IN MEDIA_TYPE MediaType,
IN WORD LogicalChannelNumber,
IN BYTE SessionId,
IN DWORD T120ConnectToIPAddr,
IN WORD T120ConnectToPort,
IN MultimediaSystemControlMessage *pH245pdu
);
friend HRESULT
T120_LOGICAL_CHANNEL::ProcessOpenLogicalChannelAckPDU(
IN MultimediaSystemControlMessage *pH245pdu
);
public:
inline
H245_INFO (
void
);
inline
void
Init (
IN H323_STATE &H323State
);
inline
H245_INFO &GetOtherH245Info (
void
);
inline
LOGICAL_CHANNEL_ARRAY &GetLogicalChannelArray (
void
);
HRESULT
ProcessMessage (
IN MultimediaSystemControlMessage * pH245pdu
);
HRESULT
H245_INFO::SendEndSessionCommand (
void
);
virtual
~H245_INFO (
void
);
protected:
H245_STATE m_H245State;
// logical channels
LOGICAL_CHANNEL_ARRAY m_LogicalChannelArray;
// the other h245 addresses are needed because we need to
// cancel NAT redirections in the logical channel destructor
// and we can't access the other h245 instance there because
// it may have been destroyed already
// queue an asynchronous receive call back
inline
HRESULT
QueueReceive (
void
);
// queue an asynchronous send call back
inline
HRESULT QueueSend (
IN MultimediaSystemControlMessage *pH245pdu
);
virtual
HRESULT AcceptCallback (
IN DWORD Status,
IN SOCKET Socket,
IN SOCKADDR_IN * LocalAddress,
IN SOCKADDR_IN * RemoteAddress
)
{
_ASSERTE(FALSE);
return E_UNEXPECTED;
}
virtual
HRESULT
ReceiveCallback (
IN HRESULT CallbackHResult,
IN BYTE *pBuf,
IN DWORD BufLen
);
virtual
HRESULT
ReceiveCallback (
IN MultimediaSystemControlMessage *pH245pdu
);
virtual
HRESULT
SendCallback (
IN HRESULT CallbackHResult
);
private:
HRESULT
HandleRequestMessage (
IN MultimediaSystemControlMessage *pH245pdu
);
HRESULT ProcessResponseMessage (
IN MultimediaSystemControlMessage *pH245pdu
);
HRESULT CheckOpenLogicalChannelPDU (
IN MultimediaSystemControlMessage &H245pdu,
OUT BYTE &SessionId,
OUT MEDIA_TYPE &MediaType
);
HRESULT CheckOpenLogicalChannelPDU (
IN MultimediaSystemControlMessage &H245pdu,
OUT BYTE &SessionId,
OUT DWORD &SourceIPv4Address,
OUT WORD &SourceRTCPPort
);
HRESULT HandleOpenLogicalChannelPDU (
IN MultimediaSystemControlMessage *pH245pdu
);
HRESULT HandleCloseLogicalChannelPDU (
IN MultimediaSystemControlMessage *pH245pdu
);
HRESULT CheckOpenRtpLogicalChannelPDU (
IN OpenLogicalChannel &OlcPDU,
OUT SOCKADDR_IN * ReturnSourceAddress
);
HRESULT CheckOpenT120LogicalChannelPDU (
IN OpenLogicalChannel &OlcPDU,
OUT DWORD &T120ConnectToIPAddr,
OUT WORD &T120ConnectToPort
);
HRESULT CreateRtpLogicalChannel (
IN OpenLogicalChannel &OlcPDU,
IN BYTE SessionId,
IN MEDIA_TYPE MediaType,
IN MultimediaSystemControlMessage *pH245pdu,
OUT LOGICAL_CHANNEL **ppReturnLogicalChannel
);
HRESULT CreateT120LogicalChannel (
IN OpenLogicalChannel &OlcPDU,
IN BYTE SessionId,
IN MEDIA_TYPE MediaType,
IN MultimediaSystemControlMessage *pH245pdu,
OUT LOGICAL_CHANNEL **ppReturnLogicalChannel
);
};
inline
H245_INFO::H245_INFO (
)
: m_H245State(H245_STATE_NOT_INIT)
{
}
inline
void
H245_INFO::Init (
IN H323_STATE &H323State
)
{
// initialize the overlaped processor
OVERLAPPED_PROCESSOR::Init(OPT_H245, H323State);
m_LogicalChannelArray.Init();
m_H245State = H245_STATE_INIT;
}
inline LOGICAL_CHANNEL_ARRAY &
H245_INFO::GetLogicalChannelArray (
void
)
{
return m_LogicalChannelArray;
}
class SOURCE_H245_INFO :
public H245_INFO
{
public:
inline
SOURCE_H245_INFO (
void
);
inline
void Init (
IN SOURCE_H323_STATE &SourceH323State
);
inline
SOURCE_Q931_INFO &GetSourceQ931Info (
void
);
inline
DEST_H245_INFO &GetDestH245Info (
void
);
HRESULT
ListenForCaller (
IN SOCKADDR_IN * ListenAddress
);
protected:
virtual
HRESULT
AcceptCallback (
IN DWORD Status,
IN SOCKET Socket,
IN SOCKADDR_IN * LocalAddress,
IN SOCKADDR_IN * RemoteAddress
);
};
inline
SOURCE_H245_INFO::SOURCE_H245_INFO (
void
)
{
}
inline
void
SOURCE_H245_INFO::Init (
IN SOURCE_H323_STATE &SourceH323State
)
{
H245_INFO::Init((H323_STATE &)SourceH323State);
}
class DEST_H245_INFO :
public H245_INFO
{
public:
inline
DEST_H245_INFO (
void
);
inline
void
Init (
IN DEST_H323_STATE &DestH323State
);
inline
void
SetCalleeInfo (
IN SOCKADDR_IN * CalleeAddress
);
inline
DEST_Q931_INFO &GetDestQ931Info (
void
);
inline
HRESULT ConnectToCallee (
void
);
protected:
SOCKADDR_IN m_CalleeAddress;
};
inline
DEST_H245_INFO::DEST_H245_INFO (
void
)
{
}
inline
void
DEST_H245_INFO::Init (
IN DEST_H323_STATE &DestH323State
)
{
H245_INFO::Init((H323_STATE &)DestH323State);
}
inline void
DEST_H245_INFO::SetCalleeInfo (
IN SOCKADDR_IN * ArgCalleeAddress
)
{
assert (ArgCalleeAddress);
m_CalleeAddress = *ArgCalleeAddress;
// state transition to H245_STATE_CON_INFO
m_H245State = H245_STATE_CON_INFO;
}
#endif // _cbridge_h245_h_