msxml3: Support more variant types in putProperty().

This commit is contained in:
Nikolay Sivov 2014-03-03 08:55:37 +04:00 committed by Alexandre Julliard
parent a41446b1f7
commit a28ace9ae7
2 changed files with 89 additions and 71 deletions

View File

@ -2602,99 +2602,85 @@ static HRESULT internal_parseURL(
return detach_bsc(bsc);
}
static HRESULT saxreader_put_handler_from_variant(saxreader *This, enum saxhandler_type type, const VARIANT *v, BOOL vb)
{
const IID *riid;
if (V_VT(v) == VT_EMPTY)
return saxreader_put_handler(This, type, NULL, vb);
switch (type)
{
case SAXDeclHandler:
riid = vb ? &IID_IVBSAXDeclHandler : &IID_ISAXDeclHandler;
break;
case SAXLexicalHandler:
riid = vb ? &IID_IVBSAXLexicalHandler : &IID_ISAXLexicalHandler;
break;
default:
ERR("wrong handler type %d\n", type);
return E_FAIL;
}
switch (V_VT(v))
{
case VT_DISPATCH:
case VT_UNKNOWN:
{
IUnknown *handler = NULL;
if (V_UNKNOWN(v))
{
HRESULT hr = IUnknown_QueryInterface(V_UNKNOWN(v), riid, (void**)&handler);
if (FAILED(hr)) return hr;
}
saxreader_put_handler(This, type, handler, vb);
if (handler) IUnknown_Release(handler);
break;
}
default:
ERR("value type %d not supported\n", V_VT(v));
return E_INVALIDARG;
}
return S_OK;
}
static HRESULT internal_putProperty(
saxreader* This,
const WCHAR *prop,
VARIANT value,
BOOL vbInterface)
{
VARIANT *v;
TRACE("(%p)->(%s %s)\n", This, debugstr_w(prop), debugstr_variant(&value));
if (This->isParsing) return E_FAIL;
v = V_VT(&value) == (VT_VARIANT|VT_BYREF) ? V_VARIANTREF(&value) : &value;
if(!memcmp(prop, PropertyDeclHandlerW, sizeof(PropertyDeclHandlerW)))
{
if(This->isParsing) return E_FAIL;
switch (V_VT(&value))
{
case VT_EMPTY:
saxreader_put_handler(This, SAXDeclHandler, NULL, vbInterface);
break;
case VT_UNKNOWN:
{
IUnknown *handler = NULL;
if (V_UNKNOWN(&value))
{
HRESULT hr;
if (vbInterface)
hr = IUnknown_QueryInterface(V_UNKNOWN(&value), &IID_IVBSAXDeclHandler, (void**)&handler);
else
hr = IUnknown_QueryInterface(V_UNKNOWN(&value), &IID_ISAXDeclHandler, (void**)&handler);
if (FAILED(hr)) return hr;
}
saxreader_put_handler(This, SAXDeclHandler, handler, vbInterface);
if (handler) IUnknown_Release(handler);
break;
}
default:
return E_INVALIDARG;
}
return S_OK;
}
return saxreader_put_handler_from_variant(This, SAXDeclHandler, v, vbInterface);
if(!memcmp(prop, PropertyLexicalHandlerW, sizeof(PropertyLexicalHandlerW)))
{
if(This->isParsing) return E_FAIL;
switch (V_VT(&value))
{
case VT_EMPTY:
saxreader_put_handler(This, SAXLexicalHandler, NULL, vbInterface);
break;
case VT_UNKNOWN:
{
IUnknown *handler = NULL;
if (V_UNKNOWN(&value))
{
HRESULT hr;
if (vbInterface)
hr = IUnknown_QueryInterface(V_UNKNOWN(&value), &IID_IVBSAXLexicalHandler, (void**)&handler);
else
hr = IUnknown_QueryInterface(V_UNKNOWN(&value), &IID_ISAXLexicalHandler, (void**)&handler);
if (FAILED(hr)) return hr;
}
saxreader_put_handler(This, SAXLexicalHandler, handler, vbInterface);
if (handler) IUnknown_Release(handler);
break;
}
default:
return E_INVALIDARG;
}
return S_OK;
}
return saxreader_put_handler_from_variant(This, SAXLexicalHandler, v, vbInterface);
if(!memcmp(prop, PropertyMaxXMLSizeW, sizeof(PropertyMaxXMLSizeW)))
{
if (V_VT(&value) == VT_I4 && V_I4(&value) == 0) return S_OK;
FIXME("(%p)->(%s): max-xml-size unsupported\n", This, debugstr_variant(&value));
if (V_VT(v) == VT_I4 && V_I4(v) == 0) return S_OK;
FIXME("(%p)->(%s): max-xml-size unsupported\n", This, debugstr_variant(v));
return E_NOTIMPL;
}
if(!memcmp(prop, PropertyMaxElementDepthW, sizeof(PropertyMaxElementDepthW)))
{
if (V_VT(&value) == VT_I4 && V_I4(&value) == 0) return S_OK;
FIXME("(%p)->(%s): max-element-depth unsupported\n", This, debugstr_variant(&value));
if (V_VT(v) == VT_I4 && V_I4(v) == 0) return S_OK;
FIXME("(%p)->(%s): max-element-depth unsupported\n", This, debugstr_variant(v));
return E_NOTIMPL;
}
FIXME("(%p)->(%s:%s): unsupported property\n", This, debugstr_w(prop), debugstr_variant(&value));
FIXME("(%p)->(%s:%s): unsupported property\n", This, debugstr_w(prop), debugstr_variant(v));
if(!memcmp(prop, PropertyCharsetW, sizeof(PropertyCharsetW)))
return E_NOTIMPL;

View File

@ -2523,6 +2523,7 @@ static void test_saxreader_properties(void)
while (ptr->prop_name)
{
VARIANT varref;
LONG ref;
init_saxlexicalhandler(&lexicalhandler, S_OK);
@ -2535,6 +2536,7 @@ static void test_saxreader_properties(void)
ok(V_VT(&v) == VT_UNKNOWN, "got %d\n", V_VT(&v));
ok(V_UNKNOWN(&v) == NULL, "got %p\n", V_UNKNOWN(&v));
/* VT_UNKNOWN */
V_VT(&v) = VT_UNKNOWN;
V_UNKNOWN(&v) = ptr->iface;
ref = get_refcount(ptr->iface);
@ -2542,6 +2544,36 @@ static void test_saxreader_properties(void)
EXPECT_HR(hr, S_OK);
ok(ref < get_refcount(ptr->iface), "expected inreased refcount\n");
/* VT_DISPATCH */
V_VT(&v) = VT_DISPATCH;
V_UNKNOWN(&v) = ptr->iface;
ref = get_refcount(ptr->iface);
hr = ISAXXMLReader_putProperty(reader, _bstr_(ptr->prop_name), v);
EXPECT_HR(hr, S_OK);
ok(ref == get_refcount(ptr->iface), "got wrong refcount %d, expected %d\n", get_refcount(ptr->iface), ref);
/* VT_VARIANT|VT_BYREF with VT_UNKNOWN in referenced variant */
V_VT(&varref) = VT_UNKNOWN;
V_UNKNOWN(&varref) = ptr->iface;
V_VT(&v) = VT_VARIANT|VT_BYREF;
V_VARIANTREF(&v) = &varref;
ref = get_refcount(ptr->iface);
hr = ISAXXMLReader_putProperty(reader, _bstr_(ptr->prop_name), v);
EXPECT_HR(hr, S_OK);
ok(ref == get_refcount(ptr->iface), "got wrong refcount %d, expected %d\n", get_refcount(ptr->iface), ref);
/* VT_VARIANT|VT_BYREF with VT_DISPATCH in referenced variant */
V_VT(&varref) = VT_DISPATCH;
V_UNKNOWN(&varref) = ptr->iface;
V_VT(&v) = VT_VARIANT|VT_BYREF;
V_VARIANTREF(&v) = &varref;
ref = get_refcount(ptr->iface);
hr = ISAXXMLReader_putProperty(reader, _bstr_(ptr->prop_name), v);
EXPECT_HR(hr, S_OK);
ok(ref == get_refcount(ptr->iface), "got wrong refcount %d, expected %d\n", get_refcount(ptr->iface), ref);
V_VT(&v) = VT_EMPTY;
V_UNKNOWN(&v) = (IUnknown*)0xdeadbeef;