Jacek Caban : jscript: Added GetNextDispID implementation.

Alexandre Julliard julliard at winehq.org
Tue Sep 9 05:50:39 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep  9 01:20:52 2008 +0200

jscript: Added GetNextDispID implementation.

---

 dlls/jscript/dispex.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 439a766..206a963 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -62,6 +62,21 @@ static inline dispex_prop_t *get_prop(DispatchEx *This, DISPID id)
     return This->props+id;
 }
 
+static DWORD get_flags(DispatchEx *This, dispex_prop_t *prop)
+{
+    if(prop->type == PROP_PROTREF) {
+        dispex_prop_t *parent = get_prop(This->prototype, prop->u.ref);
+        if(!parent) {
+            prop->type = PROP_DELETED;
+            return 0;
+        }
+
+        return get_flags(This->prototype, parent);
+    }
+
+    return prop->flags;
+}
+
 static const builtin_prop_t *find_builtin_prop(DispatchEx *This, const WCHAR *name)
 {
     int min = 0, max, i, r;
@@ -347,6 +362,30 @@ static HRESULT prop_put(DispatchEx *This, dispex_prop_t *prop, LCID lcid, DISPPA
     return S_OK;
 }
 
+static HRESULT fill_protrefs(DispatchEx *This)
+{
+    dispex_prop_t *iter, *prop;
+    HRESULT hres;
+
+    if(!This->prototype)
+        return S_OK;
+
+    fill_protrefs(This->prototype);
+
+    for(iter = This->prototype->props; iter < This->prototype->props+This->prototype->prop_cnt; iter++) {
+        hres = find_prop_name(This, iter->name, &prop);
+        if(FAILED(hres))
+            return hres;
+        if(!prop) {
+            prop = alloc_protref(This, iter->name, iter - This->prototype->props);
+            if(!prop)
+                return E_OUTOFMEMORY;
+        }
+    }
+
+    return S_OK;
+}
+
 #define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
 
 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
@@ -564,8 +603,33 @@ static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BS
 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
 {
     DispatchEx *This = DISPATCHEX_THIS(iface);
-    FIXME("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
-    return E_NOTIMPL;
+    dispex_prop_t *iter;
+    HRESULT hres;
+
+    TRACE("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
+
+    if(id == DISPID_STARTENUM) {
+        hres = fill_protrefs(This);
+        if(FAILED(hres))
+            return hres;
+    }
+
+    iter = get_prop(This, id+1);
+    if(!iter) {
+        *pid = DISPID_STARTENUM;
+        return S_FALSE;
+    }
+
+    while(iter < This->props + This->prop_cnt) {
+        if(iter->name && (get_flags(This, iter) & PROPF_ENUM)) {
+            *pid = prop_to_id(This, iter);
+            return S_OK;
+        }
+        iter++;
+    }
+
+    *pid = DISPID_STARTENUM;
+    return S_FALSE;
 }
 
 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)




More information about the wine-cvs mailing list