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