[WIN32K]
[reactos.git] / dll / directx / bdaplgin / lnbinfo.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS BDA Proxy
4 * FILE: dll/directx/bdaplgin/lnbinfo.cpp
5 * PURPOSE: IBDA_LNBInfo interface
6 *
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
8 */
9
10 #include "precomp.h"
11
12 const GUID IID_IBDA_LNBInfo = {0x992cf102, 0x49f9, 0x4719, {0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x08, 0xf4}};
13 const GUID KSPROPSETID_BdaLNBInfo = {0x992cf102, 0x49f9, 0x4719, {0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x8, 0xf4}};
14
15 class CBDALNBInfo : public IBDA_LNBInfo
16 {
17 public:
18 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
19
20 STDMETHODIMP_(ULONG) AddRef()
21 {
22 InterlockedIncrement(&m_Ref);
23 return m_Ref;
24 }
25 STDMETHODIMP_(ULONG) Release()
26 {
27 InterlockedDecrement(&m_Ref);
28 if (!m_Ref)
29 {
30 delete this;
31 return 0;
32 }
33 return m_Ref;
34 }
35
36 //IBDA_LNBInfo methods
37 HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyLowBand(ULONG ulLOFLow);
38 HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyLowBand(ULONG *pulLOFLow);
39 HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyHighBand(ULONG ulLOFHigh);
40 HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyHighBand(ULONG *pulLOFHigh);
41 HRESULT STDMETHODCALLTYPE put_HighLowSwitchFrequency(ULONG ulSwitchFrequency);
42 HRESULT STDMETHODCALLTYPE get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency);
43
44 CBDALNBInfo(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){};
45 ~CBDALNBInfo(){};
46
47 protected:
48 LONG m_Ref;
49 HANDLE m_hFile;
50 ULONG m_NodeId;
51 };
52
53 HRESULT
54 STDMETHODCALLTYPE
55 CBDALNBInfo::QueryInterface(
56 IN REFIID refiid,
57 OUT PVOID* Output)
58 {
59 *Output = NULL;
60
61 if (IsEqualGUID(refiid, IID_IUnknown))
62 {
63 *Output = PVOID(this);
64 reinterpret_cast<IUnknown*>(*Output)->AddRef();
65 return NOERROR;
66 }
67
68 if (IsEqualGUID(refiid, IID_IBDA_LNBInfo))
69 {
70 *Output = (IBDA_LNBInfo*)(this);
71 reinterpret_cast<IBDA_LNBInfo*>(*Output)->AddRef();
72 return NOERROR;
73 }
74
75 #ifdef BDAPLGIN_TRACE
76 WCHAR Buffer[100];
77 LPOLESTR lpstr;
78 StringFromCLSID(refiid, &lpstr);
79 swprintf(Buffer, L"CBDALNBInfo::QueryInterface: NoInterface for %s", lpstr);
80 OutputDebugStringW(Buffer);
81 CoTaskMemFree(lpstr);
82 #endif
83
84 return E_NOINTERFACE;
85 }
86
87 HRESULT
88 STDMETHODCALLTYPE
89 CBDALNBInfo::put_LocalOscilatorFrequencyLowBand(ULONG ulLOFLow)
90 {
91 KSP_NODE Node;
92 HRESULT hr;
93 ULONG BytesReturned;
94
95 // setup request
96 Node.Property.Set = KSPROPSETID_BdaLNBInfo;
97 Node.Property.Id = KSPROPERTY_BDA_LNB_LOF_LOW_BAND;
98 Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
99 Node.NodeId = m_NodeId;
100
101 // perform request
102 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFLow, sizeof(ULONG), &BytesReturned);
103
104 #ifdef BDAPLGIN_TRACE
105 WCHAR Buffer[100];
106 swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyLowBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
107 OutputDebugStringW(Buffer);
108 #endif
109
110 return hr;
111 }
112
113 HRESULT
114 STDMETHODCALLTYPE
115 CBDALNBInfo::get_LocalOscilatorFrequencyLowBand(ULONG *pulLOFLow)
116 {
117 return E_NOINTERFACE;
118 }
119
120 HRESULT
121 STDMETHODCALLTYPE
122 CBDALNBInfo::put_LocalOscilatorFrequencyHighBand(ULONG ulLOFHigh)
123 {
124 KSP_NODE Node;
125 HRESULT hr;
126 ULONG BytesReturned;
127
128 // setup request
129 Node.Property.Set = KSPROPSETID_BdaLNBInfo;
130 Node.Property.Id = KSPROPERTY_BDA_LNB_LOF_HIGH_BAND;
131 Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
132 Node.NodeId = m_NodeId;
133
134 // perform request
135 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFHigh, sizeof(ULONG), &BytesReturned);
136
137 #ifdef BDAPLGIN_TRACE
138 WCHAR Buffer[100];
139 swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyHighBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
140 OutputDebugStringW(Buffer);
141 #endif
142
143 return hr;
144 }
145
146 HRESULT
147 STDMETHODCALLTYPE
148 CBDALNBInfo::get_LocalOscilatorFrequencyHighBand(ULONG *pulLOFHigh)
149 {
150 return E_NOINTERFACE;
151 }
152
153 HRESULT
154 STDMETHODCALLTYPE
155 CBDALNBInfo::put_HighLowSwitchFrequency(ULONG ulSwitchFrequency)
156 {
157 KSP_NODE Node;
158 HRESULT hr;
159 ULONG BytesReturned;
160
161 // setup request
162 Node.Property.Set = KSPROPSETID_BdaLNBInfo;
163 Node.Property.Id = KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY;
164 Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
165 Node.NodeId = m_NodeId;
166
167 // perform request
168 hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulSwitchFrequency, sizeof(ULONG), &BytesReturned);
169
170 #ifdef BDAPLGIN_TRACE
171 WCHAR Buffer[100];
172 swprintf(Buffer, L"CBDALNBInfo::put_HighLowSwitchFrequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned);
173 OutputDebugStringW(Buffer);
174 #endif
175
176 return hr;
177 }
178
179 HRESULT
180 STDMETHODCALLTYPE
181 CBDALNBInfo::get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency)
182 {
183 return E_NOINTERFACE;
184 }
185
186 HRESULT
187 WINAPI
188 CBDALNBInfo_fnConstructor(
189 HANDLE hFile,
190 ULONG NodeId,
191 REFIID riid,
192 LPVOID * ppv)
193 {
194 // construct device control
195 CBDALNBInfo * handler = new CBDALNBInfo(hFile, NodeId);
196
197 #ifdef BDAPLGIN_TRACE
198 OutputDebugStringW(L"CBDALNBInfo_fnConstructor\n");
199 #endif
200
201 if (!handler)
202 return E_OUTOFMEMORY;
203
204 if (FAILED(handler->QueryInterface(riid, ppv)))
205 {
206 /* not supported */
207 delete handler;
208 return E_NOINTERFACE;
209 }
210
211 return NOERROR;
212 }