Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

405 lines
9.2 KiB

#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;
}