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

pincontrol.cpp
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS BDA Proxy
00004  * FILE:            dll/directx/bdaplgin/classfactory.cpp
00005  * PURPOSE:         ClassFactory interface
00006  *
00007  * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
00008  */
00009 
00010 #include "precomp.h"
00011 
00012 #ifndef _MSC_VER
00013 const GUID KSPROPSETID_BdaPinControl = {0x0ded49d5, 0xa8b7, 0x4d5d, {0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d}};
00014 const GUID IID_IBDA_PinControl       = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
00015 const GUID IID_IPin = {0x56a86891, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
00016 #endif
00017 
00018 
00019 class CBDAPinControl : public IBDA_PinControl
00020 {
00021 public:
00022     STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
00023 
00024     STDMETHODIMP_(ULONG) AddRef()
00025     {
00026         InterlockedIncrement(&m_Ref);
00027         return m_Ref;
00028     }
00029     STDMETHODIMP_(ULONG) Release()
00030     {
00031         InterlockedDecrement(&m_Ref);
00032         if (!m_Ref)
00033         {
00034             delete this;
00035             return 0;
00036         }
00037         return m_Ref;
00038     }
00039     // IBDA_PinControl methods
00040     HRESULT STDMETHODCALLTYPE GetPinID(ULONG *pulPinID);
00041     HRESULT STDMETHODCALLTYPE GetPinType(ULONG *pulPinType);
00042     HRESULT STDMETHODCALLTYPE RegistrationContext(ULONG *pulRegistrationCtx);
00043 
00044 
00045     CBDAPinControl(HANDLE hFile, IBDA_NetworkProvider * pProvider, IPin * pConnectedPin, ULONG RegistrationCtx) : m_Ref(0), m_Handle(hFile), m_pProvider(pProvider), m_pConnectedPin(pConnectedPin), m_RegistrationCtx(RegistrationCtx){};
00046     virtual ~CBDAPinControl()
00047     {
00048         //m_pConnectedPin->Release();
00049         //m_pProvider->Release();
00050     };
00051 
00052 protected:
00053     LONG m_Ref;
00054     HANDLE m_Handle;
00055     IBDA_NetworkProvider * m_pProvider;
00056     IPin * m_pConnectedPin;
00057     ULONG m_RegistrationCtx;
00058 };
00059 
00060 HRESULT
00061 STDMETHODCALLTYPE
00062 CBDAPinControl::QueryInterface(
00063     IN  REFIID refiid,
00064     OUT PVOID* Output)
00065 {
00066     *Output = NULL;
00067     if (IsEqualGUID(refiid, IID_IUnknown))
00068     {
00069         *Output = PVOID(this);
00070         reinterpret_cast<IUnknown*>(*Output)->AddRef();
00071         return NOERROR;
00072     }
00073     if (IsEqualGUID(refiid, IID_IBDA_PinControl))
00074     {
00075         *Output = (IBDA_PinControl*)(this);
00076         reinterpret_cast<IBDA_PinControl*>(*Output)->AddRef();
00077         return NOERROR;
00078     }
00079 DebugBreak();
00080     return E_NOINTERFACE;
00081 }
00082 //-------------------------------------------------------------------
00083 // IBDA_PinControl methods
00084 //
00085 HRESULT
00086 STDMETHODCALLTYPE
00087 CBDAPinControl::GetPinID(ULONG *pulPinID)
00088 {
00089     KSPROPERTY Property;
00090     ULONG BytesReturned;
00091     HRESULT hr;
00092 
00093     // setup request
00094     Property.Set = KSPROPSETID_BdaPinControl;
00095     Property.Id = KSPROPERTY_BDA_PIN_ID;
00096     Property.Flags = KSPROPERTY_TYPE_GET;
00097 
00098     // perform request
00099     hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), pulPinID, sizeof(ULONG), &BytesReturned);
00100 
00101 #ifdef BDAPLGIN_TRACE
00102     WCHAR Buffer[100];
00103     swprintf(Buffer, L"CBDAPinControl::GetPinID: hr %lx pulPinID %lu BytesReturned %lx\n", hr, *pulPinID, BytesReturned);
00104     OutputDebugStringW(Buffer);
00105 #endif
00106 
00107     return hr;
00108 }
00109 
00110 HRESULT
00111 STDMETHODCALLTYPE
00112 CBDAPinControl::GetPinType(ULONG *pulPinType)
00113 {
00114     KSPROPERTY Property;
00115     ULONG BytesReturned;
00116     HRESULT hr;
00117 
00118     // setup request
00119     Property.Set = KSPROPSETID_BdaPinControl;
00120     Property.Id = KSPROPERTY_BDA_PIN_TYPE;
00121     Property.Flags = KSPROPERTY_TYPE_GET;
00122 
00123     // perform request
00124     hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), pulPinType, sizeof(ULONG), &BytesReturned);
00125 
00126 #ifdef BDAPLGIN_TRACE
00127     WCHAR Buffer[100];
00128     swprintf(Buffer, L"CBDAPinControl::GetPinType: hr %lx pulPinType %lu BytesReturned %lx\n", hr, *pulPinType, BytesReturned);
00129     OutputDebugStringW(Buffer);
00130 #endif
00131 
00132     return hr;
00133 }
00134 
00135 HRESULT
00136 STDMETHODCALLTYPE
00137 CBDAPinControl::RegistrationContext(ULONG *pulRegistrationCtx)
00138 {
00139 #ifdef BDAPLGIN_TRACE
00140     OutputDebugStringW(L"CBDAPinControl::RegistrationContext\n");
00141 #endif
00142 
00143     if (!pulRegistrationCtx)
00144     {
00145         // invalid argument
00146         return E_POINTER;
00147     }
00148 
00149     if (m_RegistrationCtx)
00150     {
00151         // is registered
00152         *pulRegistrationCtx = m_RegistrationCtx;
00153         return NOERROR;
00154     }
00155 
00156     //pin not registered
00157     return E_FAIL;
00158 }
00159 
00160 //-------------------------------------------------------------------
00161 HRESULT
00162 GetNetworkProviderFromGraph(
00163     IFilterGraph * pGraph,
00164     IBDA_NetworkProvider ** pOutNetworkProvider)
00165 {
00166     IEnumFilters *pEnumFilters = NULL;
00167     IBaseFilter * ppFilter[1];
00168     IBDA_NetworkProvider * pNetworkProvider = NULL;
00169     HRESULT hr;
00170 
00171     // get IEnumFilters interface
00172     hr = pGraph->EnumFilters(&pEnumFilters);
00173 
00174     if (FAILED(hr))
00175     {
00176         //clean up
00177         *pOutNetworkProvider = NULL;
00178         return hr;
00179     }
00180 
00181     while(pEnumFilters->Next(1, ppFilter, NULL) == S_OK)
00182     {
00183         // check if that filter supports the IBDA_NetworkProvider interface
00184         hr = ppFilter[0]->QueryInterface(IID_IBDA_NetworkProvider, (void**)&pNetworkProvider);
00185 
00186         // release IBaseFilter
00187         ppFilter[0]->Release();
00188 
00189         if (SUCCEEDED(hr))
00190             break;
00191     }
00192 
00193     // release IEnumFilters interface
00194     pEnumFilters->Release();
00195 
00196     //store result
00197     *pOutNetworkProvider = pNetworkProvider;
00198 
00199     if (pNetworkProvider)
00200         return S_OK;
00201     else
00202         return E_FAIL;
00203 }
00204 
00205 HRESULT
00206 CBDAPinControl_RealConstructor(
00207     HANDLE hPin,
00208     IBDA_NetworkProvider *pNetworkProvider,
00209     IPin * pConnectedPin,
00210     ULONG RegistrationCtx,
00211     IUnknown * pUnkOuter,
00212     REFIID riid,
00213     LPVOID * ppv)
00214 {
00215     CBDAPinControl * handler = new CBDAPinControl(hPin, pNetworkProvider, pConnectedPin, RegistrationCtx);
00216 
00217 #ifdef BDAPLGIN_TRACE
00218     OutputDebugStringW(L"CBDAPinControl_fnConstructor\n");
00219 #endif
00220 
00221     if (!handler)
00222         return E_OUTOFMEMORY;
00223 
00224     if (FAILED(handler->QueryInterface(riid, ppv)))
00225     {
00226         /* not supported */
00227         delete handler;
00228         return E_NOINTERFACE;
00229     }
00230 
00231     return NOERROR;
00232 }
00233 
00234 HRESULT
00235 WINAPI
00236 CBDAPinControl_fnConstructor(
00237     IUnknown * pUnkOuter,
00238     REFIID riid,
00239     LPVOID * ppv)
00240 {
00241     IPin * pConnectedPin = NULL;
00242     IBDA_NetworkProvider * pNetworkProvider = NULL;
00243     HANDLE hFile = INVALID_HANDLE_VALUE;
00244     HRESULT hr;
00245     IKsObject * pObject = NULL;
00246     IPin * pPin = NULL;
00247     IUnknown * pUnknown = NULL;
00248     PIN_INFO PinInfo;
00249     FILTER_INFO FilterInfo;
00250     ULONG RegistrationCtx = 0;
00251 
00252     if (!pUnkOuter)
00253         return E_POINTER;
00254 
00255     OutputDebugStringW(L"CBDAPinControl_fnConstructor\n");
00256     //DebugBreak();
00257 
00258     // query for IKsObject interface
00259     hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject);
00260 
00261     if (FAILED(hr))
00262         return hr;
00263 
00264     // query for IPin interface
00265     hr = pObject->QueryInterface(IID_IPin, (void**)&pPin);
00266 
00267     if (FAILED(hr))
00268     {
00269         //clean up
00270        pObject->Release();
00271        return hr;
00272     }
00273 
00274     // get pin info
00275     hr = pPin->QueryPinInfo(&PinInfo);
00276 
00277     if (FAILED(hr))
00278     {
00279         //clean up
00280        pObject->Release();
00281        pPin->Release();
00282        return hr;
00283     }
00284 
00285     if (!PinInfo.pFilter)
00286     {
00287         //clean up
00288        pObject->Release();
00289        pPin->Release();
00290        return hr;
00291     }
00292 
00293     // sanity checks
00294     assert(PinInfo.pFilter != NULL);
00295 
00296     // query filter info
00297     hr = PinInfo.pFilter->QueryFilterInfo(&FilterInfo);
00298 
00299     // sanity check
00300     assert(FilterInfo.pGraph != NULL);
00301 
00302     // get network provider interface
00303     hr = GetNetworkProviderFromGraph(FilterInfo.pGraph, &pNetworkProvider);
00304 
00305     if (SUCCEEDED(hr))
00306     {
00307         if (PinInfo.dir == PINDIR_OUTPUT)
00308         {
00309             // get connected pin handle
00310             hr = pPin->ConnectedTo(&pConnectedPin);
00311             if (SUCCEEDED(hr))
00312             {
00313                 // get file handle
00314                 hFile = pObject->KsGetObjectHandle();
00315                 if (hFile)
00316                 {
00317                     hr = CBDAPinControl_RealConstructor(hFile, pNetworkProvider, pConnectedPin, 0, pUnkOuter, riid, ppv);
00318                     if (SUCCEEDED(hr))
00319                     {
00320                         // set to null to prevent releasing
00321                         pNetworkProvider = NULL;
00322                         pConnectedPin = NULL;
00323                     }
00324                 }
00325                 else
00326                 {
00327                     // expected file handle
00328                     hr = E_UNEXPECTED;
00329                 }
00330             }
00331         }
00332         else
00333         {
00334             // get IUnknown from base filter
00335             hr = PinInfo.pFilter->QueryInterface(IID_IUnknown, (void**)&pUnknown);
00336             if (SUCCEEDED(hr))
00337             {
00338                 // register device filter
00339                 OutputDebugStringW(L"CBDAPinControl_fnConstructor registering device filter with network provider\n");
00340                 hr = pNetworkProvider->RegisterDeviceFilter(pUnknown, &RegistrationCtx);
00341                 if (SUCCEEDED(hr))
00342                 {
00343                     // get file handle
00344                     hFile = pObject->KsGetObjectHandle();
00345                     if (hFile)
00346                     {
00347                         hr = CBDAPinControl_RealConstructor(hFile, pNetworkProvider, NULL, RegistrationCtx, pUnkOuter, riid, ppv);
00348                         if (SUCCEEDED(hr))
00349                         {
00350                             // set to null to prevent releasing
00351                             pNetworkProvider = NULL;
00352                         }
00353                     }
00354                     else
00355                     {
00356                         // expected file handle
00357                         hr = E_UNEXPECTED;
00358                     }
00359                 }
00360                 else
00361                 {
00362                     WCHAR Buffer[100];
00363                     swprintf(Buffer, L"CBDAPinControl_fnConstructor failed to register filter with %lx\n", hr);
00364                     OutputDebugStringW(Buffer);
00365                 }
00366             }
00367         }
00368     }
00369 
00370     // release IFilterGraph interface
00371     FilterInfo.pGraph->Release();
00372 
00373     // release IBaseFilter interface
00374     PinInfo.pFilter->Release();
00375 
00376     // release IPin 
00377     pPin->Release();
00378 
00379     // release IKsObject
00380     pObject->Release();
00381 
00382 
00383     if (pNetworkProvider)
00384     {
00385         // release network provider
00386         pNetworkProvider->Release();
00387     }
00388 
00389     if (pConnectedPin)
00390     {
00391         // release connected pin
00392         pConnectedPin->Release();
00393     }
00394 
00395     if (pUnknown)
00396     {
00397         // release filter
00398         pUnknown->Release();
00399     }
00400 
00401     return hr;
00402 }

Generated on Sat May 26 2012 04:19:49 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.