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