Reactos
at master 167 lines 3.8 kB view raw
1/* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS BDA Proxy 4 * FILE: dll/directx/msdvbnp/ipv6.cpp 5 * PURPOSE: IBDA_IPV6Filter interface 6 * 7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org) 8 */ 9#include "precomp.h" 10 11class CIPV6Filter : public IBDA_IPV6Filter 12{ 13public: 14 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); 15 STDMETHODIMP_(ULONG) AddRef(); 16 STDMETHODIMP_(ULONG) Release(); 17 18 //IBDA_IPV6Filter 19 HRESULT STDMETHODCALLTYPE GetMulticastListSize(ULONG *pulcbAddresses); 20 HRESULT STDMETHODCALLTYPE PutMulticastList(ULONG ulcbAddresses, BYTE * pAddressList); 21 HRESULT STDMETHODCALLTYPE GetMulticastList(ULONG *pulcbAddresses, BYTE *pAddressList); 22 HRESULT STDMETHODCALLTYPE PutMulticastMode(ULONG ulModeMask); 23 HRESULT STDMETHODCALLTYPE GetMulticastMode(ULONG *pulModeMask); 24 25 CIPV6Filter(IBDA_NetworkProvider * pNetworkProvider); 26 virtual ~CIPV6Filter(); 27 28protected: 29 IBDA_NetworkProvider * m_pNetworkProvider; 30 ULONG m_ulcbAddresses; 31 BYTE * m_pAddressList; 32 ULONG m_ulModeMask; 33}; 34 35CIPV6Filter::CIPV6Filter( 36 IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider), 37 m_ulcbAddresses(0), 38 m_pAddressList(0), 39 m_ulModeMask(0) 40{ 41} 42 43CIPV6Filter::~CIPV6Filter() 44{ 45 if (m_pAddressList) 46 CoTaskMemFree(m_pAddressList); 47} 48 49HRESULT 50STDMETHODCALLTYPE 51CIPV6Filter::QueryInterface( 52 REFIID InterfaceId, 53 PVOID* Interface) 54{ 55 assert(m_pNetworkProvider); 56 return m_pNetworkProvider->QueryInterface(InterfaceId, Interface); 57} 58 59ULONG 60STDMETHODCALLTYPE 61CIPV6Filter::AddRef() 62{ 63 assert(m_pNetworkProvider); 64 return m_pNetworkProvider->AddRef(); 65} 66 67ULONG 68STDMETHODCALLTYPE 69CIPV6Filter::Release() 70{ 71 assert(m_pNetworkProvider); 72 return m_pNetworkProvider->Release(); 73} 74 75//------------------------------------------------------------------- 76//IBDA_IPV6Filter 77// 78 79HRESULT 80STDMETHODCALLTYPE 81CIPV6Filter::GetMulticastListSize( 82 ULONG *pulcbAddresses) 83{ 84 if (!pulcbAddresses) 85 return E_POINTER; 86 87 *pulcbAddresses = 0; 88 return NOERROR; 89} 90 91HRESULT 92STDMETHODCALLTYPE 93CIPV6Filter::GetMulticastList( 94 ULONG *pulcbAddresses, 95 BYTE *pAddressList) 96{ 97 if (!pulcbAddresses || !pAddressList) 98 return E_POINTER; 99 100 if (*pulcbAddresses < m_ulcbAddresses) 101 return E_OUTOFMEMORY; 102 103 CopyMemory(pAddressList, m_pAddressList, m_ulcbAddresses); 104 *pulcbAddresses = m_ulcbAddresses; 105 return NOERROR; 106} 107 108HRESULT 109STDMETHODCALLTYPE 110CIPV6Filter::PutMulticastList( 111 ULONG ulcbAddresses, 112 BYTE * pAddressList) 113{ 114 if (!ulcbAddresses || !pAddressList) 115 return E_POINTER; 116 117 if (m_pAddressList) 118 CoTaskMemFree(m_pAddressList); 119 120 m_pAddressList = (BYTE*)CoTaskMemAlloc(ulcbAddresses); 121 if (!m_pAddressList) 122 return E_OUTOFMEMORY; 123 124 CopyMemory(m_pAddressList, pAddressList, ulcbAddresses); 125 m_ulcbAddresses = ulcbAddresses; 126 return NOERROR; 127} 128 129HRESULT 130STDMETHODCALLTYPE 131CIPV6Filter::PutMulticastMode( 132 ULONG ulModeMask) 133{ 134 m_ulModeMask = ulModeMask; 135 return NOERROR; 136} 137 138HRESULT 139STDMETHODCALLTYPE 140CIPV6Filter::GetMulticastMode( 141 ULONG *pulModeMask) 142{ 143 *pulModeMask = m_ulModeMask; 144 return NOERROR; 145} 146 147HRESULT 148WINAPI 149CIPV6Filter_fnConstructor( 150 IBDA_NetworkProvider * pNetworkProvider, 151 REFIID riid, 152 LPVOID * ppv) 153{ 154 CIPV6Filter * filter = new CIPV6Filter(pNetworkProvider); 155 156 if (!filter) 157 return E_OUTOFMEMORY; 158 159 if (FAILED(filter->QueryInterface(riid, ppv))) 160 { 161 /* not supported */ 162 delete filter; 163 return E_NOINTERFACE; 164 } 165 166 return NOERROR; 167}