2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/ksfilter/ks/topoology.c
5 * PURPOSE: KS CBaseUnknown functions
6 * PROGRAMMER: Johannes Anderwald
14 #define KS_DECL_CXX(RET_) extern RET_ __fastcall
15 #define KS_THIS(CLASS_) CLASS_ * This, void * dummy_
17 #define KS_DECL_CXX(RET_) extern RET_ __cdecl
18 #define KS_THIS(CLASS_) CLASS_ * This
23 INonDelegatedUnknownVtbl
*lpVtbl
;
24 IIndirectedUnknownVtbl
*lpVtblIndirectedUnknown
;
28 BOOLEAN m_UsingClassId
;
30 IUnknown
* m_UnknownOuter
;
38 INonDelegatedUnknown_fnQueryInterface(
39 INonDelegatedUnknown
* iface
,
43 CBaseUnknownImpl
* This
= (CBaseUnknownImpl
*)CONTAINING_RECORD(iface
, CBaseUnknownImpl
, lpVtbl
);
45 if (IsEqualGUIDAligned(refiid
, &IID_IUnknown
))
47 *Output
= &This
->lpVtbl
;
48 _InterlockedIncrement(&This
->m_RefCount
);
49 return STATUS_SUCCESS
;
51 return STATUS_NOINTERFACE
;
56 INonDelegatedUnknown_fnAddRef(
57 INonDelegatedUnknown
* iface
)
59 CBaseUnknownImpl
* This
= (CBaseUnknownImpl
*)CONTAINING_RECORD(iface
, CBaseUnknownImpl
, lpVtbl
);
61 return InterlockedIncrement(&This
->m_RefCount
);
66 INonDelegatedUnknown_fnRelease(
67 INonDelegatedUnknown
* iface
)
69 CBaseUnknownImpl
* This
= (CBaseUnknownImpl
*)CONTAINING_RECORD(iface
, CBaseUnknownImpl
, lpVtbl
);
71 InterlockedDecrement(&This
->m_RefCount
);
73 /* Return new reference count */
74 return This
->m_RefCount
;
77 static INonDelegatedUnknownVtbl vt_INonDelegatedUnknownVtbl
=
79 INonDelegatedUnknown_fnQueryInterface
,
80 INonDelegatedUnknown_fnAddRef
,
81 INonDelegatedUnknown_fnRelease
86 IIndirectedUnknown_fnQueryInterface(
87 IIndirectedUnknown
* iface
,
91 CBaseUnknownImpl
* This
= (CBaseUnknownImpl
*)CONTAINING_RECORD(iface
, CBaseUnknownImpl
, lpVtblIndirectedUnknown
);
93 return This
->m_UnknownOuter
->lpVtbl
->QueryInterface(This
->m_UnknownOuter
, refiid
, Output
);
98 IIndirectedUnknown_fnAddRef(
99 IIndirectedUnknown
* iface
)
101 CBaseUnknownImpl
* This
= (CBaseUnknownImpl
*)CONTAINING_RECORD(iface
, CBaseUnknownImpl
, lpVtblIndirectedUnknown
);
103 return This
->m_UnknownOuter
->lpVtbl
->AddRef(This
->m_UnknownOuter
);
108 IIndirectedUnknown_fnRelease(
109 IIndirectedUnknown
* iface
)
111 CBaseUnknownImpl
* This
= (CBaseUnknownImpl
*)CONTAINING_RECORD(iface
, CBaseUnknownImpl
, lpVtblIndirectedUnknown
);
113 return This
->m_UnknownOuter
->lpVtbl
->Release(This
->m_UnknownOuter
);
116 static IIndirectedUnknownVtbl vt_IIndirectedUnknownVtbl
=
118 IIndirectedUnknown_fnQueryInterface
,
119 IIndirectedUnknown_fnAddRef
,
120 IIndirectedUnknown_fnRelease
124 KS_DECL_CXX(CBaseUnknownImpl
*) CBaseUnknown_ConstructorWithGUID(KS_THIS(CBaseUnknownImpl
), const GUID
*lpGUID
, IUnknown
* OuterUnknown
)
127 This
->lpVtbl
= &vt_INonDelegatedUnknownVtbl
;
128 This
->lpVtblIndirectedUnknown
= &vt_IIndirectedUnknownVtbl
;
130 /* class uses class id */
131 This
->m_UsingClassId
= TRUE
;
134 RtlMoveMemory(&This
->m_ClassId
, lpGUID
, sizeof(GUID
));
136 /* set refcount to zero */
137 This
->m_RefCount
= 0;
141 /* use outer unknown */
142 This
->m_UnknownOuter
= OuterUnknown
;
146 /* use unknown from INonDelegatedUnknown */
147 This
->m_UnknownOuter
= (PUNKNOWN
)&This
->lpVtbl
;
154 KS_DECL_CXX(CBaseUnknownImpl
*) CBaseUnknown_Constructor(KS_THIS(CBaseUnknownImpl
), IUnknown
* OuterUnknown
)
157 This
->lpVtbl
= &vt_INonDelegatedUnknownVtbl
;
158 This
->lpVtblIndirectedUnknown
= &vt_IIndirectedUnknownVtbl
;
160 /* class uses class id */
161 This
->m_UsingClassId
= FALSE
;
163 /* set refcount to zero */
164 This
->m_RefCount
= 0;
168 /* use outer unknown */
169 This
->m_UnknownOuter
= OuterUnknown
;
173 /* use unknown from INonDelegatedUnknown */
174 This
->m_UnknownOuter
= (PUNKNOWN
)&This
->lpVtbl
;
181 KS_DECL_CXX(VOID
) CBaseUnknown_Destructor(KS_THIS(CBaseUnknownImpl
), IUnknown
* OuterUnknown
)
184 This
->lpVtbl
= &vt_INonDelegatedUnknownVtbl
;
185 This
->lpVtblIndirectedUnknown
= &vt_IIndirectedUnknownVtbl
;
190 /* use outer unknown */
191 This
->m_UnknownOuter
= OuterUnknown
;
195 /* use unknown from INonDelegatedUnknown */
196 This
->m_UnknownOuter
= (PUNKNOWN
)&This
->lpVtbl
;
200 KS_DECL_CXX(VOID
) CBaseUnknown_DefaultDestructor(KS_THIS(CBaseUnknownImpl
))
203 This
->lpVtbl
= &vt_INonDelegatedUnknownVtbl
;
204 This
->lpVtblIndirectedUnknown
= &vt_IIndirectedUnknownVtbl
;