Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygennetworkprovider.cpp
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Network Provider for MPEG2 based networks 00004 * FILE: dll/directx/msdvbnp/networkprovider.cpp 00005 * PURPOSE: IBDA_NetworkProvider interface 00006 * 00007 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) 00008 */ 00009 #include "precomp.h" 00010 00011 #define DEVICE_FILTER_MASK (0x80000000) 00012 00013 class CNetworkProvider : public IBaseFilter, 00014 public IAMovieSetup, 00015 public IBDA_NetworkProvider 00016 { 00017 public: 00018 typedef std::vector<IUnknown*>DeviceFilterStack; 00019 00020 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); 00021 00022 STDMETHODIMP_(ULONG) AddRef() 00023 { 00024 InterlockedIncrement(&m_Ref); 00025 return m_Ref; 00026 } 00027 STDMETHODIMP_(ULONG) Release() 00028 { 00029 InterlockedDecrement(&m_Ref); 00030 if (!m_Ref) 00031 { 00032 delete this; 00033 return 0; 00034 } 00035 return m_Ref; 00036 } 00037 00038 // IBaseFilter methods 00039 HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); 00040 HRESULT STDMETHODCALLTYPE Stop( void); 00041 HRESULT STDMETHODCALLTYPE Pause( void); 00042 HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart); 00043 HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State); 00044 HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock); 00045 HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **pClock); 00046 HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum); 00047 HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin); 00048 HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo); 00049 HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName); 00050 HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo); 00051 00052 //IAMovieSetup methods 00053 HRESULT STDMETHODCALLTYPE Register( void); 00054 HRESULT STDMETHODCALLTYPE Unregister( void); 00055 00056 //IBDA_NetworkProvider methods 00057 HRESULT STDMETHODCALLTYPE PutSignalSource(ULONG ulSignalSource); 00058 HRESULT STDMETHODCALLTYPE GetSignalSource(ULONG *pulSignalSource); 00059 HRESULT STDMETHODCALLTYPE GetNetworkType(GUID *pguidNetworkType); 00060 HRESULT STDMETHODCALLTYPE PutTuningSpace(REFGUID guidTuningSpace); 00061 HRESULT STDMETHODCALLTYPE GetTuningSpace(GUID *pguidTuingSpace); 00062 HRESULT STDMETHODCALLTYPE RegisterDeviceFilter(IUnknown *pUnkFilterControl, ULONG *ppvRegisitrationContext); 00063 HRESULT STDMETHODCALLTYPE UnRegisterDeviceFilter(ULONG pvRegistrationContext); 00064 00065 CNetworkProvider(LPCGUID ClassID); 00066 virtual ~CNetworkProvider(){}; 00067 00068 protected: 00069 LONG m_Ref; 00070 IFilterGraph *m_pGraph; 00071 IReferenceClock * m_ReferenceClock; 00072 FILTER_STATE m_FilterState; 00073 IPin * m_Pins[1]; 00074 GUID m_ClassID; 00075 DeviceFilterStack m_DeviceFilters; 00076 IScanningTuner * m_Tuner; 00077 IBDA_IPV6Filter * m_IPV6Filter; 00078 IBDA_IPV4Filter * m_IPV4Filter; 00079 IBDA_EthernetFilter * m_EthernetFilter; 00080 }; 00081 00082 HRESULT 00083 STDMETHODCALLTYPE 00084 CNetworkProvider::QueryInterface( 00085 IN REFIID refiid, 00086 OUT PVOID* Output) 00087 { 00088 ULONG Index; 00089 HRESULT hr; 00090 00091 *Output = NULL; 00092 00093 if (IsEqualGUID(refiid, IID_IUnknown)) 00094 { 00095 *Output = PVOID(this); 00096 reinterpret_cast<IUnknown*>(*Output)->AddRef(); 00097 return NOERROR; 00098 } 00099 if (IsEqualGUID(refiid, IID_IBaseFilter)) 00100 { 00101 *Output = (IBaseFilter*)(this); 00102 reinterpret_cast<IBaseFilter*>(*Output)->AddRef(); 00103 return NOERROR; 00104 } 00105 00106 if (IsEqualGUID(refiid, IID_ITuner) || 00107 IsEqualGUID(refiid, IID_IScanningTuner)) 00108 { 00109 // construct scanning tuner 00110 if (!m_Tuner) 00111 { 00112 HRESULT hr = CScanningTunner_fnConstructor(m_DeviceFilters, refiid, (void**)&m_Tuner); 00113 if (FAILED(hr)) 00114 return hr; 00115 } 00116 m_Tuner->AddRef(); 00117 *Output = (IUnknown*)m_Tuner; 00118 00119 return NOERROR; 00120 } 00121 00122 if (IsEqualGUID(refiid, IID_IBDA_IPV6Filter)) 00123 { 00124 // construct scanning tuner 00125 if (!m_IPV6Filter) 00126 { 00127 HRESULT hr = CIPV6Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_IPV6Filter); 00128 if (FAILED(hr)) 00129 return hr; 00130 } 00131 m_IPV6Filter->AddRef(); 00132 *Output = (IUnknown*)m_IPV6Filter; 00133 00134 return NOERROR; 00135 } 00136 00137 if (IsEqualGUID(refiid, IID_IBDA_IPV4Filter)) 00138 { 00139 // construct scanning tuner 00140 if (!m_IPV4Filter) 00141 { 00142 HRESULT hr = CIPV4Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_IPV4Filter); 00143 if (FAILED(hr)) 00144 return hr; 00145 } 00146 m_IPV4Filter->AddRef(); 00147 *Output = (IUnknown*)m_IPV4Filter; 00148 00149 return NOERROR; 00150 } 00151 00152 if (IsEqualGUID(refiid, IID_IBDA_EthernetFilter)) 00153 { 00154 // construct scanning tuner 00155 if (!m_EthernetFilter) 00156 { 00157 HRESULT hr = CIPV4Filter_fnConstructor((IBDA_NetworkProvider*)this, refiid, (void**)&m_EthernetFilter); 00158 if (FAILED(hr)) 00159 return hr; 00160 } 00161 m_EthernetFilter->AddRef(); 00162 *Output = (IUnknown*)m_EthernetFilter; 00163 00164 return NOERROR; 00165 } 00166 00167 if (IsEqualGUID(refiid, IID_IBDA_NetworkProvider)) 00168 { 00169 *Output = (IBDA_NetworkProvider*)(this); 00170 reinterpret_cast<IBDA_NetworkProvider*>(*Output)->AddRef(); 00171 return NOERROR; 00172 } 00173 00174 for(Index = 0; Index < m_DeviceFilters.size(); Index++) 00175 { 00176 // get device filter 00177 IUnknown *pFilter = m_DeviceFilters[Index]; 00178 00179 if (!pFilter) 00180 continue; 00181 00182 // query for requested interface 00183 hr = pFilter->QueryInterface(refiid, Output); 00184 if (SUCCEEDED(hr)) 00185 { 00186 #ifdef MSDVBNP_TRACE 00187 WCHAR Buffer[MAX_PATH]; 00188 LPOLESTR lpstr; 00189 StringFromCLSID(refiid, &lpstr); 00190 swprintf(Buffer, L"CNetworkProvider::QueryInterface: DeviceFilter %lu supports %s !!!\n", Index, lpstr); 00191 OutputDebugStringW(Buffer); 00192 CoTaskMemFree(lpstr); 00193 #endif 00194 return hr; 00195 } 00196 } 00197 00198 WCHAR Buffer[MAX_PATH]; 00199 LPOLESTR lpstr; 00200 StringFromCLSID(refiid, &lpstr); 00201 swprintf(Buffer, L"CNetworkProvider::QueryInterface: NoInterface for %s !!!\n", lpstr); 00202 OutputDebugStringW(Buffer); 00203 CoTaskMemFree(lpstr); 00204 00205 return E_NOINTERFACE; 00206 } 00207 00208 CNetworkProvider::CNetworkProvider(LPCGUID ClassID) : m_Ref(0), 00209 m_pGraph(0), 00210 m_ReferenceClock(0), 00211 m_FilterState(State_Stopped), 00212 m_DeviceFilters(), 00213 m_Tuner(0), 00214 m_IPV6Filter(0), 00215 m_IPV4Filter(0), 00216 m_EthernetFilter(0) 00217 { 00218 m_Pins[0] = 0; 00219 00220 CopyMemory(&m_ClassID, ClassID, sizeof(GUID)); 00221 }; 00222 00223 //------------------------------------------------------------------- 00224 // IBaseFilter interface 00225 // 00226 00227 HRESULT 00228 STDMETHODCALLTYPE 00229 CNetworkProvider::GetClassID( 00230 CLSID *pClassID) 00231 { 00232 OutputDebugStringW(L"CNetworkProvider::GetClassID\n"); 00233 CopyMemory(&pClassID, &m_ClassID, sizeof(GUID)); 00234 00235 return S_OK; 00236 } 00237 00238 HRESULT 00239 STDMETHODCALLTYPE 00240 CNetworkProvider::Stop() 00241 { 00242 OutputDebugStringW(L"CNetworkProvider::Stop\n"); 00243 m_FilterState = State_Stopped; 00244 return S_OK; 00245 } 00246 00247 HRESULT 00248 STDMETHODCALLTYPE 00249 CNetworkProvider::Pause() 00250 { 00251 OutputDebugStringW(L"CNetworkProvider::Pause\n"); 00252 00253 m_FilterState = State_Paused; 00254 return S_OK; 00255 } 00256 00257 HRESULT 00258 STDMETHODCALLTYPE 00259 CNetworkProvider::Run( 00260 REFERENCE_TIME tStart) 00261 { 00262 OutputDebugStringW(L"CNetworkProvider::Run\n"); 00263 00264 m_FilterState = State_Running; 00265 return S_OK; 00266 } 00267 00268 HRESULT 00269 STDMETHODCALLTYPE 00270 CNetworkProvider::GetState( 00271 DWORD dwMilliSecsTimeout, 00272 FILTER_STATE *State) 00273 { 00274 *State = m_FilterState; 00275 return S_OK; 00276 } 00277 00278 HRESULT 00279 STDMETHODCALLTYPE 00280 CNetworkProvider::SetSyncSource( 00281 IReferenceClock *pClock) 00282 { 00283 if (pClock) 00284 { 00285 pClock->AddRef(); 00286 00287 } 00288 if (m_ReferenceClock) 00289 { 00290 m_ReferenceClock->Release(); 00291 } 00292 00293 m_ReferenceClock = pClock; 00294 return S_OK; 00295 } 00296 00297 HRESULT 00298 STDMETHODCALLTYPE 00299 CNetworkProvider::GetSyncSource( 00300 IReferenceClock **pClock) 00301 { 00302 if (!pClock) 00303 return E_POINTER; 00304 00305 if (m_ReferenceClock) 00306 m_ReferenceClock->AddRef(); 00307 00308 *pClock = m_ReferenceClock; 00309 return S_OK; 00310 } 00311 00312 HRESULT 00313 STDMETHODCALLTYPE 00314 CNetworkProvider::EnumPins( 00315 IEnumPins **ppEnum) 00316 { 00317 if (m_Pins[0] == 0) 00318 { 00319 HRESULT hr = CPin_fnConstructor(NULL, (IBaseFilter*)this, IID_IUnknown, (void**)&m_Pins[0]); 00320 if (FAILED(hr)) 00321 return hr; 00322 } 00323 00324 return CEnumPins_fnConstructor(NULL, 1, m_Pins, IID_IEnumPins, (void**)ppEnum); 00325 } 00326 00327 HRESULT 00328 STDMETHODCALLTYPE 00329 CNetworkProvider::FindPin( 00330 LPCWSTR Id, IPin **ppPin) 00331 { 00332 OutputDebugStringW(L"CNetworkProvider::FindPin : NotImplemented\n"); 00333 return E_NOTIMPL; 00334 } 00335 00336 00337 HRESULT 00338 STDMETHODCALLTYPE 00339 CNetworkProvider::QueryFilterInfo( 00340 FILTER_INFO *pInfo) 00341 { 00342 if (!pInfo) 00343 return E_POINTER; 00344 00345 pInfo->achName[0] = L'\0'; 00346 pInfo->pGraph = m_pGraph; 00347 00348 if (m_pGraph) 00349 m_pGraph->AddRef(); 00350 00351 return S_OK; 00352 } 00353 00354 HRESULT 00355 STDMETHODCALLTYPE 00356 CNetworkProvider::JoinFilterGraph( 00357 IFilterGraph *pGraph, 00358 LPCWSTR pName) 00359 { 00360 if (pGraph) 00361 { 00362 // joining filter graph 00363 m_pGraph = pGraph; 00364 } 00365 else 00366 { 00367 // leaving graph 00368 m_pGraph = 0; 00369 } 00370 00371 OutputDebugStringW(L"CNetworkProvider::JoinFilterGraph\n"); 00372 return S_OK; 00373 } 00374 00375 00376 HRESULT 00377 STDMETHODCALLTYPE 00378 CNetworkProvider::QueryVendorInfo( 00379 LPWSTR *pVendorInfo) 00380 { 00381 return E_NOTIMPL; 00382 } 00383 00384 //------------------------------------------------------------------- 00385 // IAMovieSetup interface 00386 // 00387 00388 HRESULT 00389 STDMETHODCALLTYPE 00390 CNetworkProvider::Register() 00391 { 00392 OutputDebugStringW(L"CNetworkProvider::Register : NotImplemented\n"); 00393 return E_NOTIMPL; 00394 } 00395 00396 HRESULT 00397 STDMETHODCALLTYPE 00398 CNetworkProvider::Unregister() 00399 { 00400 OutputDebugStringW(L"CNetworkProvider::Unregister : NotImplemented\n"); 00401 return E_NOTIMPL; 00402 } 00403 00404 //------------------------------------------------------------------- 00405 // IBDA_NetworkProvider interface 00406 // 00407 00408 HRESULT 00409 STDMETHODCALLTYPE 00410 CNetworkProvider::PutSignalSource( 00411 ULONG ulSignalSource) 00412 { 00413 OutputDebugStringW(L"CNetworkProvider::PutSignalSource : NotImplemented\n"); 00414 return E_NOTIMPL; 00415 } 00416 00417 HRESULT 00418 STDMETHODCALLTYPE 00419 CNetworkProvider::GetSignalSource( 00420 ULONG *pulSignalSource) 00421 { 00422 OutputDebugStringW(L"CNetworkProvider::GetSignalSource : NotImplemented\n"); 00423 return E_NOTIMPL; 00424 } 00425 00426 HRESULT 00427 STDMETHODCALLTYPE 00428 CNetworkProvider::GetNetworkType( 00429 GUID *pguidNetworkType) 00430 { 00431 OutputDebugStringW(L"CNetworkProvider::GetNetworkType : NotImplemented\n"); 00432 return E_NOTIMPL; 00433 } 00434 00435 HRESULT 00436 STDMETHODCALLTYPE 00437 CNetworkProvider::PutTuningSpace( 00438 REFGUID guidTuningSpace) 00439 { 00440 OutputDebugStringW(L"CNetworkProvider::PutTuningSpace : NotImplemented\n"); 00441 return E_NOTIMPL; 00442 } 00443 00444 HRESULT 00445 STDMETHODCALLTYPE 00446 CNetworkProvider::GetTuningSpace( 00447 GUID *pguidTuingSpace) 00448 { 00449 OutputDebugStringW(L"CNetworkProvider::GetTuningSpace : NotImplemented\n"); 00450 return E_NOTIMPL; 00451 } 00452 00453 HRESULT 00454 STDMETHODCALLTYPE 00455 CNetworkProvider::RegisterDeviceFilter( 00456 IUnknown *pUnkFilterControl, 00457 ULONG *ppvRegisitrationContext) 00458 { 00459 HRESULT hr; 00460 IBDA_DeviceControl * pDeviceControl = NULL; 00461 IBDA_Topology *pTopology = NULL; 00462 00463 OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter\n"); 00464 00465 if (!pUnkFilterControl || !ppvRegisitrationContext) 00466 { 00467 //invalid argument 00468 return E_POINTER; 00469 } 00470 00471 // the filter must support IBDA_DeviceControl and IBDA_Topology 00472 hr = pUnkFilterControl->QueryInterface(IID_IBDA_DeviceControl, (void**)&pDeviceControl); 00473 if (FAILED(hr)) 00474 { 00475 OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter Filter does not support IBDA_DeviceControl\n"); 00476 return hr; 00477 } 00478 00479 hr = pUnkFilterControl->QueryInterface(IID_IBDA_Topology, (void**)&pTopology); 00480 if (FAILED(hr)) 00481 { 00482 pDeviceControl->Release(); 00483 OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter Filter does not support IID_IBDA_Topology\n"); 00484 return hr; 00485 } 00486 00487 //TODO 00488 // analyize device filter 00489 00490 // increment reference 00491 pUnkFilterControl->AddRef(); 00492 00493 // release IBDA_DeviceControl interface 00494 pDeviceControl->Release(); 00495 00496 // release IBDA_Topology interface 00497 pTopology->Release(); 00498 00499 // store registration ctx 00500 *ppvRegisitrationContext = (m_DeviceFilters.size() | DEVICE_FILTER_MASK); 00501 00502 // store filter 00503 m_DeviceFilters.push_back(pUnkFilterControl); 00504 00505 OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter complete\n"); 00506 00507 return S_OK; 00508 } 00509 00510 HRESULT 00511 STDMETHODCALLTYPE 00512 CNetworkProvider::UnRegisterDeviceFilter(ULONG pvRegistrationContext) 00513 { 00514 ULONG Index; 00515 IUnknown * pUnknown; 00516 00517 OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter\n"); 00518 00519 if (!(pvRegistrationContext & DEVICE_FILTER_MASK)) 00520 { 00521 // invalid argument 00522 return E_INVALIDARG; 00523 } 00524 00525 // get real index 00526 Index = pvRegistrationContext & ~DEVICE_FILTER_MASK; 00527 00528 if (Index >= m_DeviceFilters.size()) 00529 { 00530 // invalid argument 00531 return E_INVALIDARG; 00532 } 00533 00534 pUnknown = m_DeviceFilters[Index]; 00535 if (!pUnknown) 00536 { 00537 // filter was already de-registered 00538 return E_INVALIDARG; 00539 } 00540 00541 // remove from vector 00542 m_DeviceFilters[Index] = NULL; 00543 00544 // release extra reference 00545 pUnknown->Release(); 00546 00547 return NOERROR; 00548 } 00549 00550 HRESULT 00551 WINAPI 00552 CNetworkProvider_fnConstructor( 00553 IUnknown *pUnknown, 00554 REFIID riid, 00555 LPVOID * ppv) 00556 { 00557 CNetworkProvider * handler = new CNetworkProvider(&CLSID_DVBTNetworkProvider); 00558 00559 #ifdef MSDVBNP_TRACE 00560 WCHAR Buffer[MAX_PATH]; 00561 LPOLESTR lpstr; 00562 StringFromCLSID(riid, &lpstr); 00563 swprintf(Buffer, L"CNetworkProvider_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); 00564 OutputDebugStringW(Buffer); 00565 #endif 00566 00567 if (!handler) 00568 return E_OUTOFMEMORY; 00569 00570 if (FAILED(handler->QueryInterface(riid, ppv))) 00571 { 00572 /* not supported */ 00573 delete handler; 00574 return E_NOINTERFACE; 00575 } 00576 return NOERROR; 00577 } Generated on Sun May 27 2012 04:21:53 for ReactOS by
1.7.6.1
|