249 lines
9.2 KiB
C
249 lines
9.2 KiB
C
|
/*
|
||
|
* 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
|