⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conf.cpp

📁 通信增值服务,上网接听电话
💻 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 "stdafx.h"
#include "precomp.h"
#include "tapiutils.h"
#include "netprodlg.h"
#include "AcceptDlg.h"

//#define NM_SYSPROP_BUILD_VER 200

//****************************************************************************
//
// 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;
	m_sRemoteUsername=_T("");
	strStartTime = _T("");
	pNetproDlg =(CNetproDlg*)CNetproDlg::FromHandle(m_hWnd);

	m_bIsNM30 = TRUE;
}

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;
	
	CComPtr<INmSysInfo> spSysInfo;

	hr=m_pINmMgr->GetSysInfo(&spSysInfo);
	
	if (SUCCEEDED(hr))
	{
		BSTR bstrEmail;
		//char str[128];
		//DWORD cSize;
		//cSize = 128;
		hr = spSysInfo->GetProperty(NM_SYSPROP_EMAIL_NAME,&bstrEmail);
		if (SUCCEEDED(hr))
		{
			BTSTR m_sEmail(bstrEmail);
			if(strcmp((LPTSTR)m_sEmail,"")==0)
			{
				//ADD user info
				BSTRING email("ffit@com"),firstname("ffit"),lastname("com"),username("ffcs");
				/*
				if(GetUserName(str,&cSize)){
					strcpy((char *)firstname.GetLPBSTR(),str);
					strcpy((char *)username.GetLPBSTR(),str);
					strcat(str,"@com");
					strcpy((char *)email.GetLPBSTR(),str);
					GetComputerName(str,&cSize);
					strcpy((char *)lastname.GetLPBSTR(),str);
				}
				*/
				hr=spSysInfo->SetProperty(NM_SYSPROP_EMAIL_NAME,BSTR(email));
				hr=spSysInfo->SetProperty(NM_SYSPROP_FIRST_NAME,BSTR(firstname));
				hr=spSysInfo->SetProperty(NM_SYSPROP_LAST_NAME,BSTR(lastname));
				hr=spSysInfo->SetProperty(NM_SYSPROP_USER_NAME,BSTR(username));
				if(FAILED(hr)){
					TRACE0("E_FAIL\n");
					//return E_FAIL;
				}
			}

		}
		::SysFreeString(bstrEmail);
	
		BSTR bstrVer;
		hr = spSysInfo->GetProperty(NM_SYSPROP_BUILD_VER, &bstrVer);
		if (hr != S_OK)
		{
				m_bIsNM30 = FALSE;
				TRACE0("E_FAIL\n");
				//return E_FAIL;
		}else{
			::SysFreeString(bstrVer);
		}


	}
	
	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_bIsNM30)
		AddToCallLogList(m_sRemoteUsername, TRUE);

	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)
{
	if (m_pINmCall)
	{
		//sleep(200);
		//m_pCallNotify->RejectCall();
		m_pCallNotify->Disconnect();
		m_pINmCall->Release();
		m_pINmCall=NULL;
		AddToCallLogList(m_sRemoteUsername, FALSE);

	}
	
	
	m_pINmCall = pCall;
	m_pINmCall->AddRef();
	m_pCallNotify->Connect(pCall);
	m_bInConnection=TRUE;

	
	m_pINmCall->GetName(&PhoneName);
	sprintf(strName,"%ls",PhoneName);
	m_sRemoteUsername = strName;

	if (m_hWnd)
		SendMessage(m_hWnd,WM_CONNECTING,0,0);
	return S_OK;
}

//****************************************************************************
//
// HRESULT Conf::AcceptCall()
//
// Accept the incoming call
//
//****************************************************************************

HRESULT Conf::AcceptCall()
{
	CTime time = CTime::GetCurrentTime();
	strStartTime = time.Format("%H:%M:%S %m/%d/%Y");

	return m_pINmCall->Accept();
}

//****************************************************************************
//
// HRESULT Conf::RejectCall()
//
// Reject the incoming call
//
//****************************************************************************

HRESULT Conf::RejectCall()  
{
	AddToCallLogList(m_sRemoteUsername, FALSE);

	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;
	
	
/*	m_pINmCall->GetName(&PhoneName);
	sprintf(strName,"%ls",PhoneName);
	m_sRemoteUsername = strName; */
	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;
	
	if (m_hWnd)
		SendMessage(m_hWnd,WM_CONNECTED,0,0);
	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;

	AddToCallLogList(m_sRemoteUsername, TRUE);

	if (m_hWnd)
		SendMessage(m_hWnd,WM_DISCONNECTED,0,0);
	
	return S_OK;
}

//****************************************************************************
//
// BOOL Conf::InConference()
//
//****************************************************************************

BOOL Conf::InConnection()
{	
	return m_bInConnection;
}


BOOL Conf::AddToCallLogList(CString phonenum, BOOL bNormal)
{
	CTime time = CTime::GetCurrentTime();
	CString strTime = time.Format("%H:%M:%S %m/%d/%Y");
	CString strShortTime = time.Format("%H:%M:%S");
	//Fill in CallLog List
	CALLLOGNODE* pNode = new CallLogNode;
	pNode->m_sCallNum = phonenum;
	pNode->m_sCallTime = (bNormal?strStartTime:strTime);
	pNode->m_sCallEndTime = strShortTime;
	pNode->m_sState = (bNormal?"1":"0");
	if(pNetproDlg->m_pCallLogList.GetCount()>100)
	{
		CALLLOGNODE* pNode2 = (CALLLOGNODE*)pNetproDlg->m_pCallLogList.RemoveHead();
		delete pNode2;
	}
	pNetproDlg->m_pCallLogList.AddTail(pNode);
	return TRUE;
}

HRESULT Conf::CallCanceled()
{
	// 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;
	}

	m_bInConnection=FALSE;

	if (m_hWnd)
		SendMessage(m_hWnd,WM_DISCONNECTED,0,0);

	return S_OK;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -