2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS BDA Proxy
4 * FILE: dll/directx/bdaplgin/pincontrol.cpp
5 * PURPOSE: ClassFactory interface
7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
13 const GUID KSPROPSETID_BdaPinControl
= {0x0ded49d5, 0xa8b7, 0x4d5d, {0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d}};
14 const GUID IID_IBDA_PinControl
= {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}};
15 const GUID IID_IPin
= {0x56a86891, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}};
19 class CBDAPinControl
: public IBDA_PinControl
22 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
24 STDMETHODIMP_(ULONG
) AddRef()
26 InterlockedIncrement(&m_Ref
);
29 STDMETHODIMP_(ULONG
) Release()
31 InterlockedDecrement(&m_Ref
);
39 // IBDA_PinControl methods
40 HRESULT STDMETHODCALLTYPE
GetPinID(ULONG
*pulPinID
);
41 HRESULT STDMETHODCALLTYPE
GetPinType(ULONG
*pulPinType
);
42 HRESULT STDMETHODCALLTYPE
RegistrationContext(ULONG
*pulRegistrationCtx
);
45 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
){};
46 virtual ~CBDAPinControl()
48 //m_pConnectedPin->Release();
49 //m_pProvider->Release();
55 IBDA_NetworkProvider
* m_pProvider
;
56 IPin
* m_pConnectedPin
;
57 ULONG m_RegistrationCtx
;
62 CBDAPinControl::QueryInterface(
67 if (IsEqualGUID(refiid
, IID_IUnknown
))
69 *Output
= PVOID(this);
70 reinterpret_cast<IUnknown
*>(*Output
)->AddRef();
73 if (IsEqualGUID(refiid
, IID_IBDA_PinControl
))
75 *Output
= (IBDA_PinControl
*)(this);
76 reinterpret_cast<IBDA_PinControl
*>(*Output
)->AddRef();
82 //-------------------------------------------------------------------
83 // IBDA_PinControl methods
87 CBDAPinControl::GetPinID(ULONG
*pulPinID
)
94 Property
.Set
= KSPROPSETID_BdaPinControl
;
95 Property
.Id
= KSPROPERTY_BDA_PIN_ID
;
96 Property
.Flags
= KSPROPERTY_TYPE_GET
;
99 hr
= KsSynchronousDeviceControl(m_Handle
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSPROPERTY
), pulPinID
, sizeof(ULONG
), &BytesReturned
);
101 #ifdef BDAPLGIN_TRACE
103 swprintf(Buffer
, L
"CBDAPinControl::GetPinID: hr %lx pulPinID %lu BytesReturned %lx\n", hr
, *pulPinID
, BytesReturned
);
104 OutputDebugStringW(Buffer
);
112 CBDAPinControl::GetPinType(ULONG
*pulPinType
)
119 Property
.Set
= KSPROPSETID_BdaPinControl
;
120 Property
.Id
= KSPROPERTY_BDA_PIN_TYPE
;
121 Property
.Flags
= KSPROPERTY_TYPE_GET
;
124 hr
= KsSynchronousDeviceControl(m_Handle
, IOCTL_KS_PROPERTY
, (PVOID
)&Property
, sizeof(KSPROPERTY
), pulPinType
, sizeof(ULONG
), &BytesReturned
);
126 #ifdef BDAPLGIN_TRACE
128 swprintf(Buffer
, L
"CBDAPinControl::GetPinType: hr %lx pulPinType %lu BytesReturned %lx\n", hr
, *pulPinType
, BytesReturned
);
129 OutputDebugStringW(Buffer
);
137 CBDAPinControl::RegistrationContext(ULONG
*pulRegistrationCtx
)
139 #ifdef BDAPLGIN_TRACE
140 OutputDebugStringW(L
"CBDAPinControl::RegistrationContext\n");
143 if (!pulRegistrationCtx
)
149 if (m_RegistrationCtx
)
152 *pulRegistrationCtx
= m_RegistrationCtx
;
160 //-------------------------------------------------------------------
162 GetNetworkProviderFromGraph(
163 IFilterGraph
* pGraph
,
164 IBDA_NetworkProvider
** pOutNetworkProvider
)
166 IEnumFilters
*pEnumFilters
= NULL
;
167 IBaseFilter
* ppFilter
[1];
168 IBDA_NetworkProvider
* pNetworkProvider
= NULL
;
171 // get IEnumFilters interface
172 hr
= pGraph
->EnumFilters(&pEnumFilters
);
177 *pOutNetworkProvider
= NULL
;
181 while(pEnumFilters
->Next(1, ppFilter
, NULL
) == S_OK
)
183 // check if that filter supports the IBDA_NetworkProvider interface
184 hr
= ppFilter
[0]->QueryInterface(IID_IBDA_NetworkProvider
, (void**)&pNetworkProvider
);
186 // release IBaseFilter
187 ppFilter
[0]->Release();
193 // release IEnumFilters interface
194 pEnumFilters
->Release();
197 *pOutNetworkProvider
= pNetworkProvider
;
199 if (pNetworkProvider
)
206 CBDAPinControl_RealConstructor(
208 IBDA_NetworkProvider
*pNetworkProvider
,
209 IPin
* pConnectedPin
,
210 ULONG RegistrationCtx
,
211 IUnknown
* pUnkOuter
,
215 CBDAPinControl
* handler
= new CBDAPinControl(hPin
, pNetworkProvider
, pConnectedPin
, RegistrationCtx
);
217 #ifdef BDAPLGIN_TRACE
218 OutputDebugStringW(L
"CBDAPinControl_fnConstructor\n");
222 return E_OUTOFMEMORY
;
224 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
228 return E_NOINTERFACE
;
236 CBDAPinControl_fnConstructor(
237 IUnknown
* pUnkOuter
,
241 IPin
* pConnectedPin
= NULL
;
242 IBDA_NetworkProvider
* pNetworkProvider
= NULL
;
243 HANDLE hFile
= INVALID_HANDLE_VALUE
;
245 IKsObject
* pObject
= NULL
;
247 IUnknown
* pUnknown
= NULL
;
249 FILTER_INFO FilterInfo
;
250 ULONG RegistrationCtx
= 0;
255 OutputDebugStringW(L
"CBDAPinControl_fnConstructor\n");
258 // query for IKsObject interface
259 hr
= pUnkOuter
->QueryInterface(IID_IKsObject
, (void**)&pObject
);
264 // query for IPin interface
265 hr
= pObject
->QueryInterface(IID_IPin
, (void**)&pPin
);
275 hr
= pPin
->QueryPinInfo(&PinInfo
);
285 if (!PinInfo
.pFilter
)
294 assert(PinInfo
.pFilter
!= NULL
);
297 hr
= PinInfo
.pFilter
->QueryFilterInfo(&FilterInfo
);
300 assert(FilterInfo
.pGraph
!= NULL
);
302 // get network provider interface
303 hr
= GetNetworkProviderFromGraph(FilterInfo
.pGraph
, &pNetworkProvider
);
307 if (PinInfo
.dir
== PINDIR_OUTPUT
)
309 // get connected pin handle
310 hr
= pPin
->ConnectedTo(&pConnectedPin
);
314 hFile
= pObject
->KsGetObjectHandle();
317 hr
= CBDAPinControl_RealConstructor(hFile
, pNetworkProvider
, pConnectedPin
, 0, pUnkOuter
, riid
, ppv
);
320 // set to null to prevent releasing
321 pNetworkProvider
= NULL
;
322 pConnectedPin
= NULL
;
327 // expected file handle
334 // get IUnknown from base filter
335 hr
= PinInfo
.pFilter
->QueryInterface(IID_IUnknown
, (void**)&pUnknown
);
338 // register device filter
339 OutputDebugStringW(L
"CBDAPinControl_fnConstructor registering device filter with network provider\n");
340 hr
= pNetworkProvider
->RegisterDeviceFilter(pUnknown
, &RegistrationCtx
);
344 hFile
= pObject
->KsGetObjectHandle();
347 hr
= CBDAPinControl_RealConstructor(hFile
, pNetworkProvider
, NULL
, RegistrationCtx
, pUnkOuter
, riid
, ppv
);
350 // set to null to prevent releasing
351 pNetworkProvider
= NULL
;
356 // expected file handle
363 swprintf(Buffer
, L
"CBDAPinControl_fnConstructor failed to register filter with %lx\n", hr
);
364 OutputDebugStringW(Buffer
);
370 // release IFilterGraph interface
371 FilterInfo
.pGraph
->Release();
373 // release IBaseFilter interface
374 PinInfo
.pFilter
->Release();
383 if (pNetworkProvider
)
385 // release network provider
386 pNetworkProvider
->Release();
391 // release connected pin
392 pConnectedPin
->Release();