Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpincontrol.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
1.7.6.1
|