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