/****************************************************************************/ /* */ /* ERNCCM.HPP */ /* */ /* Conference Manager class for the Reference System Node Controller. */ /* */ /* Copyright Data Connection Ltd. 1995 */ /* */ /****************************************************************************/ /* Changes: */ /* */ /* 16Jun95 NFC Created. */ /* */ /****************************************************************************/ #ifndef __ERNCCM_HPP_ #define __ERNCCM_HPP_ #include "events.hpp" #include "erncconf.hpp" #include "inodecnt.h" #include "csap.h" class DCRNCConference; class CLogicalConnection; extern INodeControllerEvents *g_pCallbackInterface; extern BOOL g_bRDS; /****************************************************************************/ /* Values for CM state. */ /****************************************************************************/ typedef enum { CM_ST_UNINITIALIZED, CM_ST_CPI_INITIALIZED, CM_ST_GCC_INITIALIZED, CM_ST_STARTING_CMP, CM_ST_CMP_STARTED, } NC_CONF_MGR_STATE; class CNCConfList : public CList { DEFINE_CLIST(CNCConfList, DCRNCConference*) }; class DCRNCConferenceManager : public INodeController, public CRefCount { friend class DCRNCConference; friend class CInviteIndWork; public: // // INodeController Methods: // STDMETHODIMP_(void) ReleaseInterface(void); STDMETHODIMP CheckVersion( PT120PRODUCTVERSION pRemoteVersion); STDMETHODIMP QueryRemote( LPVOID pCallerContext, LPCSTR pcszAddress, BOOL fSecure, BOOL fIsConferenceActive); STDMETHOD(CancelQueryRemote)( LPVOID pCallerContext); STDMETHODIMP CreateConference( LPCWSTR pcwszConferenceName, LPCWSTR pcwszPassword, PBYTE pbHashedPassword, DWORD cbHashedPassword, BOOL fSecure, PCONF_HANDLE phConference); STDMETHODIMP JoinConference( LPCWSTR pcwszConferenceName, LPCWSTR pcwszPassword, LPCSTR pcszAddress, BOOL fSecure, PUSERDATAINFO pUserDataInfoEntries, UINT cUserDataEntries, PCONF_HANDLE phConference); STDMETHODIMP GetUserData( ROSTER_DATA_HANDLE hUserData, const GUID* pcGUID, PUINT pcbData, LPVOID* ppvData); STDMETHODIMP_(UINT) GetPluggableConnID (LPCSTR pcszNodeAddress); public: DCRNCConferenceManager(INodeControllerEvents *pCallback, HRESULT * pStatus); virtual ~DCRNCConferenceManager(void); void WndMsgHandler(UINT uMsg, LPARAM lParam); void PostWndMsg(UINT uMsg, LPARAM lParam) { ::PostMessage(g_pControlSap->GetHwnd(), uMsg, (WPARAM) this, lParam); } void NotifyConferenceComplete(PCONFERENCE pConference, BOOL bIncoming, HRESULT result); PCONFERENCE GetConferenceFromName(LPCWSTR pcwszConfName); PCONFERENCE GetConferenceFromNumber(GCCNumericString NumericName); CLogicalConnection * GetConEntryFromConnectionHandle(ConnectionHandle hInviteIndConn); static void CALLBACK GCCCallBackHandler (GCCMessage * gcc_message); void AddInviteIndWorkItem(CInviteIndWork * pWorkItem) { m_InviteIndWorkList.AddWorkItem(pWorkItem); } void RemoveInviteIndWorkItem(CInviteIndWork * pWorkItem) { m_InviteIndWorkList.RemoveWorkItem(pWorkItem); } void RemoveJoinIndWorkItem(CJoinIndWork * pWorkItem) { m_JoinIndWorkList.RemoveWorkItem(pWorkItem); } CJoinIndWork *PeekFirstJoinIndWorkItem(void) { return m_JoinIndWorkList.PeekHead(); } BOOL FindSocketNumber(GCCNodeID nid, SOCKET * socket_number); /************************************************************************/ /* RemoveConference() - remove the conference from the conference list. */ /************************************************************************/ void RemoveConference(PCONFERENCE pConf, BOOL fDontCheckList = FALSE, BOOL fReleaseNow = FALSE); ULONG GetNodeName(GCCConfID, GCCNodeID, LPSTR, ULONG); ULONG GetUserGUIDData(GCCConfID, GCCNodeID, GUID*, LPBYTE, ULONG); protected: void GCCCreateResponse( HRESULT rc, GCCConferenceID conference_id, GCCConferenceName * pGCCName); HRESULT CreateNewConference(PCWSTR wszconferenceName, GCCConferenceID conferenceID, PCONFERENCE * ppConference, BOOL fFindExistingConf, BOOL fSecure); PCONFERENCE GetConferenceFromID(GCCConferenceID conferenceID); void HandleGCCCallback(GCCMessage * pGCCMessage); void BroadcastGCCCallback(GCCMessage FAR * pGCCMessage); void HandleJoinConfirm(JoinConfirmMessage * pJoinConfirm); #ifdef ENABLE_START_REMOTE void HandleCreateIndication(CreateIndicationMessage * pCreateMessage); #else void HandleCreateIndication(CreateIndicationMessage *pMsg) { GCCCreateResponse(UI_RC_USER_REJECTED, pMsg->conference_id, &pMsg->conference_name); } #endif // ENABLE_START_REMOTE void HandleInviteIndication(InviteIndicationMessage * pInviteMessage); void HandleJoinInd(JoinIndicationMessage * pJoinInd); /************************************************************************/ /* MapConftoCMRC - map a CONFERENCE return code to a CM return code. */ /************************************************************************/ HRESULT MapConftoCMRC(HRESULT confrc); void UpdateNodeIdNameListAndUserData(GCCMessage * pGCCMessage); private: /************************************************************************/ /* State of the conference manager. */ /************************************************************************/ NC_CONF_MGR_STATE m_eState; /************************************************************************/ /* Sequential lists of work to give to UI/receive answers from */ /************************************************************************/ CInviteIndWorkList m_InviteIndWorkList; CJoinIndWorkList m_JoinIndWorkList; /************************************************************************/ /* The list of active conferences. */ /************************************************************************/ CNCConfList m_ConfList; }; extern DCRNCConferenceManager *g_pNCConfMgr; /****************************************************************************/ /* */ /* CONSTANTS */ /* */ /****************************************************************************/ /****************************************************************************/ /* Return codes */ /****************************************************************************/ #define CM_RC_UNKNOWN_CONFERENCE 1 #define CM_RC_INTERNAL_ERROR 2 #define CM_RC_NOT_SUPPORTED_IN_BACKLEVEL 3 /****************************************************************************/ /* Constants for SetAutoAcceptMode(). */ /****************************************************************************/ #define CM_AUTO_JOIN 0 #define CM_DONT_AUTO_JOIN 1 // Get a name in Unicode from either an ANSII numeric name or // a Unicode text name, and allocate memory for result. HRESULT GetUnicodeFromGCC(PCSTR szGCCNumeric, PCWSTR wszGCCUnicode, PWSTR * pwszText); // Do the reverse of GetUnicodeFromGCC, and reuse the Unicode text name, // (i.e. do not allocate), and only allocate a ANSI numeric name if needed. HRESULT GetGCCFromUnicode(PCWSTR wszText, GCCNumericString * pGCCNumeric, LPWSTR * pGCCUnicode); HRESULT GCCJoinResponseWrapper(GCCResponseTag join_response_tag, GCCChallengeRequestResponse * password_challenge, GCCResult result, GCCConferenceID conferenceID, UINT nUserData = 0, GCCUserData ** ppUserData = NULL); GCCConferenceID GetConfIDFromMessage(GCCMessage *pGCCMessage); #endif /* __ERNCCM_HPP_ */