CONF.CPP
//**************************************************************************** 
//  Module:     AVPHONE.EXE      
//  File:       CONF.CPP 
//  Content:     
//               
// 
//  Copyright (c) Microsoft Corporation 1995-1997 
// 
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF  
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO  
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A  
// PARTICULAR PURPOSE. 
//**************************************************************************** 
 
#include "precomp.h" 
 
 
//**************************************************************************** 
// 
// CLASS Conf 
// 
//**************************************************************************** 
 
//**************************************************************************** 
// 
// Construction/Destruction 
// 
//**************************************************************************** 
 
Conf::Conf(HWND hWnd) 
{ 
// Create Sink Objects. 
// During construction, AddRef occurs 
m_pMgrNotify = new CMgrNotify(this);   
m_pCallNotify = new CCallNotify(this); 
m_pConfNotify = new CConfNotify(this); 
 
// Initialize other member variables 
m_pINmMgr=NULL; 
m_pINmConf=NULL; 
m_pINmCall=NULL; 
m_bInConnection=FALSE; 
m_hWnd=hWnd; 
} 
 
Conf::~Conf() 
{ 
//clean up the notification sink objects 
m_pMgrNotify->Release();   
m_pCallNotify->Release(); 
m_pConfNotify->Release(); 
} 
 
 
//**************************************************************************** 
// 
// HRESULT Conf::Initialize() 
// 
// Initiate NetMeeting, obtain a pointer to INmManager, connect the MgrNotify  
// sink object and initialize INmManager. 
// 
//**************************************************************************** 
 
HRESULT Conf::Initialize() 
{ 
HRESULT hr=S_OK; 
 
if (FAILED(CoCreateInstance(CLSID_NmManager,NULL,CLSCTX_INPROC_SERVER,IID_INmManager,(VOID **)&m_pINmMgr))) 
return E_FAIL; 
 
ULONG uOptions = NM_INIT_CONTROL; // Don't display the NetMeeting UI 
ULONG uCaps = NMCH_AUDIO|NMCH_VIDEO; 
 
hr =m_pMgrNotify->Connect(m_pINmMgr); 
if (SUCCEEDED (hr)) 
hr=m_pINmMgr->Initialize(&uOptions,&uCaps); 
 
return hr; 
} 
 
 
//**************************************************************************** 
// 
// HRESULT Conf::Uninitialize() 
// 
// Disconnect MgrNotify sink object and release the interface INmManager  
// 
//**************************************************************************** 
 
HRESULT Conf::Uninitialize() 
{ 
 
 
m_pMgrNotify->Disconnect(); 
if (m_pINmMgr) 
m_pINmMgr->Release(); 
 
return S_OK; 
} 
 
//**************************************************************************** 
// 
// HRESULT Conf::Call(LPSTR szMachineName) 
// 
// This function initiates an AV conference to the remote machine specified  
// by szMachineName. 
// 
//**************************************************************************** 
 
HRESULT Conf::Call(LPSTR szMachineName) 
{ 
HRESULT hr = S_OK; 
BSTRING bstrName(szMachineName); 
hr = m_pINmMgr->CreateCall(&m_pINmCall,NM_CALL_H323 ,NM_ADDR_MACHINENAME ,bstrName,NULL); 
 
if (FAILED(hr)) 
{ 
// Call object sometimes needs to be released. 
if (m_pINmCall) 
{ 
m_pCallNotify->Disconnect(); 
m_pINmCall->Release(); 
} 
} 
 
return hr; 
} 
 
 
//**************************************************************************** 
// 
// HRESULT Conf::HangUp() 
// 
// Leave the conference 
// 
//**************************************************************************** 
 
 
HRESULT Conf::HangUp() 
{ 
HRESULT hr=S_OK; 
 
// if call hungup before Call accepted or rejected, release INmCall and  
// disconnect CallNotify sink 
if (m_pINmCall) 
{ 
hr = m_pINmCall->Cancel(); 
m_pCallNotify->Disconnect(); 
m_pINmCall->Release(); 
m_pINmCall=NULL; 
} 
else 
if (m_pINmConf) 
hr = m_pINmConf->Leave(); 
 
 
// Release INmConf and disconnect the ConfNotify sink 
if (m_pINmConf) 
{ 
m_pINmConf->Release(); 
m_pINmConf=NULL; 
m_pConfNotify->Disconnect(); 
} 
 
m_bInConnection=FALSE; 
 
if (m_hWnd) 
SendMessage(m_hWnd,WM_DISCONNECTED,0,0); 
 
return hr; 
} 
 
