Nikolay Sivov : msxml3: Support more variant types in putProperty().
Alexandre Julliard
julliard at winehq.org
Mon Mar 3 13:20:10 CST 2014
Module: wine
Branch: master
Commit: a28ace9ae7f6bdae8ad8e1d6580741325f3d2f53
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a28ace9ae7f6bdae8ad8e1d6580741325f3d2f53
Author: Nikolay Sivov <nsivov at 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;
More information about the wine-cvs
mailing list