msxml3: Implement _newEnum() for schema cache.
This commit is contained in:
parent
03ad0acfad
commit
892b21088e
|
@ -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*);
|
||||
};
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue