|
|
/*
* File: ctrlh323.h * * H.323/H.245 implementation of IControlChannel. * * Revision History: * * 05/03/96 mikev created */
#ifndef _CTRLH323_H
#define _CTRLH323_H
//
// Build with BETA_2_ASN_PRESENT defined to detect a peer that is using
// downlevel ASN.1. It has been discovered that some PDUs encoded with the
// old encoder (OSS version 4.2.1 beta) cause the new decoder (OSS 4.2.2) to
// crash. The only known products to beware of are:
// Microsoft NetMeeting Version 2, (beta 2 and beta 3.) These do not set
// either version field.
// Intel Internet Video Phone Beta 1 (expires 4/19/97)
//
// The only PDUs known (so far) to crash are the acks for "MiscellaneousCommand"
// and "MiscelaneousIndication". We avoid the acks by not sending the Command or
// Indication.
#define BETA_2_ASN_PRESENT
#ifdef BETA_2_ASN_PRESENT
// Intel products: (country code: 0xb5, manufacturer code: 0x8080)
// Intel Internet Video Phone Beta 1 (expires 4/19/97): product number: "Intel
// Internet Video Phone"; version number: "1.0"
#define INTEL_H_221_MFG_CODE 0x8080
#endif
//
// control channel flags
//
typedef ULONG CCHFLAGS; #define CTRLF_OPEN 0x10000000 // control channel is open
#define CTRLF_ORIGINATING 0x00000001 // call originated at this end
#define IsCtlChanOpen(f) (f & CTRLF_OPEN)
#define IsOriginating(f) (f & CTRLF_ORIGINATING)
#define CTRLF_INIT_ORIGINATING CTRLF_ORIGINATING
#define CTRLF_INIT_NOT_ORIGINATING 0
#define CTRLF_INIT_ACCEPT CTRLF_OPEN
#define CTRLF_RESET 0
//
// Extensible Nonstandard data structure
//
typedef enum { NSTD_ID_ONLY = 0, // placeholder so that H.221 stuff like Mfr.Id
// can be exchanged without sacrificing extensibility later
NSTD_VENDORINFO, // wrapped CC_VENDORINFO, redundant.
NSTD_APPLICATION_DATA // array of bytes passed from application layer to
// application layer
} NSTD_DATA_TYPE;
typedef struct { #define APPLICATION_DATA_DEFAULT_SIZE 4
DWORD dwDataSize; BYTE data[APPLICATION_DATA_DEFAULT_SIZE]; // variable sized
}APPLICATION_DATA;
typedef struct { NSTD_DATA_TYPE data_type; DWORD dw_nonstd_data_size; union { CC_VENDORINFO VendorInfo; APPLICATION_DATA AppData; }nonstd_data; }MSFT_NONSTANDARD_DATA, *PMSFT_NONSTANDARD_DATA;
class CH323Ctrl : public IControlChannel {
protected: OBJ_CPT; // profiling timer
#ifdef BETA_2_ASN_PRESENT
BOOL m_fAvoidCrashingPDUs; #endif
//
// Handles and data specific to CALLCONT.DLL apis (H245 call control DLL)
//
CC_HLISTEN m_hListen; CC_HCONFERENCE m_hConference; CC_CONFERENCEID m_ConferenceID; CC_HCALL m_hCall; PCC_ALIASNAMES m_pRemoteAliases; PCC_ALIASITEM m_pRemoteAliasItem; LPWSTR pwszPeerAliasName; // unicode peer ID - this is always used for caller ID
LPWSTR pwszPeerDisplayName; // unicode peer display name - used for called party ID
// in the absence of szPeerAliasName
BOOL m_bMultipointController;
CC_VENDORINFO m_VendorInfo; CC_VENDORINFO m_RemoteVendorInfo; CC_NONSTANDARDDATA m_NonstandardData; MSFT_NONSTANDARD_DATA m_NonstdContent; // empty for now
CC_CONFERENCEATTRIBUTES m_ConferenceAttributes; CC_PARTICIPANTLIST m_ParticipantList; public: //
// access methods specific to support of CALLCONT.DLL apis (H245 call control DLL)
//
CC_HCONFERENCE GetConfHandle() {return(m_hConference);}; CC_CONFERENCEID GetConfID() {return(m_ConferenceID);}; CC_CONFERENCEID *GetConfIDptr() {return(&m_ConferenceID);}; CC_HLISTEN GetListenHandle() {return(m_hListen);}; CC_HCALL GetHCall() {return(m_hCall);};
// Callbacks and event handling functions specific to support of
// CALLCONT.DLL callbacks
//
HRESULT ConfCallback (BYTE bIndication, HRESULT hStatus, PCC_CONFERENCE_CALLBACK_PARAMS pConferenceCallbackParams); VOID ListenCallback (HRESULT hStatus,PCC_LISTEN_CALLBACK_PARAMS pListenCallbackParams); VOID OnCallConnect(HRESULT hStatus, PCC_CONNECT_CALLBACK_PARAMS pConfParams); VOID OnCallRinging(HRESULT hStatus, PCC_RINGING_CALLBACK_PARAMS pRingingParams);
VOID OnChannelRequest(HRESULT hStatus,PCC_RX_CHANNEL_REQUEST_CALLBACK_PARAMS pChannelReqParams); VOID OnChannelAcceptComplete(HRESULT hStatus, PCC_TX_CHANNEL_CLOSE_REQUEST_CALLBACK_PARAMS pChannelParams); VOID OnChannelOpen(HRESULT hStatus,PCC_TX_CHANNEL_OPEN_CALLBACK_PARAMS pChannelParams ); VOID OnT120ChannelRequest(HRESULT hStatus,PCC_T120_CHANNEL_REQUEST_CALLBACK_PARAMS pT120RequestParams); VOID OnT120ChannelOpen(HRESULT hStatus, PCC_T120_CHANNEL_OPEN_CALLBACK_PARAMS pT120OpenParams);
BOOL OnCallAccept(PCC_LISTEN_CALLBACK_PARAMS pListenCallbackParams); VOID OnHangup(HRESULT hStatus); VOID OnRxChannelClose(HRESULT hStatus,PCC_RX_CHANNEL_CLOSE_CALLBACK_PARAMS pChannelParams ); VOID OnTxChannelClose(HRESULT hStatus,PCC_TX_CHANNEL_CLOSE_REQUEST_CALLBACK_PARAMS pChannelParams ); VOID OnMiscCommand(HRESULT hStatus, PCC_H245_MISCELLANEOUS_COMMAND_CALLBACK_PARAMS pParams); VOID OnMiscIndication(HRESULT hStatus, PCC_H245_MISCELLANEOUS_INDICATION_CALLBACK_PARAMS pParams); VOID OnMute(HRESULT hStatus, PCC_MUTE_CALLBACK_PARAMS pParams); VOID OnUnMute(HRESULT hStatus, PCC_UNMUTE_CALLBACK_PARAMS pParams); // support functions
HRESULT NewConference(VOID); VOID SetRemoteVendorID(PCC_VENDORINFO pVendorInfo);
//
// End of CALLCONT.DLL specific members
//
BOOL IsReleasing() {return((uRef==0)?TRUE:FALSE);}; // object is being released and should not
// be reentered
// this implementation has a coarse concept of call setup protocol phase because it's
// using apis of CALLCONT.DLL.
CtlChanStateType m_Phase; // our perception of protocol phase
BOOL m_fLocalT120Cap; BOOL m_fRemoteT120Cap; public: CH323Ctrl(); ~CH323Ctrl();
protected: SOCKADDR_IN local_sin; SOCKADDR_IN remote_sin; int local_sin_len; int remote_sin_len; LPVOID lpvRemoteCustomFormats; virtual VOID Cleanup(); BOOL ConfigureRecvChannelCapability(ICtrlCommChan *pChannel , PCC_RX_CHANNEL_REQUEST_CALLBACK_PARAMS pChannelParams); BOOL ValidateChannelParameters(PCC_TERMCAP pChanCap1, PCC_TERMCAP pChanCap2); STDMETHOD(FindDefaultRXChannel(PCC_TERMCAP pChannelCapability, ICtrlCommChan **lplpChannel)); GUID m_PID; private: UINT uRef; HRESULT hrLast; CCHFLAGS m_ChanFlags; HRESULT m_hCallCompleteCode; COBLIST m_ChannelList; IConfAdvise *m_pConfAdvise; ICtrlCommChan *FindChannel(CC_HCHANNEL hChannel); VOID DoAdvise(DWORD dwEvent, LPVOID lpvData); VOID CheckChannelsReady(VOID); VOID NewRemoteUserInfo(PCC_ALIASNAMES pRemoteAliasNames, LPWSTR szRemotePeerDisplayName); VOID ConnectNotify(DWORD dwEvent); VOID GoNextPhase(CtlChanStateType phase); VOID InternalDisconnect(); HRESULT AllocConferenceAttributes(); VOID CleanupConferenceAttributes(); VOID ReleaseAllChannels(); public:
STDMETHOD_(ULONG, AddRef()); STDMETHOD_(ULONG, Release());
STDMETHOD( Init(IConfAdvise *pConfAdvise)); STDMETHOD( DeInit(IConfAdvise *pConfAdvise)); VOID SetRemoteAddress(PSOCKADDR_IN psin) {remote_sin = *psin;}; VOID SetLocalAddress(PSOCKADDR_IN psin) {local_sin = *psin;}; // so we know what address we accepted on
STDMETHOD( GetLocalAddress(PSOCKADDR_IN *lplpAddr)); // so we know the address of the caller
STDMETHOD( GetRemoteAddress(PSOCKADDR_IN *lplpAddr)); STDMETHOD( GetRemotePort(PORT * lpPort)); STDMETHOD( GetLocalPort(PORT * lpPort)); STDMETHOD(PlaceCall (BOOL bUseGKResolution, PSOCKADDR_IN pCallAddr, P_H323ALIASLIST pDestinationAliases, P_H323ALIASLIST pExtraAliases, LPCWSTR pCalledPartyNumber, P_APP_CALL_SETUP_DATA pAppData)); STDMETHOD_(VOID, Disconnect(DWORD dwReason)); STDMETHOD( ListenOn(PORT Port)); STDMETHOD( StopListen(VOID)); STDMETHOD( AsyncAcceptRejectCall(CREQ_RESPONSETYPE Response)); // accept from the listening connection. The ideal is that the accepting
// object would QueryInterface for a private interface, then grab all the
// pertinent connection info through that interface. Temporarily expose this
// using the IControlChannel interface. The call control state will vary greatly
// between implementations. For some implementations, this may perform
// a socket accept before user information has been exchanged. User information will
// be read into the accepting object directly. For other implementations, the
// socket accept is decoupled and has already been performed, and user information
// has already been read into the listening object. In that case, this method
// copies the user info and advises the parent "Conference" object of the
// incoming call
STDMETHOD( AcceptConnection(LPIControlChannel pIListenCtrlChan, LPVOID lpvListenCallbackParams)); STDMETHOD_(BOOL, IsAcceptingConference(LPVOID lpvConfID)); STDMETHOD( GetProtocolID(LPGUID lpPID)); STDMETHOD_(IH323Endpoint *, GetIConnIF()); STDMETHOD( MiscChannelCommand(ICtrlCommChan *pChannel,VOID * pCmd)); STDMETHOD( MiscChannelIndication(ICtrlCommChan *pChannel,VOID * pCmd)); STDMETHOD( OpenChannel(ICtrlCommChan * pCommChannel, IH323PubCap *pCapResolver, MEDIA_FORMAT_ID dwIDLocalSend, MEDIA_FORMAT_ID dwIDRemoteRecv)); STDMETHOD (CloseChannel(ICtrlCommChan* pCommChannel)); STDMETHOD (AddChannel(ICtrlCommChan * pCommChannel, LPIH323PubCap pCapabilityResolver)); STDMETHOD(GetVersionInfo( PCC_VENDORINFO *ppLocalVendorInfo, PCC_VENDORINFO *ppRemoteVendorInfo)); };
#endif //#ifndef _CTRLH323_H
|