Module: wine Branch: master Commit: 892b21088ee3cd30e57e48c0b8563bdb0591b616 URL: http://source.winehq.org/git/wine.git/?a=commit;h=892b21088ee3cd30e57e48c0b8...
Author: Nikolay Sivov nsivov@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();