/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS BDA Proxy * FILE: dll/directx/msdvbnp/ipv6.cpp * PURPOSE: IBDA_IPV6Filter interface * * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org) */ #include "precomp.h" class CIPV6Filter : public IBDA_IPV6Filter { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); //IBDA_IPV6Filter HRESULT STDMETHODCALLTYPE GetMulticastListSize(ULONG *pulcbAddresses); HRESULT STDMETHODCALLTYPE PutMulticastList(ULONG ulcbAddresses, BYTE * pAddressList); HRESULT STDMETHODCALLTYPE GetMulticastList(ULONG *pulcbAddresses, BYTE *pAddressList); HRESULT STDMETHODCALLTYPE PutMulticastMode(ULONG ulModeMask); HRESULT STDMETHODCALLTYPE GetMulticastMode(ULONG *pulModeMask); CIPV6Filter(IBDA_NetworkProvider * pNetworkProvider); virtual ~CIPV6Filter(); protected: IBDA_NetworkProvider * m_pNetworkProvider; ULONG m_ulcbAddresses; BYTE * m_pAddressList; ULONG m_ulModeMask; }; CIPV6Filter::CIPV6Filter( IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider), m_ulcbAddresses(0), m_pAddressList(0), m_ulModeMask(0) { } CIPV6Filter::~CIPV6Filter() { if (m_pAddressList) CoTaskMemFree(m_pAddressList); } HRESULT STDMETHODCALLTYPE CIPV6Filter::QueryInterface( REFIID InterfaceId, PVOID* Interface) { assert(m_pNetworkProvider); return m_pNetworkProvider->QueryInterface(InterfaceId, Interface); } ULONG STDMETHODCALLTYPE CIPV6Filter::AddRef() { assert(m_pNetworkProvider); return m_pNetworkProvider->AddRef(); } ULONG STDMETHODCALLTYPE CIPV6Filter::Release() { assert(m_pNetworkProvider); return m_pNetworkProvider->Release(); } //------------------------------------------------------------------- //IBDA_IPV6Filter // HRESULT STDMETHODCALLTYPE CIPV6Filter::GetMulticastListSize( ULONG *pulcbAddresses) { if (!pulcbAddresses) return E_POINTER; *pulcbAddresses = 0; return NOERROR; } HRESULT STDMETHODCALLTYPE CIPV6Filter::GetMulticastList( ULONG *pulcbAddresses, BYTE *pAddressList) { if (!pulcbAddresses || !pAddressList) return E_POINTER; if (*pulcbAddresses < m_ulcbAddresses) return E_OUTOFMEMORY; CopyMemory(pAddressList, m_pAddressList, m_ulcbAddresses); *pulcbAddresses = m_ulcbAddresses; return NOERROR; } HRESULT STDMETHODCALLTYPE CIPV6Filter::PutMulticastList( ULONG ulcbAddresses, BYTE * pAddressList) { if (!ulcbAddresses || !pAddressList) return E_POINTER; if (m_pAddressList) CoTaskMemFree(m_pAddressList); m_pAddressList = (BYTE*)CoTaskMemAlloc(ulcbAddresses); if (!m_pAddressList) return E_OUTOFMEMORY; CopyMemory(m_pAddressList, pAddressList, ulcbAddresses); m_ulcbAddresses = ulcbAddresses; return NOERROR; } HRESULT STDMETHODCALLTYPE CIPV6Filter::PutMulticastMode( ULONG ulModeMask) { m_ulModeMask = ulModeMask; return NOERROR; } HRESULT STDMETHODCALLTYPE CIPV6Filter::GetMulticastMode( ULONG *pulModeMask) { *pulModeMask = m_ulModeMask; return NOERROR; } HRESULT WINAPI CIPV6Filter_fnConstructor( IBDA_NetworkProvider * pNetworkProvider, REFIID riid, LPVOID * ppv) { CIPV6Filter * filter = new CIPV6Filter(pNetworkProvider); if (!filter) return E_OUTOFMEMORY; if (FAILED(filter->QueryInterface(riid, ppv))) { /* not supported */ delete filter; return E_NOINTERFACE; } return NOERROR; }