Piotr Caban : oleacc: Added AccessibleChildren implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 23 10:03:19 CDT 2015


Module: wine
Branch: master
Commit: 88b5b6a51ed532214541bb8e097a5eba994064c5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=88b5b6a51ed532214541bb8e097a5eba994064c5

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Sat Mar 21 11:26:09 2015 +0100

oleacc: Added AccessibleChildren implementation.

---

 dlls/oleacc/main.c      | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 dlls/oleacc/oleacc.spec |  2 +-
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/dlls/oleacc/main.c b/dlls/oleacc/main.c
index fa7d592..4d9c55e 100644
--- a/dlls/oleacc/main.c
+++ b/dlls/oleacc/main.c
@@ -568,3 +568,50 @@ UINT WINAPI GetStateTextA(DWORD state_bit, CHAR *state_str, UINT state_str_len)
         return LoadStringA(oleacc_handle, state_id, tmp, sizeof(tmp));
     }
 }
+
+HRESULT WINAPI AccessibleChildren(IAccessible *container,
+        LONG start, LONG count, VARIANT *children, LONG *children_cnt)
+{
+    IEnumVARIANT *ev;
+    LONG i, child_no;
+    HRESULT hr;
+
+    TRACE("%p %d %d %p %p\n", container, start, count, children, children_cnt);
+
+    if(!container || !children || !children_cnt)
+        return E_INVALIDARG;
+
+    for(i=0; i<count; i++)
+        VariantInit(children+i);
+
+    hr = IAccessible_QueryInterface(container, &IID_IEnumVARIANT, (void**)&ev);
+    if(SUCCEEDED(hr)) {
+        hr = IEnumVARIANT_Reset(ev);
+        if(SUCCEEDED(hr))
+            hr = IEnumVARIANT_Skip(ev, start);
+        if(SUCCEEDED(hr))
+            hr = IEnumVARIANT_Next(ev, count, children, (ULONG*)children_cnt);
+        IEnumVARIANT_Release(ev);
+        return hr;
+    }
+
+    hr = IAccessible_get_accChildCount(container, &child_no);
+    if(FAILED(hr))
+        return hr;
+
+    for(i=0; i<count && start+i+1<=child_no; i++) {
+        IDispatch *disp;
+
+        V_VT(children+i) = VT_I4;
+        V_I4(children+i) = start+i+1;
+
+        hr = IAccessible_get_accChild(container, children[i], &disp);
+        if(SUCCEEDED(hr) && disp) {
+            V_VT(children+i) = VT_DISPATCH;
+            V_DISPATCH(children+i) = disp;
+        }
+    }
+
+    *children_cnt = i;
+    return i==count ? S_OK : S_FALSE;
+}
diff --git a/dlls/oleacc/oleacc.spec b/dlls/oleacc/oleacc.spec
index 9f3a9a0..4cff0b8 100644
--- a/dlls/oleacc/oleacc.spec
+++ b/dlls/oleacc/oleacc.spec
@@ -1,4 +1,4 @@
-@ stub AccessibleChildren
+@ stdcall AccessibleChildren(ptr long long ptr ptr)
 @ stub AccessibleObjectFromEvent
 @ stdcall AccessibleObjectFromPoint(int64 ptr ptr)
 @ stdcall AccessibleObjectFromWindow(ptr long ptr ptr)




More information about the wine-cvs mailing list