From 13606ed49d40174935135a053426f1f1ca7c9dc5 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Tue, 28 Oct 2008 19:47:15 +1100 Subject: [PATCH] msxml3: Add support to get_nodeTypedValue on Element Nodes. --- dlls/msxml3/node.c | 28 +++++++++++++++-- dlls/msxml3/tests/domdoc.c | 63 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 63aa8dfae5e..3162f822a79 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -977,8 +977,32 @@ static HRESULT WINAPI xmlnode_get_nodeTypedValue( IXMLDOMNode *iface, VARIANT* typedValue) { - FIXME("ignoring data type\n"); - return xmlnode_get_nodeValue(iface, typedValue); + xmlnode *This = impl_from_IXMLDOMNode( iface ); + HRESULT r = S_FALSE; + + FIXME("ignoring data type %p %p\n", This, typedValue); + + if(!typedValue) + return E_INVALIDARG; + + V_VT(typedValue) = VT_NULL; + + switch ( This->node->type ) + { + case XML_ELEMENT_NODE: + { + xmlChar *content = xmlNodeGetContent(This->node); + V_VT(typedValue) = VT_BSTR; + V_BSTR(typedValue) = bstr_from_xmlChar( content ); + xmlFree(content); + r = S_OK; + break; + } + default: + r = xmlnode_get_nodeValue(iface, typedValue); + } + + return r; } static HRESULT WINAPI xmlnode_put_nodeTypedValue( diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 578738fefcf..df3fa0e2888 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -146,6 +146,10 @@ static const CHAR szTransformOutput[] = "Hello World" ""; +static const CHAR szTypeValueXML[] = +"" +"Wine"; + static const WCHAR szNonExistentFile[] = { 'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0 }; @@ -3782,6 +3786,64 @@ static void test_FormattingXML(void) free_bstrs(); } +static void test_NodeTypeValue(void) +{ + IXMLDOMDocument2 *doc = NULL; + IXMLDOMNode *pNode; + VARIANT_BOOL bSucc; + HRESULT hr; + VARIANT v; + + hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); + if( hr != S_OK ) + return; + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(szTypeValueXML), &bSucc); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(bSucc == VARIANT_TRUE, "Expected VARIANT_TRUE got VARIANT_FALSE\n"); + if(bSucc == VARIANT_TRUE) + { + hr = IXMLDOMDocument2_get_nodeValue(doc, NULL); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = NULL; + hr = IXMLDOMDocument2_get_nodeValue(doc, &v); + ok(hr == S_FALSE, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_NULL, "expect VT_NULL got %d\n", V_VT(&v)); + + hr = IXMLDOMDocument2_get_nodeTypedValue(doc, NULL); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + hr = IXMLDOMDocument2_get_nodeTypedValue(doc, &v); + ok(hr == S_FALSE, "ret %08x\n", hr ); + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("string"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = NULL; + hr = IXMLDOMNode_get_nodeValue(pNode, &v); + ok(hr == S_FALSE, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_NULL, "expect VT_NULL got %d\n", V_VT(&v)); + + hr = IXMLDOMNode_get_nodeTypedValue(pNode, NULL); + ok(hr == E_INVALIDARG, "ret %08x\n", hr ); + + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(!lstrcmpW( V_BSTR(&v), _bstr_("Wine") ), "incorrect value\n"); + + IXMLDOMNode_Release(pNode); + } + } + + IXMLDOMDocument2_Release(doc); + + free_bstrs(); +} + START_TEST(domdoc) { HRESULT r; @@ -3810,6 +3872,7 @@ START_TEST(domdoc) test_testTransforms(); test_Namespaces(); test_FormattingXML(); + test_NodeTypeValue(); CoUninitialize(); }