ReactOS 0.4.16-dev-2491-g3dc6630
uia_private.h File Reference
#include "uiautomation.h"
#include "uia_classes.h"
#include "wine/list.h"
#include "wine/rbtree.h"
#include "assert.h"
Include dependency graph for uia_private.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  uia_node
 
struct  uia_provider
 
struct  uia_event_args
 
struct  uia_event
 

Macros

#define COBJMACROS
 

Typedefs

typedef HRESULT UiaWineEventCallback(struct uia_event *, struct uia_event_args *, SAFEARRAY *, BSTR)
 
typedef HRESULT UiaWineEventForEachCallback(struct uia_event *, void *)
 

Enumerations

enum  uia_prop_type { PROP_TYPE_UNKNOWN , PROP_TYPE_ELEM_PROP , PROP_TYPE_SPECIAL , PROP_TYPE_PATTERN_PROP }
 
enum  uia_node_prov_type {
  PROV_TYPE_OVERRIDE , PROV_TYPE_MAIN , PROV_TYPE_NONCLIENT , PROV_TYPE_HWND ,
  PROV_TYPE_COUNT
}
 
enum  uia_node_flags { NODE_FLAG_IGNORE_CLIENTSIDE_HWND_PROVS = 0x01 , NODE_FLAG_NO_PREPARE = 0x02 , NODE_FLAG_IGNORE_COM_THREADING = 0x04 }
 
enum  uia_event_type { EVENT_TYPE_CLIENTSIDE , EVENT_TYPE_SERVERSIDE }
 
enum  provider_method_flags { PROV_METHOD_FLAG_RETURN_NODE_LRES = 0x0001 }
 

Functions

static struct uia_nodeimpl_from_IWineUiaNode (IWineUiaNode *iface)
 
static struct uia_providerimpl_from_IWineUiaProvider (IWineUiaProvider *iface)
 
static void variant_init_bool (VARIANT *v, BOOL val)
 
static void variant_init_i4 (VARIANT *v, int val)
 
static void get_variant_for_node (HUIANODE node, VARIANT *v)
 
