1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS BDA Proxy
4  * FILE:            dll/directx/bdaplgin/signalstatistics.cpp
5  * PURPOSE:         IBDA_FrequencyFilter interface
6  *
7  * PROGRAMMERS:     Johannes Anderwald (johannes.anderwald@reactos.org)
8  */
9 
10 #include "precomp.h"
11 
12 #ifndef _MSC_VER
13 const GUID IID_IBDA_SignalStatistics = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0x0d, 0x9a, 0x2a, 0x43, 0x38}};
14 const GUID KSPROPSETID_BdaSignalStats = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0xd, 0x9a, 0x2a, 0x43, 0x38}};
15 #endif
16 
17 class CBDASignalStatistics : public IBDA_SignalStatistics
18 {
19 public:
20     STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
21 
AddRef()22     STDMETHODIMP_(ULONG) AddRef()
23     {
24         InterlockedIncrement(&m_Ref);
25         return m_Ref;
26     }
Release()27     STDMETHODIMP_(ULONG) Release()
28     {
29         InterlockedDecrement(&m_Ref);
30         if (!m_Ref)
31         {
32             delete this;
33             return 0;
34         }
35         return m_Ref;
36     }
37 
38     // IBDA_SignalStatistics methods
39     HRESULT STDMETHODCALLTYPE put_SignalStrength(LONG lDbStrength);
40     HRESULT STDMETHODCALLTYPE get_SignalStrength(LONG *plDbStrength);
41     HRESULT STDMETHODCALLTYPE put_SignalQuality(LONG lPercentQuality);
42     HRESULT STDMETHODCALLTYPE get_SignalQuality(LONG *plPercentQuality);
43     HRESULT STDMETHODCALLTYPE put_SignalPresent(BOOLEAN fPresent);
44     HRESULT STDMETHODCALLTYPE get_SignalPresent(BOOLEAN *pfPresent);
45     HRESULT STDMETHODCALLTYPE put_SignalLocked(BOOLEAN fLocked);
46     HRESULT STDMETHODCALLTYPE get_SignalLocked(BOOLEAN *pfLocked);
47     HRESULT STDMETHODCALLTYPE put_SampleTime(LONG lmsSampleTime);
48     HRESULT STDMETHODCALLTYPE get_SampleTime(LONG *plmsSampleTime);
49 
CBDASignalStatistics(IKsPropertySet * pProperty,ULONG NodeId)50     CBDASignalStatistics(IKsPropertySet * pProperty, ULONG NodeId) : m_Ref(0), m_pProperty(pProperty), m_NodeId(NodeId){};
~CBDASignalStatistics()51     ~CBDASignalStatistics(){};
52 
53 protected:
54     LONG m_Ref;
55     IKsPropertySet * m_pProperty;
56     ULONG m_NodeId;
57 };
58 
59 HRESULT
60 STDMETHODCALLTYPE
QueryInterface(IN REFIID refiid,OUT PVOID * Output)61 CBDASignalStatistics::QueryInterface(
62     IN  REFIID refiid,
63     OUT PVOID* Output)
64 {
65     *Output = NULL;
66 
67     if (IsEqualGUID(refiid, IID_IUnknown))
68     {
69         *Output = PVOID(this);
70         reinterpret_cast<IUnknown*>(*Output)->AddRef();
71         return NOERROR;
72     }
73 
74     if (IsEqualGUID(refiid, IID_IBDA_SignalStatistics))
75     {
76         *Output = (IBDA_SignalStatistics*)(this);
77         reinterpret_cast<IBDA_SignalStatistics*>(*Output)->AddRef();
78         return NOERROR;
79     }
80     return E_NOINTERFACE;
81 }
82 
83 HRESULT
84 STDMETHODCALLTYPE
put_SignalStrength(LONG lDbStrength)85 CBDASignalStatistics::put_SignalStrength(LONG lDbStrength)
86 {
87     return E_NOINTERFACE;
88 }
89 
90 HRESULT
91 STDMETHODCALLTYPE
get_SignalStrength(LONG * plDbStrength)92 CBDASignalStatistics::get_SignalStrength(LONG *plDbStrength)
93 {
94     KSP_NODE Node;
95     HRESULT hr;
96     ULONG BytesReturned;
97 
98     // setup request
99     Node.NodeId = (ULONG)-1;
100     Node.Reserved = 0;
101 
102     assert(m_pProperty);
103 
104     hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_STRENGTH, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plDbStrength, sizeof(LONG), &BytesReturned);
105 
106 
107 #ifdef BDAPLGIN_TRACE
108     WCHAR Buffer[100];
109     swprintf(Buffer, L"CBDASignalStatistics::get_SignalStrength: m_NodeId %lu hr %lx, BytesReturned %lu plDbStrength %ld\n", m_NodeId, hr, BytesReturned, *plDbStrength);
110     OutputDebugStringW(Buffer);
111 #endif
112 
113     return hr;
114 }
115 
116 HRESULT
117 STDMETHODCALLTYPE
put_SignalQuality(LONG lPercentQuality)118 CBDASignalStatistics::put_SignalQuality(LONG lPercentQuality)
119 {
120     return E_NOINTERFACE;
121 }
122 
123 HRESULT
124 STDMETHODCALLTYPE
get_SignalQuality(LONG * plPercentQuality)125 CBDASignalStatistics::get_SignalQuality(LONG *plPercentQuality)
126 {
127     KSP_NODE Node;
128     HRESULT hr;
129     ULONG BytesReturned;
130 
131     // setup request
132     Node.NodeId = (ULONG)-1;
133     Node.Reserved = 0;
134 
135     // perform request
136     hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_QUALITY, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plPercentQuality, sizeof(LONG), &BytesReturned);
137 
138 #ifdef BDAPLGIN_TRACE
139     WCHAR Buffer[100];
140     swprintf(Buffer, L"CBDASignalStatistics::get_SignalQuality: m_NodeId %lu hr %lx, BytesReturned %lu plPercentQuality %lu\n", m_NodeId, hr, BytesReturned, *plPercentQuality);
141     OutputDebugStringW(Buffer);
142 #endif
143 
144     return hr;
145 }
146 
147 HRESULT
148 STDMETHODCALLTYPE
put_SignalPresent(BOOLEAN fPresent)149 CBDASignalStatistics::put_SignalPresent(BOOLEAN fPresent)
150 {
151     return E_NOINTERFACE;
152 }
153 
154 HRESULT
155 STDMETHODCALLTYPE
get_SignalPresent(BOOLEAN * pfPresent)156 CBDASignalStatistics::get_SignalPresent(BOOLEAN *pfPresent)
157 {
158     KSP_NODE Node;
159     HRESULT hr;
160     ULONG Present;
161     ULONG BytesReturned;
162 
163     // setup request
164     Node.NodeId = (ULONG)-1;
165     Node.Reserved = 0;
166 
167     // perform request
168     hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_PRESENT, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Present, sizeof(ULONG), &BytesReturned);
169 
170     // store result
171     *pfPresent = Present;
172 
173 #ifdef BDAPLGIN_TRACE
174     WCHAR Buffer[100];
175     swprintf(Buffer, L"CBDASignalStatistics::get_SignalPresent: m_NodeId %lu hr %lx, BytesReturned %lu Present %lu\n", m_NodeId, hr, BytesReturned, Present);
176     OutputDebugStringW(Buffer);
177 #endif
178 
179     return hr;
180 }
181 
182 HRESULT
183 STDMETHODCALLTYPE
put_SignalLocked(BOOLEAN fLocked)184 CBDASignalStatistics::put_SignalLocked(BOOLEAN fLocked)
185 {
186     return E_NOINTERFACE;
187 }
188 
189 HRESULT
190 STDMETHODCALLTYPE
get_SignalLocked(BOOLEAN * pfLocked)191 CBDASignalStatistics::get_SignalLocked(BOOLEAN *pfLocked)
192 {
193     KSP_NODE Node;
194     HRESULT hr;
195     ULONG Locked;
196     ULONG BytesReturned;
197 
198     // setup request
199     Node.NodeId = (ULONG)-1;
200     Node.Reserved = 0;
201 
202     // perform request
203     hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SIGNAL_LOCKED, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &Locked, sizeof(ULONG), &BytesReturned);
204 
205     *pfLocked = Locked;
206 
207 #ifdef BDAPLGIN_TRACE
208     WCHAR Buffer[100];
209     swprintf(Buffer, L"CBDASignalStatistics::get_SignalLocked: m_NodeId %lu hr %lx, BytesReturned %lu Locked %lu\n", m_NodeId, hr, BytesReturned, Locked);
210     OutputDebugStringW(Buffer);
211 #endif
212 
213     return hr;
214 }
215 
216 HRESULT
217 STDMETHODCALLTYPE
put_SampleTime(LONG lmsSampleTime)218 CBDASignalStatistics::put_SampleTime(LONG lmsSampleTime)
219 {
220     KSP_NODE Node;
221     HRESULT hr;
222 
223     // setup request
224     Node.NodeId = (ULONG)-1;
225     Node.Reserved = 0;
226 
227     // perform request
228     hr = m_pProperty->Set(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SAMPLE_TIME, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), &lmsSampleTime, sizeof(LONG));
229 
230 #ifdef BDAPLGIN_TRACE
231     WCHAR Buffer[100];
232     swprintf(Buffer, L"CBDASignalStatistics::put_SampleTime: m_NodeId %lu hr %lx\n", m_NodeId, hr);
233     OutputDebugStringW(Buffer);
234 #endif
235 
236     return hr;
237 }
238 
239 HRESULT
240 STDMETHODCALLTYPE
get_SampleTime(LONG * plmsSampleTime)241 CBDASignalStatistics::get_SampleTime(LONG *plmsSampleTime)
242 {
243     KSP_NODE Node;
244     HRESULT hr;
245     ULONG BytesReturned;
246 
247     // setup request
248     Node.NodeId = (ULONG)-1;
249     Node.Reserved = 0;
250 
251     // perform request
252     hr = m_pProperty->Get(KSPROPSETID_BdaSignalStats, KSPROPERTY_BDA_SAMPLE_TIME, &Node.NodeId, sizeof(KSP_NODE)-sizeof(KSPROPERTY), plmsSampleTime, sizeof(LONG), &BytesReturned);
253 
254 #ifdef BDAPLGIN_TRACE
255     WCHAR Buffer[100];
256     swprintf(Buffer, L"CBDASignalStatistics::get_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu \n", m_NodeId, hr, BytesReturned);
257     OutputDebugStringW(Buffer);
258 #endif
259 
260     return hr;
261 }
262 
263 HRESULT
264 WINAPI
CBDASignalStatistics_fnConstructor(IKsPropertySet * pProperty,ULONG NodeId,REFIID riid,LPVOID * ppv)265 CBDASignalStatistics_fnConstructor(
266     IKsPropertySet * pProperty,
267     ULONG NodeId,
268     REFIID riid,
269     LPVOID * ppv)
270 {
271     // construct device control
272     CBDASignalStatistics * handler = new CBDASignalStatistics(pProperty, NodeId);
273 
274 #ifdef BDAPLGIN_TRACE
275     OutputDebugStringW(L"CBDASignalStatistics_fnConstructor\n");
276 #endif
277 
278     if (!handler)
279         return E_OUTOFMEMORY;
280 
281     if (FAILED(handler->QueryInterface(riid, ppv)))
282     {
283         /* not supported */
284         delete handler;
285         return E_NOINTERFACE;
286     }
287 
288     return NOERROR;
289 }
290