Sync with trunk head.
[reactos.git] / dll / directx / msdvbnp / networkprovider.cpp
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Network Provider for MPEG2 based networks
4 * FILE: dll/directx/msdvbnp/networkprovider.cpp
5 * PURPOSE: IBDA_NetworkProvider interface
6 *
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
8 */
9 #include "precomp.h"
10
11 class CNetworkProvider : public IBaseFilter,
12 public IAMovieSetup,
13 public IBDA_NetworkProvider
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 if (!m_Ref)
27 {
28 delete this;
29 return 0;
30 }
31 return m_Ref;
32 }
33
34 // IBaseFilter methods
35 HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
36 HRESULT STDMETHODCALLTYPE Stop( void);
37 HRESULT STDMETHODCALLTYPE Pause( void);
38 HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
39 HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State);
40 HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock);
41 HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **pClock);
42 HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum);
43 HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin);
44 HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo);
45 HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName);
46 HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo);
47
48 //IAMovieSetup methods
49 HRESULT STDMETHODCALLTYPE Register( void);
50 HRESULT STDMETHODCALLTYPE Unregister( void);
51
52 //IBDA_NetworkProvider methods
53 HRESULT STDMETHODCALLTYPE PutSignalSource(ULONG ulSignalSource);
54 HRESULT STDMETHODCALLTYPE GetSignalSource(ULONG *pulSignalSource);
55 HRESULT STDMETHODCALLTYPE GetNetworkType(GUID *pguidNetworkType);
56 HRESULT STDMETHODCALLTYPE PutTuningSpace(REFGUID guidTuningSpace);
57 HRESULT STDMETHODCALLTYPE GetTuningSpace(GUID *pguidTuingSpace);
58 HRESULT STDMETHODCALLTYPE RegisterDeviceFilter(IUnknown *pUnkFilterControl, ULONG *ppvRegisitrationContext);
59 HRESULT STDMETHODCALLTYPE UnRegisterDeviceFilter(ULONG pvRegistrationContext);
60
61 CNetworkProvider() : m_Ref(0), m_pGraph(0), m_ReferenceClock(0), m_FilterState(State_Stopped) {m_Pins[0] = 0;};
62 virtual ~CNetworkProvider(){};
63
64 protected:
65 LONG m_Ref;
66 IFilterGraph *m_pGraph;
67 IReferenceClock * m_ReferenceClock;
68 FILTER_STATE m_FilterState;
69 IPin * m_Pins[1];
70 };
71
72 HRESULT
73 STDMETHODCALLTYPE
74 CNetworkProvider::QueryInterface(
75 IN REFIID refiid,
76 OUT PVOID* Output)
77 {
78 *Output = NULL;
79
80 if (IsEqualGUID(refiid, IID_IUnknown))
81 {
82 *Output = PVOID(this);
83 reinterpret_cast<IUnknown*>(*Output)->AddRef();
84 return NOERROR;
85 }
86 if (IsEqualGUID(refiid, IID_IBaseFilter))
87 {
88 *Output = (IBaseFilter*)(this);
89 reinterpret_cast<IBaseFilter*>(*Output)->AddRef();
90 return NOERROR;
91 }
92
93 if (IsEqualGUID(refiid, IID_ITuner) ||
94 IsEqualGUID(refiid, IID_IScanningTuner))
95 {
96 // construct scanning tuner
97 return CScanningTunner_fnConstructor(NULL, refiid, Output);
98 }
99
100 WCHAR Buffer[MAX_PATH];
101 LPOLESTR lpstr;
102 StringFromCLSID(refiid, &lpstr);
103 swprintf(Buffer, L"CNetworkProvider::QueryInterface: NoInterface for %s !!!\n", lpstr);
104 OutputDebugStringW(Buffer);
105 CoTaskMemFree(lpstr);
106
107
108 return E_NOINTERFACE;
109 }
110
111 //-------------------------------------------------------------------
112 // IBaseFilter interface
113 //
114
115 HRESULT
116 STDMETHODCALLTYPE
117 CNetworkProvider::GetClassID(
118 CLSID *pClassID)
119 {
120 OutputDebugStringW(L"CNetworkProvider::GetClassID : NotImplemented\n");
121 return E_NOTIMPL;
122 }
123
124 HRESULT
125 STDMETHODCALLTYPE
126 CNetworkProvider::Stop()
127 {
128 OutputDebugStringW(L"CNetworkProvider::Stop : NotImplemented\n");
129 return E_NOTIMPL;
130 }
131
132 HRESULT
133 STDMETHODCALLTYPE
134 CNetworkProvider::Pause()
135 {
136 OutputDebugStringW(L"CNetworkProvider::Pause : NotImplemented\n");
137 return E_NOTIMPL;
138 }
139
140 HRESULT
141 STDMETHODCALLTYPE
142 CNetworkProvider::Run(
143 REFERENCE_TIME tStart)
144 {
145 OutputDebugStringW(L"CNetworkProvider::Run : NotImplemented\n");
146 return E_NOTIMPL;
147 }
148
149 HRESULT
150 STDMETHODCALLTYPE
151 CNetworkProvider::GetState(
152 DWORD dwMilliSecsTimeout,
153 FILTER_STATE *State)
154 {
155 *State = m_FilterState;
156 return S_OK;
157 }
158
159 HRESULT
160 STDMETHODCALLTYPE
161 CNetworkProvider::SetSyncSource(
162 IReferenceClock *pClock)
163 {
164 if (pClock)
165 {
166 pClock->AddRef();
167
168 }
169
170 if (m_ReferenceClock)
171 {
172 m_ReferenceClock->Release();
173 }
174
175 m_ReferenceClock = pClock;
176 return S_OK;
177 }
178
179 HRESULT
180 STDMETHODCALLTYPE
181 CNetworkProvider::GetSyncSource(
182 IReferenceClock **pClock)
183 {
184 if (!pClock)
185 return E_POINTER;
186
187 if (m_ReferenceClock)
188 m_ReferenceClock->AddRef();
189
190 *pClock = m_ReferenceClock;
191 return S_OK;
192 }
193
194 HRESULT
195 STDMETHODCALLTYPE
196 CNetworkProvider::EnumPins(
197 IEnumPins **ppEnum)
198 {
199 if (m_Pins[0] == 0)
200 {
201 HRESULT hr = CPin_fnConstructor(NULL, (IBaseFilter*)this, IID_IUnknown, (void**)&m_Pins[0]);
202 if (FAILED(hr))
203 return hr;
204 }
205
206 return CEnumPins_fnConstructor(NULL, 1, m_Pins, IID_IEnumPins, (void**)ppEnum);
207 }
208
209 HRESULT
210 STDMETHODCALLTYPE
211 CNetworkProvider::FindPin(
212 LPCWSTR Id, IPin **ppPin)
213 {
214 OutputDebugStringW(L"CNetworkProvider::FindPin : NotImplemented\n");
215 return E_NOTIMPL;
216 }
217
218
219 HRESULT
220 STDMETHODCALLTYPE
221 CNetworkProvider::QueryFilterInfo(
222 FILTER_INFO *pInfo)
223 {
224 if (!pInfo)
225 return E_POINTER;
226
227 pInfo->achName[0] = L'\0';
228 pInfo->pGraph = m_pGraph;
229
230 return S_OK;
231 }
232
233 HRESULT
234 STDMETHODCALLTYPE
235 CNetworkProvider::JoinFilterGraph(
236 IFilterGraph *pGraph,
237 LPCWSTR pName)
238 {
239 if (pGraph)
240 {
241 // joining filter graph
242 m_pGraph = pGraph;
243 }
244 else
245 {
246 // leaving graph
247 m_pGraph = 0;
248 }
249
250 OutputDebugStringW(L"CNetworkProvider::JoinFilterGraph\n");
251 return S_OK;
252 }
253
254
255 HRESULT
256 STDMETHODCALLTYPE
257 CNetworkProvider::QueryVendorInfo(
258 LPWSTR *pVendorInfo)
259 {
260 OutputDebugStringW(L"CNetworkProvider::QueryVendorInfo : NotImplemented\n");
261 return E_NOTIMPL;
262 }
263
264 //-------------------------------------------------------------------
265 // IAMovieSetup interface
266 //
267
268 HRESULT
269 STDMETHODCALLTYPE
270 CNetworkProvider::Register()
271 {
272 OutputDebugStringW(L"CNetworkProvider::Register : NotImplemented\n");
273 return E_NOTIMPL;
274 }
275
276 HRESULT
277 STDMETHODCALLTYPE
278 CNetworkProvider::Unregister()
279 {
280 OutputDebugStringW(L"CNetworkProvider::Unregister : NotImplemented\n");
281 return E_NOTIMPL;
282 }
283
284 //-------------------------------------------------------------------
285 // IBDA_NetworkProvider interface
286 //
287
288 HRESULT
289 STDMETHODCALLTYPE
290 CNetworkProvider::PutSignalSource(
291 ULONG ulSignalSource)
292 {
293 OutputDebugStringW(L"CNetworkProvider::PutSignalSource : NotImplemented\n");
294 return E_NOTIMPL;
295 }
296
297 HRESULT
298 STDMETHODCALLTYPE
299 CNetworkProvider::GetSignalSource(
300 ULONG *pulSignalSource)
301 {
302 OutputDebugStringW(L"CNetworkProvider::GetSignalSource : NotImplemented\n");
303 return E_NOTIMPL;
304 }
305
306 HRESULT
307 STDMETHODCALLTYPE
308 CNetworkProvider::GetNetworkType(
309 GUID *pguidNetworkType)
310 {
311 OutputDebugStringW(L"CNetworkProvider::GetNetworkType : NotImplemented\n");
312 return E_NOTIMPL;
313 }
314
315 HRESULT
316 STDMETHODCALLTYPE
317 CNetworkProvider::PutTuningSpace(
318 REFGUID guidTuningSpace)
319 {
320 OutputDebugStringW(L"CNetworkProvider::PutTuningSpace : NotImplemented\n");
321 return E_NOTIMPL;
322 }
323
324 HRESULT
325 STDMETHODCALLTYPE
326 CNetworkProvider::GetTuningSpace(
327 GUID *pguidTuingSpace)
328 {
329 OutputDebugStringW(L"CNetworkProvider::GetTuningSpace : NotImplemented\n");
330 return E_NOTIMPL;
331 }
332
333 HRESULT
334 STDMETHODCALLTYPE
335 CNetworkProvider::RegisterDeviceFilter(
336 IUnknown *pUnkFilterControl,
337 ULONG *ppvRegisitrationContext)
338 {
339 OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter : NotImplemented\n");
340 return E_NOTIMPL;
341 }
342
343 HRESULT
344 STDMETHODCALLTYPE
345 CNetworkProvider::UnRegisterDeviceFilter(ULONG pvRegistrationContext)
346 {
347 OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter : NotImplemented\n");
348 return E_NOTIMPL;
349 }
350
351 HRESULT
352 WINAPI
353 CNetworkProvider_fnConstructor(
354 IUnknown *pUnknown,
355 REFIID riid,
356 LPVOID * ppv)
357 {
358 CNetworkProvider * handler = new CNetworkProvider();
359
360 #ifdef MSDVBNP_TRACE
361 WCHAR Buffer[MAX_PATH];
362 LPOLESTR lpstr;
363 StringFromCLSID(riid, &lpstr);
364 swprintf(Buffer, L"CNetworkProvider_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown);
365 OutputDebugStringW(Buffer);
366 #endif
367
368 if (!handler)
369 return E_OUTOFMEMORY;
370
371 if (FAILED(handler->QueryInterface(riid, ppv)))
372 {
373 /* not supported */
374 delete handler;
375 return E_NOINTERFACE;
376 }
377 return NOERROR;
378 }