ReactOS 0.4.16-dev-2491-g3dc6630
uia_main.c
Go to the documentation of this file.
1/*
2 * Copyright 2017 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#define COBJMACROS
20
21#include "combaseapi.h"
22#include "initguid.h"
23#include "uia_private.h"
24
25#include "wine/debug.h"
26
28
30
32{
35
38};
39
41{
43}
44
46 REFIID riid, void **ppv)
47{
49 return IUnknown_QueryInterface(wrapper->marshal_object, riid, ppv);
50}
51
53{
56
57 TRACE("%p, refcount %ld\n", iface, refcount);
58
59 return refcount;
60}
61
63{
66
67 TRACE("%p, refcount %ld\n", iface, refcount);
68 if (!refcount)
69 {
70 IUnknown_Release(wrapper->marshaler);
71 free(wrapper);
72 }
73
74 return refcount;
75}
76
77static const IUnknownVtbl uia_object_wrapper_vtbl = {
81};
82
83/*
84 * When passing the ReservedNotSupportedValue/ReservedMixedAttributeValue
85 * interface pointers across apartments within the same process, create a free
86 * threaded marshaler so that the pointer value is preserved.
87 */
89{
90 struct uia_object_wrapper *wrapper;
91 HRESULT hr;
92
93 TRACE("%p, %p\n", reserved, ppv);
94
95 wrapper = calloc(1, sizeof(*wrapper));
96 if (!wrapper)
97 return E_OUTOFMEMORY;
98
99 wrapper->IUnknown_iface.lpVtbl = &uia_object_wrapper_vtbl;
100 wrapper->marshal_object = reserved;
101 wrapper->refcount = 1;
102
104 {
105 free(wrapper);
106 return hr;
107 }
108
109 hr = IUnknown_QueryInterface(wrapper->marshaler, &IID_IMarshal, ppv);
110 IUnknown_Release(&wrapper->IUnknown_iface);
111
112 return hr;
113}
114
115/*
116 * UiaReservedNotSupportedValue/UiaReservedMixedAttributeValue object.
117 */
119 REFIID riid, void **ppv)
120{
121 *ppv = NULL;
123 *ppv = iface;
124 else if (IsEqualIID(riid, &IID_IMarshal))
125 return create_uia_object_wrapper(iface, ppv);
126 else
127 return E_NOINTERFACE;
128
129 return S_OK;
130}
131
133{
134 return 1;
135}
136
138{
139 return 1;
140}
141
142static const IUnknownVtbl uia_reserved_obj_vtbl = {
146};
147
150
151/*
152 * UiaHostProviderFromHwnd IRawElementProviderSimple interface.
153 */
155 IRawElementProviderSimple IRawElementProviderSimple_iface;
157
159};
160
161static inline struct hwnd_host_provider *impl_from_hwnd_host_provider(IRawElementProviderSimple *iface)
162{
164}
165
166HRESULT WINAPI hwnd_host_provider_QueryInterface(IRawElementProviderSimple *iface, REFIID riid, void **ppv)
167{
168 *ppv = NULL;
169 if (IsEqualIID(riid, &IID_IRawElementProviderSimple) || IsEqualIID(riid, &IID_IUnknown))
170 *ppv = iface;
171 else
172 return E_NOINTERFACE;
173
174 IRawElementProviderSimple_AddRef(iface);
175 return S_OK;
176}
177
178ULONG WINAPI hwnd_host_provider_AddRef(IRawElementProviderSimple *iface)
179{
180 struct hwnd_host_provider *host_prov = impl_from_hwnd_host_provider(iface);
182
183 TRACE("%p, refcount %ld\n", iface, refcount);
184
185 return refcount;
186}
187
188ULONG WINAPI hwnd_host_provider_Release(IRawElementProviderSimple *iface)
189{
190 struct hwnd_host_provider *host_prov = impl_from_hwnd_host_provider(iface);
192
193 TRACE("%p, refcount %ld\n", iface, refcount);
194
195 if (!refcount)
196 free(host_prov);
197
198 return refcount;
199}
200
202 enum ProviderOptions *ret_val)
203{
204 TRACE("%p, %p\n", iface, ret_val);
206 return S_OK;
207}
208
209HRESULT WINAPI hwnd_host_provider_GetPatternProvider(IRawElementProviderSimple *iface,
210 PATTERNID pattern_id, IUnknown **ret_val)
211{
212 TRACE("%p, %d, %p\n", iface, pattern_id, ret_val);
213 *ret_val = NULL;
214 return S_OK;
215}
216
217HRESULT WINAPI hwnd_host_provider_GetPropertyValue(IRawElementProviderSimple *iface,
218 PROPERTYID prop_id, VARIANT *ret_val)
219{
220 struct hwnd_host_provider *host_prov = impl_from_hwnd_host_provider(iface);
221
222 TRACE("%p, %d, %p\n", iface, prop_id, ret_val);
223
224 VariantInit(ret_val);
225 switch (prop_id)
226 {
227 case UIA_NativeWindowHandlePropertyId:
228 V_VT(ret_val) = VT_I4;
229 V_I4(ret_val) = HandleToUlong(host_prov->hwnd);
230 break;
231
232 case UIA_ProviderDescriptionPropertyId:
233 V_VT(ret_val) = VT_BSTR;
234 V_BSTR(ret_val) = SysAllocString(L"Wine: HWND Provider Proxy");
235 break;
236
237 default:
238 break;
239 }
240
241 return S_OK;
242}
243
245 IRawElementProviderSimple **ret_val)
246{
247 TRACE("%p, %p\n", iface, ret_val);
248 *ret_val = NULL;
249 return S_OK;
250}
251
252static const IRawElementProviderSimpleVtbl hwnd_host_provider_vtbl = {
260};
261
262/***********************************************************************
263 * UiaClientsAreListening (uiautomationcore.@)
264 */
266{
267 TRACE("()\n");
268 return TRUE;
269}
270
271/***********************************************************************
272 * UiaGetReservedMixedAttributeValue (uiautomationcore.@)
273 */
275{
276 TRACE("(%p)\n", value);
277
278 if (!value)
279 return E_INVALIDARG;
280
282
283 return S_OK;
284}
285
286/***********************************************************************
287 * UiaGetReservedNotSupportedValue (uiautomationcore.@)
288 */
290{
291 TRACE("(%p)\n", value);
292
293 if (!value)
294 return E_INVALIDARG;
295
297
298 return S_OK;
299}
300
301/***********************************************************************
302 * UiaRaiseAutomationPropertyChangedEvent (uiautomationcore.@)
303 */
304HRESULT WINAPI UiaRaiseAutomationPropertyChangedEvent(IRawElementProviderSimple *provider, PROPERTYID id, VARIANT old, VARIANT new)
305{
306 FIXME("(%p, %d, %s, %s): stub\n", provider, id, debugstr_variant(&old), debugstr_variant(&new));
307 return S_OK;
308}
309
310/***********************************************************************
311 * UiaRaiseStructureChangedEvent (uiautomationcore.@)
312 */
313HRESULT WINAPI UiaRaiseStructureChangedEvent(IRawElementProviderSimple *provider, enum StructureChangeType struct_change_type,
314 int *runtime_id, int runtime_id_len)
315{
316 FIXME("(%p, %d, %p, %d): stub\n", provider, struct_change_type, runtime_id, runtime_id_len);
317 return S_OK;
318}
319
320/***********************************************************************
321 * UiaRaiseAsyncContentLoadedEvent (uiautomationcore.@)
322 */
323HRESULT WINAPI UiaRaiseAsyncContentLoadedEvent(IRawElementProviderSimple *provider,
324 enum AsyncContentLoadedState async_content_loaded_state, double percent_complete)
325{
326 FIXME("(%p, %d, %f): stub\n", provider, async_content_loaded_state, percent_complete);
327 return S_OK;
328}
329
330/***********************************************************************
331 * UiaRaiseTextEditTextChangedEvent (uiautomationcore.@)
332 */
333HRESULT WINAPI UiaRaiseTextEditTextChangedEvent(IRawElementProviderSimple *provider,
334 enum TextEditChangeType text_edit_change_type, SAFEARRAY *changed_data)
335{
336 FIXME("(%p, %d, %p): stub\n", provider, text_edit_change_type, changed_data);
337 return S_OK;
338}
339
340/***********************************************************************
341 * UiaRaiseNotificationEvent (uiautomationcore.@)
342 */
343HRESULT WINAPI UiaRaiseNotificationEvent(IRawElementProviderSimple *provider, enum NotificationKind notification_kind,
344 enum NotificationProcessing notification_processing, BSTR display_str, BSTR activity_id)
345{
346 FIXME("(%p, %d, %d, %s, %s): stub\n", provider, notification_kind, notification_processing,
347 debugstr_w(display_str), debugstr_w(activity_id));
348 return S_OK;
349}
350
351/***********************************************************************
352 * UiaRaiseChangesEvent (uiautomationcore.@)
353 */
354HRESULT WINAPI UiaRaiseChangesEvent(IRawElementProviderSimple *provider, int event_id_count,
355 struct UiaChangeInfo *uia_changes)
356{
357 FIXME("(%p, %d, %p): stub\n", provider, event_id_count, uia_changes);
358 return S_OK;
359}
360
361HRESULT WINAPI UiaHostProviderFromHwnd(HWND hwnd, IRawElementProviderSimple **provider)
362{
363 struct hwnd_host_provider *host_prov;
364
365 TRACE("(%p, %p)\n", hwnd, provider);
366
367 if (provider)
368 *provider = NULL;
369
370 if (!IsWindow(hwnd) || !provider)
371 return E_INVALIDARG;
372
373 host_prov = calloc(1, sizeof(*host_prov));
374 if (!host_prov)
375 return E_OUTOFMEMORY;
376
378 host_prov->refcount = 1;
379 host_prov->hwnd = hwnd;
380 *provider = &host_prov->IRawElementProviderSimple_iface;
381
382 return S_OK;
383}
384
385/***********************************************************************
386 * DllMain (uiautomationcore.@)
387 */
389{
390 TRACE("(%p, %ld, %p)\n", hinst, reason, reserved);
391
392 switch (reason)
393 {
397 break;
398
399 default:
400 break;
401 }
402
403 return TRUE;
404}
405
406/* UIAutomation ClassFactory */
407struct uia_cf {
410
411 const GUID *clsid;
412};
413
415{
416 return CONTAINING_RECORD(iface, struct uia_cf, IClassFactory_iface);
417}
418
420{
421 *ppv = NULL;
423 *ppv = iface;
424 else
425 return E_NOINTERFACE;
426
427 IClassFactory_AddRef(iface);
428 return S_OK;
429}
430
432{
433 struct uia_cf *cf = impl_from_IClassFactory(iface);
435
436 TRACE("%p, refcount %ld\n", cf, ref);
437
438 return ref;
439}
440
442{
443 struct uia_cf *cf = impl_from_IClassFactory(iface);
445
446 TRACE("%p, refcount %ld\n", cf, ref);
447
448 if (!ref)
449 free(cf);
450
451 return ref;
452}
453
455{
456 struct uia_cf *cf = impl_from_IClassFactory(iface);
457 IUnknown *obj = NULL;
458 HRESULT hr;
459
460 TRACE("%p, %p, %s, %p\n", iface, pouter, debugstr_guid(riid), ppv);
461
462 *ppv = NULL;
463 if (pouter)
465
466 if (IsEqualGUID(cf->clsid, &CLSID_CUIAutomation))
468 else if (IsEqualGUID(cf->clsid, &CLSID_CUIAutomation8))
470 else
471 return E_NOINTERFACE;
472
473 if (SUCCEEDED(hr))
474 {
475 hr = IUnknown_QueryInterface(obj, riid, ppv);
476 IUnknown_Release(obj);
477 }
478
479 return hr;
480}
481
483{
484 FIXME("%p, %d: stub\n", iface, do_lock);
485 return S_OK;
486}
487
488static const IClassFactoryVtbl uia_cf_Vtbl =
489{
495};
496
498{
499 struct uia_cf *cf = calloc(1, sizeof(*cf));
500 HRESULT hr;
501
502 *ppv = NULL;
503 if (!cf)
504 return E_OUTOFMEMORY;
505
507 cf->clsid = clsid;
508 cf->ref = 1;
509
510 hr = IClassFactory_QueryInterface(&cf->IClassFactory_iface, riid, ppv);
511 IClassFactory_Release(&cf->IClassFactory_iface);
512
513 return hr;
514}
515
516/***********************************************************************
517 * DllGetClassObject (uiautomationcore.@)
518 */
520{
521 TRACE("(%s, %s, %p)\n", debugstr_guid(clsid), debugstr_guid(riid), ppv);
522
523 if (IsEqualGUID(clsid, &CLSID_CUIAutomation) || IsEqualGUID(clsid, &CLSID_CUIAutomation8))
524 return create_uia_cf(clsid, riid, ppv);
525
527}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define HandleToUlong(h)
Definition: basetsd.h:73
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:573
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HRESULT WINAPI CoCreateFreeThreadedMarshaler(IUnknown *outer, IUnknown **marshaler)
Definition: marshal.c:417
static WCHAR reason[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1904
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
OLECHAR * BSTR
Definition: compat.h:2293
@ VT_BSTR
Definition: compat.h:2303
@ VT_I4
Definition: compat.h:2298
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
static const char * debugstr_variant(const VARIANT *var)
Definition: dom.c:505
#define L(x)
Definition: resources.c:13
r reserved
Definition: btrfs.c:3006
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
static HINSTANCE hinst
Definition: edit.c:551
const CLSID * clsid
Definition: msctf.cpp:50
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define calloc
Definition: rosglue.h:14
#define TRACE(s)
Definition: solgame.cpp:4
IClassFactory IClassFactory_iface
Definition: inetcomm_main.c:76
IRawElementProviderSimple IRawElementProviderSimple_iface
Definition: uia_main.c:155
Definition: send.c:48
const GUID * clsid
Definition: uia_main.c:411
IClassFactory IClassFactory_iface
Definition: uia_main.c:408
LONG ref
Definition: uia_main.c:409
IUnknown IUnknown_iface
Definition: uia_main.c:33
IUnknown * marshaler
Definition: uia_main.c:36
IUnknown * marshal_object
Definition: uia_main.c:37
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
HRESULT create_uia_iface(IUnknown **iface, BOOL is_cui8)
HRESULT WINAPI UiaGetReservedMixedAttributeValue(IUnknown **value)
Definition: uia_main.c:274
HRESULT WINAPI hwnd_host_provider_GetPatternProvider(IRawElementProviderSimple *iface, PATTERNID pattern_id, IUnknown **ret_val)
Definition: uia_main.c:209
HMODULE huia_module
Definition: uia_main.c:29
static HRESULT WINAPI uia_object_wrapper_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: uia_main.c:45
static const IRawElementProviderSimpleVtbl hwnd_host_provider_vtbl
Definition: uia_main.c:252
HRESULT WINAPI UiaGetReservedNotSupportedValue(IUnknown **value)
Definition: uia_main.c:289
static const IUnknownVtbl uia_object_wrapper_vtbl
Definition: uia_main.c:77
ULONG WINAPI hwnd_host_provider_Release(IRawElementProviderSimple *iface)
Definition: uia_main.c:188
HRESULT WINAPI UiaRaiseNotificationEvent(IRawElementProviderSimple *provider, enum NotificationKind notification_kind, enum NotificationProcessing notification_processing, BSTR display_str, BSTR activity_id)
Definition: uia_main.c:343
HRESULT WINAPI hwnd_host_provider_get_HostRawElementProvider(IRawElementProviderSimple *iface, IRawElementProviderSimple **ret_val)
Definition: uia_main.c:244
HRESULT WINAPI UiaRaiseAsyncContentLoadedEvent(IRawElementProviderSimple *provider, enum AsyncContentLoadedState async_content_loaded_state, double percent_complete)
Definition: uia_main.c:323
static HRESULT WINAPI uia_reserved_obj_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: uia_main.c:118
static const IClassFactoryVtbl uia_cf_Vtbl
Definition: uia_main.c:488
static ULONG WINAPI uia_object_wrapper_AddRef(IUnknown *iface)
Definition: uia_main.c:52
static ULONG WINAPI uia_object_wrapper_Release(IUnknown *iface)
Definition: uia_main.c:62
static struct uia_cf * impl_from_IClassFactory(IClassFactory *iface)
Definition: uia_main.c:414
static const IUnknownVtbl uia_reserved_obj_vtbl
Definition: uia_main.c:142
static ULONG WINAPI uia_reserved_obj_AddRef(IUnknown *iface)
Definition: uia_main.c:132
HRESULT WINAPI hwnd_host_provider_get_ProviderOptions(IRawElementProviderSimple *iface, enum ProviderOptions *ret_val)
Definition: uia_main.c:201
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **ppv)
Definition: uia_main.c:519
HRESULT WINAPI UiaHostProviderFromHwnd(HWND hwnd, IRawElementProviderSimple **provider)
Definition: uia_main.c:361
HRESULT WINAPI hwnd_host_provider_QueryInterface(IRawElementProviderSimple *iface, REFIID riid, void **ppv)
Definition: uia_main.c:166
static HRESULT create_uia_cf(REFCLSID clsid, REFIID riid, void **ppv)
Definition: uia_main.c:497
HRESULT WINAPI UiaRaiseStructureChangedEvent(IRawElementProviderSimple *provider, enum StructureChangeType struct_change_type, int *runtime_id, int runtime_id_len)
Definition: uia_main.c:313
static ULONG WINAPI uia_reserved_obj_Release(IUnknown *iface)
Definition: uia_main.c:137
static struct hwnd_host_provider * impl_from_hwnd_host_provider(IRawElementProviderSimple *iface)
Definition: uia_main.c:161
HRESULT WINAPI UiaRaiseTextEditTextChangedEvent(IRawElementProviderSimple *provider, enum TextEditChangeType text_edit_change_type, SAFEARRAY *changed_data)
Definition: uia_main.c:333
static HRESULT create_uia_object_wrapper(IUnknown *reserved, void **ppv)
Definition: uia_main.c:88
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved)
Definition: uia_main.c:388
static HRESULT WINAPI uia_cf_LockServer(IClassFactory *iface, BOOL do_lock)
Definition: uia_main.c:482
static ULONG WINAPI uia_cf_Release(IClassFactory *iface)
Definition: uia_main.c:441
ULONG WINAPI hwnd_host_provider_AddRef(IRawElementProviderSimple *iface)
Definition: uia_main.c:178
HRESULT WINAPI hwnd_host_provider_GetPropertyValue(IRawElementProviderSimple *iface, PROPERTYID prop_id, VARIANT *ret_val)
Definition: uia_main.c:217
static struct uia_object_wrapper * impl_uia_object_wrapper_from_IUnknown(IUnknown *iface)
Definition: uia_main.c:40
static HRESULT WINAPI uia_cf_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
Definition: uia_main.c:419
HRESULT WINAPI UiaRaiseAutomationPropertyChangedEvent(IRawElementProviderSimple *provider, PROPERTYID id, VARIANT old, VARIANT new)
Definition: uia_main.c:304
static IUnknown uia_reserved_ns_iface
Definition: uia_main.c:148
static IUnknown uia_reserved_ma_iface
Definition: uia_main.c:149
static ULONG WINAPI uia_cf_AddRef(IClassFactory *iface)
Definition: uia_main.c:431
static HRESULT WINAPI uia_cf_CreateInstance(IClassFactory *iface, IUnknown *pouter, REFIID riid, void **ppv)
Definition: uia_main.c:454
BOOL WINAPI UiaClientsAreListening(void)
Definition: uia_main.c:265
HRESULT WINAPI UiaRaiseChangesEvent(IRawElementProviderSimple *provider, int event_id_count, struct UiaChangeInfo *uia_changes)
Definition: uia_main.c:354
int PATTERNID
NotificationProcessing
ProviderOptions
@ ProviderOptions_ServerSideProvider
NotificationKind
int PROPERTYID
TextEditChangeType
StructureChangeType
AsyncContentLoadedState
Definition: pdh_main.c:96
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:3772
BOOL WINAPI IsWindow(_In_opt_ HWND)