[AMSTREAM] Sync with Wine Staging 3.9. CORE-14656
[reactos.git] / dll / directx / dsound_new / classfactory.c
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