Module: wine Branch: master Commit: a28ace9ae7f6bdae8ad8e1d6580741325f3d2f53 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a28ace9ae7f6bdae8ad8e1d658...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Mar 3 08:55:37 2014 +0400
msxml3: Support more variant types in putProperty().
---
dlls/msxml3/saxreader.c | 122 ++++++++++++++++++----------------------- dlls/msxml3/tests/saxreader.c | 32 +++++++++++ 2 files changed, 86 insertions(+), 68 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 530ca02..df92997 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -2602,99 +2602,85 @@ static HRESULT internal_parseURL( return detach_bsc(bsc); }
-static HRESULT internal_putProperty( - saxreader* This, - const WCHAR *prop, - VARIANT value, - BOOL vbInterface) +static HRESULT saxreader_put_handler_from_variant(saxreader *This, enum saxhandler_type type, const VARIANT *v, BOOL vb) { - TRACE("(%p)->(%s %s)\n", This, debugstr_w(prop), debugstr_variant(&value)); - - if(!memcmp(prop, PropertyDeclHandlerW, sizeof(PropertyDeclHandlerW))) - { - if(This->isParsing) return E_FAIL; + const IID *riid;
- switch (V_VT(&value)) - { - case VT_EMPTY: - saxreader_put_handler(This, SAXDeclHandler, NULL, vbInterface); - break; - case VT_UNKNOWN: - { - IUnknown *handler = NULL; + if (V_VT(v) == VT_EMPTY) + return saxreader_put_handler(This, type, NULL, vb);
- if (V_UNKNOWN(&value)) - { - HRESULT hr; + 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; + }
- 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; - } + switch (V_VT(v)) + { + case VT_DISPATCH: + case VT_UNKNOWN: + { + IUnknown *handler = NULL;
- saxreader_put_handler(This, SAXDeclHandler, handler, vbInterface); - if (handler) IUnknown_Release(handler); - break; - } - default: - return E_INVALIDARG; + if (V_UNKNOWN(v)) + { + HRESULT hr = IUnknown_QueryInterface(V_UNKNOWN(v), riid, (void**)&handler); + if (FAILED(hr)) return hr; }
- return S_OK; + 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; }
- if(!memcmp(prop, PropertyLexicalHandlerW, sizeof(PropertyLexicalHandlerW))) - { - if(This->isParsing) return E_FAIL; + return S_OK; +}
- switch (V_VT(&value)) - { - case VT_EMPTY: - saxreader_put_handler(This, SAXLexicalHandler, NULL, vbInterface); - break; - case VT_UNKNOWN: - { - IUnknown *handler = NULL; +static HRESULT internal_putProperty( + saxreader* This, + const WCHAR *prop, + VARIANT value, + BOOL vbInterface) +{ + VARIANT *v;
- if (V_UNKNOWN(&value)) - { - HRESULT hr; + TRACE("(%p)->(%s %s)\n", This, debugstr_w(prop), debugstr_variant(&value));
- 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; - } + if (This->isParsing) return E_FAIL;
- saxreader_put_handler(This, SAXLexicalHandler, handler, vbInterface); - if (handler) IUnknown_Release(handler); - break; - } - default: - return E_INVALIDARG; - } + v = V_VT(&value) == (VT_VARIANT|VT_BYREF) ? V_VARIANTREF(&value) : &value; + if(!memcmp(prop, PropertyDeclHandlerW, sizeof(PropertyDeclHandlerW))) + return saxreader_put_handler_from_variant(This, SAXDeclHandler, v, vbInterface);
- return S_OK; - } + if(!memcmp(prop, PropertyLexicalHandlerW, sizeof(PropertyLexicalHandlerW))) + 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; diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index bb3ea2a..f581fd3 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -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;