406 lines
9.2 KiB
C++
406 lines
9.2 KiB
C++
|
#include "precomp.h"
|
||
|
|
||
|
// NetMeeting SDK stuff
|
||
|
#include "NmEnum.h"
|
||
|
#include "SDKInternal.h"
|
||
|
#include "NmConference.h"
|
||
|
#include "NmChannel.h"
|
||
|
#include "NmChannelData.h"
|
||
|
|
||
|
|
||
|
CNmChannelDataObj::CNmChannelDataObj()
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::CNmChannelDataObj);
|
||
|
|
||
|
DBGEXIT(CNmChannelDataObj::CNmChannelDataObj);
|
||
|
}
|
||
|
|
||
|
CNmChannelDataObj::~CNmChannelDataObj()
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::~CNmChannelDataObj);
|
||
|
|
||
|
m_spInternalINmChannelData = NULL;
|
||
|
|
||
|
DBGEXIT(CNmChannelDataObj::~CNmChannelDataObj);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CNmChannelDataObj::FinalConstruct()
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::FinalConstruct);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if(m_spInternalINmChannelData)
|
||
|
{
|
||
|
if(SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = AtlAdvise(m_spInternalINmChannelData, GetUnknown(), IID_INmChannelDataNotify2, &m_dwInternalAdviseCookie);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::FinalConstruct,hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
ULONG CNmChannelDataObj::InternalRelease()
|
||
|
{
|
||
|
ATLASSERT(m_dwRef > 0);
|
||
|
|
||
|
--m_dwRef;
|
||
|
|
||
|
if((1 == m_dwRef) && m_dwInternalAdviseCookie)
|
||
|
{
|
||
|
++m_dwRef;
|
||
|
DWORD dwAdvise = m_dwInternalAdviseCookie;
|
||
|
m_dwInternalAdviseCookie = 0;
|
||
|
AtlUnadvise(m_spInternalINmChannelData, IID_INmChannelDataNotify2, dwAdvise);
|
||
|
--m_dwRef;
|
||
|
}
|
||
|
|
||
|
return m_dwRef;
|
||
|
|
||
|
}
|
||
|
//
|
||
|
HRESULT CNmChannelDataObj::CreateInstance(CNmConferenceObj* pConfObj, INmChannel* pInternalINmChannel, INmChannel** ppChannel)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::CreateInstance);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
typedef CNmChannel<CNmChannelDataObj, &IID_INmChannelData, NMCH_DATA> channel_type;
|
||
|
|
||
|
channel_type* p = NULL;
|
||
|
p = new CComObject<channel_type>(NULL);
|
||
|
|
||
|
if (p != NULL)
|
||
|
{
|
||
|
if(ppChannel)
|
||
|
{
|
||
|
p->SetVoid(NULL);
|
||
|
|
||
|
hr = p->QueryInterface(IID_INmChannel, reinterpret_cast<void**>(ppChannel));
|
||
|
|
||
|
if(SUCCEEDED(hr))
|
||
|
{
|
||
|
p->m_spInternalINmChannelData = com_cast<INmChannelData>(pInternalINmChannel);
|
||
|
if(p->m_spInternalINmChannelData)
|
||
|
{
|
||
|
|
||
|
// We don't have to RefCount this because our lifetime is
|
||
|
// contained in the CConf's lifetime
|
||
|
p->m_pConfObj = pConfObj;
|
||
|
|
||
|
// We do this so that we don't accidentally Release out of memory
|
||
|
++p->m_dwRef;
|
||
|
hr = p->FinalConstruct();
|
||
|
--p->m_dwRef;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_FAIL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(FAILED(hr))
|
||
|
{
|
||
|
delete p;
|
||
|
*ppChannel = NULL;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_POINTER;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::CreateInstance,hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
// INmChannelData methods
|
||
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
STDMETHODIMP CNmChannelDataObj::GetGuid(GUID *pguid)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::GetGuid);
|
||
|
HRESULT hr = E_UNEXPECTED;
|
||
|
|
||
|
if(m_spInternalINmChannelData)
|
||
|
{
|
||
|
hr = m_spInternalINmChannelData->GetGuid(pguid);
|
||
|
}
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::GetGuid,hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CNmChannelDataObj::SendData(INmMember *pMember, ULONG uSize, byte *pvBuffer, ULONG uOptions)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::SendData);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if(m_spInternalINmChannelData)
|
||
|
{
|
||
|
CComPtr<INmMember> spInternalMember;
|
||
|
|
||
|
if(pMember)
|
||
|
{
|
||
|
CComPtr<IInternalMemberObj> spMemberObj = com_cast<IInternalMemberObj>(pMember);
|
||
|
if(spMemberObj)
|
||
|
{
|
||
|
hr = spMemberObj->GetInternalINmMember(&spInternalMember);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = m_spInternalINmChannelData->SendData(spInternalMember, uSize, pvBuffer, uOptions);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::SendData,hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
// INmChannelData2 methods
|
||
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
STDMETHODIMP CNmChannelDataObj::RegistryAllocateHandle(ULONG numberOfHandlesRequested)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::RegistryAllocateHandle);
|
||
|
HRESULT hr = E_UNEXPECTED;
|
||
|
|
||
|
if(m_spInternalINmChannelData)
|
||
|
{
|
||
|
CComPtr<INmChannelData2> spChannel = com_cast<INmChannelData2>(m_spInternalINmChannelData);
|
||
|
if(spChannel)
|
||
|
{
|
||
|
hr = spChannel->RegistryAllocateHandle(numberOfHandlesRequested);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::RegistryAllocateHandle,hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
//INmChannelDataNotify2
|
||
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
STDMETHODIMP CNmChannelDataObj::DataSent(INmMember *pMember, ULONG uSize,byte *pvBuffer)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::DataSent);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
ASSERT(GetConfObj());
|
||
|
INmMember* pSDKMember = GetConfObj()->GetSDKMemberFromInternalMember(pMember);
|
||
|
|
||
|
hr = Fire_DataSent(pSDKMember, uSize, pvBuffer);
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::DataSent,hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CNmChannelDataObj::DataReceived(INmMember *pInternalMember, ULONG uSize,byte *pvBuffer, ULONG dwFlags)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::DataReceived);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
ASSERT(GetConfObj());
|
||
|
CComPtr<INmMember> spSDKMember = GetConfObj()->GetSDKMemberFromInternalMember(pInternalMember);
|
||
|
|
||
|
hr = Fire_DataReceived(spSDKMember, uSize, pvBuffer, dwFlags);
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::DataReceived,hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CNmChannelDataObj::AllocateHandleConfirm(ULONG handle_value, ULONG chandles)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::AllocateHandleConfirm);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::AllocateHandleConfirm,hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// IInternalChannelObj methods
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
STDMETHODIMP CNmChannelDataObj::GetInternalINmChannel(INmChannel** ppChannel)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::GetInternalINmChannel);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if(ppChannel)
|
||
|
{
|
||
|
hr = m_spInternalINmChannelData->QueryInterface(IID_INmChannel, reinterpret_cast<void**>(ppChannel));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_POINTER;
|
||
|
}
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::GetInternalINmChannel,hr);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CNmChannelDataObj::ChannelRemoved()
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
RemoveMembers();
|
||
|
|
||
|
CNmConferenceObj* pConfObj = GetConfObj();
|
||
|
if(pConfObj)
|
||
|
{
|
||
|
hr = pConfObj->Fire_ChannelChanged(NM_CHANNEL_REMOVED, com_cast<INmChannel>(GetUnknown()));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ERROR_OUT(("ChannelRemoved, but no ConfObject"));
|
||
|
hr = E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
if(m_dwInternalAdviseCookie)
|
||
|
{
|
||
|
ASSERT(m_spInternalINmChannelData);
|
||
|
AtlUnadvise(m_spInternalINmChannelData, IID_INmChannelDataNotify, m_dwInternalAdviseCookie);
|
||
|
m_dwInternalAdviseCookie = 0;
|
||
|
}
|
||
|
|
||
|
m_spInternalINmChannelData = NULL;
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// Helpers
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
HRESULT CNmChannelDataObj::Fire_MemberChanged(NM_MEMBER_NOTIFY uNotify, INmMember *pMember)
|
||
|
{
|
||
|
DBGENTRY(CNmChannelDataObj::Fire_MemberChanged);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////
|
||
|
// INmChannelNotify
|
||
|
/////////////////////////////////////////////////////
|
||
|
IConnectionPointImpl<CNmChannelDataObj, &IID_INmChannelNotify, CComDynamicUnkArray>* pCP = this;
|
||
|
for(int i = 0; i < pCP->m_vec.GetSize(); ++i )
|
||
|
{
|
||
|
INmChannelNotify* pNotify = reinterpret_cast<INmChannelNotify*>(pCP->m_vec.GetAt(i));
|
||
|
|
||
|
if(pNotify)
|
||
|
{
|
||
|
pNotify->MemberChanged(uNotify, pMember);
|
||
|
}
|
||
|
}
|
||
|
/////////////////////////////////////////////////////
|
||
|
// INmChannelDataNotify
|
||
|
/////////////////////////////////////////////////////
|
||
|
|
||
|
IConnectionPointImpl<CNmChannelDataObj, &IID_INmChannelDataNotify, CComDynamicUnkArray>* pCP2 = this;
|
||
|
for(i = 0; i < pCP2->m_vec.GetSize(); ++i )
|
||
|
{
|
||
|
INmChannelDataNotify* pNotify2 = reinterpret_cast<INmChannelDataNotify*>(pCP2->m_vec.GetAt(i));
|
||
|
|
||
|
if(pNotify2)
|
||
|
{
|
||
|
pNotify2->MemberChanged(uNotify, pMember);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DBGEXIT_HR(CNmChannelDataObj::Fire_MemberChanged,hr)
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CNmChannelDataObj::Fire_DataSent(INmMember *pSDKMember, ULONG uSize,byte *pvBuffer)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
/////////////////////////////////////////////////////
|
||
|
// INmChannelDataNotify
|
||
|
/////////////////////////////////////////////////////
|
||
|
|
||
|
IConnectionPointImpl<CNmChannelDataObj, &IID_INmChannelDataNotify, CComDynamicUnkArray>* pCP2 = this;
|
||
|
for(int i = 0; i < pCP2->m_vec.GetSize(); ++i )
|
||
|
{
|
||
|
INmChannelDataNotify* pNotify2 = reinterpret_cast<INmChannelDataNotify*>(pCP2->m_vec.GetAt(i));
|
||
|
|
||
|
if(pNotify2)
|
||
|
{
|
||
|
pNotify2->DataSent(pSDKMember, uSize, pvBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CNmChannelDataObj::Fire_DataReceived(INmMember *pSDKMember, ULONG uSize, byte *pvBuffer, ULONG dwFlags)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
/////////////////////////////////////////////////////
|
||
|
// INmChannelDataNotify
|
||
|
/////////////////////////////////////////////////////
|
||
|
|
||
|
IConnectionPointImpl<CNmChannelDataObj, &IID_INmChannelDataNotify, CComDynamicUnkArray>* pCP2 = this;
|
||
|
for(int i = 0; i < pCP2->m_vec.GetSize(); ++i )
|
||
|
{
|
||
|
INmChannelDataNotify* pNotify2 = reinterpret_cast<INmChannelDataNotify*>(pCP2->m_vec.GetAt(i));
|
||
|
|
||
|
if(pNotify2)
|
||
|
{
|
||
|
pNotify2->DataReceived(pSDKMember, uSize, pvBuffer, dwFlags);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CNmChannelDataObj::_IsActive()
|
||
|
{
|
||
|
|
||
|
HRESULT hr = E_FAIL;
|
||
|
|
||
|
if(m_spInternalINmChannelData)
|
||
|
{
|
||
|
hr = m_spInternalINmChannelData->IsActive();
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CNmChannelDataObj::_SetActive(BOOL bActive)
|
||
|
{
|
||
|
if (GetbActive() == bActive)
|
||
|
return S_FALSE;
|
||
|
|
||
|
return E_FAIL;
|
||
|
}
|