oleaut32: Add a helper to return INVOKEKIND flags value.
[wine] / dlls / objsel / objsel.c
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((IClassFactory*)&OBJSEL_ClassFactory, 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, NULL );
79 }
80
81
82 /***********************************************************************
83  *              DllUnregisterServer (OBJSEL.@)
84  */
85 HRESULT WINAPI DllUnregisterServer(void)
86 {
87     return __wine_unregister_resources( hInstance, NULL );
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 /**********************************************************************
103  * OBJSEL_IDsObjectPicker_AddRef (also IUnknown)
104  */
105 static ULONG WINAPI OBJSEL_IDsObjectPicker_AddRef(IDsObjectPicker * iface)
106 {
107     IDsObjectPickerImpl *This = (IDsObjectPickerImpl *)iface;
108     ULONG ref;
109
110     TRACE("\n");
111
112     if (This == NULL) return E_POINTER;
113
114     ref = InterlockedIncrement(&This->ref);
115
116     if (ref == 1)
117     {
118         InterlockedIncrement(&dll_refs);
119     }
120
121     return ref;
122 }
123
124
125 /**********************************************************************
126  * OBJSEL_IDsObjectPicker_Release (also IUnknown)
127  */
128 static ULONG WINAPI OBJSEL_IDsObjectPicker_Release(IDsObjectPicker * iface)
129 {
130     IDsObjectPickerImpl *This = (IDsObjectPickerImpl *)iface;
131     ULONG ref;
132
133     TRACE("\n");
134
135     if (This == NULL) return E_POINTER;
136
137     ref = InterlockedDecrement(&This->ref);
138
139     if (ref == 0)
140     {
141         InterlockedDecrement(&dll_refs);
142         OBJSEL_IDsObjectPicker_Destroy(This);
143     }
144
145     return ref;
146 }
147
148
149 /**********************************************************************
150  * OBJSEL_IDsObjectPicker_QueryInterface (also IUnknown)
151  */
152 static HRESULT WINAPI OBJSEL_IDsObjectPicker_QueryInterface(
153     IDsObjectPicker * iface,
154     REFIID riid,
155     LPVOID *ppvObj)
156 {
157     TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
158
159     if (ppvObj == NULL) return E_POINTER;
160
161     if (IsEqualGUID(riid, &IID_IUnknown) ||
162         IsEqualGUID(riid, &IID_IDsObjectPicker))
163     {
164         *ppvObj = iface;
165         OBJSEL_IDsObjectPicker_AddRef(iface);
166         return S_OK;
167     }
168
169     FIXME("- no interface IID: %s\n", debugstr_guid(riid));
170     return E_NOINTERFACE;
171 }
172
173
174 /**********************************************************************
175  * OBJSEL_IDsObjectPicker_Initialize
176  */
177 static HRESULT WINAPI OBJSEL_IDsObjectPicker_Initialize(
178     IDsObjectPicker * iface,
179     PDSOP_INIT_INFO pInitInfo)
180 {
181     FIXME("stub!\n");
182     return S_OK;
183 }
184
185
186 /**********************************************************************
187  * OBJSEL_IDsObjectPicker_InvokeDialog
188  */
189 static HRESULT WINAPI OBJSEL_IDsObjectPicker_InvokeDialog(
190     IDsObjectPicker * iface,
191     HWND hwndParent,
192     IDataObject** ppdoSelections)
193 {
194     FIXME("stub!\n");
195     return S_FALSE;
196 }
197
198
199 /**********************************************************************
200  * IDsObjectPicker_Vtbl
201  */
202 static IDsObjectPickerVtbl IDsObjectPicker_Vtbl =
203 {
204     OBJSEL_IDsObjectPicker_QueryInterface,
205     OBJSEL_IDsObjectPicker_AddRef,
206     OBJSEL_IDsObjectPicker_Release,
207     OBJSEL_IDsObjectPicker_Initialize,
208     OBJSEL_IDsObjectPicker_InvokeDialog
209 };
210
211
212 /**********************************************************************
213  * OBJSEL_IDsObjectPicker_Create
214  */
215 HRESULT WINAPI OBJSEL_IDsObjectPicker_Create(LPVOID *ppvObj)
216 {
217     IDsObjectPickerImpl *Instance = HeapAlloc(GetProcessHeap(),
218                                               HEAP_ZERO_MEMORY,
219                                               sizeof(IDsObjectPickerImpl));
220     if (Instance != NULL)
221     {
222         Instance->lpVtbl = &IDsObjectPicker_Vtbl;
223         OBJSEL_IDsObjectPicker_AddRef((IDsObjectPicker *)Instance);
224         
225         *ppvObj = Instance;
226         return S_OK;
227     }
228     else
229         return E_OUTOFMEMORY;
230 }