//**************************************************************************** 
// 
// HRESULT Conf::CallCreated(INmCall * pCall) 
// 
// Callback from the MgrNotify sink object 
// 
//**************************************************************************** 
 
HRESULT Conf::CallCreated(INmCall * pCall) 
{ 
m_pINmCall = pCall; 
m_pINmCall->AddRef(); 
m_pCallNotify->Connect(pCall); 
m_bInConnection=TRUE; 
 
if (m_hWnd) 
SendMessage(m_hWnd,WM_CONNECTING,0,0); 
return S_OK; 
} 
 
//**************************************************************************** 
// 
// HRESULT Conf::AcceptCall() 
// 
// Accept the incoming call 
// 
//**************************************************************************** 
 
HRESULT Conf::AcceptCall() 
{ 
return m_pINmCall->Accept(); 
} 
 
//**************************************************************************** 
// 
// HRESULT Conf::RejectCall() 
// 
// Reject the incoming call 
// 
//**************************************************************************** 
 
HRESULT Conf::RejectCall()   
{ 
return m_pINmCall->Reject(); 
} 
 
//**************************************************************************** 
// 
// HRESULT Conf::ConferenceCreated(INmConference *pINmConf) 
// 
// Callback from the MgrNotify sink object that a new conference has been  
// created 
// 
//**************************************************************************** 
 
HRESULT Conf::ConferenceCreated(INmConference *pINmConf) 
{ 
//Add Conference notification sink to handle channels. 
m_pINmConf=pINmConf; 
m_pINmConf->AddRef(); 
m_pConfNotify->Connect(pINmConf); 
m_bInConnection=TRUE; 
 
if (m_hWnd) 
SendMessage(m_hWnd,WM_CONNECTED,0,0); 
return S_OK; 
} 
 
 
//**************************************************************************** 
// 
// HRESULT Conf::CallAccepted()   
// 
// Callback from the CallNotify sink object that the new call has been accepted 
// 
//**************************************************************************** 
 
HRESULT Conf::CallAccepted()   
{ 
// Release INmCall, and let send window message that a user has connected 
if (m_pINmCall) 
m_pINmCall->Release(); 
 
m_pINmCall=NULL; 
m_pCallNotify->Disconnect(); 
m_bInConnection=TRUE; 
 
return S_OK; 
} 
 
//**************************************************************************** 
// 
// HRESULT Conf::CallRejected()   
// 
// Callback from the CallNotify sink object that the new call has been rejected 
// 
//**************************************************************************** 
 
HRESULT Conf::CallRejected()  
{ 
// Release INmCall, INmConf, disconnect CallNotify and ConfNotify 
// sink objects, and send message to main window that the user has  
// disconnected. 
 
if (m_pINmCall) 
{ 
m_pCallNotify->Disconnect(); 
m_pINmCall->Release(); 
m_pINmCall=NULL; 
} 
 
if (m_pINmConf) 
{ 
m_pINmConf->Release(); 
m_pINmConf=NULL; 
} 
m_pConfNotify->Disconnect(); 
m_bInConnection=FALSE; 
 
if (m_hWnd) 
SendMessage(m_hWnd,WM_DISCONNECTED,0,0); 
 
return S_OK; 
} 
 
//**************************************************************************** 
// 
// HRESULT Conf::RemoteHungup() 
// 
// Callback from the ConfNotify sink object that a member has left the 
// conference 
// 
//**************************************************************************** 
 
HRESULT Conf::RemoteHungup() 
{ 
 
// Release INmConf, disconnect ConfNotify sink object, and send message to  
// main window that the remote node has disconnected. 
 
m_pINmConf->Release(); 
m_pINmConf=NULL; 
m_pConfNotify->Disconnect(); 
m_bInConnection=FALSE; 
 
if (m_hWnd) 
SendMessage(m_hWnd,WM_DISCONNECTED,0,0); 
 
return S_OK; 
} 
 
//**************************************************************************** 
// 
// BOOL Conf::InConference() 
// 
//**************************************************************************** 
 
BOOL Conf::InConnection() 
{ 
return m_bInConnection; 
}