Module: wine Branch: master Commit: eef194a7992eaa9a90350ba4504c6d340b6c6f47 URL: http://source.winehq.org/git/wine.git/?a=commit;h=eef194a7992eaa9a90350ba450...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Oct 30 19:42:24 2010 +0400
msxml3: Implement a trivial case of ::put_nodeTypedValue() for elements.
---
dlls/msxml3/element.c | 31 +++++++++++++++++++++++++++++-- dlls/msxml3/tests/domdoc.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 615499d..d6558f0 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -434,10 +434,37 @@ static HRESULT WINAPI domelem_get_nodeTypedValue(
static HRESULT WINAPI domelem_put_nodeTypedValue( IXMLDOMElement *iface, - VARIANT var1) + VARIANT value) { domelem *This = impl_from_IXMLDOMElement( iface ); - return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(&This->node), var1 ); + VARIANT type; + HRESULT hr; + + TRACE("(%p)\n", This); + + /* for untyped node coerce to BSTR and set */ + if (IXMLDOMElement_get_dataType(iface, &type) == S_FALSE) + { + if (V_VT(&value) != VT_BSTR) + { + hr = VariantChangeType(&value, &value, 0, VT_BSTR); + if (hr == S_OK) + { + hr = node_set_content(&This->node, V_BSTR(&value)); + VariantClear(&value); + } + } + else + hr = node_set_content(&This->node, V_BSTR(&value)); + } + else + { + FIXME("not implemented for typed nodes. type %s\n", debugstr_w(V_BSTR(&value))); + VariantClear(&type); + return E_NOTIMPL; + } + + return hr; }
static HRESULT WINAPI domelem_get_dataType( diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index a22975a..f560694 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -7409,6 +7409,48 @@ static void test_createProcessingInstruction(void) IXMLDOMDocument_Release(doc); }
+static void test_put_nodeTypedValue(void) +{ + IXMLDOMDocument *doc; + IXMLDOMElement *elem; + VARIANT type; + HRESULT hr; + + doc = create_document(&IID_IXMLDOMDocument); + if (!doc) return; + + hr = IXMLDOMDocument_createElement(doc, _bstr_("Element"), &elem); + ok(hr == S_OK, "got 0x%08x\n", hr); + + V_VT(&type) = VT_EMPTY; + hr = IXMLDOMElement_get_dataType(elem, &type); + ok(hr == S_FALSE, "got 0x%08x\n", hr); + ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type)); + + /* set typed value for untyped node */ + V_VT(&type) = VT_I1; + V_I1(&type) = 1; + hr = IXMLDOMElement_put_nodeTypedValue(elem, type); + ok(hr == S_OK, "got 0x%08x\n", hr); + + V_VT(&type) = VT_EMPTY; + hr = IXMLDOMElement_get_dataType(elem, &type); + ok(hr == S_FALSE, "got 0x%08x\n", hr); + ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type)); + + /* no type info stored */ + V_VT(&type) = VT_EMPTY; + hr = IXMLDOMElement_get_nodeTypedValue(elem, &type); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&type) == VT_BSTR, "got %d, expected VT_BSTR\n", V_VT(&type)); + ok(memcmp(V_BSTR(&type), _bstr_("1"), 2*sizeof(WCHAR)) == 0, + "got %s, expected "1"\n", wine_dbgstr_w(V_BSTR(&type))); + VariantClear(&type); + + IXMLDOMDocument_Release(doc); + free_bstrs(); +} + START_TEST(domdoc) { IXMLDOMDocument *doc; @@ -7471,6 +7513,7 @@ START_TEST(domdoc) test_selectSingleNode(); test_events(); test_createProcessingInstruction(); + test_put_nodeTypedValue();
CoUninitialize(); }