Merge to trunk head (r46631)
[reactos.git] / dll / directx / msdvbnp / ipv4.cpp
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 (janderwald@reactos.org)
8 */
9 #include "precomp.h"
10
11 class CIPV4Filter : public IBDA_IPV4Filter
12 {
13 public:
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
29 protected:
30 IBDA_NetworkProvider * m_pNetworkProvider;
31 ULONG m_ulcbAddresses;
32 BYTE * m_pAddressList;
33 ULONG m_ulModeMask;
34 };
35
36 CIPV4Filter::CIPV4Filter(
37 IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider),
38 m_ulcbAddresses(0),
39 m_pAddressList(0),
40 m_ulModeMask(0)
41 {
42 }
43
44 CIPV4Filter::~CIPV4Filter()
45 {
46 if (m_pAddressList)
47 CoTaskMemFree(m_pAddressList);
48 }
49
50
51 HRESULT
52 STDMETHODCALLTYPE
53 CIPV4Filter::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 CIPV4Filter::AddRef()
64 {
65 assert(m_pNetworkProvider);
66 return m_pNetworkProvider->AddRef();
67 }
68
69 ULONG
70 STDMETHODCALLTYPE
71 CIPV4Filter::Release()
72 {
73 assert(m_pNetworkProvider);
74 return m_pNetworkProvider->Release();
75 }
76
77 //-------------------------------------------------------------------
78 //IBDA_IPV4Filter
79 //
80
81
82 HRESULT
83 STDMETHODCALLTYPE
84 CIPV4Filter::GetMulticastListSize(
85 ULONG *pulcbAddresses)
86 {
87 if (!pulcbAddresses)
88 return E_POINTER;
89
90 *pulcbAddresses = 0;
91 return NOERROR;
92 }
93
94 HRESULT
95 STDMETHODCALLTYPE
96 CIPV4Filter::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
115 HRESULT
116 STDMETHODCALLTYPE
117 CIPV4Filter::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
132 HRESULT
133 STDMETHODCALLTYPE
134 CIPV4Filter::PutMulticastMode(
135 ULONG ulModeMask)
136 {
137 m_ulModeMask = ulModeMask;
138 return NOERROR;
139 }
140
141 HRESULT
142 STDMETHODCALLTYPE
143 CIPV4Filter::GetMulticastMode(
144 ULONG *pulModeMask)
145 {
146 *pulModeMask = m_ulModeMask;
147 return NOERROR;
148 }
149
150 HRESULT
151 WINAPI
152 CIPV4Filter_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 }