Nikolay Sivov : msxml3: Implement _newEnum() for schema cache.

Alexandre Julliard julliard at winehq.org
Mon Jul 2 13:22:02 CDT 2012


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Jul  1 19:26:55 2012 +0400

msxml3: Implement _newEnum() for schema cache.

---

 dlls/msxml3/msxml_private.h |    2 +-
 dlls/msxml3/nodelist.c      |    5 +-
 dlls/msxml3/schema.c        |   20 ++++++---
 dlls/msxml3/selection.c     |   20 ++++-----
 dlls/msxml3/tests/domdoc.c  |   96 +++++++++++++++++++++++--------------------
 5 files changed, 78 insertions(+), 65 deletions(-)

diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 4aafc29..8468e55 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -259,7 +259,7 @@ struct nodemap_funcs
 /* used by IEnumVARIANT to access outer object items */
 struct enumvariant_funcs
 {
-    HRESULT (*get_item)(IUnknown*, LONG, IDispatch**);
+    HRESULT (*get_item)(IUnknown*, LONG, VARIANT*);
     HRESULT (*next)(IUnknown*);
 };
 
diff --git a/dlls/msxml3/nodelist.c b/dlls/msxml3/nodelist.c
index 7e46d40..756783d 100644
--- a/dlls/msxml3/nodelist.c
+++ b/dlls/msxml3/nodelist.c
@@ -62,9 +62,10 @@ typedef struct
     IEnumVARIANT *enumvariant;
 } xmlnodelist;
 
-static HRESULT nodelist_get_item(IUnknown *iface, LONG index, IDispatch** item)
+static HRESULT nodelist_get_item(IUnknown *iface, LONG index, VARIANT *item)
 {
-    return IXMLDOMNodeList_get_item((IXMLDOMNodeList*)iface, index, (IXMLDOMNode**)item);
+    V_VT(item) = VT_DISPATCH;
+    return IXMLDOMNodeList_get_item((IXMLDOMNodeList*)iface, index, (IXMLDOMNode**)&V_DISPATCH(item));
 }
 
 static const struct enumvariant_funcs nodelist_enumvariant = {
diff --git a/dlls/msxml3/schema.c b/dlls/msxml3/schema.c
index 903f311..2f31016 100644
--- a/dlls/msxml3/schema.c
+++ b/dlls/msxml3/schema.c
@@ -288,6 +288,17 @@ static void validate_serror(void* ctx, xmlErrorPtr err)
 }
 #endif
 
+static HRESULT schema_cache_get_item(IUnknown *iface, LONG index, VARIANT *item)
+{
+    V_VT(item) = VT_BSTR;
+    return IXMLDOMSchemaCollection2_get_namespaceURI((IXMLDOMSchemaCollection2*)iface, index, &V_BSTR(item));
+}
+
+static const struct enumvariant_funcs schemacache_enumvariant = {
+    schema_cache_get_item,
+    NULL
+};
+
 static inline HRESULT Schema_validate_tree(xmlSchemaPtr schema, xmlNodePtr tree)
 {
     xmlSchemaValidCtxtPtr svctx;
@@ -1327,14 +1338,11 @@ static HRESULT WINAPI schema_cache_addCollection(IXMLDOMSchemaCollection2* iface
     return S_OK;
 }
 
-static HRESULT WINAPI schema_cache_get__newEnum(IXMLDOMSchemaCollection2* iface,
-                                                IUnknown** ppUnk)
+static HRESULT WINAPI schema_cache_get__newEnum(IXMLDOMSchemaCollection2* iface, IUnknown** enumv)
 {
     schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface);
-    FIXME("(%p)->(%p): stub\n", This, ppUnk);
-    if (ppUnk)
-        *ppUnk = NULL;
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, enumv);
+    return create_enumvariant((IUnknown*)iface, TRUE, &schemacache_enumvariant, (IEnumVARIANT**)enumv);
 }
 
 static HRESULT WINAPI schema_cache_validate(IXMLDOMSchemaCollection2* iface)
diff --git a/dlls/msxml3/selection.c b/dlls/msxml3/selection.c
index bf5fe61..bb0f42e 100644
--- a/dlls/msxml3/selection.c
+++ b/dlls/msxml3/selection.c
@@ -83,9 +83,10 @@ typedef struct
     IEnumVARIANT *enumvariant;
 } domselection;
 
-static HRESULT selection_get_item(IUnknown *iface, LONG index, IDispatch** item)
+static HRESULT selection_get_item(IUnknown *iface, LONG index, VARIANT* item)
 {
-    return IXMLDOMSelection_get_item((IXMLDOMSelection*)iface, index, (IXMLDOMNode**)item);
+    V_VT(item) = VT_DISPATCH;
+    return IXMLDOMSelection_get_item((IXMLDOMSelection*)iface, index, (IXMLDOMNode**)&V_DISPATCH(item));
 }
 
 static HRESULT selection_next(IUnknown *iface)
