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

unknown.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS Kernel Streaming
00004  * FILE:            drivers/ksfilter/ks/topoology.c
00005  * PURPOSE:         KS CBaseUnknown functions
00006  * PROGRAMMER:      Johannes Anderwald
00007  *                  KJK::Hyperion
00008  */
00009 
00010 
00011 #include "priv.h"
00012 
00013 #ifdef _X86_
00014 #define KS_DECL_CXX(RET_) extern RET_ __fastcall
00015 #define KS_THIS(CLASS_)   CLASS_ * This, void * dummy_
00016 #else
00017 #define KS_DECL_CXX(RET_) extern RET_ __cdecl
00018 #define KS_THIS(CLASS_)   CLASS_ * This
00019 #endif
00020 
00021 typedef struct
00022 {
00023     INonDelegatedUnknownVtbl *lpVtbl;
00024     IIndirectedUnknownVtbl *lpVtblIndirectedUnknown;
00025 
00026     LONG m_RefCount;
00027 
00028     BOOLEAN m_UsingClassId;
00029     CLSID m_ClassId;
00030     IUnknown* m_UnknownOuter;
00031 
00032 }CBaseUnknownImpl;
00033 
00034 
00035 
00036 NTSTATUS
00037 NTAPI
00038 INonDelegatedUnknown_fnQueryInterface(
00039     INonDelegatedUnknown * iface,
00040     IN  REFIID refiid,
00041     OUT PVOID* Output)
00042 {
00043     CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl);
00044 
00045     if (IsEqualGUIDAligned(refiid, &IID_IUnknown))
00046     {
00047         *Output = &This->lpVtbl;
00048         _InterlockedIncrement(&This->m_RefCount);
00049         return STATUS_SUCCESS;
00050     }
00051     return STATUS_NOINTERFACE;
00052 }
00053 
00054 ULONG
00055 NTAPI
00056 INonDelegatedUnknown_fnAddRef(
00057     INonDelegatedUnknown * iface)
00058 {
00059     CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl);
00060 
00061     return InterlockedIncrement(&This->m_RefCount);
00062 }
00063 
00064 ULONG
00065 NTAPI
00066 INonDelegatedUnknown_fnRelease(
00067     INonDelegatedUnknown * iface)
00068 {
00069     CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl);
00070 
00071     InterlockedDecrement(&This->m_RefCount);
00072 
00073     /* Return new reference count */
00074     return This->m_RefCount;
00075 }
00076 
00077 static INonDelegatedUnknownVtbl vt_INonDelegatedUnknownVtbl =
00078 {
00079     INonDelegatedUnknown_fnQueryInterface,
00080     INonDelegatedUnknown_fnAddRef,
00081     INonDelegatedUnknown_fnRelease
00082 };
00083 
00084 NTSTATUS
00085 NTAPI
00086 IIndirectedUnknown_fnQueryInterface(
00087     IIndirectedUnknown * iface,
00088     IN  REFIID refiid,
00089     OUT PVOID* Output)
00090 {
00091     CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown);
00092 
00093     return This->m_UnknownOuter->lpVtbl->QueryInterface(This->m_UnknownOuter, refiid, Output);
00094 }
00095 
00096 ULONG
00097 NTAPI
00098 IIndirectedUnknown_fnAddRef(
00099     IIndirectedUnknown * iface)
00100 {
00101     CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown);
00102 
00103     return This->m_UnknownOuter->lpVtbl->AddRef(This->m_UnknownOuter);
00104 }
00105 
00106 ULONG
00107 NTAPI
00108 IIndirectedUnknown_fnRelease(
00109     IIndirectedUnknown * iface)
00110 {
00111     CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown);
00112 
00113     return This->m_UnknownOuter->lpVtbl->Release(This->m_UnknownOuter);
00114 }
00115 
00116 static IIndirectedUnknownVtbl vt_IIndirectedUnknownVtbl =
00117 {
00118     IIndirectedUnknown_fnQueryInterface,
00119     IIndirectedUnknown_fnAddRef,
00120     IIndirectedUnknown_fnRelease
00121 };
00122 
00123 
00124 KS_DECL_CXX(CBaseUnknownImpl *) CBaseUnknown_ConstructorWithGUID(KS_THIS(CBaseUnknownImpl), const GUID *lpGUID, IUnknown * OuterUnknown)
00125 {
00126 
00127     This->lpVtbl = &vt_INonDelegatedUnknownVtbl;
00128     This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl;
00129 
00130     /* class uses class id */
00131     This->m_UsingClassId = TRUE;
00132 
00133     /* copy guid */
00134     RtlMoveMemory(&This->m_ClassId, lpGUID, sizeof(GUID));
00135 
00136     /* set refcount to zero */
00137     This->m_RefCount = 0;
00138 
00139     if (OuterUnknown)
00140     {
00141         /* use outer unknown */
00142         This->m_UnknownOuter = OuterUnknown;
00143     }
00144     else
00145     {
00146         /* use unknown from INonDelegatedUnknown */
00147         This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl;
00148     }
00149 
00150     /* return result */
00151     return This;
00152 }
00153 
00154 KS_DECL_CXX(CBaseUnknownImpl *) CBaseUnknown_Constructor(KS_THIS(CBaseUnknownImpl), IUnknown * OuterUnknown)
00155 {
00156 
00157     This->lpVtbl = &vt_INonDelegatedUnknownVtbl;
00158     This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl;
00159 
00160     /* class uses class id */
00161     This->m_UsingClassId = FALSE;
00162 
00163     /* set refcount to zero */
00164     This->m_RefCount = 0;
00165 
00166     if (OuterUnknown)
00167     {
00168         /* use outer unknown */
00169         This->m_UnknownOuter = OuterUnknown;
00170     }
00171     else
00172     {
00173         /* use unknown from INonDelegatedUnknown */
00174         This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl;
00175     }
00176 
00177     /* return result */
00178     return This;
00179 }
00180 
00181 KS_DECL_CXX(VOID) CBaseUnknown_Destructor(KS_THIS(CBaseUnknownImpl), IUnknown * OuterUnknown)
00182 {
00183     /* restore vtbl's */
00184     This->lpVtbl = &vt_INonDelegatedUnknownVtbl;
00185     This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl;
00186 
00187 
00188     if (OuterUnknown)
00189     {
00190         /* use outer unknown */
00191         This->m_UnknownOuter = OuterUnknown;
00192     }
00193     else
00194     {
00195         /* use unknown from INonDelegatedUnknown */
00196         This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl;
00197     }
00198 }
00199 
00200 KS_DECL_CXX(VOID) CBaseUnknown_DefaultDestructor(KS_THIS(CBaseUnknownImpl))
00201 {
00202     /* restore vtbl's */
00203     This->lpVtbl = &vt_INonDelegatedUnknownVtbl;
00204     This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl;
00205 }
00206 

Generated on Sun May 27 2012 04:27:58 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.