msxml3: Implement {get,putref}_schemas.
This commit is contained in:
parent
c30c6e23ba
commit
1780ca678c
|
@ -171,6 +171,7 @@ typedef struct _domdoc
|
||||||
VARIANT_BOOL preserving;
|
VARIANT_BOOL preserving;
|
||||||
IUnknown *node_unk;
|
IUnknown *node_unk;
|
||||||
IXMLDOMNode *node;
|
IXMLDOMNode *node;
|
||||||
|
IXMLDOMSchemaCollection *schema;
|
||||||
HRESULT error;
|
HRESULT error;
|
||||||
} domdoc;
|
} domdoc;
|
||||||
|
|
||||||
|
@ -254,6 +255,7 @@ static ULONG WINAPI domdoc_Release(
|
||||||
if ( ref == 0 )
|
if ( ref == 0 )
|
||||||
{
|
{
|
||||||
IUnknown_Release( This->node_unk );
|
IUnknown_Release( This->node_unk );
|
||||||
|
if(This->schema) IXMLDOMSchemaCollection_Release( This->schema );
|
||||||
HeapFree( GetProcessHeap(), 0, This );
|
HeapFree( GetProcessHeap(), 0, This );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1293,7 +1295,7 @@ static HRESULT WINAPI domdoc_put_onTransformNode(
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI domdoc_get_namespaces(
|
static HRESULT WINAPI domdoc_get_namespaces(
|
||||||
IXMLDOMDocument2* This,
|
IXMLDOMDocument2* iface,
|
||||||
IXMLDOMSchemaCollection** schemaCollection )
|
IXMLDOMSchemaCollection** schemaCollection )
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
FIXME("\n");
|
||||||
|
@ -1301,23 +1303,66 @@ static HRESULT WINAPI domdoc_get_namespaces(
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI domdoc_get_schemas(
|
static HRESULT WINAPI domdoc_get_schemas(
|
||||||
IXMLDOMDocument2* This,
|
IXMLDOMDocument2* iface,
|
||||||
VARIANT* var1 )
|
VARIANT* var1 )
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
domdoc *This = impl_from_IXMLDOMDocument2( iface );
|
||||||
return E_NOTIMPL;
|
HRESULT hr = S_FALSE;
|
||||||
|
IXMLDOMSchemaCollection *cur_schema = This->schema;
|
||||||
|
|
||||||
|
TRACE("(%p)->(%p)\n", This, var1);
|
||||||
|
|
||||||
|
VariantInit(var1); /* Test shows we don't call VariantClear here */
|
||||||
|
V_VT(var1) = VT_NULL;
|
||||||
|
|
||||||
|
if(cur_schema)
|
||||||
|
{
|
||||||
|
hr = IXMLDOMSchemaCollection_QueryInterface(cur_schema, &IID_IDispatch, (void**)&V_DISPATCH(var1));
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
V_VT(var1) = VT_DISPATCH;
|
||||||
|
}
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI domdoc_putref_schemas(
|
static HRESULT WINAPI domdoc_putref_schemas(
|
||||||
IXMLDOMDocument2* This,
|
IXMLDOMDocument2* iface,
|
||||||
VARIANT var1)
|
VARIANT var1)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
domdoc *This = impl_from_IXMLDOMDocument2( iface );
|
||||||
return E_NOTIMPL;
|
HRESULT hr = E_FAIL;
|
||||||
|
IXMLDOMSchemaCollection *new_schema = NULL;
|
||||||
|
|
||||||
|
FIXME("(%p): semi-stub\n", This);
|
||||||
|
switch(V_VT(&var1))
|
||||||
|
{
|
||||||
|
case VT_UNKNOWN:
|
||||||
|
hr = IUnknown_QueryInterface(V_UNKNOWN(&var1), &IID_IXMLDOMSchemaCollection, (void**)&new_schema);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VT_DISPATCH:
|
||||||
|
hr = IDispatch_QueryInterface(V_DISPATCH(&var1), &IID_IXMLDOMSchemaCollection, (void**)&new_schema);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VT_NULL:
|
||||||
|
case VT_EMPTY:
|
||||||
|
hr = S_OK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
WARN("Can't get schema from vt %x\n", V_VT(&var1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
IXMLDOMSchemaCollection *old_schema = InterlockedExchangePointer((void**)&This->schema, new_schema);
|
||||||
|
if(old_schema) IXMLDOMSchemaCollection_Release(old_schema);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI domdoc_validate(
|
static HRESULT WINAPI domdoc_validate(
|
||||||
IXMLDOMDocument2* This,
|
IXMLDOMDocument2* iface,
|
||||||
IXMLDOMParseError** err)
|
IXMLDOMParseError** err)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
FIXME("\n");
|
||||||
|
@ -1325,7 +1370,7 @@ static HRESULT WINAPI domdoc_validate(
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI domdoc_setProperty(
|
static HRESULT WINAPI domdoc_setProperty(
|
||||||
IXMLDOMDocument2* This,
|
IXMLDOMDocument2* iface,
|
||||||
BSTR p,
|
BSTR p,
|
||||||
VARIANT var)
|
VARIANT var)
|
||||||
{
|
{
|
||||||
|
@ -1334,7 +1379,7 @@ static HRESULT WINAPI domdoc_setProperty(
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI domdoc_getProperty(
|
static HRESULT WINAPI domdoc_getProperty(
|
||||||
IXMLDOMDocument2* This,
|
IXMLDOMDocument2* iface,
|
||||||
BSTR p,
|
BSTR p,
|
||||||
VARIANT* var)
|
VARIANT* var)
|
||||||
{
|
{
|
||||||
|
@ -1447,6 +1492,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
|
||||||
doc->resolving = 0;
|
doc->resolving = 0;
|
||||||
doc->preserving = 0;
|
doc->preserving = 0;
|
||||||
doc->error = S_OK;
|
doc->error = S_OK;
|
||||||
|
doc->schema = NULL;
|
||||||
|
|
||||||
xmldoc = xmlNewDoc(NULL);
|
xmldoc = xmlNewDoc(NULL);
|
||||||
if(!xmldoc)
|
if(!xmldoc)
|
||||||
|
|
|
@ -55,6 +55,7 @@ static HRESULT WINAPI schema_cache_QueryInterface( IXMLDOMSchemaCollection *ifac
|
||||||
TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
|
TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
|
||||||
|
|
||||||
if ( IsEqualIID( riid, &IID_IUnknown ) ||
|
if ( IsEqualIID( riid, &IID_IUnknown ) ||
|
||||||
|
IsEqualIID( riid, &IID_IDispatch ) ||
|
||||||
IsEqualIID( riid, &IID_IXMLDOMSchemaCollection ) )
|
IsEqualIID( riid, &IID_IXMLDOMSchemaCollection ) )
|
||||||
{
|
{
|
||||||
*ppvObject = iface;
|
*ppvObject = iface;
|
||||||
|
|
|
@ -86,8 +86,118 @@ void test_schema_refs(void)
|
||||||
SysFreeString(str);
|
SysFreeString(str);
|
||||||
VariantClear(&v);
|
VariantClear(&v);
|
||||||
|
|
||||||
|
V_VT(&v) = VT_INT;
|
||||||
|
r = IXMLDOMDocument2_get_schemas(doc, &v);
|
||||||
|
ok(r == S_FALSE, "ret %08x\n", r);
|
||||||
|
ok(V_VT(&v) == VT_NULL, "vt %x\n", V_VT(&v));
|
||||||
|
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 2, "ref %d\n", ref);
|
||||||
|
V_VT(&v) = VT_DISPATCH;
|
||||||
|
V_DISPATCH(&v) = (IDispatch*)schema;
|
||||||
|
|
||||||
|
/* check that putref_schemas takes a ref */
|
||||||
|
r = IXMLDOMDocument2_putref_schemas(doc, v);
|
||||||
|
ok(r == S_OK, "ret %08x\n", r);
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 4, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
VariantClear(&v);
|
||||||
|
|
||||||
|
/* refs now 2 */
|
||||||
|
V_VT(&v) = VT_INT;
|
||||||
|
/* check that get_schemas adds a ref */
|
||||||
|
r = IXMLDOMDocument2_get_schemas(doc, &v);
|
||||||
|
ok(r == S_OK, "ret %08x\n", r);
|
||||||
|
ok(V_VT(&v) == VT_DISPATCH, "vt %x\n", V_VT(&v));
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 4, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
|
||||||
|
/* refs now 3 */
|
||||||
|
/* get_schemas doesn't release a ref if passed VT_DISPATCH - ie it doesn't call VariantClear() */
|
||||||
|
r = IXMLDOMDocument2_get_schemas(doc, &v);
|
||||||
|
ok(r == S_OK, "ret %08x\n", r);
|
||||||
|
ok(V_VT(&v) == VT_DISPATCH, "vt %x\n", V_VT(&v));
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 5, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
|
||||||
|
/* refs now 4 */
|
||||||
|
/* release the two refs returned by get_schemas */
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
|
||||||
|
/* refs now 2 */
|
||||||
|
|
||||||
|
/* check that taking another ref on the document doesn't change the schema's ref count */
|
||||||
|
IXMLDOMDocument2_AddRef(doc);
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 3, "ref %d\n", ref);
|
||||||
IXMLDOMSchemaCollection_Release(schema);
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
IXMLDOMDocument2_Release(doc);
|
IXMLDOMDocument2_Release(doc);
|
||||||
|
|
||||||
|
|
||||||
|
/* refs now 2 */
|
||||||
|
/* call putref_schema with some odd variants */
|
||||||
|
V_VT(&v) = VT_INT;
|
||||||
|
r = IXMLDOMDocument2_putref_schemas(doc, v);
|
||||||
|
ok(r == E_FAIL, "ret %08x\n", r);
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 3, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
|
||||||
|
/* refs now 2 */
|
||||||
|
/* calling with VT_EMPTY releases the schema */
|
||||||
|
V_VT(&v) = VT_EMPTY;
|
||||||
|
r = IXMLDOMDocument2_putref_schemas(doc, v);
|
||||||
|
ok(r == S_OK, "ret %08x\n", r);
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 2, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
|
||||||
|
/* refs now 1 */
|
||||||
|
/* try setting with VT_UNKNOWN */
|
||||||
|
IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
V_VT(&v) = VT_UNKNOWN;
|
||||||
|
V_UNKNOWN(&v) = (IUnknown*)schema;
|
||||||
|
r = IXMLDOMDocument2_putref_schemas(doc, v);
|
||||||
|
ok(r == S_OK, "ret %08x\n", r);
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 4, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
VariantClear(&v);
|
||||||
|
|
||||||
|
/* refs now 2 */
|
||||||
|
/* calling with VT_NULL releases the schema */
|
||||||
|
V_VT(&v) = VT_NULL;
|
||||||
|
r = IXMLDOMDocument2_putref_schemas(doc, v);
|
||||||
|
ok(r == S_OK, "ret %08x\n", r);
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 2, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
|
||||||
|
/* refs now 1 */
|
||||||
|
/* set again */
|
||||||
|
IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
V_VT(&v) = VT_UNKNOWN;
|
||||||
|
V_UNKNOWN(&v) = (IUnknown*)schema;
|
||||||
|
r = IXMLDOMDocument2_putref_schemas(doc, v);
|
||||||
|
ok(r == S_OK, "ret %08x\n", r);
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 4, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
VariantClear(&v);
|
||||||
|
|
||||||
|
/* refs now 2 */
|
||||||
|
|
||||||
|
/* release the final ref on the doc which should release its ref on the schema */
|
||||||
|
IXMLDOMDocument2_Release(doc);
|
||||||
|
|
||||||
|
ref = IXMLDOMSchemaCollection_AddRef(schema);
|
||||||
|
ok(ref == 2, "ref %d\n", ref);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
|
IXMLDOMSchemaCollection_Release(schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
START_TEST(schema)
|
START_TEST(schema)
|
||||||
|
|
Loading…
Reference in New Issue