1 /* 2 * Object Picker Dialog 3 * 4 * Copyright 2005 Thomas Weidenmueller <w3seek@reactos.com> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21 #include "objsel_private.h" 22 #include "rpcproxy.h" 23 24 #include "wine/debug.h" 25 26 WINE_DEFAULT_DEBUG_CHANNEL(objsel); 27 28 LONG dll_refs = 0; 29 static HINSTANCE hInstance; 30 31 /*********************************************************************** 32 * DllEntryPoint 33 */ 34 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) 35 { 36 switch(fdwReason) 37 { 38 case DLL_PROCESS_ATTACH: 39 hInstance = hinstDLL; 40 DisableThreadLibraryCalls(hInstance); 41 break; 42 } 43 return TRUE; 44 } 45 46 47 /*********************************************************************** 48 * DllGetClassObject (OBJSEL.@) 49 */ 50 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) 51 { 52 TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); 53 54 *ppv = NULL; 55 56 if (IsEqualGUID(rclsid, &CLSID_DsObjectPicker)) 57 return IClassFactory_QueryInterface(&OBJSEL_ClassFactory.IClassFactory_iface, iid, ppv); 58 59 FIXME("CLSID: %s, IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid)); 60 return CLASS_E_CLASSNOTAVAILABLE; 61 } 62 63 64 /*********************************************************************** 65 * DllCanUnloadNow (OBJSEL.@) 66 */ 67 HRESULT WINAPI DllCanUnloadNow(void) 68 { 69 return dll_refs != 0 ? S_FALSE : S_OK; 70 } 71 72 73 /*********************************************************************** 74 * DllRegisterServer (OBJSEL.@) 75 */ 76 HRESULT WINAPI DllRegisterServer(void) 77 { 78 return __wine_register_resources( hInstance ); 79 } 80 81 82 /*********************************************************************** 83 * DllUnregisterServer (OBJSEL.@) 84 */ 85 HRESULT WINAPI DllUnregisterServer(void) 86 { 87 return __wine_unregister_resources( hInstance ); 88 } 89 90 91 /********************************************************************** 92 * OBJSEL_IDsObjectPicker_Destroy (also IUnknown) 93 */ 94 static VOID OBJSEL_IDsObjectPicker_Destroy(IDsObjectPickerImpl *This) 95 { 96 HeapFree(GetProcessHeap(), 97 0, 98 This); 99 } 100 101 102 static inline IDsObjectPickerImpl *impl_from_IDsObjectPicker(IDsObjectPicker *iface) 103 { 104 return CONTAINING_RECORD(iface, IDsObjectPickerImpl, IDsObjectPicker_iface); 105 } 106 107 /********************************************************************** 108 * OBJSEL_IDsObjectPicker_AddRef (also IUnknown) 109 */ 110 static ULONG WINAPI OBJSEL_IDsObjectPicker_AddRef(IDsObjectPicker * iface) 111 { 112 IDsObjectPickerImpl *This = impl_from_IDsObjectPicker(iface); 113 ULONG ref; 114 115 TRACE("\n"); 116 117 if (This == NULL) return E_POINTER; 118 119 ref = InterlockedIncrement(&This->ref); 120 121 if (ref == 1) 122 { 123 InterlockedIncrement(&dll_refs); 124 } 125 126 return ref; 127 } 128 129 130 /********************************************************************** 131 * OBJSEL_IDsObjectPicker_Release (also IUnknown) 132 */ 133 static ULONG WINAPI OBJSEL_IDsObjectPicker_Release(IDsObjectPicker * iface) 134 { 135 IDsObjectPickerImpl *This = impl_from_IDsObjectPicker(iface); 136 ULONG ref; 137 138 TRACE("\n"); 139 140 if (This == NULL) return E_POINTER; 141 142 ref = InterlockedDecrement(&This->ref); 143 144 if (ref == 0) 145 { 146 InterlockedDecrement(&dll_refs); 147 OBJSEL_IDsObjectPicker_Destroy(This); 148 } 149 150 return ref; 151 } 152 153 154 /********************************************************************** 155 * OBJSEL_IDsObjectPicker_QueryInterface (also IUnknown) 156 */ 157 static HRESULT WINAPI OBJSEL_IDsObjectPicker_QueryInterface( 158 IDsObjectPicker * iface, 159 REFIID riid, 160 LPVOID *ppvObj) 161 { 162 TRACE("\n\tIID:\t%s\n",debugstr_guid(riid)); 163 164 if (ppvObj == NULL) return E_POINTER; 165 166 if (IsEqualGUID(riid, &IID_IUnknown) || 167 IsEqualGUID(riid, &IID_IDsObjectPicker)) 168 { 169 *ppvObj = iface; 170 OBJSEL_IDsObjectPicker_AddRef(iface); 171 return S_OK; 172 } 173 174 FIXME("- no interface IID: %s\n", debugstr_guid(riid)); 175 return E_NOINTERFACE; 176 } 177 178 179 /********************************************************************** 180 * OBJSEL_IDsObjectPicker_Initialize 181 */ 182 static HRESULT WINAPI OBJSEL_IDsObjectPicker_Initialize( 183 IDsObjectPicker * iface, 184 PDSOP_INIT_INFO pInitInfo) 185 { 186 FIXME("stub!\n"); 187 return S_OK; 188 } 189 190 191 /********************************************************************** 192 * OBJSEL_IDsObjectPicker_InvokeDialog 193 */ 194 static HRESULT WINAPI OBJSEL_IDsObjectPicker_InvokeDialog( 195 IDsObjectPicker * iface, 196 HWND hwndParent, 197 IDataObject** ppdoSelections) 198 { 199 FIXME("stub!\n"); 200 return S_FALSE; 201 } 202 203 204 /********************************************************************** 205 * IDsObjectPicker_Vtbl 206 */ 207 static IDsObjectPickerVtbl IDsObjectPicker_Vtbl = 208 { 209 OBJSEL_IDsObjectPicker_QueryInterface, 210 OBJSEL_IDsObjectPicker_AddRef, 211 OBJSEL_IDsObjectPicker_Release, 212 OBJSEL_IDsObjectPicker_Initialize, 213 OBJSEL_IDsObjectPicker_InvokeDialog 214 }; 215 216 217 /********************************************************************** 218 * OBJSEL_IDsObjectPicker_Create 219 */ 220 HRESULT WINAPI OBJSEL_IDsObjectPicker_Create(LPVOID *ppvObj) 221 { 222 IDsObjectPickerImpl *Instance = HeapAlloc(GetProcessHeap(), 223 HEAP_ZERO_MEMORY, 224 sizeof(IDsObjectPickerImpl)); 225 if (Instance != NULL) 226 { 227 Instance->IDsObjectPicker_iface.lpVtbl = &IDsObjectPicker_Vtbl; 228 OBJSEL_IDsObjectPicker_AddRef(&Instance->IDsObjectPicker_iface); 229 230 *ppvObj = Instance; 231 return S_OK; 232 } 233 else 234 return E_OUTOFMEMORY; 235 } 236