windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/confman.cpp
2020-09-26 16:20:57 +08:00

190 lines
3.5 KiB
C++

// File: confman.cpp
//
// Conference Manager
#include "precomp.h"
#include "conf.h"
#include "confroom.h"
#include "confman.h"
#include "cr.h" // for CreateConfRoom
#include "call.h" // for OnUICallCreated
CConfMan * CConfMan::m_pConfMan = NULL; // There is only one of these
static const UINT g_cuShutdownMsgTimeout = 0x7FFFFFFF; // milliseconds
/* C C O N F M A N */
/*-------------------------------------------------------------------------
%%Function: CConfMan
-------------------------------------------------------------------------*/
CConfMan::CConfMan(INmManager2 *pManager) :
RefCount(NULL),
m_pManager(pManager)
{
m_pConfMan = this;
ASSERT(NULL != m_pManager);
NmAdvise(m_pManager, (INmManagerNotify*)this, IID_INmManagerNotify, &m_dwCookie);
m_pManager->AddRef();
DbgMsg(iZONE_OBJECTS, "Obj: %08X created CConfMan", this);
}
CConfMan::~CConfMan()
{
ASSERT(NULL == m_pManager);
m_pConfMan = NULL;
DbgMsg(iZONE_OBJECTS, "Obj: %08X destroyed CConfMan", this);
}
BOOL CConfMan::FCreate(INmManager2 *pManager)
{
if (NULL != m_pConfMan)
return FALSE; // already created
m_pConfMan = new CConfMan(pManager);
if (NULL == m_pConfMan)
return FALSE;
return TRUE;
}
VOID CConfMan::Destroy(void)
{
if (NULL == m_pConfMan)
return;
m_pConfMan->CleanUp();
// we should only have one more lock on this object
m_pConfMan->Release();
// so this will be cleared in the destructor
ASSERT(NULL == m_pConfMan);
}
VOID CConfMan::CleanUp(void)
{
if (NULL != m_pManager)
{
NmUnadvise(m_pManager, IID_INmManagerNotify, m_dwCookie);
CConfRoom* pcr = ::GetConfRoom();
if (NULL != pcr)
{
pcr->CleanUp();
}
m_pManager->Release();
m_pManager = NULL;
}
}
/* G E T N M M A N A G E R */
/*-------------------------------------------------------------------------
%%Function: GetNmManager
-------------------------------------------------------------------------*/
INmManager2 * CConfMan::GetNmManager()
{
if (NULL == m_pConfMan)
return NULL;
INmManager2 * pManager = m_pConfMan->GetINmManager();
if (NULL != pManager)
{
pManager->AddRef();
}
return pManager;
}
//////////////////////////////////////////////////////////////////////////
// IUnknown
STDMETHODIMP_(ULONG) CConfMan::AddRef(void)
{
return RefCount::AddRef();
}
STDMETHODIMP_(ULONG) CConfMan::Release(void)
{
return RefCount::Release();
}
STDMETHODIMP CConfMan::QueryInterface(REFIID riid, PVOID *ppv)
{
HRESULT hr = S_OK;
if ((riid == IID_INmManagerNotify) || (riid == IID_IUnknown))
{
*ppv = (INmManagerNotify *)this;
ApiDebugMsg(("CConfMan::QueryInterface()"));
}
else
{
hr = E_NOINTERFACE;
*ppv = NULL;
ApiDebugMsg(("CConfMan::QueryInterface(): Called on unknown interface."));
}
if (S_OK == hr)
{
AddRef();
}
return hr;
}
//////////////////////////////////////////////////////////////////////////
// INmManagerNotify
STDMETHODIMP CConfMan::NmUI(CONFN uNotify)
{
return S_OK;
}
STDMETHODIMP CConfMan::ConferenceCreated(INmConference *pConference)
{
CConfRoom * m_pConfRoom = ::GetConfRoom();
ASSERT(NULL != m_pConfRoom);
if(_Module.IsUIActive())
{
m_pConfRoom->BringToFront();
}
return m_pConfRoom->OnConferenceCreated(pConference);
}
STDMETHODIMP CConfMan::CallCreated(INmCall *pCall)
{
OnUICallCreated(pCall);
return S_OK;
}
VOID CConfMan::AllowAV(BOOL fAllowAV)
{
CConfMan * pConfMan = CConfMan::GetInstance();
if (NULL == pConfMan)
return;
INmManager2 * pManager = pConfMan->GetINmManager();
if (NULL == pManager)
return;
pManager->AllowH323(fAllowAV);
}