1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS BDA Proxy
4  * FILE:            dll/directx/msvidctl/tuningspace.cpp
5  * PURPOSE:         ITuningSpace interface
6  *
7  * PROGRAMMERS:     Johannes Anderwald (johannes.anderwald@reactos.org)
8  */
9 #include "precomp.h"
10 
11 const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}};
12 
13 class CTuningSpace : public IDVBTuningSpace
14 {
15 public:
16     STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
17 
18     STDMETHODIMP_(ULONG) AddRef()
19     {
20         InterlockedIncrement(&m_Ref);
21         return m_Ref;
22     }
23     STDMETHODIMP_(ULONG) Release()
24     {
25         InterlockedDecrement(&m_Ref);
26 
27             WCHAR Buffer[100];
28             swprintf(Buffer, L"CTuningSpace::Release : %p Ref %lu\n", this, m_Ref);
29             OutputDebugStringW(Buffer);
30 
31         if (!m_Ref)
32         {
33             //delete this;
34             return 0;
35         }
36         return m_Ref;
37     }
38 
39      // IDispatch methods
40      HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
41      HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
42      HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
43      HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
44 
45 
46     //ITuningSpace methods
47     HRESULT STDMETHODCALLTYPE get_UniqueName(BSTR *Name);
48     HRESULT STDMETHODCALLTYPE put_UniqueName(BSTR Name);
49     HRESULT STDMETHODCALLTYPE get_FriendlyName(BSTR *Name);
50     HRESULT STDMETHODCALLTYPE put_FriendlyName(BSTR Name);
51     HRESULT STDMETHODCALLTYPE get_CLSID(BSTR *SpaceCLSID);
52     HRESULT STDMETHODCALLTYPE get_NetworkType(BSTR *NetworkTypeGuid);
53     HRESULT STDMETHODCALLTYPE put_NetworkType(BSTR NetworkTypeGuid);
54     HRESULT STDMETHODCALLTYPE get__NetworkType(GUID *NetworkTypeGuid);
55     HRESULT STDMETHODCALLTYPE put__NetworkType(REFCLSID NetworkTypeGuid);
56     HRESULT STDMETHODCALLTYPE CreateTuneRequest(ITuneRequest **TuneRequest);
57     HRESULT STDMETHODCALLTYPE EnumCategoryGUIDs(IEnumGUID **ppEnum);
58     HRESULT STDMETHODCALLTYPE EnumDeviceMonikers(IEnumMoniker **ppEnum);
59     HRESULT STDMETHODCALLTYPE get_DefaultPreferredComponentTypes(IComponentTypes **ComponentTypes);
60     HRESULT STDMETHODCALLTYPE put_DefaultPreferredComponentTypes(IComponentTypes *NewComponentTypes);
61     HRESULT STDMETHODCALLTYPE get_FrequencyMapping(BSTR *pMapping);
62     HRESULT STDMETHODCALLTYPE put_FrequencyMapping(BSTR Mapping);
63     HRESULT STDMETHODCALLTYPE get_DefaultLocator(ILocator **LocatorVal);
64     HRESULT STDMETHODCALLTYPE put_DefaultLocator(ILocator *LocatorVal);
65     HRESULT STDMETHODCALLTYPE Clone(ITuningSpace **NewTS);
66     // IDVBTuningSpace
67     HRESULT STDMETHODCALLTYPE get_SystemType(DVBSystemType *SysType);
68     HRESULT STDMETHODCALLTYPE put_SystemType(DVBSystemType SysType);
69 
70     CTuningSpace() : m_Ref(0){};
71 
72     virtual ~CTuningSpace(){};
73 
74 protected:
75     LONG m_Ref;
76 };
77 
78 HRESULT
79 STDMETHODCALLTYPE
80 CTuningSpace::QueryInterface(
81     IN  REFIID refiid,
82     OUT PVOID* Output)
83 {
84     if (IsEqualGUID(refiid, IID_IUnknown))
85     {
86         *Output = PVOID(this);
87         reinterpret_cast<IUnknown*>(*Output)->AddRef();
88         return NOERROR;
89     }
90 
91     if (IsEqualGUID(refiid, IID_ITuningSpace))
92     {
93         *Output = (ITuningSpace*)this;
94         reinterpret_cast<ITuningSpace*>(*Output)->AddRef();
95         return NOERROR;
96     }
97 
98     if (IsEqualGUID(refiid, IID_IDVBTuningSpace))
99     {
100         *Output = (IDVBTuningSpace*)this;
101         reinterpret_cast<IDVBTuningSpace*>(*Output)->AddRef();
102         return NOERROR;
103     }
104 
105 
106     WCHAR Buffer[MAX_PATH];
107     LPOLESTR lpstr;
108     StringFromCLSID(refiid, &lpstr);
109     swprintf(Buffer, L"CTuningSpace::QueryInterface: NoInterface for %s", lpstr);
110     OutputDebugStringW(Buffer);
111     CoTaskMemFree(lpstr);
112 
113 
114     return E_NOINTERFACE;
115 }
116 
117 //-------------------------------------------------------------------
118 // IDispatch methods
119 //
120 HRESULT
121 STDMETHODCALLTYPE
122 CTuningSpace::GetTypeInfoCount(UINT *pctinfo)
123 {
124     OutputDebugStringW(L"CTuningSpace::GetTypeInfoCount : NotImplemented\n");
125     return E_NOTIMPL;
126 }
127 
128 HRESULT
129 STDMETHODCALLTYPE
130 CTuningSpace::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
131 {
132     OutputDebugStringW(L"CTuningSpace::GetTypeInfo : NotImplemented\n");
133     return E_NOTIMPL;
134 }
135 HRESULT
136 STDMETHODCALLTYPE
137 CTuningSpace::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
138 {
139     OutputDebugStringW(L"CTuningSpace::GetIDsOfNames : NotImplemented\n");
140     return E_NOTIMPL;
141 }
142 HRESULT
143 STDMETHODCALLTYPE
144 CTuningSpace::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
145 {
146     OutputDebugStringW(L"CTuningSpace::Invoke : NotImplemented\n");
147     return E_NOTIMPL;
148 }
149 
150 
151 //-------------------------------------------------------------------
152 // ITuningSpace interface
153 //
154 
155 HRESULT
156 STDMETHODCALLTYPE
157 CTuningSpace::get_UniqueName(BSTR *Name)
158 {
159     OutputDebugStringW(L"CTuningSpace::get_UniqueName : NotImplemented\n");
160     return E_NOTIMPL;
161 }
162 
163 HRESULT
164 STDMETHODCALLTYPE
165 CTuningSpace::put_UniqueName(BSTR Name)
166 {
167     OutputDebugStringW(L"CTuningSpace::put_UniqueName : NotImplemented\n");
168     return E_NOTIMPL;
169 }
170 
171 HRESULT
172 STDMETHODCALLTYPE
173 CTuningSpace::get_FriendlyName(BSTR *Name)
174 {
175     OutputDebugStringW(L"CTuningSpace::get_FriendlyName : NotImplemented\n");
176     return E_NOTIMPL;
177 }
178 
179 HRESULT
180 STDMETHODCALLTYPE
181 CTuningSpace::put_FriendlyName(BSTR Name)
182 {
183     OutputDebugStringW(L"CTuningSpace::put_FriendlyName : NotImplemented\n");
184     return E_NOTIMPL;
185 }
186 
187 HRESULT
188 STDMETHODCALLTYPE
189 CTuningSpace::get_CLSID(BSTR *SpaceCLSID)
190 {
191     OutputDebugStringW(L"CTuningSpace::get_CLSID : NotImplemented\n");
192     return E_NOTIMPL;
193 }
194 
195 HRESULT
196 STDMETHODCALLTYPE
197 CTuningSpace::get_NetworkType(BSTR *NetworkTypeGuid)
198 {
199     OutputDebugStringW(L"CTuningSpace::get_NetworkType : stub\n");
200     return StringFromCLSID(CLSID_DVBTNetworkProvider, (LPOLESTR*)NetworkTypeGuid);
201 
202 }
203 
204 HRESULT
205 STDMETHODCALLTYPE
206 CTuningSpace::put_NetworkType(BSTR NetworkTypeGuid)
207 {
208     OutputDebugStringW(L"CTuningSpace::put_NetworkType : NotImplemented\n");
209     return E_NOTIMPL;
210 }
211 
212 HRESULT
213 STDMETHODCALLTYPE
214 CTuningSpace::get__NetworkType(GUID *NetworkTypeGuid)
215 {
216 #ifdef MSVIDCTL_TRACE
217     WCHAR Buffer[100];
218     swprintf(Buffer, L"CTuningSpace::get__NetworkType : %p stub\n", NetworkTypeGuid);
219     OutputDebugStringW(Buffer);
220 #endif
221 
222     CopyMemory(NetworkTypeGuid, &CLSID_DVBTNetworkProvider, sizeof(GUID));
223     OutputDebugStringW(L"CTuningSpace::get__NetworkType : done\n");
224     return S_OK;
225 }
226 
227 HRESULT
228 STDMETHODCALLTYPE
229 CTuningSpace::put__NetworkType(REFCLSID NetworkTypeGuid)
230 {
231     OutputDebugStringW(L"CTuningSpace::put__NetworkType : NotImplemented\n");
232     return E_NOTIMPL;
233 }
234 
235 HRESULT
236 STDMETHODCALLTYPE
237 CTuningSpace::CreateTuneRequest(ITuneRequest **TuneRequest)
238 {
239     OutputDebugStringW(L"CTuningSpace::CreateTuneRequest : stub\n");
240     return CTuneRequest_fnConstructor(NULL, (ITuningSpace*)this, IID_ITuneRequest, (void**)TuneRequest);
241 }
242 
243 HRESULT
244 STDMETHODCALLTYPE
245 CTuningSpace::EnumCategoryGUIDs(IEnumGUID **ppEnum)
246 {
247     OutputDebugStringW(L"CTuningSpace::EnumCategoryGUIDs : NotImplemented\n");
248     return E_NOTIMPL;
249 }
250 
251 HRESULT
252 STDMETHODCALLTYPE
253 CTuningSpace::EnumDeviceMonikers(IEnumMoniker **ppEnum)
254 {
255     OutputDebugStringW(L"CTuningSpace::EnumDeviceMonikers : NotImplemented\n");
256     return E_NOTIMPL;
257 }
258 
259 HRESULT
260 STDMETHODCALLTYPE
261 CTuningSpace::get_DefaultPreferredComponentTypes(IComponentTypes **ComponentTypes)
262 {
263     OutputDebugStringW(L"CTuningSpace::get_DefaultPreferredComponentTypes : NotImplemented\n");
264     return E_NOTIMPL;
265 }
266 
267 HRESULT
268 STDMETHODCALLTYPE
269 CTuningSpace::put_DefaultPreferredComponentTypes(IComponentTypes *NewComponentTypes)
270 {
271     OutputDebugStringW(L"CTuningSpace::put_DefaultPreferredComponentTypes : NotImplemented\n");
272     return E_NOTIMPL;
273 }
274 
275 HRESULT
276 STDMETHODCALLTYPE
277 CTuningSpace::get_FrequencyMapping(BSTR *pMapping)
278 {
279     OutputDebugStringW(L"CTuningSpace::get_FrequencyMapping : NotImplemented\n");
280     return E_NOTIMPL;
281 }
282 
283 HRESULT
284 STDMETHODCALLTYPE
285 CTuningSpace::put_FrequencyMapping(BSTR Mapping)
286 {
287     OutputDebugStringW(L"CTuningSpace::put_FrequencyMapping : NotImplemented\n");
288     return E_NOTIMPL;
289 }
290 
291 HRESULT
292 STDMETHODCALLTYPE
293 CTuningSpace::get_DefaultLocator(ILocator **LocatorVal)
294 {
295     OutputDebugStringW(L"CTuningSpace::get_DefaultLocator : NotImplemented\n");
296     return E_NOTIMPL;
297 }
298 
299 HRESULT
300 STDMETHODCALLTYPE
301 CTuningSpace::put_DefaultLocator(ILocator *LocatorVal)
302 {
303     OutputDebugStringW(L"CTuningSpace::put_DefaultLocator : NotImplemented\n");
304     return E_NOTIMPL;
305 }
306 
307 HRESULT
308 STDMETHODCALLTYPE
309 CTuningSpace::Clone(ITuningSpace **NewTS)
310 {
311     OutputDebugStringW(L"CTuningSpace::Clone : NotImplemented\n");
312     return E_NOTIMPL;
313 }
314 
315 //-------------------------------------------------------------------
316 // IDVBTuningSpace
317 //
318 HRESULT
319 STDMETHODCALLTYPE
320 CTuningSpace::get_SystemType(DVBSystemType *SysType)
321 {
322     OutputDebugStringW(L"CTuningSpace::get_SystemType : NotImplemented\n");
323     return E_NOTIMPL;
324 }
325 
326 HRESULT
327 STDMETHODCALLTYPE
328 CTuningSpace::put_SystemType(DVBSystemType SysType)
329 {
330     OutputDebugStringW(L"CTuningSpace::put_SystemType : NotImplemented\n");
331     return E_NOTIMPL;
332 }
333 
334 HRESULT
335 WINAPI
336 CTuningSpace_fnConstructor(
337     IUnknown *pUnknown,
338     REFIID riid,
339     LPVOID * ppv)
340 {
341     // construct device control
342     CTuningSpace * space = new CTuningSpace();
343 
344 #ifdef MSVIDCTL_TRACE
345     WCHAR Buffer[MAX_PATH];
346     LPOLESTR lpstr;
347     StringFromCLSID(riid, &lpstr);
348     swprintf(Buffer, L"CTuningSpace_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
349     OutputDebugStringW(Buffer);
350 #endif
351 
352     if (!space)
353         return E_OUTOFMEMORY;
354 
355     if (FAILED(space->QueryInterface(riid, ppv)))
356     {
357         /* not supported */
358         delete space;
359         return E_NOINTERFACE;
360     }
361 
362     return NOERROR;
363 }
364 
365 
366