static BOOL uia_array_reserve (void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
 
int get_node_provider_type_at_idx (struct uia_node *node, int idx)
 
HRESULT get_focus_from_node_provider (IWineUiaNode *node, int idx, LONG flags, VARIANT *ret_val)
 
HRESULT respond_to_win_event_on_node_provider (IWineUiaNode *node, int idx, DWORD win_event, HWND hwnd, LONG obj_id, LONG child_id, IProxyProviderWinEventSink *sink)
 
HRESULT create_node_from_node_provider (IWineUiaNode *node, int idx, LONG flags, VARIANT *ret_val)
 
HRESULT attach_event_to_uia_node (HUIANODE node, struct uia_event *event)
 
HRESULT clone_uia_node (HUIANODE in_node, HUIANODE *out_node)
 
HRESULT navigate_uia_node (struct uia_node *node, int nav_dir, HUIANODE *out_node)
 
HRESULT create_uia_node_from_elprov (IRawElementProviderSimple *elprov, HUIANODE *out_node, BOOL get_hwnd_providers, int node_flags)
 
HRESULT uia_node_from_lresult (LRESULT lr, HUIANODE *huianode, int node_flags)
 
void uia_node_lresult_release (LRESULT lr)
 
HRESULT create_uia_node_from_hwnd (HWND hwnd, HUIANODE *out_node, int node_flags)
 
HRESULT uia_condition_check (HUIANODE node, struct UiaCondition *condition)
 
BOOL uia_condition_matched (HRESULT hr)
 
HRESULT uia_com_win_event_callback (DWORD event_id, HWND hwnd, LONG obj_id, LONG child_id, DWORD thread_id, DWORD event_time)
 
HRESULT create_uia_iface (IUnknown **iface, BOOL is_cui8)
 
HRESULT uia_event_add_win_event_hwnd (struct uia_event *event, HWND hwnd)
 
HRESULT uia_event_for_each (int event_id, UiaWineEventForEachCallback *callback, void *user_data, BOOL clientside_only)
 
BOOL uia_clientside_event_start_event_thread (struct uia_event *event)
 
HRESULT create_msaa_provider_from_hwnd (HWND hwnd, int in_child_id, IRawElementProviderSimple **ret_elprov)
 
HRESULT create_serverside_uia_event (struct uia_event **out_event, LONG process_id, LONG event_cookie)
 
HRESULT uia_event_add_provider_event_adviser (IRawElementProviderAdviseEvents *advise_events, struct uia_event *event)
 
HRESULT uia_event_add_serverside_event_adviser (IWineUiaEvent *serverside_event, struct uia_event *event)
 
HRESULT uia_event_advise_node (struct uia_event *event, HUIANODE node)
 
HRESULT uia_add_clientside_event (HUIANODE huianode, EVENTID event_id, enum TreeScope scope, PROPERTYID *prop_ids, int prop_ids_count, struct UiaCacheRequest *cache_req, SAFEARRAY *rt_id, UiaWineEventCallback *cback, void *cback_data, HUIAEVENT *huiaevent)
 
HRESULT uia_event_invoke (HUIANODE node, HUIANODE nav_start_node, struct uia_event_args *args, struct uia_event *event)
 
HRESULT uia_event_check_node_within_event_scope (struct uia_event *event, HUIANODE node, SAFEARRAY *rt_id, HUIANODE *clientside_nav_node_out)
 
const struct uia_prop_infouia_prop_info_from_id (PROPERTYID prop_id)
 
const struct uia_event_infouia_event_info_from_id (EVENTID event_id)
 
const struct uia_pattern_infouia_pattern_info_from_id (PATTERNID pattern_id)
 
const struct uia_control_type_infouia_control_type_info_from_id (CONTROLTYPEID control_type_id)
 
HRESULT create_base_hwnd_provider (HWND hwnd, IRawElementProviderSimple **elprov)
 
void uia_stop_provider_thread (void)
 
void uia_provider_thread_remove_node (HUIANODE node)
 
LRESULT uia_lresult_from_node (HUIANODE huianode)
 
HRESULT create_msaa_provider (IAccessible *acc, LONG child_id, HWND hwnd, BOOL root_acc_known, BOOL is_root_acc, IRawElementProviderSimple **elprov)
 
HRESULT register_interface_in_git (IUnknown *iface, REFIID riid, DWORD *ret_cookie)
 
HRESULT unregister_interface_in_git (DWORD git_cookie)
 
HRESULT get_interface_in_git (REFIID riid, DWORD git_cookie, IUnknown **ret_iface)
 
HRESULT write_runtime_id_base (SAFEARRAY *sa, HWND hwnd)
 
void uia_cache_request_destroy (struct UiaCacheRequest *cache_req)
 
HRESULT uia_cache_request_clone (struct UiaCacheRequest *dst, struct UiaCacheRequest *src)
 
HRESULT get_safearray_dim_bounds (SAFEARRAY *sa, UINT dim, LONG *lbound, LONG *elems)
 
HRESULT get_safearray_bounds (SAFEARRAY *sa, LONG *lbound, LONG *elems)
 
int uia_compare_safearrays (SAFEARRAY *sa1, SAFEARRAY *sa2, int prop_type)
 
BOOL uia_hwnd_is_visible (HWND hwnd)
 
BOOL uia_is_top_level_hwnd (HWND hwnd)
 
BOOL uia_hwnd_map_check_hwnd (struct rb_tree *hwnd_map, HWND hwnd)
 
HRESULT uia_hwnd_map_add_hwnd (struct rb_tree *hwnd_map, HWND hwnd)
 
void uia_hwnd_map_remove_hwnd (struct rb_tree *hwnd_map, HWND hwnd)
 
void uia_hwnd_map_init (struct rb_tree *hwnd_map)
 
void uia_hwnd_map_destroy (struct rb_tree *hwnd_map)
 

Variables

HMODULE huia_module
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 19 of file uia_private.h.

Typedef Documentation

◆ UiaWineEventCallback

typedef HRESULT UiaWineEventCallback(struct uia_event *, struct uia_event_args *, SAFEARRAY *, BSTR)

Definition at line 160 of file uia_private.h.

◆ UiaWineEventForEachCallback

typedef HRESULT UiaWineEventForEachCallback(struct uia_event *, void *)

Definition at line 161 of file uia_private.h.

Enumeration Type Documentation

◆ provider_method_flags

Enumerator
PROV_METHOD_FLAG_RETURN_NODE_LRES 

Definition at line 213 of file uia_private.h.

213 {
215};
@ PROV_METHOD_FLAG_RETURN_NODE_LRES
Definition: uia_private.h:214

◆ uia_event_type

Enumerator
EVENT_TYPE_CLIENTSIDE 
EVENT_TYPE_SERVERSIDE 

Definition at line 115 of file uia_private.h.

115 {
118};
@ EVENT_TYPE_SERVERSIDE
Definition: uia_private.h:117
@ EVENT_TYPE_CLIENTSIDE
Definition: uia_private.h:116

◆ uia_node_flags

Enumerator
NODE_FLAG_IGNORE_CLIENTSIDE_HWND_PROVS 
NODE_FLAG_NO_PREPARE 
NODE_FLAG_IGNORE_COM_THREADING 

Definition at line 58 of file uia_private.h.

58 {
62};
@ NODE_FLAG_IGNORE_CLIENTSIDE_HWND_PROVS
Definition: uia_private.h:59
@ NODE_FLAG_IGNORE_COM_THREADING
Definition: uia_private.h:61
@ NODE_FLAG_NO_PREPARE
Definition: uia_private.h:60

◆ uia_node_prov_type

Enumerator
PROV_TYPE_OVERRIDE 
PROV_TYPE_MAIN 
PROV_TYPE_NONCLIENT 
PROV_TYPE_HWND 
PROV_TYPE_COUNT 

Definition at line 50 of file uia_private.h.

50 {
56};
@ PROV_TYPE_OVERRIDE
Definition: uia_private.h:51
@ PROV_TYPE_MAIN
Definition: uia_private.h:52
@ PROV_TYPE_HWND
Definition: uia_private.h:54
@ PROV_TYPE_NONCLIENT
Definition: uia_private.h:53
@ PROV_TYPE_COUNT
Definition: uia_private.h:55

◆ uia_prop_type

Enumerator
PROP_TYPE_UNKNOWN 
PROP_TYPE_ELEM_PROP 
PROP_TYPE_SPECIAL 
PROP_TYPE_PATTERN_PROP 

Definition at line 29 of file uia_private.h.

29 {
34};
@ PROP_TYPE_ELEM_PROP
Definition: uia_private.h:31
@ PROP_TYPE_SPECIAL
Definition: uia_private.h:32
@ PROP_TYPE_UNKNOWN
Definition: uia_private.h:30
@ PROP_TYPE_PATTERN_PROP
Definition: uia_private.h:33

Function Documentation

◆ attach_event_to_uia_node()

HRESULT attach_event_to_uia_node ( HUIANODE  node,
struct uia_event event 
)

Definition at line 1337 of file uia_client.c.

1338{
1339 struct uia_node *node_data = impl_from_IWineUiaNode((IWineUiaNode *)node);
1340 HRESULT hr = S_OK;
1341 int i;
1342
1343 for (i = 0; i < node_data->prov_count; i++)
1344 {
1345 hr = attach_event_to_node_provider(&node_data->IWineUiaNode_iface, i, (HUIAEVENT)event);
1346 if (FAILED(hr))
1347 return hr;
1348 }
1349
1350 return hr;
1351}
HRESULT hr
Definition: delayimp.cpp:573
struct _cl_event * event
Definition: glext.h:7739
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
IWineUiaNode IWineUiaNode_iface
Definition: uia_private.h:65
int prov_count
Definition: uia_private.h:70
static HRESULT attach_event_to_node_provider(IWineUiaNode *node, int idx, HUIAEVENT huiaevent)
Definition: uia_client.c:366
static struct uia_node * impl_from_IWineUiaNode(IWineUiaNode *iface)
Definition: uia_private.h:87
Definition: dlist.c:348

Referenced by uia_add_clientside_event(), uia_event_advise_node(), and uia_provider_attach_event().

◆ clone_uia_node()

HRESULT clone_uia_node ( HUIANODE  in_node,
HUIANODE *  out_node 
)

Definition at line 738 of file uia_client.c.

739{
740 struct uia_node *in_node_data = impl_from_IWineUiaNode((IWineUiaNode *)in_node);
741 struct uia_node *node;
742 HRESULT hr = S_OK;
743 int i;
744
745 *out_node = NULL;
746 if (in_node_data->nested_node)
747 {
748 FIXME("Cloning of nested nodes currently unimplemented\n");
749 return E_NOTIMPL;
750 }
751
752 for (i = 0; i < PROV_TYPE_COUNT; i++)
753 {
754 if (in_node_data->prov[i] && is_nested_node_provider(in_node_data->prov[i]))
755 {
756 FIXME("Cloning of nested node providers currently unimplemented\n");
757 return E_NOTIMPL;
758 }
759 }
760
761 hr = create_uia_node(&node, 0);
762 if (FAILED(hr))
763 return hr;
764
765 node->hwnd = in_node_data->hwnd;
766 for (i = 0; i < PROV_TYPE_COUNT; i++)
767 {
768 struct uia_provider *in_prov_data;
769
770 if (!in_node_data->prov[i])
771 continue;
772
773 in_prov_data = impl_from_IWineUiaProvider(in_node_data->prov[i]);
774 hr = create_wine_uia_provider(node, in_prov_data->elprov, i);
775 if (FAILED(hr))
776 goto exit;
777
778 if (in_node_data->git_cookie[i])
779 {
780 hr = register_interface_in_git((IUnknown *)node->prov[i], &IID_IWineUiaProvider, &node->git_cookie[i]);
781 if (FAILED(hr))
782 goto exit;
783 }
784 }
785
786 node->parent_link_idx = in_node_data->parent_link_idx;
787 node->creator_prov_idx = in_node_data->creator_prov_idx;
788 node->creator_prov_type = in_node_data->creator_prov_type;
789
790 *out_node = (void *)&node->IWineUiaNode_iface;
791 TRACE("Created clone node %p from node %p\n", *out_node, in_node);
792
793exit:
794 if (FAILED(hr))
795 IWineUiaNode_Release(&node->IWineUiaNode_iface);
796
797 return hr;
798}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
#define exit(n)
Definition: config.h:202
#define TRACE(s)
Definition: solgame.cpp:4
int creator_prov_idx
Definition: uia_private.h:72
BOOL nested_node
Definition: uia_private.h:76
IWineUiaProvider * prov[PROV_TYPE_COUNT]
Definition: uia_private.h:68
DWORD git_cookie[PROV_TYPE_COUNT]
Definition: uia_private.h:69
int parent_link_idx
Definition: uia_private.h:71
int creator_prov_type
Definition: uia_private.h:78
HWND hwnd
Definition: uia_private.h:74
IRawElementProviderSimple * elprov
Definition: uia_private.h:96
static BOOL is_nested_node_provider(IWineUiaProvider *iface)
Definition: uia_client.c:2523
static HRESULT create_uia_node(struct uia_node **out_node, int node_flags)
Definition: uia_client.c:632
static HRESULT create_wine_uia_provider(struct uia_node *node, IRawElementProviderSimple *elprov, int prov_type)
Definition: uia_client.c:2027
static struct uia_provider * impl_from_IWineUiaProvider(IWineUiaProvider *iface)
Definition: uia_private.h:104
HRESULT register_interface_in_git(IUnknown *iface, REFIID riid, DWORD *ret_cookie)
Definition: uia_utils.c:40

Referenced by uia_event_invoke().

◆ create_base_hwnd_provider()

HRESULT create_base_hwnd_provider ( HWND  hwnd,
IRawElementProviderSimple **  elprov 
)

Definition at line 1915 of file uia_provider.c.

1916{
1918
1919 *elprov = NULL;
1920
1921 if (!hwnd)
1922 return E_INVALIDARG;
1923
1924 if (!IsWindow(hwnd))
1926
1927 if (!(base_hwnd_prov = calloc(1, sizeof(*base_hwnd_prov))))
1928 return E_OUTOFMEMORY;
1929
1930 base_hwnd_prov->IRawElementProviderSimple_iface.lpVtbl = &base_hwnd_provider_vtbl;
1931 base_hwnd_prov->IRawElementProviderFragment_iface.lpVtbl = &base_hwnd_fragment_vtbl;
1932 base_hwnd_prov->refcount = 1;
1933 base_hwnd_prov->hwnd = hwnd;
1934 *elprov = &base_hwnd_prov->IRawElementProviderSimple_iface;
1935
1936 return S_OK;
1937}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define calloc
Definition: rosglue.h:14
static const IRawElementProviderSimpleVtbl base_hwnd_provider_vtbl
static const IRawElementProviderFragmentVtbl base_hwnd_fragment_vtbl
static IRawElementProviderSimple * base_hwnd_prov
#define UIA_E_ELEMENTNOTAVAILABLE
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
BOOL WINAPI IsWindow(_In_opt_ HWND)

Referenced by base_hwnd_fragment_Navigate(), and default_uia_provider_callback().

◆ create_msaa_provider()

HRESULT create_msaa_provider ( IAccessible acc,
LONG  child_id,
HWND  hwnd,
BOOL  root_acc_known,
BOOL  is_root_acc,
IRawElementProviderSimple **  elprov 
)

Definition at line 1443 of file uia_provider.c.

1445{
1446 struct msaa_provider *msaa_prov = calloc(1, sizeof(*msaa_prov));
1447
1448 if (!msaa_prov)
1449 return E_OUTOFMEMORY;
1450
1456 msaa_prov->refcount = 1;
1457 variant_init_i4(&msaa_prov->cid, child_id);
1458 msaa_prov->acc = acc;
1459 IAccessible_AddRef(acc);
1460 msaa_prov->ia2 = msaa_acc_get_ia2(acc);
1461
1462 if (!hwnd)
1463 {
1464 HRESULT hr;
1465
1466 hr = WindowFromAccessibleObject(acc, &msaa_prov->hwnd);
1467 if (FAILED(hr))
1468 WARN("WindowFromAccessibleObject failed with hr %#lx\n", hr);
1469 }
1470 else
1471 msaa_prov->hwnd = hwnd;
1472
1473 if (root_acc_known)
1474 {
1475 msaa_prov->root_acc_check_ran = TRUE;
1476 msaa_prov->is_root_acc = is_root_acc;
1477 }
1478
1479 *elprov = &msaa_prov->IRawElementProviderSimple_iface;
1480
1481 return S_OK;
1482}
#define WARN(fmt,...)
Definition: precomp.h:61
#define TRUE
Definition: types.h:120
HRESULT WINAPI WindowFromAccessibleObject(IAccessible *acc, HWND *phwnd)
Definition: main.c:372
IAccessible * acc
Definition: uia_provider.c:536
IAccessible2 * ia2
Definition: uia_provider.c:537
IRawElementProviderFragmentRoot IRawElementProviderFragmentRoot_iface
Definition: uia_provider.c:531
BOOL root_acc_check_ran
Definition: uia_provider.c:542
IRawElementProviderFragment IRawElementProviderFragment_iface
Definition: uia_provider.c:530
IRawElementProviderSimple IRawElementProviderSimple_iface
Definition: uia_provider.c:529
ILegacyIAccessibleProvider ILegacyIAccessibleProvider_iface
Definition: uia_provider.c:532
IProxyProviderWinEventHandler IProxyProviderWinEventHandler_iface
Definition: uia_provider.c:533
static void variant_init_i4(VARIANT *v, int val)
Definition: uia_private.h:169
static const IRawElementProviderFragmentRootVtbl msaa_fragment_root_vtbl
static const IProxyProviderWinEventHandlerVtbl msaa_winevent_handler_vtbl
static IAccessible2 * msaa_acc_get_ia2(IAccessible *acc)
Definition: uia_provider.c:64
static const IRawElementProviderFragmentVtbl msaa_fragment_vtbl
static const ILegacyIAccessibleProviderVtbl msaa_acc_provider_vtbl
static const IRawElementProviderSimpleVtbl msaa_provider_vtbl
Definition: uia_provider.c:793

Referenced by create_msaa_provider_from_hwnd(), default_uia_provider_callback(), msaa_acc_get_focus(), msaa_fragment_get_FragmentRoot(), msaa_fragment_Navigate(), msaa_fragment_root_GetFocus(), and UiaProviderFromIAccessible().

◆ create_msaa_provider_from_hwnd()

HRESULT create_msaa_provider_from_hwnd ( HWND  hwnd,
int  in_child_id,
IRawElementProviderSimple **  ret_elprov 
)

Definition at line 677 of file uia_event.c.

678{
679 IRawElementProviderSimple *elprov;
680 IAccessible *acc;
681 int child_id;
682 HRESULT hr;
683
684 *ret_elprov = NULL;
685 hr = AccessibleObjectFromWindow(hwnd, OBJID_CLIENT, &IID_IAccessible, (void **)&acc);
686 if (FAILED(hr))
687 return hr;
688
689 child_id = in_child_id;
690 if (in_child_id != CHILDID_SELF)
691 {
692 IDispatch *disp;
693 VARIANT cid;
694
695 disp = NULL;
696 variant_init_i4(&cid, in_child_id);
697 hr = IAccessible_get_accChild(acc, cid, &disp);
698 if (FAILED(hr))
699 TRACE("get_accChild failed with %#lx!\n", hr);
700
701 if (SUCCEEDED(hr) && disp)
702 {
703 IAccessible_Release(acc);
704 hr = IDispatch_QueryInterface(disp, &IID_IAccessible, (void **)&acc);
705 IDispatch_Release(disp);
706 if (FAILED(hr))
707 return hr;
708
709 child_id = CHILDID_SELF;
710 }
711 }
712
713 hr = create_msaa_provider(acc, child_id, hwnd, TRUE, in_child_id == CHILDID_SELF, &elprov);
714 IAccessible_Release(acc);
715 if (FAILED(hr))
716 return hr;
717
718 *ret_elprov = elprov;
719 return S_OK;
720}
HRESULT WINAPI AccessibleObjectFromWindow(HWND hwnd, DWORD dwObjectID, REFIID riid, void **ppvObject)
Definition: main.c:349
static TfClientId cid
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT create_msaa_provider(IAccessible *acc, LONG child_id, HWND hwnd, BOOL root_acc_known, BOOL is_root_acc, IRawElementProviderSimple **elprov)
#define OBJID_CLIENT
Definition: winable.h:19
#define CHILDID_SELF
Definition: winable.h:14

Referenced by uia_com_focus_win_event_msaa_handler(), and uia_win_event_for_each_callback().

◆ create_node_from_node_provider()

HRESULT create_node_from_node_provider ( IWineUiaNode *  node,
int  idx,
LONG  flags,
VARIANT ret_val 
)

Definition at line 397 of file uia_client.c.

398{
399 IWineUiaProvider *prov;
400 HRESULT hr;
401
402 VariantInit(ret_val);
403 hr = IWineUiaNode_get_provider(node, idx, &prov);
404 if (FAILED(hr))
405 return hr;
406
407 hr = IWineUiaProvider_create_node_from_prov(prov, flags, ret_val);
408 IWineUiaProvider_Release(prov);
409
410 return hr;
411}
unsigned int idx
Definition: utils.c:41
GLbitfield flags
Definition: glext.h:7161
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568

Referenced by uia_com_focus_win_event_callback(), and uia_nested_node_provider_create_node_from_prov().

◆ create_serverside_uia_event()

HRESULT create_serverside_uia_event ( struct uia_event **  out_event,
LONG  process_id,
LONG  event_cookie 
)

Definition at line 1234 of file uia_event.c.

1235{
1236 struct uia_event_identifier event_identifier = { event_cookie, process_id };
1237 struct rb_entry *rb_entry;
1238 struct uia_event *event;
1239 HRESULT hr = S_OK;
1240
1241 /*
1242 * Attempt to lookup an existing event for this PID/event_cookie. If there
1243 * is one, return S_FALSE.
1244 */
1245 *out_event = NULL;
1248 {
1249 *out_event = RB_ENTRY_VALUE(rb_entry, struct uia_event, u.serverside.serverside_event_entry);
1250 hr = S_FALSE;
1251 goto exit;
1252 }
1253
1255 if (FAILED(hr))
1256 goto exit;
1257
1259 {
1260 free(event);
1261 hr = E_FAIL;
1262 goto exit;
1263 }
1264
1265 event->u.serverside.proc_id = process_id;
1269 rb_put(&uia_event_map.serverside_event_map, &event_identifier, &event->u.serverside.serverside_event_entry);
1270 *out_event = event;
1271
1272exit:
1274 return hr;
1275}
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define rb_entry(ptr, type, member)
Definition: rbtree.h:130
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
#define RB_ENTRY_VALUE(element, type, field)
Definition: rbtree.h:26
static int rb_put(struct rb_tree *tree, const void *key, struct rb_entry *entry)
Definition: rbtree.h:204
static struct rb_entry * rb_get(const struct rb_tree *tree, const void *key)
Definition: rbtree.h:192
static void rb_init(struct rb_tree *tree, rb_compare_func_t compare)
Definition: rbtree.h:173
Definition: rbtree.h:30
LONG serverside_event_count
Definition: uia_event.c:104
struct rb_tree serverside_event_map
Definition: uia_event.c:103
LONG event_cookie
Definition: uia_private.h:138
static HRESULT create_uia_event(struct uia_event **out_event, LONG event_cookie, int event_type)
Definition: uia_event.c:1194
static CRITICAL_SECTION event_map_cs
Definition: uia_event.c:142
static int uia_serverside_event_id_compare(const void *key, const struct rb_entry *entry)
Definition: uia_event.c:131
static BOOL uia_start_event_thread(void)
Definition: uia_event.c:932
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define S_FALSE
Definition: winerror.h:3451

Referenced by uia_node_attach_event().

◆ create_uia_iface()

HRESULT create_uia_iface ( IUnknown **  iface,
BOOL  is_cui8 
)

Definition at line 4402 of file uia_com_client.c.

4403{
4404 struct uia_iface *uia;
4405
4406 uia = calloc(1, sizeof(*uia));
4407 if (!uia)
4408 return E_OUTOFMEMORY;
4409
4410 uia->IUIAutomation6_iface.lpVtbl = &uia_iface_vtbl;
4411 uia->is_cui8 = is_cui8;
4412 uia->ref = 1;
4413
4414 *iface = (IUnknown *)&uia->IUIAutomation6_iface;
4415 return S_OK;
4416}
IUIAutomation6 IUIAutomation6_iface
static const IUIAutomation6Vtbl uia_iface_vtbl

Referenced by uia_cf_CreateInstance().

◆ create_uia_node_from_elprov()

HRESULT create_uia_node_from_elprov ( IRawElementProviderSimple *  elprov,
HUIANODE *  out_node,
BOOL  get_hwnd_providers,
int  node_flags 
)

Definition at line 2049 of file uia_client.c.

2051{
2052 static const int unsupported_prov_opts = ProviderOptions_ProviderOwnsSetFocus | ProviderOptions_HasNativeIAccessible |
2054 enum ProviderOptions prov_opts;
2055 struct uia_node *node;
2056 int prov_type;
2057 HRESULT hr;
2058
2059 *out_node = NULL;
2060
2061 hr = IRawElementProviderSimple_get_ProviderOptions(elprov, &prov_opts);
2062 if (FAILED(hr))
2063 return hr;
2064
2065 if (prov_opts & unsupported_prov_opts)
2066 FIXME("Ignoring unsupported ProviderOption(s) %#x\n", prov_opts & unsupported_prov_opts);
2067
2068 if (prov_opts & ProviderOptions_OverrideProvider)
2069 prov_type = PROV_TYPE_OVERRIDE;
2070 else if (prov_opts & ProviderOptions_NonClientAreaProvider)
2071 prov_type = PROV_TYPE_NONCLIENT;
2072 else if (prov_opts & ProviderOptions_ServerSideProvider)
2073 prov_type = PROV_TYPE_MAIN;
2074 else if (prov_opts & ProviderOptions_ClientSideProvider)
2075 prov_type = PROV_TYPE_HWND;
2076 else
2077 prov_type = PROV_TYPE_MAIN;
2078
2079 hr = create_uia_node(&node, node_flags);
2080 if (FAILED(hr))
2081 return hr;
2082
2083 node->hwnd = get_hwnd_from_provider(elprov);
2084
2085 hr = create_wine_uia_provider(node, elprov, prov_type);
2086 if (FAILED(hr))
2087 {
2088 free(node);
2089 return hr;
2090 }
2091
2092 if (node->hwnd && get_hwnd_providers)
2093 {
2095 if (FAILED(hr))
2096 WARN("uia_get_providers_for_hwnd failed with hr %#lx\n", hr);
2097 }
2098
2100 if (FAILED(hr))
2101 {
2102 IWineUiaNode_Release(&node->IWineUiaNode_iface);
2103 return hr;
2104 }
2105
2106 *out_node = (void *)&node->IWineUiaNode_iface;
2107
2108 return S_OK;
2109}
static HWND get_hwnd_from_provider(IRawElementProviderSimple *elprov)
Definition: uia_client.c:172
static HRESULT uia_get_providers_for_hwnd(struct uia_node *node)
Definition: uia_client.c:3245
static HRESULT prepare_uia_node(struct uia_node *node)
Definition: uia_client.c:656
ProviderOptions
@ ProviderOptions_ProviderOwnsSetFocus
@ ProviderOptions_ClientSideProvider
@ ProviderOptions_NonClientAreaProvider
@ ProviderOptions_UseClientCoordinates
@ ProviderOptions_OverrideProvider
@ ProviderOptions_HasNativeIAccessible
@ ProviderOptions_ServerSideProvider

Referenced by get_variant_for_elprov_node(), uia_com_focus_win_event_msaa_handler(), uia_provider_attach_event(), uia_raise_elprov_event_callback(), uia_win_event_for_each_callback(), UiaDisconnectProvider(), UiaNodeFromProvider(), and UiaReturnRawElementProvider().

◆ create_uia_node_from_hwnd()

HRESULT create_uia_node_from_hwnd ( HWND  hwnd,
HUIANODE *  out_node,
int  node_flags 
)

Definition at line 2721 of file uia_client.c.

2722{
2723 struct uia_node *node;
2724 HRESULT hr;
2725
2726 if (!out_node)
2727 return E_INVALIDARG;
2728
2729 *out_node = NULL;
2730
2731 if (!IsWindow(hwnd))
2733
2734 hr = create_uia_node(&node, node_flags);
2735 if (FAILED(hr))
2736 return hr;
2737
2738 node->hwnd = hwnd;
2740 if (FAILED(hr))
2741 {
2742 free(node);
2743 return hr;
2744 }
2745
2747 if (FAILED(hr))
2748 {
2749 IWineUiaNode_Release(&node->IWineUiaNode_iface);
2750 return hr;
2751 }
2752
2753 *out_node = (void *)&node->IWineUiaNode_iface;
2754
2755 return S_OK;
2756}

Referenced by uia_com_win_event_callback(), uia_event_handlers_add_handler(), UiaHasServerSideProvider(), and UiaNodeFromHandle().

◆ get_focus_from_node_provider()

HRESULT get_focus_from_node_provider ( IWineUiaNode *  node,
int  idx,
LONG  flags,
VARIANT ret_val 
)

Definition at line 350 of file uia_client.c.

351{
352 IWineUiaProvider *prov;
353 HRESULT hr;
354
355 VariantInit(ret_val);
356 hr = IWineUiaNode_get_provider(node, idx, &prov);
357 if (FAILED(hr))
358 return hr;
359
360 hr = IWineUiaProvider_get_focus(prov, flags, ret_val);
361 IWineUiaProvider_Release(prov);
362
363 return hr;
364}

Referenced by get_focused_uia_node(), uia_com_focus_win_event_handler(), and uia_nested_node_provider_get_focus().

◆ get_interface_in_git()

HRESULT get_interface_in_git ( REFIID  riid,
DWORD  git_cookie,
IUnknown **  ret_iface 
)

Definition at line 79 of file uia_utils.c.

80{
82 IUnknown *iface;
83 HRESULT hr;
84
86 if (FAILED(hr))
87 return hr;
88
89 hr = IGlobalInterfaceTable_GetInterfaceFromGlobal(git, git_cookie, riid, (void **)&iface);
90 if (FAILED(hr))
91 {
92 ERR("Failed to get interface from Global Interface Table, hr %#lx\n", hr);
93 return hr;
94 }
95
96 *ret_iface = iface;
97
98 return S_OK;
99}
#define ERR(fmt,...)
Definition: precomp.h:57
REFIID riid
Definition: atlbase.h:39
static HRESULT get_global_interface_table(IGlobalInterfaceTable **git)
Definition: uia_utils.c:28

Referenced by uia_com_event_callback(), uia_event_advise(), uia_event_adviser_advise(), and uia_node_get_provider().

◆ get_node_provider_type_at_idx()

int get_node_provider_type_at_idx ( struct uia_node node,
int  idx 
)

Definition at line 266 of file uia_client.c.

267{
268 int i, prov_idx;
269
270 for (i = prov_idx = 0; i < PROV_TYPE_COUNT; i++)
271 {
272 if (node->prov[i])
273 {
274 if (prov_idx == idx)
275 return i;
276 else
277 prov_idx++;
278 }
279 }
280
281 ERR("Node %p has no provider at idx %d\n", node, idx);
282 return 0;
283}

Referenced by create_wine_uia_nested_node_provider(), get_focused_uia_node(), get_node_provider_description_string(), set_refuse_hwnd_providers(), uia_node_disconnect(), uia_node_get_provider(), and uia_provider_thread_add_node().

◆ get_safearray_bounds()

HRESULT get_safearray_bounds ( SAFEARRAY sa,
LONG lbound,
LONG elems 
)

Definition at line 319 of file uia_utils.c.

320{
321 UINT dims;
322
323 *lbound = *elems = 0;
324 dims = SafeArrayGetDim(sa);
325 if (dims != 1)
326 {
327 WARN("Invalid dimensions %d for safearray.\n", dims);
328 return E_FAIL;
329 }
330
331 return get_safearray_dim_bounds(sa, 1, lbound, elems);
332}
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
Definition: safearray.c:1094
unsigned int UINT
Definition: ndis.h:50
HRESULT get_safearray_dim_bounds(SAFEARRAY *sa, UINT dim, LONG *lbound, LONG *elems)
Definition: uia_utils.c:301

Referenced by append_uia_runtime_id(), create_uia_node_safearray(), get_element_variant_from_node_variant(), uia_compare_safearrays(), uia_element_FindAllBuildCache(), uia_element_FindFirstBuildCache(), uia_get_clientside_provider(), uia_iface_IntSafeArrayToNativeArray(), and uia_provider_attach_event().

◆ get_safearray_dim_bounds()

HRESULT get_safearray_dim_bounds ( SAFEARRAY sa,
UINT  dim,
LONG lbound,
LONG elems 
)

Definition at line 301 of file uia_utils.c.

302{
303 LONG ubound;
304 HRESULT hr;
305
306 *lbound = *elems = 0;
307 hr = SafeArrayGetLBound(sa, dim, lbound);
308 if (FAILED(hr))
309 return hr;
310
311 hr = SafeArrayGetUBound(sa, dim, &ubound);
312 if (FAILED(hr))
313 return hr;
314
315 *elems = (ubound - (*lbound)) + 1;
316 return S_OK;
317}
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1066
long LONG
Definition: pedump.c:60

Referenced by get_safearray_bounds(), uia_cache_request_combine(), and UiaFind().

◆ get_variant_for_node()

static void get_variant_for_node ( HUIANODE  node,
VARIANT v 
)
inlinestatic

Definition at line 175 of file uia_private.h.

176{
177#ifdef _WIN64
178 V_VT(v) = VT_I8;
179 V_I8(v) = (UINT64)node;
180#else
181 V_VT(v) = VT_I4;
182 V_I4(v) = (UINT32)node;
183#endif
184}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
@ VT_I8
Definition: compat.h:2314
@ VT_I4
Definition: compat.h:2298
const GLdouble * v
Definition: gl.h:2040
#define V_I8(A)
Definition: oleauto.h:249
#define V_VT(A)
Definition: oleauto.h:211
#define V_I4(A)
Definition: oleauto.h:247
uint32_t UINT32
Definition: typedefs.h:59

Referenced by get_variant_for_elprov_node(), uia_nested_node_provider_create_node_from_prov(), uia_nested_node_provider_get_focus(), uia_nested_node_provider_get_prop_val(), uia_nested_node_provider_navigate(), and UiaGetUpdatedCache().

◆ impl_from_IWineUiaNode()

◆ impl_from_IWineUiaProvider()

◆ navigate_uia_node()

HRESULT navigate_uia_node ( struct uia_node node,
int  nav_dir,
HUIANODE *  out_node 
)

Definition at line 914 of file uia_client.c.

915{
916 HRESULT hr;
917 VARIANT v;
918
919 *out_node = NULL;
920
921 VariantInit(&v);
922 switch (nav_dir)
923 {
926 /* First child always comes from last provider index. */
927 if (nav_dir == NavigateDirection_FirstChild)
928 hr = get_child_for_node(node, node->prov_count - 1, nav_dir, &v);
929 else
930 hr = get_child_for_node(node, 0, nav_dir, &v);
931 if (FAILED(hr))
932 WARN("Child navigation failed with hr %#lx\n", hr);
933 break;
934
937 {
938 struct uia_node *node_data;
939 HUIANODE parent;
940 VARIANT tmp;
941
942 hr = get_sibling_from_node_provider(node, node->parent_link_idx, nav_dir, &v);
943 if (FAILED(hr))
944 {
945 WARN("Sibling navigation failed with hr %#lx\n", hr);
946 break;
947 }
948
949 if (V_VT(&v) != VT_EMPTY)
950 break;
951
952 hr = get_navigate_from_node_provider(&node->IWineUiaNode_iface, node->parent_link_idx,
954 if (FAILED(hr))
955 {
956 WARN("Parent navigation failed with hr %#lx\n", hr);
957 break;
958 }
959
961 if (FAILED(hr))
962 break;
963
964 /*
965 * If the parent node has multiple providers, attempt to get a sibling
966 * from one of them.
967 */
968 node_data = impl_from_IWineUiaNode((IWineUiaNode *)parent);
969 if (node_data->prov_count > 1)
970 {
971 if (nav_dir == NavigateDirection_NextSibling)
973 else
975 }
976
978 break;
979 }
980
982 hr = get_navigate_from_node_provider(&node->IWineUiaNode_iface, node->parent_link_idx, nav_dir, &v);
983 if (FAILED(hr))
984 WARN("Parent navigation failed with hr %#lx\n", hr);
985 break;
986
987 default:
988 WARN("Invalid NavigateDirection %d\n", nav_dir);
989 return E_INVALIDARG;
990 }
991
992 if (V_VT(&v) != VT_EMPTY)
993 {
994 hr = UiaHUiaNodeFromVariant(&v, (HUIANODE *)out_node);
995 if (FAILED(hr))
996 WARN("UiaHUiaNodeFromVariant failed with hr %#lx\n", hr);
997 }
998
999 return S_OK;
1000}
@ VT_EMPTY
Definition: compat.h:2295
r parent
Definition: btrfs.c:3010
static HRESULT get_navigate_from_node_provider(IWineUiaNode *node, int idx, int nav_dir, VARIANT *ret_val)
Definition: uia_client.c:334
static HRESULT get_sibling_from_node_provider(struct uia_node *node, int prov_idx, int nav_dir, VARIANT *out_node)
Definition: uia_client.c:808
BOOL WINAPI UiaNodeRelease(HUIANODE huianode)
Definition: uia_client.c:2876
HRESULT WINAPI UiaHUiaNodeFromVariant(VARIANT *in_val, HUIANODE *huianode)
Definition: uia_client.c:3097
static HRESULT get_child_for_node(struct uia_node *node, int start_prov_idx, int nav_dir, VARIANT *out_node)
Definition: uia_client.c:856
@ NavigateDirection_NextSibling
@ NavigateDirection_PreviousSibling
@ NavigateDirection_Parent
@ NavigateDirection_LastChild
@ NavigateDirection_FirstChild

Referenced by conditional_navigate_uia_node(), traverse_uia_node_tree(), traverse_uia_node_tree_siblings(), and uia_event_check_node_within_event_scope().

◆ register_interface_in_git()

HRESULT register_interface_in_git ( IUnknown iface,
REFIID  riid,
DWORD ret_cookie 
)

Definition at line 40 of file uia_utils.c.

41{
43 DWORD git_cookie;
44 HRESULT hr;
45
46 *ret_cookie = 0;
48 if (FAILED(hr))
49 return hr;
50
51 hr = IGlobalInterfaceTable_RegisterInterfaceInGlobal(git, iface, riid, &git_cookie);
52 if (FAILED(hr))
53 {
54 WARN("Failed to register interface in GlobalInterfaceTable, hr %#lx\n", hr);
55 return hr;
56 }
57
58 *ret_cookie = git_cookie;
59
60 return S_OK;
61}
unsigned long DWORD
Definition: ntddk_ex.h:95

Referenced by clone_uia_node(), create_wine_uia_nested_node_provider(), prepare_uia_node(), uia_add_com_event_handler(), uia_event_add_provider_event_adviser(), and uia_event_add_serverside_event_adviser().

◆ respond_to_win_event_on_node_provider()

HRESULT respond_to_win_event_on_node_provider ( IWineUiaNode *  node,
int  idx,
DWORD  win_event,
HWND  hwnd,
LONG  obj_id,
LONG  child_id,
IProxyProviderWinEventSink *  sink 
)

Definition at line 381 of file uia_client.c.

383{
384 IWineUiaProvider *prov;
385 HRESULT hr;
386
387 hr = IWineUiaNode_get_provider(node, idx, &prov);
388 if (FAILED(hr))
389 return hr;
390
391 hr = IWineUiaProvider_respond_to_win_event(prov, win_event, HandleToUlong(hwnd), obj_id, child_id, sink);
392 IWineUiaProvider_Release(prov);
393
394 return hr;
395}
#define HandleToUlong(h)
Definition: basetsd.h:73
GLsizei GLenum GLboolean sink
Definition: glext.h:5672

Referenced by uia_win_event_for_each_callback().

◆ uia_add_clientside_event()

HRESULT uia_add_clientside_event ( HUIANODE  huianode,
EVENTID  event_id,
enum TreeScope  scope,
PROPERTYID prop_ids,
int  prop_ids_count,
struct UiaCacheRequest cache_req,
SAFEARRAY rt_id,
UiaWineEventCallback cback,
void cback_data,
HUIAEVENT *  huiaevent 
)

Definition at line 1628 of file uia_event.c.

1631{
1632 struct uia_event *event;
1633 SAFEARRAY *sa;
1634 HRESULT hr;
1635
1636 hr = SafeArrayCopy(rt_id, &sa);
1637 if (FAILED(hr))
1638 return hr;
1639
1640 hr = create_clientside_uia_event(&event, event_id, scope, cback, cback_data, sa);
1641 if (FAILED(hr))
1642 {
1644 return hr;
1645 }
1646
1647 hr = uia_cache_request_clone(&event->u.clientside.cache_req, cache_req);
1648 if (FAILED(hr))
1649 goto exit;
1650
1651 hr = attach_event_to_uia_node(huianode, event);
1652 if (FAILED(hr))
1653 goto exit;
1654
1656 if (FAILED(hr))
1657 goto exit;
1658
1660 if (FAILED(hr))
1661 goto exit;
1662
1663 *huiaevent = (HUIAEVENT)event;
1664
1665exit:
1666 if (FAILED(hr))
1667 IWineUiaEvent_Release(&event->IWineUiaEvent_iface);
1668
1669 return hr;
1670}
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
Definition: safearray.c:1379
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
struct UiaCacheRequest cache_req
Definition: uia_private.h:143
int event_id
Definition: uia_private.h:127
HRESULT attach_event_to_uia_node(HUIANODE node, struct uia_event *event)
Definition: uia_client.c:1337
static HRESULT uia_event_advise(struct uia_event *event, BOOL advise_added, LONG start_idx)
Definition: uia_event.c:1553
static HRESULT uia_event_map_add_event(struct uia_event *event)
Definition: uia_event.c:170
static HRESULT create_clientside_uia_event(struct uia_event **out_event, int event_id, int scope, UiaWineEventCallback *cback, void *cback_data, SAFEARRAY *runtime_id)
Definition: uia_event.c:1211
HRESULT uia_cache_request_clone(struct UiaCacheRequest *dst, struct UiaCacheRequest *src)
Definition: uia_utils.c:264

Referenced by uia_add_com_event_handler(), and UiaAddEvent().

◆ uia_array_reserve()

static BOOL uia_array_reserve ( void **  elements,
SIZE_T capacity,
SIZE_T  count,
SIZE_T  size 
)
inlinestatic

Definition at line 186 of file uia_private.h.

187{
188 SIZE_T max_capacity, new_capacity;
189 void *new_elements;
190
191 if (count <= *capacity)
192 return TRUE;
193
194 max_capacity = ~(SIZE_T)0 / size;
195 if (count > max_capacity)
196 return FALSE;
197
198 new_capacity = max(1, *capacity);
199 while (new_capacity < count && new_capacity <= max_capacity / 2)
200 new_capacity *= 2;
201 if (new_capacity < count)
202 new_capacity = count;
203
204 new_elements = _recalloc(*elements, new_capacity, size);
205 if (!new_elements)
206 return FALSE;
207
208 *elements = new_elements;
209 *capacity = new_capacity;
210 return TRUE;
211}
#define FALSE
Definition: types.h:117
_ACRTIMP void *__cdecl _recalloc(void *, size_t, size_t) __WINE_ALLOC_SIZE(2
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
#define max(a, b)
Definition: svc.c:63
ULONG_PTR SIZE_T
Definition: typedefs.h:80

Referenced by add_node_to_node_array(), uia_cache_request_AddProperty(), and uia_event_add_event_adviser().

◆ uia_cache_request_clone()

HRESULT uia_cache_request_clone ( struct UiaCacheRequest dst,
struct UiaCacheRequest src 
)

Definition at line 264 of file uia_utils.c.

265{
266 HRESULT hr;
267
268 hr = uia_condition_clone(&dst->pViewCondition, src->pViewCondition);
269 if (FAILED(hr))
270 return hr;
271
272 dst->Scope = src->Scope;
273 dst->automationElementMode = src->automationElementMode;
274 if (src->cProperties)
275 {
276 if (!(dst->pProperties = calloc(src->cProperties, sizeof(*dst->pProperties))))
277 {
279 return E_OUTOFMEMORY;
280 }
281
282 dst->cProperties = src->cProperties;
283 memcpy(dst->pProperties, src->pProperties, sizeof(*dst->pProperties) * dst->cProperties);
284 }
285
286 if (src->cPatterns)
287 {
288 if (!(dst->pPatterns = calloc(src->cPatterns, sizeof(*dst->pPatterns))))
289 {
291 return E_OUTOFMEMORY;
292 }
293
294 dst->cPatterns = src->cPatterns;
295 memcpy(dst->pPatterns, src->pPatterns, sizeof(*dst->pPatterns) * dst->cPatterns);
296 }
297
298 return S_OK;
299}
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HRESULT uia_condition_clone(struct UiaCondition **dst, struct UiaCondition *src)
Definition: uia_utils.c:163
void uia_cache_request_destroy(struct UiaCacheRequest *cache_req)
Definition: uia_utils.c:257

Referenced by uia_add_clientside_event().

◆ uia_cache_request_destroy()

void uia_cache_request_destroy ( struct UiaCacheRequest cache_req)

Definition at line 257 of file uia_utils.c.

258{
260 free(cache_req->pProperties);
261 free(cache_req->pPatterns);
262}
struct UiaCondition * pViewCondition
PROPERTYID * pProperties
static void uia_condition_destroy(struct UiaCondition *cond)
Definition: uia_utils.c:121

Referenced by uia_cache_request_clone(), and uia_event_Release().

◆ uia_clientside_event_start_event_thread()

BOOL uia_clientside_event_start_event_thread ( struct uia_event event)

Definition at line 988 of file uia_event.c.

989{
990 if (!event->u.clientside.event_thread_started)
991 event->u.clientside.event_thread_started = uia_start_event_thread();
992
993 return event->u.clientside.event_thread_started;
994}

Referenced by uia_add_com_event_handler(), uia_event_add_serverside_event_adviser(), and uia_event_add_win_event_hwnd().

◆ uia_com_win_event_callback()

HRESULT uia_com_win_event_callback ( DWORD  event_id,
HWND  hwnd,
LONG  obj_id,
LONG  child_id,
DWORD  thread_id,
DWORD  event_time 
)

Definition at line 1154 of file uia_com_client.c.

1155{
1156 LONG handler_count;
1157
1158 TRACE("%ld, %p, %ld, %ld, %ld, %ld\n", event_id, hwnd, obj_id, child_id, thread_id, event_time);
1159
1161 handler_count = com_event_handlers.handler_count;
1163
1164 if (!handler_count)
1165 return S_OK;
1166
1167 switch (event_id)
1168 {
1169 case EVENT_OBJECT_SHOW:
1170 {
1172 SAFEARRAY *rt_id = NULL;
1173 HUIANODE node;
1174 HRESULT hr;
1175
1176 if (obj_id != OBJID_WINDOW || !uia_hwnd_is_visible(hwnd))
1177 break;
1178
1180 if (FAILED(hr))
1181 return hr;
1182
1183 hr = UiaGetRuntimeId(node, &rt_id);
1184 if (FAILED(hr))
1185 {
1187 return hr;
1188 }
1189
1191
1193 {
1194 struct uia_com_event *event;
1195
1196 /*
1197 * Focus change event handlers only listen for EVENT_OBJECT_SHOW
1198 * on the desktop HWND.
1199 */
1200 if ((entry->event_id == UIA_AutomationFocusChangedEventId) && (hwnd != GetDesktopWindow()))
1201 continue;
1202
1204 {
1206 if (FAILED(hr))
1207 WARN("uia_event_check_node_within_scope failed with hr %#lx\n", hr);
1208 else if (hr == S_OK)
1209 {
1210 hr = uia_event_advise_node((struct uia_event *)event->event, node);
1211 if (FAILED(hr))
1212 WARN("uia_event_advise_node failed with hr %#lx\n", hr);
1213 }
1214 }
1215 }
1216
1218
1220 break;
1221 }
1222
1223 case EVENT_OBJECT_FOCUS:
1224 {
1225 static const int uia_event_id = UIA_AutomationFocusChangedEventId;
1226 struct rb_entry *rb_entry;
1227 HRESULT hr;
1228
1229 if (obj_id != OBJID_CLIENT)
1230 break;
1231
1233
1234 if ((rb_entry = rb_get(&com_event_handlers.handler_event_id_map, &uia_event_id)))
1235 {
1236 struct uia_event_handler_event_id_map_entry *event_id_map;
1237 HUIANODE node = NULL;
1238
1241 if (SUCCEEDED(hr))
1243 else
1245
1247 }
1248
1250 break;
1251 }
1252
1253 case EVENT_OBJECT_DESTROY:
1254 {
1255 static const int uia_event_id = UIA_AutomationFocusChangedEventId;
1256 struct rb_entry *rb_entry;
1257
1258 if (obj_id != OBJID_WINDOW)
1259 break;
1260
1262
1263 if ((rb_entry = rb_get(&com_event_handlers.handler_event_id_map, &uia_event_id)))
1264 {
1265 struct uia_event_handler_event_id_map_entry *event_id_map;
1267
1271 {
1272 struct uia_com_event *event;
1273
1275 {
1276 uia_hwnd_map_remove_hwnd(&event->focus_hwnd_map, hwnd);
1277 }
1278 }
1279 }
1280
1282 break;
1283 }
1284
1285 default:
1286 break;
1287 }
1288
1289 return S_OK;
1290}
uint32_t entry
Definition: isohybrid.c:63
static DWORD thread_id
Definition: protocol.c:159
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define RB_FOR_EACH_ENTRY(elem, tree, type, field)
Definition: rbtree.h:148
struct list event_handler_map_list_entry
struct list handlers_list
struct list handler_event_id_map_list_entry
HRESULT WINAPI UiaGetRuntimeId(HUIANODE huianode, SAFEARRAY **runtime_id)
Definition: uia_client.c:3045
HRESULT create_uia_node_from_hwnd(HWND hwnd, HUIANODE *out_node, int node_flags)
Definition: uia_client.c:2721
HRESULT WINAPI UiaNodeFromHandle(HWND hwnd, HUIANODE *huianode)
Definition: uia_client.c:2761
static struct uia_com_event_handlers com_event_handlers
static void uia_com_focus_win_event_handler(HUIANODE node, HWND hwnd, struct uia_event_handler_event_id_map_entry *event_id_map)
static void uia_com_focus_win_event_msaa_handler(HWND hwnd, LONG child_id)
static CRITICAL_SECTION com_event_handlers_cs
HRESULT uia_event_check_node_within_event_scope(struct uia_event *event, HUIANODE node, SAFEARRAY *rt_id, HUIANODE *clientside_nav_node_out)
Definition: uia_event.c:1814
HRESULT uia_event_advise_node(struct uia_event *event, HUIANODE node)
Definition: uia_event.c:1577
BOOL uia_hwnd_is_visible(HWND hwnd)
Definition: uia_utils.c:391
void uia_hwnd_map_remove_hwnd(struct rb_tree *hwnd_map, HWND hwnd)
Definition: uia_utils.c:462
#define OBJID_WINDOW
Definition: winable.h:15
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:628

Referenced by uia_event_thread_process_queue().

◆ uia_compare_safearrays()

int uia_compare_safearrays ( SAFEARRAY sa1,
SAFEARRAY sa2,
int  prop_type 
)

Definition at line 334 of file uia_utils.c.

335{
336 LONG i, idx, lbound[2], elems[2];
337 int val[2];
338 HRESULT hr;
339
340 hr = get_safearray_bounds(sa1, &lbound[0], &elems[0]);
341 if (FAILED(hr))
342 {
343 ERR("Failed to get safearray bounds from sa1 with hr %#lx\n", hr);
344 return -1;
345 }
346
347 hr = get_safearray_bounds(sa2, &lbound[1], &elems[1]);
348 if (FAILED(hr))
349 {
350 ERR("Failed to get safearray bounds from sa2 with hr %#lx\n", hr);
351 return -1;
352 }
353
354 if (elems[0] != elems[1])
355 return (elems[0] > elems[1]) - (elems[0] < elems[1]);
356
357 if (prop_type != UIAutomationType_IntArray)
358 {
359 FIXME("Array type %#x value comparison currently unimplemented.\n", prop_type);
360 return -1;
361 }
362
363 for (i = 0; i < elems[0]; i++)
364 {
365 idx = lbound[0] + i;
366 hr = SafeArrayGetElement(sa1, &idx, &val[0]);
367 if (FAILED(hr))
368 {
369 ERR("Failed to get element from sa1 with hr %#lx\n", hr);
370 return -1;
371 }
372
373 idx = lbound[1] + i;
374 hr = SafeArrayGetElement(sa2, &idx, &val[1]);
375 if (FAILED(hr))
376 {
377 ERR("Failed to get element from sa2 with hr %#lx\n", hr);
378 return -1;
379 }
380
381 if (val[0] != val[1])
382 return (val[0] > val[1]) - (val[0] < val[1]);
383 }
384
385 return 0;
386}
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:947
GLuint GLfloat * val
Definition: glext.h:7180
HRESULT get_safearray_bounds(SAFEARRAY *sa, LONG *lbound, LONG *elems)
Definition: uia_utils.c:319

Referenced by uia_com_event_handler_id_compare(), uia_event_check_node_within_event_scope(), uia_event_map_add_event(), uia_property_condition_check(), and uia_runtime_id_compare().

◆ uia_condition_check()

HRESULT uia_condition_check ( HUIANODE  node,
struct UiaCondition condition 
)

Definition at line 3363 of file uia_client.c.

3364{
3365 HRESULT hr;
3366
3367 switch (condition->ConditionType)
3368 {
3369 case ConditionType_True:
3370 return S_OK;
3371
3373 return S_FALSE;
3374
3375 case ConditionType_Not:
3376 {
3377 struct UiaNotCondition *not_cond = (struct UiaNotCondition *)condition;
3378
3379 hr = uia_condition_check(node, not_cond->pConditions);
3380 if (FAILED(hr))
3381 return hr;
3382
3384 return S_FALSE;
3385 else
3386 return S_OK;
3387 }
3388
3389 case ConditionType_And:
3390 case ConditionType_Or:
3391 {
3392 struct UiaAndOrCondition *and_or_cond = (struct UiaAndOrCondition *)condition;
3393 int i;
3394
3395 for (i = 0; i < and_or_cond->cConditions; i++)
3396 {
3397 hr = uia_condition_check(node, and_or_cond->ppConditions[i]);
3398 if (FAILED(hr))
3399 return hr;
3400
3401 if (condition->ConditionType == ConditionType_And && !uia_condition_matched(hr))
3402 return S_FALSE;
3403 else if (condition->ConditionType == ConditionType_Or && uia_condition_matched(hr))
3404 return S_OK;
3405 }
3406
3407 if (condition->ConditionType == ConditionType_Or)
3408 return S_FALSE;
3409 else
3410 return S_OK;
3411 }
3412
3415
3416 default:
3417 WARN("Invalid condition type %d\n", condition->ConditionType);
3418 return E_INVALIDARG;
3419 }
3420}
GLenum condition
Definition: glext.h:9255
struct UiaCondition ** ppConditions
struct UiaCondition * pConditions
HRESULT uia_condition_check(HUIANODE node, struct UiaCondition *condition)
Definition: uia_client.c:3363
static HRESULT uia_property_condition_check(HUIANODE node, struct UiaPropertyCondition *prop_cond)
Definition: uia_client.c:3310
BOOL uia_condition_matched(HRESULT hr)
Definition: uia_client.c:3302
@ ConditionType_Not
@ ConditionType_True
@ ConditionType_Or
@ ConditionType_Property
@ ConditionType_False
@ ConditionType_And

Referenced by conditional_navigate_uia_node(), traverse_uia_node_tree(), traverse_uia_node_tree_siblings(), uia_condition_check(), uia_event_check_node_within_event_scope(), and uia_node_normalize().

◆ uia_condition_matched()

BOOL uia_condition_matched ( HRESULT  hr)

◆ uia_control_type_info_from_id()

const struct uia_control_type_info * uia_control_type_info_from_id ( CONTROLTYPEID  control_type_id)

Definition at line 616 of file uia_ids.c.

617{
618 if ((control_type_id < CONTROL_TYPE_ID_MIN) || (control_type_id >= CONTROL_TYPE_ID_MAX))
619 return NULL;
620
622}
static const struct uia_control_type_info default_uia_control_types[]
Definition: uia_ids.c:549
#define CONTROL_TYPE_ID_MAX
Definition: uia_ids.c:603
#define CONTROL_TYPE_ID_MIN
Definition: uia_ids.c:602
static const int control_type_id_idx[]
Definition: uia_ids.c:593

Referenced by uia_elem_get_control_type().

◆ uia_event_add_provider_event_adviser()

HRESULT uia_event_add_provider_event_adviser ( IRawElementProviderAdviseEvents *  advise_events,
struct uia_event event 
)

Definition at line 1385 of file uia_event.c.

1386{
1387 struct uia_event_adviser *adv_events;
1388 IRawElementProviderSimple *elprov;
1389 enum ProviderOptions prov_opts;
1390 HRESULT hr;
1391
1392 hr = IRawElementProviderAdviseEvents_QueryInterface(advise_events, &IID_IRawElementProviderSimple,
1393 (void **)&elprov);
1394 if (FAILED(hr))
1395 {
1396 ERR("Failed to get IRawElementProviderSimple from advise events\n");
1397 return E_FAIL;
1398 }
1399
1400 hr = IRawElementProviderSimple_get_ProviderOptions(elprov, &prov_opts);
1401 IRawElementProviderSimple_Release(elprov);
1402 if (FAILED(hr))
1403 return hr;
1404
1405 if (!(adv_events = calloc(1, sizeof(*adv_events))))
1406 return E_OUTOFMEMORY;
1407
1408 if (prov_opts & ProviderOptions_UseComThreading)
1409 {
1410 hr = register_interface_in_git((IUnknown *)advise_events, &IID_IRawElementProviderAdviseEvents,
1411 &adv_events->git_cookie);
1412 if (FAILED(hr))
1413 {
1414 free(adv_events);
1415 return hr;
1416 }
1417 }
1418
1420 adv_events->ref = 1;
1421 adv_events->advise_events = advise_events;
1422 IRawElementProviderAdviseEvents_AddRef(advise_events);
1423
1425 IWineUiaEventAdviser_Release(&adv_events->IWineUiaEventAdviser_iface);
1426
1427 return hr;
1428}
IRawElementProviderAdviseEvents * advise_events
Definition: uia_event.c:1297
IWineUiaEventAdviser IWineUiaEventAdviser_iface
Definition: uia_event.c:1294
static const IWineUiaEventAdviserVtbl uia_event_adviser_vtbl
Definition: uia_event.c:1378
static HRESULT uia_event_add_event_adviser(IWineUiaEventAdviser *adviser, struct uia_event *event)
Definition: uia_event.c:1277
@ ProviderOptions_UseComThreading

Referenced by uia_provider_attach_event().

◆ uia_event_add_serverside_event_adviser()

HRESULT uia_event_add_serverside_event_adviser ( IWineUiaEvent *  serverside_event,
struct uia_event event 
)

Definition at line 1519 of file uia_event.c.

1520{
1521 struct uia_serverside_event_adviser *adv_events;
1522 HRESULT hr;
1523
1524 /*
1525 * Need to create a proxy IWineUiaEvent for our clientside event to use
1526 * this serverside IWineUiaEvent proxy from the appropriate apartment.
1527 */
1528 if (!event->u.clientside.git_cookie)
1529 {
1531 return E_FAIL;
1532
1533 hr = register_interface_in_git((IUnknown *)&event->IWineUiaEvent_iface, &IID_IWineUiaEvent,
1534 &event->u.clientside.git_cookie);
1535 if (FAILED(hr))
1536 return hr;
1537 }
1538
1539 if (!(adv_events = calloc(1, sizeof(*adv_events))))
1540 return E_OUTOFMEMORY;
1541
1543 adv_events->ref = 1;
1544 adv_events->event_iface = serverside_event;
1545 IWineUiaEvent_AddRef(serverside_event);
1546
1548 IWineUiaEventAdviser_Release(&adv_events->IWineUiaEventAdviser_iface);
1549
1550 return hr;
1551}
IWineUiaEventAdviser IWineUiaEventAdviser_iface
Definition: uia_event.c:1434
IWineUiaEvent * event_iface
Definition: uia_event.c:1437
BOOL uia_clientside_event_start_event_thread(struct uia_event *event)
Definition: uia_event.c:988
static const IWineUiaEventAdviserVtbl uia_serverside_event_adviser_vtbl
Definition: uia_event.c:1512

Referenced by uia_nested_node_provider_attach_event().

◆ uia_event_add_win_event_hwnd()

HRESULT uia_event_add_win_event_hwnd ( struct uia_event event,
HWND  hwnd 
)

Definition at line 83 of file uia_event.c.

84{
86 return E_FAIL;
87
88 if (hwnd == GetDesktopWindow())
89 EnumWindows(uia_win_event_enum_top_level_hwnds, (LPARAM)&event->u.clientside.win_event_hwnd_map);
90
91 return uia_hwnd_map_add_hwnd(&event->u.clientside.win_event_hwnd_map, hwnd);
92}
LONG_PTR LPARAM
Definition: minwindef.h:175
static BOOL CALLBACK uia_win_event_enum_top_level_hwnds(HWND hwnd, LPARAM lparam)
Definition: uia_event.c:68
HRESULT uia_hwnd_map_add_hwnd(struct rb_tree *hwnd_map, HWND hwnd)
Definition: uia_utils.c:442
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam)

Referenced by uia_provider_attach_event().

◆ uia_event_advise_node()

HRESULT uia_event_advise_node ( struct uia_event event,
HUIANODE  node 
)

Definition at line 1577 of file uia_event.c.

1578{
1579 int old_event_advisers_count = event->event_advisers_count;
1580 HRESULT hr;
1581
1583 if (FAILED(hr))
1584 return hr;
1585
1586 if (event->event_advisers_count != old_event_advisers_count)
1587 hr = uia_event_advise(event, TRUE, old_event_advisers_count);
1588
1589 return hr;
1590}

Referenced by uia_com_focus_handler_advise_node(), uia_com_win_event_callback(), and UiaEventAddWindow().

◆ uia_event_check_node_within_event_scope()

HRESULT uia_event_check_node_within_event_scope ( struct uia_event event,
HUIANODE  node,
SAFEARRAY rt_id,
HUIANODE *  clientside_nav_node_out 
)

Definition at line 1814 of file uia_event.c.

1816{
1818 struct uia_node *node_data = impl_from_IWineUiaNode((IWineUiaNode *)node);
1819 BOOL in_scope = FALSE;
1820 HRESULT hr = S_FALSE;
1821
1822 if (clientside_nav_node_out)
1823 *clientside_nav_node_out = NULL;
1824
1825 if (event->event_type == EVENT_TYPE_SERVERSIDE)
1826 assert(clientside_nav_node_out);
1827
1828 /* Event is no longer valid. */
1829 if (InterlockedCompareExchange(&event->event_defunct, 0, 0) != 0)
1830 return S_FALSE;
1831
1832 /* Can't match an event that doesn't have a runtime ID, early out. */
1833 if (!event->runtime_id)
1834 return S_FALSE;
1835
1836 if (event->desktop_subtree_event)
1837 return S_OK;
1838
1839 if (rt_id && !uia_compare_safearrays(rt_id, event->runtime_id, UIAutomationType_IntArray))
1840 return (event->scope & TreeScope_Element) ? S_OK : S_FALSE;
1841
1843 return S_FALSE;
1844
1845 V_VT(&prop_cond.Value) = VT_I4 | VT_ARRAY;
1846 V_ARRAY(&prop_cond.Value) = event->runtime_id;
1847
1848 IWineUiaNode_AddRef(&node_data->IWineUiaNode_iface);
1849 while (1)
1850 {
1851 HUIANODE node2 = NULL;
1852
1853 /*
1854 * When trying to match serverside events through navigation, we
1855 * don't want any clientside providers added in the server process.
1856 * Once we encounter a provider with an HWND, we pass it off to the
1857 * client for any further navigation.
1858 */
1859 if (event->event_type == EVENT_TYPE_SERVERSIDE)
1860 {
1861 if (node_data->hwnd)
1862 {
1863 *clientside_nav_node_out = (HUIANODE)&node_data->IWineUiaNode_iface;
1864 IWineUiaNode_AddRef(&node_data->IWineUiaNode_iface);
1865 in_scope = TRUE;
1866 break;
1867 }
1868 set_refuse_hwnd_providers(node_data, TRUE);
1869 }
1870
1871 hr = navigate_uia_node(node_data, NavigateDirection_Parent, &node2);
1872 if (FAILED(hr) || !node2)
1873 break;
1874
1875 IWineUiaNode_Release(&node_data->IWineUiaNode_iface);
1876
1877 node_data = impl_from_IWineUiaNode((IWineUiaNode *)node2);
1878 hr = uia_condition_check(node2, (struct UiaCondition *)&prop_cond);
1879 if (FAILED(hr))
1880 break;
1881
1883 {
1884 in_scope = TRUE;
1885 break;
1886 }
1887
1888 if (!(event->scope & TreeScope_Descendants))
1889 break;
1890 }
1891 IWineUiaNode_Release(&node_data->IWineUiaNode_iface);
1892
1893 if (FAILED(hr))
1894 return hr;
1895
1896 return in_scope ? S_OK : S_FALSE;
1897}
@ VT_ARRAY
Definition: compat.h:2341
#define assert(_expr)
Definition: assert.h:32
unsigned int BOOL
Definition: ntddk_ex.h:94
#define InterlockedCompareExchange
Definition: interlocked.h:119
#define V_ARRAY(A)
Definition: oleauto.h:222
HRESULT navigate_uia_node(struct uia_node *node, int nav_dir, HUIANODE *out_node)
Definition: uia_client.c:914
static void set_refuse_hwnd_providers(struct uia_node *node, BOOL refuse_hwnd_providers)
Definition: uia_event.c:1801
int uia_compare_safearrays(SAFEARRAY *sa1, SAFEARRAY *sa2, int prop_type)
Definition: uia_utils.c:334
@ TreeScope_Descendants
@ TreeScope_Children
@ TreeScope_Element

Referenced by uia_com_win_event_callback(), uia_event_invoke(), and uia_raise_elprov_event_callback().

◆ uia_event_for_each()

HRESULT uia_event_for_each ( int  event_id,
UiaWineEventForEachCallback callback,
void user_data,
BOOL  clientside_only 
)

Definition at line 255 of file uia_event.c.

257{
258 struct uia_event_map_entry *event_entry;
259 HRESULT hr = S_OK;
260 int i;
261
263 if ((event_entry = uia_get_event_map_entry_for_event(event_id)))
264 InterlockedIncrement(&event_entry->refs);
266
267 if (!event_entry)
268 return S_OK;
269
270 for (i = 0; i < 2; i++)
271 {
272 struct list *events = !i ? &event_entry->events_list : &event_entry->serverside_events_list;
273 struct list *cursor, *cursor2;
274
275 if (i && clientside_only)
276 break;
277
279 {
280 struct uia_event *event = LIST_ENTRY(cursor, struct uia_event, event_list_entry);
281
282 /* Event is no longer valid. */
283 if (InterlockedCompareExchange(&event->event_defunct, 0, 0) != 0)
284 continue;
285
287 if (FAILED(hr))
288 goto exit;
289 }
290 }
291
292exit:
293 if (FAILED(hr))
294 WARN("Event callback failed with hr %#lx\n", hr);
295 uia_event_map_entry_release(event_entry);
296 return hr;
297}
#define InterlockedIncrement
Definition: armddk.h:53
Definition: list.h:37
static void * user_data
Definition: metahost.c:106
const char cursor[]
Definition: icontest.c:13
HANDLE events[2]
Definition: event.c:4
static IPrintDialogCallback callback
Definition: printdlg.c:326
#define LIST_FOR_EACH_SAFE(cursor, cursor2, list)
Definition: list.h:192
Definition: uia_event.c:108
struct list serverside_events_list
Definition: uia_event.c:123
LONG refs
Definition: uia_event.c:110
int event_id
Definition: uia_event.c:112
struct list events_list
Definition: uia_event.c:122
struct list event_list_entry
Definition: uia_private.h:134
#define LIST_ENTRY(type)
Definition: queue.h:175
static void uia_event_map_entry_release(struct uia_event_map_entry *entry)
Definition: uia_event.c:212
static struct uia_event_map_entry * uia_get_event_map_entry_for_event(int event_id)
Definition: uia_event.c:159

Referenced by uia_com_focus_win_event_handler(), uia_com_focus_win_event_msaa_handler(), uia_event_thread_process_queue(), and uia_raise_elprov_event().

◆ uia_event_info_from_id()

const struct uia_event_info * uia_event_info_from_id ( EVENTID  event_id)

Definition at line 438 of file uia_ids.c.

439{
440 if ((event_id < EVENT_ID_MIN) || (event_id >= EVENT_ID_MAX))
441 return NULL;
442
443 return &default_uia_events[event_id_idx[event_id - EVENT_ID_MIN]];
444}
static const struct uia_event_info default_uia_events[]
Definition: uia_ids.c:341
static const int event_id_idx[]
Definition: uia_ids.c:416
#define EVENT_ID_MIN
Definition: uia_ids.c:424
#define EVENT_ID_MAX
Definition: uia_ids.c:425

Referenced by uia_event_raise_event(), uia_proxy_win_event_sink_AddAutomationEvent(), uia_serverside_event_adviser_advise(), UiaAddEvent(), and UiaRaiseAutomationEvent().

◆ uia_event_invoke()

HRESULT uia_event_invoke ( HUIANODE  node,
HUIANODE  nav_start_node,
struct uia_event_args args,
struct uia_event event 
)

Definition at line 1738 of file uia_event.c.

1739{
1740 HRESULT hr = S_OK;
1741
1742 if (event->event_type == EVENT_TYPE_CLIENTSIDE)
1743 {
1744 SAFEARRAY *out_req;
1745 BSTR tree_struct;
1746
1747 if (nav_start_node && (hr = uia_event_check_node_within_event_scope(event, nav_start_node, NULL, NULL)) != S_OK)
1748 return hr;
1749
1750 hr = UiaGetUpdatedCache(node, &event->u.clientside.cache_req, NormalizeState_View, NULL, &out_req,
1751 &tree_struct);
1752 if (SUCCEEDED(hr))
1753 {
1754 hr = event->u.clientside.event_callback(event, args, out_req, tree_struct);
1755 if (FAILED(hr))
1756 WARN("Event callback failed with hr %#lx\n", hr);
1757 SafeArrayDestroy(out_req);
1758 SysFreeString(tree_struct);
1759 }
1760 }
1761 else
1762 {
1764 HUIANODE node2, nav_start_node2;
1765
1766 if (!(queue_event = calloc(1, sizeof(*queue_event))))
1767 return E_OUTOFMEMORY;
1768
1769 node2 = nav_start_node2 = NULL;
1770 hr = clone_uia_node(node, &node2);
1771 if (FAILED(hr))
1772 {
1774 return hr;
1775 }
1776
1777 if (nav_start_node)
1778 {
1779 hr = clone_uia_node(nav_start_node, &nav_start_node2);
1780 if (FAILED(hr))
1781 {
1783 UiaNodeRelease(node2);
1784 return hr;
1785 }
1786 }
1787
1788 queue_event->args = args;
1789 queue_event->event = event;
1790 queue_event->u.serverside.node = node2;
1791 queue_event->u.serverside.nav_start_node = nav_start_node2;
1792
1794 IWineUiaEvent_AddRef(&event->IWineUiaEvent_iface);
1796 }
1797
1798 return hr;
1799}
void queue_event(LPDIRECTINPUTDEVICE8A iface, int inst_id, DWORD data, DWORD time, DWORD seq)
Definition: device.c:1025
OLECHAR * BSTR
Definition: compat.h:2293
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define args
Definition: format.c:66
Definition: match.c:390
HUIANODE nav_start_node
Definition: uia_event.c:528
HRESULT WINAPI UiaGetUpdatedCache(HUIANODE huianode, struct UiaCacheRequest *cache_req, enum NormalizeState normalize_state, struct UiaCondition *normalize_cond, SAFEARRAY **out_req, BSTR *tree_struct)
Definition: uia_client.c:3450
HRESULT clone_uia_node(HUIANODE in_node, HUIANODE *out_node)
Definition: uia_client.c:738
static void uia_event_queue_push(struct uia_queue_event *event, int queue_event_type)
Definition: uia_event.c:550
@ QUEUE_EVENT_TYPE_SERVERSIDE
Definition: uia_event.c:508
@ NormalizeState_View

Referenced by uia_com_focus_win_event_msaa_callback(), uia_raise_clientside_event(), and uia_raise_elprov_event_callback().

◆ uia_hwnd_is_visible()

BOOL uia_hwnd_is_visible ( HWND  hwnd)

Definition at line 391 of file uia_utils.c.

392{
393 RECT rect;
394
395 if (!IsWindowVisible(hwnd))
396 return FALSE;
397
398 if (!GetWindowRect(hwnd, &rect))
399 return FALSE;
400
401 if ((rect.right - rect.left) <= 0 || (rect.bottom - rect.top) <= 0)
402 return FALSE;
403
404 return TRUE;
405}
& rect
Definition: startmenu.cpp:1413
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI IsWindowVisible(_In_ HWND)

Referenced by uia_com_win_event_callback(), and uia_win_event_enum_top_level_hwnds().

◆ uia_hwnd_map_add_hwnd()

HRESULT uia_hwnd_map_add_hwnd ( struct rb_tree hwnd_map,
HWND  hwnd 
)

Definition at line 442 of file uia_utils.c.

443{
445
446 if (uia_hwnd_map_check_hwnd(hwnd_map, hwnd))
447 {
448 TRACE("hwnd %p already in map %p\n", hwnd, hwnd_map);
449 return S_OK;
450 }
451
452 if (!(entry = calloc(1, sizeof(*entry))))
453 return E_OUTOFMEMORY;
454
455 TRACE("Adding hwnd %p to map %p\n", hwnd, hwnd_map);
456 entry->hwnd = hwnd;
457 rb_put(hwnd_map, hwnd, &entry->entry);
458
459 return S_OK;
460}
Definition: uia_utils.c:416
BOOL uia_hwnd_map_check_hwnd(struct rb_tree *hwnd_map, HWND hwnd)
Definition: uia_utils.c:437

Referenced by uia_com_focus_handler_advise_node(), uia_event_add_win_event_hwnd(), and uia_win_event_enum_top_level_hwnds().

◆ uia_hwnd_map_check_hwnd()

BOOL uia_hwnd_map_check_hwnd ( struct rb_tree hwnd_map,
HWND  hwnd 
)

◆ uia_hwnd_map_destroy()

void uia_hwnd_map_destroy ( struct rb_tree hwnd_map)

Definition at line 484 of file uia_utils.c.

485{
486 rb_destroy(hwnd_map, uia_hwnd_map_free, hwnd_map);
487}
static void rb_destroy(struct rb_tree *tree, rb_traverse_func_t *callback, void *context)
Definition: rbtree.h:185
static void uia_hwnd_map_free(struct rb_entry *entry, void *context)
Definition: uia_utils.c:429

Referenced by uia_event_handler_destroy(), and uia_event_Release().

◆ uia_hwnd_map_init()

void uia_hwnd_map_init ( struct rb_tree hwnd_map)

Definition at line 479 of file uia_utils.c.

480{
482}
static int uia_hwnd_map_hwnd_compare(const void *key, const struct rb_entry *entry)
Definition: uia_utils.c:421

Referenced by create_clientside_uia_event(), and uia_add_com_event_handler().

◆ uia_hwnd_map_remove_hwnd()

void uia_hwnd_map_remove_hwnd ( struct rb_tree hwnd_map,
HWND  hwnd 
)

Definition at line 462 of file uia_utils.c.

463{
464 struct rb_entry *rb_entry = rb_get(hwnd_map, hwnd);
466
467 if (!rb_entry)
468 {
469 TRACE("hwnd %p not in map %p, nothing to remove.\n", hwnd, hwnd_map);
470 return;
471 }
472
473 TRACE("Removing hwnd %p from map %p\n", hwnd, hwnd_map);
475 rb_remove(hwnd_map, &entry->entry);
476 free(entry);
477}
static void rb_remove(struct rb_tree *tree, struct rb_entry *entry)
Definition: rbtree.h:272

Referenced by uia_com_win_event_callback().

◆ uia_is_top_level_hwnd()

BOOL uia_is_top_level_hwnd ( HWND  hwnd)

Definition at line 407 of file uia_utils.c.

408{
410}
#define GA_PARENT
Definition: winuser.h:2892
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
Definition: window.c:929

Referenced by base_hwnd_fragment_get_BoundingRectangle(), base_hwnd_fragment_Navigate(), and get_uia_control_type_for_hwnd().

◆ uia_lresult_from_node()

LRESULT uia_lresult_from_node ( HUIANODE  huianode)

Definition at line 2236 of file uia_provider.c.

2237{
2238 SAFEARRAY *rt_id;
2239 LRESULT lr = 0;
2240 HRESULT hr;
2241
2242 hr = UiaGetRuntimeId(huianode, &rt_id);
2244 lr = SendMessageW(provider_thread.hwnd, WM_GET_OBJECT_UIA_NODE, (WPARAM)rt_id, (LPARAM)huianode);
2245
2246 if (FAILED(hr))
2247 WARN("UiaGetRuntimeId failed with hr %#lx\n", hr);
2248
2249 /*
2250 * LresultFromObject increases refcnt by 1. If LresultFromObject
2251 * failed or wasn't called, this is expected to release the node.
2252 */
2253 UiaNodeRelease(huianode);
2254 SafeArrayDestroy(rt_id);
2255 return lr;
2256}
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
static struct uia_provider_thread provider_thread
static BOOL uia_start_provider_thread(void)
#define WM_GET_OBJECT_UIA_NODE
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by get_variant_for_elprov_node(), uia_raise_serverside_event(), and UiaReturnRawElementProvider().

◆ uia_node_from_lresult()

HRESULT uia_node_from_lresult ( LRESULT  lr,
HUIANODE *  huianode,
int  node_flags 
)

Definition at line 2642 of file uia_client.c.

2643{
2644 struct uia_node *node;
2645 HRESULT hr;
2646
2647 *huianode = NULL;
2648
2649 hr = create_uia_node(&node, node_flags);
2650 if (FAILED(hr))
2651 {
2653 return hr;
2654 }
2655
2658 if (FAILED(hr))
2659 {
2660 free(node);
2661 return hr;
2662 }
2663
2664 if (node->hwnd)
2665 {
2667 if (FAILED(hr))
2668 WARN("uia_get_providers_for_hwnd failed with hr %#lx\n", hr);
2669 }
2670
2672 if (FAILED(hr))
2673 {
2674 IWineUiaNode_Release(&node->IWineUiaNode_iface);
2675 return hr;
2676 }
2677
2678 *huianode = (void *)&node->IWineUiaNode_iface;
2679
2680 return hr;
2681}
static HRESULT create_wine_uia_nested_node_provider(struct uia_node *node, LRESULT lr, BOOL unwrap)
Definition: uia_client.c:2531
void uia_node_lresult_release(LRESULT lr)
Definition: uia_client.c:2683
static BOOL uia_start_client_thread(void)
Definition: uia_client.c:2204

Referenced by uia_com_focus_win_event_handler(), uia_nested_node_provider_create_node_from_prov(), uia_nested_node_provider_get_focus(), uia_nested_node_provider_get_prop_val(), uia_nested_node_provider_navigate(), and uia_raise_clientside_event().

◆ uia_node_lresult_release()

void uia_node_lresult_release ( LRESULT  lr)

Definition at line 2683 of file uia_client.c.

2684{
2685 IWineUiaNode *node;
2686
2687 if (lr && SUCCEEDED(ObjectFromLresult(lr, &IID_IWineUiaNode, 0, (void **)&node)))
2688 IWineUiaNode_Release(node);
2689}
HRESULT WINAPI ObjectFromLresult(LRESULT result, REFIID riid, WPARAM wParam, void **ppObject)
Definition: main.c:177

Referenced by uia_com_focus_win_event_callback(), uia_node_from_lresult(), uia_raise_clientside_event(), and uia_raise_serverside_event().

◆ uia_pattern_info_from_id()

const struct uia_pattern_info * uia_pattern_info_from_id ( PATTERNID  pattern_id)

Definition at line 540 of file uia_ids.c.

541{
542 if ((pattern_id < PATTERN_ID_MIN) || (pattern_id >= PATTERN_ID_MAX))
543 return NULL;
544
546}
#define PATTERN_ID_MAX
Definition: uia_ids.c:527
#define PATTERN_ID_MIN
Definition: uia_ids.c:526
static const struct uia_pattern_info default_uia_patterns[]
Definition: uia_ids.c:447
static const int pattern_id_idx[]
Definition: uia_ids.c:518

Referenced by uia_provider_get_pattern_prop_val().

◆ uia_prop_info_from_id()

const struct uia_prop_info * uia_prop_info_from_id ( PROPERTYID  prop_id)

Definition at line 332 of file uia_ids.c.

333{
334 if ((prop_id < PROP_ID_MIN) || (prop_id >= PROP_ID_MAX))
335 return NULL;
336
338}
#define PROP_ID_MAX
Definition: uia_ids.c:319
#define PROP_ID_MIN
Definition: uia_ids.c:318
static const int prop_id_idx[]
Definition: uia_ids.c:293
static const struct uia_prop_info default_uia_properties[]
Definition: uia_ids.c:55

Referenced by create_uia_element_from_cache_req(), create_uia_property_condition_iface(), get_node_provider_description_string(), uia_cache_request_AddProperty(), uia_element_GetCachedPropertyValueEx(), uia_element_GetCurrentPropertyValueEx(), uia_property_condition_check(), UiaGetPropertyValue(), UiaGetRuntimeId(), and UiaGetUpdatedCache().

◆ uia_provider_thread_remove_node()

void uia_provider_thread_remove_node ( HUIANODE  node)

Definition at line 1975 of file uia_provider.c.

1976{
1977 struct uia_node *node_data = impl_from_IWineUiaNode((IWineUiaNode *)node);
1978
1979 TRACE("Removing node %p\n", node);
1980
1982
1984 list_init(&node_data->prov_thread_list_entry);
1985 if (!list_empty(&node_data->node_map_list_entry))
1986 {
1987 list_remove(&node_data->node_map_list_entry);
1988 list_init(&node_data->node_map_list_entry);
1989 if (list_empty(&node_data->map->nodes_list))
1990 {
1991 rb_remove(&provider_thread.node_map, &node_data->map->entry);
1992 SafeArrayDestroy(node_data->map->runtime_id);
1993 free(node_data->map);
1994 }
1995 node_data->map = NULL;
1996 }
1997
1999}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void list_init(struct list_entry *head)
Definition: list.h:51
struct uia_provider_thread_map_entry * map
Definition: uia_private.h:84
struct list prov_thread_list_entry
Definition: uia_private.h:82
struct list node_map_list_entry
Definition: uia_private.h:83
static CRITICAL_SECTION provider_thread_cs

Referenced by uia_node_Release().

◆ uia_stop_provider_thread()

void uia_stop_provider_thread ( void  )

Definition at line 2217 of file uia_provider.c.

2218{
2220 if (!--provider_thread.ref)
2221 {
2224 if (!list_empty(&provider_thread.nodes_list))
2225 ERR("Provider thread shutdown with nodes still in the list\n");
2227 }
2229}
#define CloseHandle
Definition: compat.h:739
#define memset(x, y, z)
Definition: compat.h:39
#define WM_UIA_PROVIDER_THREAD_STOP
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by uia_node_Release().

◆ unregister_interface_in_git()

HRESULT unregister_interface_in_git ( DWORD  git_cookie)

Definition at line 63 of file uia_utils.c.

64{
66 HRESULT hr;
67
69 if (FAILED(hr))
70 return hr;
71
72 hr = IGlobalInterfaceTable_RevokeInterfaceFromGlobal(git, git_cookie);
73 if (FAILED(hr))
74 WARN("Failed to revoke interface from GlobalInterfaceTable, hr %#lx\n", hr);
75
76 return hr;
77}

Referenced by uia_event_adviser_Release(), uia_event_handler_destroy(), uia_node_disconnect(), uia_node_Release(), and UiaRemoveEvent().

◆ variant_init_bool()

static void variant_init_bool ( VARIANT v,
BOOL  val 
)
inlinestatic

Definition at line 163 of file uia_private.h.

164{
165 V_VT(v) = VT_BOOL;
166 V_BOOL(v) = val ? VARIANT_TRUE : VARIANT_FALSE;
167}
@ VT_BOOL
Definition: compat.h:2306
#define V_BOOL(A)
Definition: oleauto.h:224

Referenced by msaa_provider_GetPropertyValue(), and uia_provider_get_pattern_prop_val().

◆ variant_init_i4()

◆ write_runtime_id_base()

HRESULT write_runtime_id_base ( SAFEARRAY sa,
HWND  hwnd 
)

Definition at line 102 of file uia_utils.c.

103{
104 const int rt_id[2] = { UIA_RUNTIME_ID_PREFIX, HandleToUlong(hwnd) };
105 HRESULT hr;
106 LONG idx;
107
108 for (idx = 0; idx < ARRAY_SIZE(rt_id); idx++)
109 {
110 hr = SafeArrayPutElement(sa, &idx, (void *)&rt_id[idx]);
111 if (FAILED(hr))
112 return hr;
113 }
114
115 return S_OK;
116}
#define ARRAY_SIZE(A)
Definition: main.h:20
HRESULT WINAPI SafeArrayPutElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:864
#define UIA_RUNTIME_ID_PREFIX
Definition: uia_utils.c:101

Referenced by append_uia_runtime_id(), uia_init_desktop_rt_id(), and UiaGetRuntimeId().

Variable Documentation

◆ huia_module

HMODULE huia_module
extern