xref: /reactos/dll/win32/objsel/factory.c (revision 65ce1461)
1 /*
2  *	ClassFactory implementation for OBJSEL.dll
3  *
4  * Copyright (C) 2002 John K. Hohm
5  * Copyright (C) 2002 Robert Shearman
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21 
22 #include "objsel_private.h"
23 
24 #include "wine/debug.h"
25 
26 WINE_DEFAULT_DEBUG_CHANNEL(objsel);
27 
28 
29 static inline ClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
30 {
31     return CONTAINING_RECORD(iface, ClassFactoryImpl, IClassFactory_iface);
32 }
33 
34 /**********************************************************************
35  * OBJSEL_IClassFactory_QueryInterface (also IUnknown)
36  */
37 static HRESULT WINAPI OBJSEL_IClassFactory_QueryInterface(
38     LPCLASSFACTORY iface,
39     REFIID riid,
40     LPVOID *ppvObj)
41 {
42     TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
43 
44     if (ppvObj == NULL) return E_POINTER;
45 
46     if (IsEqualGUID(riid, &IID_IUnknown) ||
47 	IsEqualGUID(riid, &IID_IClassFactory))
48     {
49         *ppvObj = iface;
50 	IClassFactory_AddRef(iface);
51 	return S_OK;
52     }
53     else if (IsEqualGUID(riid, &IID_IDsObjectPicker))
54     {
55         return IClassFactory_CreateInstance(iface, NULL, riid, ppvObj);
56     }
57 
58     FIXME("- no interface IID: %s\n", debugstr_guid(riid));
59     return E_NOINTERFACE;
60 }
61 
62 
63 /**********************************************************************
64  * OBJSEL_IClassFactory_AddRef (also IUnknown)
65  */
66 static ULONG WINAPI OBJSEL_IClassFactory_AddRef(LPCLASSFACTORY iface)
67 {
68     ClassFactoryImpl *This = impl_from_IClassFactory(iface);
69     ULONG ref;
70 
71     TRACE("\n");
72 
73     if (This == NULL) return E_POINTER;
74 
75     ref = InterlockedIncrement(&This->ref);
76 
77     if (ref == 1)
78     {
79         InterlockedIncrement(&dll_refs);
80     }
81 
82     return ref;
83 }
84 
85 
86 /**********************************************************************
87  * OBJSEL_IClassFactory_Release (also IUnknown)
88  */
89 static ULONG WINAPI OBJSEL_IClassFactory_Release(LPCLASSFACTORY iface)
90 {
91     ClassFactoryImpl *This = impl_from_IClassFactory(iface);
92     ULONG ref;
93 
94     TRACE("\n");
95 
96     if (This == NULL) return E_POINTER;
97 
98     ref = InterlockedDecrement(&This->ref);
99 
100     if (ref == 0)
101     {
102         InterlockedDecrement(&dll_refs);
103     }
104 
105     return ref;
106 }
107 
108 
109 /**********************************************************************
110  * OBJSEL_IClassFactory_CreateInstance
111  */
112 static HRESULT WINAPI OBJSEL_IClassFactory_CreateInstance(
113     LPCLASSFACTORY iface,
114     LPUNKNOWN pUnkOuter,
115     REFIID riid,
116     LPVOID *ppvObj)
117 {
118     TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
119 
120     if (ppvObj == NULL) return E_POINTER;
121 
122     /* Don't support aggregation (Windows doesn't) */
123     if (pUnkOuter != NULL) return CLASS_E_NOAGGREGATION;
124 
125     if (IsEqualGUID(&IID_IDsObjectPicker, riid))
126     {
127         return OBJSEL_IDsObjectPicker_Create(ppvObj);
128     }
129 
130     return CLASS_E_CLASSNOTAVAILABLE;
131 }
132 
133 
134 /**********************************************************************
135  * OBJSEL_IClassFactory_LockServer
136  */
137 static HRESULT WINAPI OBJSEL_IClassFactory_LockServer(
138     LPCLASSFACTORY iface,
139     BOOL fLock)
140 {
141     TRACE("\n");
142 
143     if (fLock)
144         IClassFactory_AddRef(iface);
145     else
146         IClassFactory_Release(iface);
147     return S_OK;
148 }
149 
150 
151 /**********************************************************************
152  * IClassFactory_Vtbl
153  */
154 static IClassFactoryVtbl IClassFactory_Vtbl =
155 {
156     OBJSEL_IClassFactory_QueryInterface,
157     OBJSEL_IClassFactory_AddRef,
158     OBJSEL_IClassFactory_Release,
159     OBJSEL_IClassFactory_CreateInstance,
160     OBJSEL_IClassFactory_LockServer
161 };
162 
163 
164 /**********************************************************************
165  * static ClassFactory instance
166  */
167 
168 ClassFactoryImpl OBJSEL_ClassFactory = { { &IClassFactory_Vtbl }, 0 };
169