@@ -510,15 +511,12 @@ static HRESULT WINAPI enumvariant_Next(
 
     for (; celt > 0; celt--, var++, This->pos++)
     {
-        IDispatch *disp = NULL;
-        HRESULT hr;
-
-        hr = This->funcs->get_item(This->outer, This->pos, &disp);
-        if (hr != S_OK) break;
-
-        V_VT(var) = VT_DISPATCH;
-        V_DISPATCH(var) = disp;
-
+        HRESULT hr = This->funcs->get_item(This->outer, This->pos, var);
+        if (hr != S_OK)
+        {
+            V_VT(var) = VT_EMPTY;
+            break;
+        }
         ret_count++;
     }
 
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 92e8d5e..58b170c 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -11700,7 +11700,8 @@ static void test_get_namespaces(void)
 {
     IXMLDOMSchemaCollection *collection, *collection2;
     IXMLDOMDocument2 *doc, *doc2;
-    IEnumVARIANT *enumv;
+    IEnumVARIANT *enumv, *enum2;
+    IUnknown *unk1, *unk2;
     IXMLDOMNode *node;
     VARIANT_BOOL b;
     HRESULT hr;
@@ -11789,34 +11790,43 @@ static void test_get_namespaces(void)
 
     /* enumerate */
     enumv = (void*)0xdeadbeef;
+    EXPECT_REF(collection, 2);
     hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);
-todo_wine
     EXPECT_HR(hr, S_OK);
-    if (hr == S_OK)
-    {
-        ok(enumv != NULL, "got %p\n", enumv);
+    EXPECT_REF(collection, 3);
+    ok(enumv != NULL, "got %p\n", enumv);
 
-        V_VT(&v) = VT_EMPTY;
-        hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
-        EXPECT_HR(hr, S_OK);
-        ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
-        ok(!lstrcmpW(V_BSTR(&v), _bstr_("http://blah.org")), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
-        VariantClear(&v);
+    hr = IXMLDOMSchemaCollection_QueryInterface(collection, &IID_IUnknown, (void**)&unk1);
+    EXPECT_HR(hr, S_OK);
+    hr = IEnumVARIANT_QueryInterface(enumv, &IID_IUnknown, (void**)&unk2);
+    EXPECT_HR(hr, S_OK);
+    ok(unk1 != unk2, "got %p, %p\n", unk1, unk2);
+    IUnknown_Release(unk1);
+    IUnknown_Release(unk2);
 
-        V_VT(&v) = VT_EMPTY;
-        hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
-        EXPECT_HR(hr, S_OK);
-        ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
-        ok(!lstrcmpW(V_BSTR(&v), _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
-        VariantClear(&v);
+    hr = IXMLDOMSchemaCollection_QueryInterface(collection, &IID_IEnumVARIANT, (void**)&enum2);
+    EXPECT_HR(hr, E_NOINTERFACE);
 
-        V_VT(&v) = VT_NULL;
-        hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
-        EXPECT_HR(hr, S_FALSE);
-        ok(V_VT(&v) == VT_EMPTY, "got %d\n", V_VT(&v));
+    V_VT(&v) = VT_EMPTY;
+    hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
+    EXPECT_HR(hr, S_OK);
+    ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
+    ok(!lstrcmpW(V_BSTR(&v), _bstr_("http://blah.org")), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
+    VariantClear(&v);
 
-        IEnumVARIANT_Release(enumv);
-    }
+    V_VT(&v) = VT_EMPTY;
+    hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
+    EXPECT_HR(hr, S_OK);
+    ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
+    ok(!lstrcmpW(V_BSTR(&v), _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
+    VariantClear(&v);
+
+    V_VT(&v) = VT_NULL;
+    hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
+    EXPECT_HR(hr, S_FALSE);
+    ok(V_VT(&v) == VT_EMPTY, "got %d\n", V_VT(&v));
+
+    IEnumVARIANT_Release(enumv);
     IXMLDOMSchemaCollection_Release(collection);
 
     IXMLDOMDocument2_Release(doc);
@@ -11900,33 +11910,29 @@ todo_wine
     /* enumerate */
     enumv = (void*)0xdeadbeef;
     hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);
-todo_wine
     EXPECT_HR(hr, S_OK);
-    if (hr == S_OK)
-    {
-        ok(enumv != NULL, "got %p\n", enumv);
+    ok(enumv != NULL, "got %p\n", enumv);
 
-        V_VT(&v) = VT_EMPTY;
-        hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
-        EXPECT_HR(hr, S_OK);
-        ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
-        ok(!lstrcmpW(V_BSTR(&v), _bstr_("http://blah.org")), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
-        VariantClear(&v);
+    V_VT(&v) = VT_EMPTY;
+    hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
+    EXPECT_HR(hr, S_OK);
+    ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
+    ok(!lstrcmpW(V_BSTR(&v), _bstr_("http://blah.org")), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
+    VariantClear(&v);
 
-        V_VT(&v) = VT_EMPTY;
-        hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
-        EXPECT_HR(hr, S_OK);
-        ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
-        ok(!lstrcmpW(V_BSTR(&v), _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
-        VariantClear(&v);
+    V_VT(&v) = VT_EMPTY;
+    hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
+    EXPECT_HR(hr, S_OK);
+    ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
+    ok(!lstrcmpW(V_BSTR(&v), _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
+    VariantClear(&v);
 
-        V_VT(&v) = VT_NULL;
-        hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
-        EXPECT_HR(hr, S_FALSE);
-        ok(V_VT(&v) == VT_EMPTY, "got %d\n", V_VT(&v));
+    V_VT(&v) = VT_NULL;
+    hr = IEnumVARIANT_Next(enumv, 1, &v, NULL);
+    EXPECT_HR(hr, S_FALSE);
+    ok(V_VT(&v) == VT_EMPTY, "got %d\n", V_VT(&v));
 
-        IEnumVARIANT_Release(enumv);
-    }
+    IEnumVARIANT_Release(enumv);
     IXMLDOMSchemaCollection_Release(collection);
     IXMLDOMDocument2_Release(doc);
     free_bstrs();




More information about the wine-cvs mailing list