ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

networkprovider.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.