xref: /reactos/dll/win32/netcfgx/classfactory.c (revision e1ef0787)
1 #include "precomp.h"
2 
3 typedef struct
4 {
5     const IClassFactoryVtbl    *lpVtbl;
6     LONG                       ref;
7     CLSID                      *rclsid;
8     LPFNCREATEINSTANCE         lpfnCI;
9     const IID *                riidInst;
10 } IClassFactoryImpl;
11 
12 
13 static
14 HRESULT
15 WINAPI
16 IClassFactory_fnQueryInterface(
17     LPCLASSFACTORY iface,
18     REFIID riid,
19     LPVOID *ppvObj)
20 {
21     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
22 
23     *ppvObj = NULL;
24     if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory))
25     {
26         *ppvObj = This;
27         InterlockedIncrement(&This->ref);
28         return S_OK;
29     }
30     return E_NOINTERFACE;
31 }
32 
33 static
34 ULONG
35 WINAPI
36 IClassFactory_fnAddRef(
37     LPCLASSFACTORY iface)
38 {
39     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
40     ULONG refCount = InterlockedIncrement(&This->ref);
41 
42     return refCount;
43 }
44 
45 static
46 ULONG
47 WINAPI
48 IClassFactory_fnRelease(
49     LPCLASSFACTORY iface)
50 {
51     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
52     ULONG refCount = InterlockedDecrement(&This->ref);
53 
54     if (!refCount)
55     {
56         CoTaskMemFree(This);
57         return 0;
58     }
59     return refCount;
60 }
61 
62 static
63 HRESULT
64 WINAPI
65 IClassFactory_fnCreateInstance(
66     LPCLASSFACTORY iface,
67     LPUNKNOWN pUnkOuter,
68     REFIID riid,
69     LPVOID *ppvObject)
70 {
71     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
72 
73     *ppvObject = NULL;
74 
75     if ( This->riidInst==NULL || IsEqualCLSID(riid, This->riidInst) || IsEqualCLSID(riid, &IID_IUnknown) )
76     {
77         return This->lpfnCI(pUnkOuter, riid, ppvObject);
78     }
79 
80     return E_NOINTERFACE;
81 }
82 
83 static
84 HRESULT
85 WINAPI IClassFactory_fnLockServer(
86     LPCLASSFACTORY iface,
87     BOOL fLock)
88 {
89     //IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
90     return E_NOTIMPL;
91 }
92 
93 
94 static const IClassFactoryVtbl dclfvt =
95 {
96     IClassFactory_fnQueryInterface,
97     IClassFactory_fnAddRef,
98     IClassFactory_fnRelease,
99     IClassFactory_fnCreateInstance,
100     IClassFactory_fnLockServer
101 };
102 
103 
104 IClassFactory *
105 IClassFactory_fnConstructor(
106     LPFNCREATEINSTANCE lpfnCI,
107     PLONG pcRefDll,
108     REFIID riidInst)
109 {
110     IClassFactoryImpl* lpclf;
111 
112     lpclf = CoTaskMemAlloc(sizeof(IClassFactoryImpl));
113     lpclf->ref = 1;
114     lpclf->lpVtbl = &dclfvt;
115     lpclf->lpfnCI = lpfnCI;
116 
117     if (pcRefDll)
118         InterlockedIncrement(pcRefDll);
119     lpclf->riidInst = riidInst;
120 
121     return (LPCLASSFACTORY)lpclf;
122 }
123 
124 
125