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.
 
 
 
 
 
 

248 lines
9.2 KiB

/*
* 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