windows-nt/Source/XPSP1/NT/enduser/netmeeting/t120/mst120/ernccm.hpp
2020-09-26 16:20:57 +08:00

231 lines
9.3 KiB
C++

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