Reactos
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}