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 11 class CEthernetFilter : public IBDA_EthernetFilter 12 { 13 public: 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 30 protected: 31 IBDA_NetworkProvider * m_pNetworkProvider; 32 ULONG m_ulcbAddresses; 33 BYTE * m_pAddressList; 34 ULONG m_ulModeMask; 35 }; 36 37 CEthernetFilter::CEthernetFilter( 38 IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider), 39 m_ulcbAddresses(0), 40 m_pAddressList(0), 41 m_ulModeMask(0) 42 { 43 } 44 45 CEthernetFilter::~CEthernetFilter() 46 { 47 if (m_pAddressList) 48 CoTaskMemFree(m_pAddressList); 49 } 50 51 HRESULT 52 STDMETHODCALLTYPE 53 CEthernetFilter::QueryInterface( 54 REFIID InterfaceId, 55 PVOID* Interface) 56 { 57 assert(m_pNetworkProvider); 58 return m_pNetworkProvider->QueryInterface(InterfaceId, Interface); 59 } 60 61 ULONG 62 STDMETHODCALLTYPE 63 CEthernetFilter::AddRef() 64 { 65 assert(m_pNetworkProvider); 66 return m_pNetworkProvider->AddRef(); 67 } 68 69 ULONG 70 STDMETHODCALLTYPE 71 CEthernetFilter::Release() 72 { 73 assert(m_pNetworkProvider); 74 return m_pNetworkProvider->Release(); 75 } 76 77 //------------------------------------------------------------------- 78 //IBDA_EthernetFilter 79 // 80 81 HRESULT 82 STDMETHODCALLTYPE 83 CEthernetFilter::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 102 HRESULT 103 STDMETHODCALLTYPE 104 CEthernetFilter::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 119 HRESULT 120 STDMETHODCALLTYPE 121 CEthernetFilter::GetMulticastListSize( 122 ULONG *pulcbAddresses) 123 { 124 if (!pulcbAddresses) 125 return E_POINTER; 126 127 *pulcbAddresses = m_ulcbAddresses; 128 return NOERROR; 129 } 130 131 HRESULT 132 STDMETHODCALLTYPE 133 CEthernetFilter::PutMulticastMode( 134 ULONG ulModeMask) 135 { 136 m_ulModeMask = ulModeMask; 137 return NOERROR; 138 } 139 140 HRESULT 141 STDMETHODCALLTYPE 142 CEthernetFilter::GetMulticastMode( 143 ULONG *pulModeMask) 144 { 145 *pulModeMask = m_ulModeMask; 146 return NOERROR; 147 } 148 149 HRESULT 150 WINAPI 151 CEthernetFilter_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 } 170