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