231 lines
9.3 KiB
C++
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_ */
|
|
|