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