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.
 
 
 
 
 
 

389 lines
9.7 KiB

#ifndef __pxsvc_q931_h
#define __pxsvc_q931_h
#include "q931msg.h"
#include "ovioctx.h"
#include "crv.h"
/*---------------------------------------------------
Copyright (c) 1998, Microsoft Corporation
File: q931.h
Purpose:
Contains declarations specific to q931 processing that need
not be present in cbridge.h.
History:
1. created
Byrisetty Rajeev (rajeevb) 26-Aug-1998
---------------------------------------------------*/
// The H.225 spec calls for a 2 byte call reference value
typedef WORD CALL_REF_TYPE;
// Q931 source side states
enum Q931_SOURCE_STATE
{
Q931_SOURCE_STATE_NOT_INIT = 0,
Q931_SOURCE_STATE_INIT,
Q931_SOURCE_STATE_CON_ESTD,
Q931_SOURCE_STATE_SETUP_RCVD,
Q931_SOURCE_STATE_REL_COMP_RCVD
};
// Q931 destination side states
enum Q931_DEST_STATE
{
Q931_DEST_STATE_NOT_INIT = 0,
Q931_DEST_STATE_INIT,
Q931_DEST_STATE_CON_ESTD,
Q931_DEST_STATE_CALL_PROC_RCVD,
Q931_DEST_STATE_ALERTING_RCVD,
Q931_DEST_STATE_CONNECT_RCVD,
Q931_DEST_STATE_REL_COMP_RCVD
};
#ifdef DBG
// CODEWORK: Define a static array of strings to use in dbg printfs
// where the array can be indexed by the state.
#endif DBG
// Q931_INFO
class Q931_INFO :
public OVERLAPPED_PROCESSOR,
public TIMER_PROCESSOR
{
public:
inline Q931_INFO();
inline void Init(
IN H323_STATE &H323State
);
inline CALL_REF_TYPE GetCallRefVal();
virtual HRESULT SendCallback(
IN HRESULT CallbackHResult
);
virtual HRESULT ReceiveCallback(
IN HRESULT CallbackHResult,
IN BYTE *pBuf,
IN DWORD BufLen
);
// Implementation is provided by SOURCE_Q931_INFO and DEST_Q931_INFO
virtual HRESULT ReceiveCallback(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
) = 0;
HRESULT CreateTimer(DWORD TimeoutValue);
virtual void TimerCallback();
HRESULT SendReleaseCompletePdu();
HRESULT QueueSend(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
// queue an asynchronous receive call back
HRESULT QueueReceive();
void IncrementLifetimeCounter (void);
void DecrementLifetimeCounter (void);
protected:
// call reference value for this call (Q931 portion)
// A Call Reference Value is generated for each outbound call.
// The CRV in PDUs corresponding to outbound calls needs to be
// replaced because the external H.323 endpoint sees the call
// as coming from the proxy. No CRV replacement is required for inbound
// calls. But we need to store the CRV so that we can send the
// CallProceeding/ReleaseComplete PDUs.
// This variable is initialized when we process the Setup PDU.
// Note that the Call Reference Value also includes the Call Reference Flag
// which indicates whether the PDU is sent by the originator (0) or
// destination (1) of the call.
// m_CallRefVal always stores the Call Reference Value that we send in
// the PDUs. So, SOURCE_Q931_INFO CRV will have the CRV flag set (since
// it sends to the source) and the DEST_Q931_INFO CRV will have this flag
// zeroed (since it is the source from the destination's point of view.
CALL_REF_TYPE m_CallRefVal;
};
inline
Q931_INFO::Q931_INFO(
)
: m_CallRefVal(0)
{
}
inline void
Q931_INFO::Init(
IN H323_STATE &H323State
)
{
// initialize the overlaped processor
OVERLAPPED_PROCESSOR::Init(OPT_Q931, H323State);
}
class SOURCE_Q931_INFO :
public Q931_INFO
{
public:
inline SOURCE_Q931_INFO();
inline void Init(
IN SOURCE_H323_STATE &SourceH323State
);
inline HRESULT SetIncomingSocket(
IN SOCKET IncomingSocket,
IN SOCKADDR_IN * LocalAddress,
IN SOCKADDR_IN * RemoteAddress);
inline DEST_Q931_INFO &GetDestQ931Info();
inline SOURCE_H245_INFO &GetSourceH245Info();
// TimerValue contains the timer value in seconds, for a timer event
// to be created when a queued send completes
HRESULT ProcessDestPDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
virtual ~SOURCE_Q931_INFO();
protected:
Q931_SOURCE_STATE m_Q931SourceState;
// this should never be called
virtual HRESULT AcceptCallback(
IN DWORD Status,
IN SOCKET Socket,
IN SOCKADDR_IN * LocalAddress,
IN SOCKADDR_IN * RemoteAddress);
virtual HRESULT ReceiveCallback(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
private:
// processes PDUs when in Q931_SRC_CON_EST state
HRESULT HandleStateSrcConEstd(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
// handles the release complete PDU - sends it to the
// destination q931 instance, performs state transition and
// initiates cleanup
HRESULT HandleReleaseCompletePDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
// processes CONNECT PDU forwarded by the dest instance
HRESULT ProcessConnectPDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
};
inline
SOURCE_Q931_INFO::SOURCE_Q931_INFO(
)
: m_Q931SourceState(Q931_SOURCE_STATE_NOT_INIT)
{
}
inline void
SOURCE_Q931_INFO::Init(
IN SOURCE_H323_STATE &SourceH323State
)
{
m_Q931SourceState = Q931_SOURCE_STATE_INIT;
Q931_INFO::Init((H323_STATE &)SourceH323State);
}
class DEST_Q931_INFO :
public Q931_INFO
{
public:
inline DEST_Q931_INFO();
inline HRESULT Init(
IN DEST_H323_STATE &DestH323State
);
inline SOURCE_Q931_INFO &GetSourceQ931Info();
inline DEST_H245_INFO &GetDestH245Info();
// processes PDUs received from the source Q931 instance
// and directs them to the method for processing the
// specific PDU
HRESULT ProcessSourcePDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
virtual ~DEST_Q931_INFO();
protected:
// state for the dest instance
Q931_DEST_STATE m_Q931DestState;
// this method should never be called
virtual HRESULT AcceptCallback(
IN DWORD Status,
IN SOCKET Socket,
IN SOCKADDR_IN * LocalAddress,
IN SOCKADDR_IN * RemoteAddress);
virtual HRESULT ReceiveCallback (
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
private:
// the following methods handle PDUs when the instance
// is in a certain Q931 state
HRESULT HandleStateDestConEstd(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
HRESULT HandleStateDestCallProcRcvd(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
HRESULT HandleStateDestAlertingRcvd(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
HRESULT HandleStateDestConnectRcvd(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
// the following methods handle a specific PDU for
// any state of the Q931 instance. These are typically
// called after the PDU has gone through one of the
// HandleState* methods
HRESULT HandleCallProceedingPDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
HRESULT HandleAlertingPDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
HRESULT HandleConnectPDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
// handles the release complete PDU - sends it to the
// source q931 instance, performs state transition and
// initiates cleanup
HRESULT HandleReleaseCompletePDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
// the following methods process PDUs received from
// the source Q931 instance
// processes source Q.931 instance setup PDU
HRESULT ProcessSourceSetupPDU(
IN Q931_MESSAGE *pQ931Message,
IN H323_UserInformation *pH323UserInfo
);
// other helper methods
HRESULT ConnectToH323Endpoint(
IN SOCKADDR_IN * DestinationAddress);
HRESULT LookupDefaultDestination (
OUT DWORD * ReturnAddress); // host order
// if necessary, bring up the demand-dial interface
HRESULT ConnectDemandDialInterface (void);
};
inline
DEST_Q931_INFO::DEST_Q931_INFO(
)
: m_Q931DestState(Q931_DEST_STATE_NOT_INIT)
{
}
inline HRESULT
DEST_Q931_INFO::Init(
IN DEST_H323_STATE &DestH323State
)
{
m_Q931DestState = Q931_DEST_STATE_INIT;
Q931_INFO::Init((H323_STATE &)DestH323State);
return S_OK;
}
void
Q931AsyncAcceptFunction (
IN PVOID Context,
IN SOCKET Socket,
IN SOCKADDR_IN * LocalAddress,
IN SOCKADDR_IN * RemoteAddress);
HRESULT
Q931CreateBindSocket (
void);
void Q931CloseSocket (
void);
HRESULT Q931StartLoopbackRedirect (
void);
void Q931StopLoopbackRedirect (
void);
extern SYNC_COUNTER Q931SyncCounter;
extern ASYNC_ACCEPT Q931AsyncAccept;
extern SOCKADDR_IN Q931ListenSocketAddress;
extern HANDLE Q931LoopbackRedirectHandle;
#endif // __pxsvc_q931_h