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
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
11 #define DEVICE_FILTER_MASK (0x80000000)
13 class CNetworkProvider
: public IBaseFilter
,
15 public IBDA_NetworkProvider
18 typedef std::vector
<IUnknown
*>DeviceFilterStack
;
20 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
22 STDMETHODIMP_(ULONG
) AddRef()
24 InterlockedIncrement(&m_Ref
);
27 STDMETHODIMP_(ULONG
) Release()
29 InterlockedDecrement(&m_Ref
);
38 // IBaseFilter methods
39 HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
40 HRESULT STDMETHODCALLTYPE
Stop( void);
41 HRESULT STDMETHODCALLTYPE
Pause( void);
42 HRESULT STDMETHODCALLTYPE
Run(REFERENCE_TIME tStart
);
43 HRESULT STDMETHODCALLTYPE
GetState(DWORD dwMilliSecsTimeout
, FILTER_STATE
*State
);
44 HRESULT STDMETHODCALLTYPE
SetSyncSource(IReferenceClock
*pClock
);
45 HRESULT STDMETHODCALLTYPE
GetSyncSource(IReferenceClock
**pClock
);
46 HRESULT STDMETHODCALLTYPE
EnumPins(IEnumPins
**ppEnum
);
47 HRESULT STDMETHODCALLTYPE
FindPin(LPCWSTR Id
, IPin
**ppPin
);
48 HRESULT STDMETHODCALLTYPE
QueryFilterInfo(FILTER_INFO
*pInfo
);
49 HRESULT STDMETHODCALLTYPE
JoinFilterGraph(IFilterGraph
*pGraph
, LPCWSTR pName
);
50 HRESULT STDMETHODCALLTYPE
QueryVendorInfo(LPWSTR
*pVendorInfo
);
52 //IAMovieSetup methods
53 HRESULT STDMETHODCALLTYPE
Register( void);
54 HRESULT STDMETHODCALLTYPE
Unregister( void);
56 //IBDA_NetworkProvider methods
57 HRESULT STDMETHODCALLTYPE
PutSignalSource(ULONG ulSignalSource
);
58 HRESULT STDMETHODCALLTYPE
GetSignalSource(ULONG
*pulSignalSource
);
59 HRESULT STDMETHODCALLTYPE
GetNetworkType(GUID
*pguidNetworkType
);
60 HRESULT STDMETHODCALLTYPE
PutTuningSpace(REFGUID guidTuningSpace
);
61 HRESULT STDMETHODCALLTYPE
GetTuningSpace(GUID
*pguidTuingSpace
);
62 HRESULT STDMETHODCALLTYPE
RegisterDeviceFilter(IUnknown
*pUnkFilterControl
, ULONG
*ppvRegisitrationContext
);
63 HRESULT STDMETHODCALLTYPE
UnRegisterDeviceFilter(ULONG pvRegistrationContext
);
65 CNetworkProvider(LPCGUID ClassID
);
66 virtual ~CNetworkProvider(){};
70 IFilterGraph
*m_pGraph
;
71 IReferenceClock
* m_ReferenceClock
;
72 FILTER_STATE m_FilterState
;
75 DeviceFilterStack m_DeviceFilters
;
76 IScanningTuner
* m_Tuner
;
81 CNetworkProvider::QueryInterface(
90 if (IsEqualGUID(refiid
, IID_IUnknown
))
92 *Output
= PVOID(this);
93 reinterpret_cast<IUnknown
*>(*Output
)->AddRef();
96 if (IsEqualGUID(refiid
, IID_IBaseFilter
))
98 *Output
= (IBaseFilter
*)(this);
99 reinterpret_cast<IBaseFilter
*>(*Output
)->AddRef();
103 if (IsEqualGUID(refiid
, IID_ITuner
) ||
104 IsEqualGUID(refiid
, IID_IScanningTuner
))
106 // construct scanning tuner
109 HRESULT hr
= CScanningTunner_fnConstructor(m_DeviceFilters
, refiid
, (void**)&m_Tuner
);
114 *Output
= (IUnknown
*)m_Tuner
;
119 if (IsEqualGUID(refiid
, IID_IBDA_NetworkProvider
))
121 *Output
= (IBDA_NetworkProvider
*)(this);
122 reinterpret_cast<IBDA_NetworkProvider
*>(*Output
)->AddRef();
126 for(Index
= 0; Index
< m_DeviceFilters
.size(); Index
++)
129 IUnknown
*pFilter
= m_DeviceFilters
[Index
];
134 // query for requested interface
135 hr
= pFilter
->QueryInterface(refiid
, Output
);
139 WCHAR Buffer
[MAX_PATH
];
141 StringFromCLSID(refiid
, &lpstr
);
142 swprintf(Buffer
, L
"CNetworkProvider::QueryInterface: DeviceFilter %lu supports %s !!!\n", Index
, lpstr
);
143 OutputDebugStringW(Buffer
);
144 CoTaskMemFree(lpstr
);
150 WCHAR Buffer
[MAX_PATH
];
152 StringFromCLSID(refiid
, &lpstr
);
153 swprintf(Buffer
, L
"CNetworkProvider::QueryInterface: NoInterface for %s !!!\n", lpstr
);
154 OutputDebugStringW(Buffer
);
155 CoTaskMemFree(lpstr
);
158 return E_NOINTERFACE
;
161 CNetworkProvider::CNetworkProvider(LPCGUID ClassID
) : m_Ref(0),
164 m_FilterState(State_Stopped
),
170 CopyMemory(&m_ClassID
, ClassID
, sizeof(GUID
));
173 //-------------------------------------------------------------------
174 // IBaseFilter interface
179 CNetworkProvider::GetClassID(
182 OutputDebugStringW(L
"CNetworkProvider::GetClassID\n");
183 CopyMemory(&pClassID
, &m_ClassID
, sizeof(GUID
));
190 CNetworkProvider::Stop()
192 OutputDebugStringW(L
"CNetworkProvider::Stop\n");
193 m_FilterState
= State_Stopped
;
199 CNetworkProvider::Pause()
201 OutputDebugStringW(L
"CNetworkProvider::Pause\n");
203 m_FilterState
= State_Paused
;
209 CNetworkProvider::Run(
210 REFERENCE_TIME tStart
)
212 OutputDebugStringW(L
"CNetworkProvider::Run\n");
214 m_FilterState
= State_Running
;
220 CNetworkProvider::GetState(
221 DWORD dwMilliSecsTimeout
,
224 *State
= m_FilterState
;
230 CNetworkProvider::SetSyncSource(
231 IReferenceClock
*pClock
)
238 if (m_ReferenceClock
)
240 m_ReferenceClock
->Release();
243 m_ReferenceClock
= pClock
;
249 CNetworkProvider::GetSyncSource(
250 IReferenceClock
**pClock
)
255 if (m_ReferenceClock
)
256 m_ReferenceClock
->AddRef();
258 *pClock
= m_ReferenceClock
;
264 CNetworkProvider::EnumPins(
269 HRESULT hr
= CPin_fnConstructor(NULL
, (IBaseFilter
*)this, IID_IUnknown
, (void**)&m_Pins
[0]);
274 return CEnumPins_fnConstructor(NULL
, 1, m_Pins
, IID_IEnumPins
, (void**)ppEnum
);
279 CNetworkProvider::FindPin(
280 LPCWSTR Id
, IPin
**ppPin
)
282 OutputDebugStringW(L
"CNetworkProvider::FindPin : NotImplemented\n");
289 CNetworkProvider::QueryFilterInfo(
295 pInfo
->achName
[0] = L
'\0';
296 pInfo
->pGraph
= m_pGraph
;
306 CNetworkProvider::JoinFilterGraph(
307 IFilterGraph
*pGraph
,
312 // joining filter graph
321 OutputDebugStringW(L
"CNetworkProvider::JoinFilterGraph\n");
328 CNetworkProvider::QueryVendorInfo(
334 //-------------------------------------------------------------------
335 // IAMovieSetup interface
340 CNetworkProvider::Register()
342 OutputDebugStringW(L
"CNetworkProvider::Register : NotImplemented\n");
348 CNetworkProvider::Unregister()
350 OutputDebugStringW(L
"CNetworkProvider::Unregister : NotImplemented\n");
354 //-------------------------------------------------------------------
355 // IBDA_NetworkProvider interface
360 CNetworkProvider::PutSignalSource(
361 ULONG ulSignalSource
)
363 OutputDebugStringW(L
"CNetworkProvider::PutSignalSource : NotImplemented\n");
369 CNetworkProvider::GetSignalSource(
370 ULONG
*pulSignalSource
)
372 OutputDebugStringW(L
"CNetworkProvider::GetSignalSource : NotImplemented\n");
378 CNetworkProvider::GetNetworkType(
379 GUID
*pguidNetworkType
)
381 OutputDebugStringW(L
"CNetworkProvider::GetNetworkType : NotImplemented\n");
387 CNetworkProvider::PutTuningSpace(
388 REFGUID guidTuningSpace
)
390 OutputDebugStringW(L
"CNetworkProvider::PutTuningSpace : NotImplemented\n");
396 CNetworkProvider::GetTuningSpace(
397 GUID
*pguidTuingSpace
)
399 OutputDebugStringW(L
"CNetworkProvider::GetTuningSpace : NotImplemented\n");
405 CNetworkProvider::RegisterDeviceFilter(
406 IUnknown
*pUnkFilterControl
,
407 ULONG
*ppvRegisitrationContext
)
410 IBDA_DeviceControl
* pDeviceControl
= NULL
;
411 IBDA_Topology
*pTopology
= NULL
;
413 OutputDebugStringW(L
"CNetworkProvider::RegisterDeviceFilter\n");
415 if (!pUnkFilterControl
|| !ppvRegisitrationContext
)
421 // the filter must support IBDA_DeviceControl and IBDA_Topology
422 hr
= pUnkFilterControl
->QueryInterface(IID_IBDA_DeviceControl
, (void**)&pDeviceControl
);
425 OutputDebugStringW(L
"CNetworkProvider::RegisterDeviceFilter Filter does not support IBDA_DeviceControl\n");
429 hr
= pUnkFilterControl
->QueryInterface(IID_IBDA_Topology
, (void**)&pTopology
);
432 pDeviceControl
->Release();
433 OutputDebugStringW(L
"CNetworkProvider::RegisterDeviceFilter Filter does not support IID_IBDA_Topology\n");
438 // analyize device filter
440 // increment reference
441 pUnkFilterControl
->AddRef();
443 // release IBDA_DeviceControl interface
444 pDeviceControl
->Release();
446 // release IBDA_Topology interface
447 pTopology
->Release();
449 // store registration ctx
450 *ppvRegisitrationContext
= (m_DeviceFilters
.size() | DEVICE_FILTER_MASK
);
453 m_DeviceFilters
.push_back(pUnkFilterControl
);
455 OutputDebugStringW(L
"CNetworkProvider::RegisterDeviceFilter complete\n");
462 CNetworkProvider::UnRegisterDeviceFilter(ULONG pvRegistrationContext
)
467 OutputDebugStringW(L
"CNetworkProvider::UnRegisterDeviceFilter\n");
469 if (!(pvRegistrationContext
& DEVICE_FILTER_MASK
))
476 Index
= pvRegistrationContext
& ~DEVICE_FILTER_MASK
;
478 if (Index
>= m_DeviceFilters
.size())
484 pUnknown
= m_DeviceFilters
[Index
];
487 // filter was already de-registered
491 // remove from vector
492 m_DeviceFilters
[Index
] = NULL
;
494 // release extra reference
502 CNetworkProvider_fnConstructor(
507 CNetworkProvider
* handler
= new CNetworkProvider(&CLSID_DVBTNetworkProvider
);
510 WCHAR Buffer
[MAX_PATH
];
512 StringFromCLSID(riid
, &lpstr
);
513 swprintf(Buffer
, L
"CNetworkProvider_fnConstructor riid %s pUnknown %p\n", lpstr
, pUnknown
);
514 OutputDebugStringW(Buffer
);
518 return E_OUTOFMEMORY
;
520 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
524 return E_NOINTERFACE
;