From 91513caa16f5c5c523a312e05920e4ea943cf4fc Mon Sep 17 00:00:00 2001 From: Michael Karcher Date: Tue, 7 Oct 2008 11:55:57 +0200 Subject: [PATCH] msxml3: Handle all variant types in IXMLDOMDocument::createNode. --- dlls/msxml3/domdoc.c | 22 ++++++++++++++++------ dlls/msxml3/tests/domdoc.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 3c5aedef483..41cd8561b14 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -1110,13 +1110,19 @@ static HRESULT WINAPI domdoc_getElementsByTagName( return hr; } -static DOMNodeType get_node_type(VARIANT Type) +static HRESULT get_node_type(VARIANT Type, DOMNodeType * type) { - if(V_VT(&Type) == VT_I4) - return V_I4(&Type); + VARIANT tmp; + HRESULT hr; - FIXME("Unsupported variant type %x\n", V_VT(&Type)); - return 0; + VariantInit(&tmp); + hr = VariantChangeType(&tmp, &Type, 0, VT_I4); + if(FAILED(hr)) + return E_INVALIDARG; + + *type = V_I4(&tmp); + + return S_OK; } static HRESULT WINAPI domdoc_createNode( @@ -1130,10 +1136,14 @@ static HRESULT WINAPI domdoc_createNode( DOMNodeType node_type; xmlNodePtr xmlnode = NULL; xmlChar *xml_name; + HRESULT hr; TRACE("(%p)->(type,%s,%s,%p)\n", This, debugstr_w(name), debugstr_w(namespaceURI), node); - node_type = get_node_type(Type); + hr = get_node_type(Type, &node_type); + if(FAILED(hr)) + return hr; + TRACE("node_type %d\n", node_type); xml_name = xmlChar_from_wchar((WCHAR*)name); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 056c91ba4bc..1645e2f140e 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -1353,6 +1353,8 @@ static void test_refs(void) static void test_create(void) { + static const WCHAR szOne[] = {'1',0}; + static const WCHAR szOneGarbage[] = {'1','G','a','r','b','a','g','e',0}; HRESULT r; VARIANT var; BSTR str, name; @@ -1369,6 +1371,36 @@ static void test_create(void) if( r != S_OK ) return; + V_VT(&var) = VT_I1; + V_I1(&var) = NODE_ELEMENT; + str = SysAllocString( szlc ); + r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node ); + ok( r == S_OK, "returns %08x\n", r ); + if( SUCCEEDED(r) ) IXMLDOMNode_Release( node ); + + V_VT(&var) = VT_R4; + V_R4(&var) = NODE_ELEMENT; + str = SysAllocString( szlc ); + r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node ); + ok( r == S_OK, "returns %08x\n", r ); + if( SUCCEEDED(r) ) IXMLDOMNode_Release( node ); + + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString( szOne ); + str = SysAllocString( szlc ); + r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node ); + ok( r == S_OK, "returns %08x\n", r ); + if( SUCCEEDED(r) ) IXMLDOMNode_Release( node ); + VariantClear(&var); + + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString( szOneGarbage ); + str = SysAllocString( szlc ); + r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node ); + ok( r == E_INVALIDARG, "returns %08x\n", r ); + if( SUCCEEDED(r) ) IXMLDOMNode_Release( node ); + VariantClear(&var); + V_VT(&var) = VT_I4; V_I4(&var) = NODE_ELEMENT; str = SysAllocString( szlc );