#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