1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Configuration of network devices 4 * FILE: dll/directx/dsound_new/classfactory.c 5 * PURPOSE: IClassFactory implementation 6 * 7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org) 8 */ 9 10 11 #include "precomp.h" 12 13 typedef struct 14 { 15 const IClassFactoryVtbl *lpVtbl; 16 LONG ref; 17 CLSID *rclsid; 18 LPFNCREATEINSTANCE lpfnCI; 19 const IID * riidInst; 20 } IClassFactoryImpl; 21 22 23 static 24 HRESULT 25 WINAPI 26 IClassFactory_fnQueryInterface( 27 LPCLASSFACTORY iface, 28 REFIID riid, 29 LPVOID *ppvObj) 30 { 31 IClassFactoryImpl *This = (IClassFactoryImpl *)iface; 32 33 *ppvObj = NULL; 34 35 /* check requested interface */ 36 if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory)) 37 { 38 *ppvObj = This; 39 InterlockedIncrement(&This->ref); 40 return S_OK; 41 } 42 return E_NOINTERFACE; 43 } 44 45 static 46 ULONG 47 WINAPI 48 IClassFactory_fnAddRef( 49 LPCLASSFACTORY iface) 50 { 51 IClassFactoryImpl *This = (IClassFactoryImpl *)iface; 52 53 /* increment reference count */ 54 ULONG refCount = InterlockedIncrement(&This->ref); 55 56 return refCount; 57 } 58 59 static 60 ULONG 61 WINAPI 62 IClassFactory_fnRelease( 63 LPCLASSFACTORY iface) 64 { 65 IClassFactoryImpl *This = (IClassFactoryImpl *)iface; 66 ULONG refCount = InterlockedDecrement(&This->ref); 67 68 /* decrement reference count */ 69 if (!refCount) 70 { 71 /* free class factory */ 72 CoTaskMemFree(This); 73 return 0; 74 } 75 return refCount; 76 } 77 78 static 79 HRESULT 80 WINAPI 81 IClassFactory_fnCreateInstance( 82 LPCLASSFACTORY iface, 83 LPUNKNOWN pUnkOuter, 84 REFIID riid, 85 LPVOID *ppvObject) 86 { 87 IClassFactoryImpl *This = (IClassFactoryImpl *)iface; 88 89 if (!ppvObject) 90 return E_INVALIDARG; 91 92 *ppvObject = NULL; 93 94 if ( This->riidInst==NULL || IsEqualCLSID(riid, This->riidInst) || IsEqualCLSID(riid, &IID_IUnknown) ) 95 { 96 /* instantiate object */ 97 return This->lpfnCI(pUnkOuter, riid, ppvObject); 98 } 99 100 return E_NOINTERFACE; 101 } 102 103 static 104 HRESULT 105 WINAPI IClassFactory_fnLockServer( 106 LPCLASSFACTORY iface, 107 BOOL fLock) 108 { 109 //IClassFactoryImpl *This = (IClassFactoryImpl *)iface; 110 return E_NOTIMPL; 111 } 112 113 114 static const IClassFactoryVtbl dclfvt = 115 { 116 IClassFactory_fnQueryInterface, 117 IClassFactory_fnAddRef, 118 IClassFactory_fnRelease, 119 IClassFactory_fnCreateInstance, 120 IClassFactory_fnLockServer 121 }; 122 123 124 IClassFactory * 125 IClassFactory_fnConstructor( 126 LPFNCREATEINSTANCE lpfnCI, 127 PLONG pcRefDll, 128 REFIID riidInst) 129 { 130 IClassFactoryImpl* lpclf; 131 132 lpclf = CoTaskMemAlloc(sizeof(IClassFactoryImpl)); 133 lpclf->ref = 1; 134 lpclf->lpVtbl = &dclfvt; 135 lpclf->lpfnCI = lpfnCI; 136 137 if (pcRefDll) 138 InterlockedIncrement(pcRefDll); 139 lpclf->riidInst = riidInst; 140 141 return (LPCLASSFACTORY)lpclf; 142 } 143 144 145