Reactos
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
11class CIPV6Filter : public IBDA_IPV6Filter
12{
13public:
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
28protected:
29 IBDA_NetworkProvider * m_pNetworkProvider;
30 ULONG m_ulcbAddresses;
31 BYTE * m_pAddressList;
32 ULONG m_ulModeMask;
33};
34
35CIPV6Filter::CIPV6Filter(
36 IBDA_NetworkProvider * pNetworkProvider) : m_pNetworkProvider(pNetworkProvider),
37 m_ulcbAddresses(0),
38 m_pAddressList(0),
39 m_ulModeMask(0)
40{
41}
42
43CIPV6Filter::~CIPV6Filter()
44{
45 if (m_pAddressList)
46 CoTaskMemFree(m_pAddressList);
47}
48
49HRESULT
50STDMETHODCALLTYPE
51CIPV6Filter::QueryInterface(
52 REFIID InterfaceId,
53 PVOID* Interface)
54{
55 assert(m_pNetworkProvider);
56 return m_pNetworkProvider->QueryInterface(InterfaceId, Interface);
57}
58
59ULONG
60STDMETHODCALLTYPE
61CIPV6Filter::AddRef()
62{
63 assert(m_pNetworkProvider);
64 return m_pNetworkProvider->AddRef();
65}
66
67ULONG
68STDMETHODCALLTYPE
69CIPV6Filter::Release()
70{
71 assert(m_pNetworkProvider);
72 return m_pNetworkProvider->Release();
73}
74
75//-------------------------------------------------------------------
76//IBDA_IPV6Filter
77//
78
79HRESULT
80STDMETHODCALLTYPE
81CIPV6Filter::GetMulticastListSize(
82 ULONG *pulcbAddresses)
83{
84 if (!pulcbAddresses)
85 return E_POINTER;
86
87 *pulcbAddresses = 0;
88 return NOERROR;
89}
90
91HRESULT
92STDMETHODCALLTYPE
93CIPV6Filter::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
108HRESULT
109STDMETHODCALLTYPE
110CIPV6Filter::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
129HRESULT
130STDMETHODCALLTYPE
131CIPV6Filter::PutMulticastMode(
132 ULONG ulModeMask)
133{
134 m_ulModeMask = ulModeMask;
135 return NOERROR;
136}
137
138HRESULT
139STDMETHODCALLTYPE
140CIPV6Filter::GetMulticastMode(
141 ULONG *pulModeMask)
142{
143 *pulModeMask = m_ulModeMask;
144 return NOERROR;
145}
146
147HRESULT
148WINAPI
149CIPV6Filter_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}