Piotr Caban : oleacc: Added client IEnumVARIANT::{Reset, Skip, Next} implementation.

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


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Sat Mar 21 13:19:59 2015 +0100

oleacc: Added client IEnumVARIANT::{Reset,Skip,Next} implementation.

---

 dlls/oleacc/client.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 68 insertions(+), 6 deletions(-)

diff --git a/dlls/oleacc/client.c b/dlls/oleacc/client.c
index 9409990..ddaa89d 100644
--- a/dlls/oleacc/client.c
+++ b/dlls/oleacc/client.c
@@ -33,6 +33,7 @@ typedef struct {
     LONG ref;
 
     HWND hwnd;
+    HWND enum_pos;
 } Client;
 
 static inline Client* impl_from_Client(IAccessible *iface)
@@ -526,22 +527,82 @@ static HRESULT WINAPI Client_EnumVARIANT_Next(IEnumVARIANT *iface,
         ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
 {
     Client *This = impl_from_Client_EnumVARIANT(iface);
-    FIXME("(%p)->(%u %p %p)\n", This, celt, rgVar, pCeltFetched);
-    return E_NOTIMPL;
+    HWND cur = This->enum_pos, next;
+    ULONG fetched = 0;
+    HRESULT hr;
+
+    TRACE("(%p)->(%u %p %p)\n", This, celt, rgVar, pCeltFetched);
+
+    if(!celt) {
+        if(pCeltFetched)
+            *pCeltFetched = 0;
+        return S_OK;
+    }
+
+    if(!This->enum_pos)
+        next = GetWindow(This->hwnd, GW_CHILD);
+    else
+        next = GetWindow(This->enum_pos, GW_HWNDNEXT);
+
+    while(next) {
+        cur = next;
+
+        V_VT(rgVar+fetched) = VT_DISPATCH;
+        hr = AccessibleObjectFromWindow(cur, OBJID_WINDOW,
+                &IID_IDispatch, (void**)&V_DISPATCH(rgVar+fetched));
+        if(FAILED(hr)) {
+            V_VT(rgVar+fetched) = VT_EMPTY;
+            while(fetched > 0) {
+                VariantClear(rgVar+fetched-1);
+                fetched--;
+            }
+            if(pCeltFetched)
+                *pCeltFetched = 0;
+            return hr;
+        }
+        fetched++;
+        if(fetched == celt)
+            break;
+
+        next = GetWindow(cur, GW_HWNDNEXT);
+    }
+
+    This->enum_pos = cur;
+    if(pCeltFetched)
+        *pCeltFetched = fetched;
+    return celt == fetched ? S_OK : S_FALSE;
 }
 
 static HRESULT WINAPI Client_EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
 {
     Client *This = impl_from_Client_EnumVARIANT(iface);
-    FIXME("(%p)->(%u)\n", This, celt);
-    return E_NOTIMPL;
+    HWND next;
+
+    TRACE("(%p)->(%u)\n", This, celt);
+
+    while(celt) {
+        if(!This->enum_pos)
+            next = GetWindow(This->hwnd, GW_CHILD);
+        else
+            next = GetWindow(This->enum_pos, GW_HWNDNEXT);
+        if(!next)
+            return S_FALSE;
+
+        This->enum_pos = next;
+        celt--;
+    }
+
+    return S_OK;
 }
 
 static HRESULT WINAPI Client_EnumVARIANT_Reset(IEnumVARIANT *iface)
 {
     Client *This = impl_from_Client_EnumVARIANT(iface);
-    FIXME("(%p)\n", This);
-    return E_NOTIMPL;
+
+    TRACE("(%p)\n", This);
+
+    This->enum_pos = 0;
+    return S_OK;
 }
 
 static HRESULT WINAPI Client_EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
@@ -578,6 +639,7 @@ HRESULT create_client_object(HWND hwnd, const IID *iid, void **obj)
     client->IEnumVARIANT_iface.lpVtbl = &ClientEnumVARIANTVtbl;
     client->ref = 1;
     client->hwnd = hwnd;
+    client->enum_pos = 0;
 
     hres = IAccessible_QueryInterface(&client->IAccessible_iface, iid, obj);
     IAccessible_Release(&client->IAccessible_iface);




More information about the wine-cvs mailing list