Module: wine Branch: master Commit: 2a9eb6e3bb452333c7a5750478bb8a88f8d1232c URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a9eb6e3bb452333c7a5750478...
Author: Piotr Caban piotr.caban@gmail.com Date: Thu Nov 19 20:50:22 2009 +0100
msxml3: Implemented more data types handling xmlnode_get_nodeTypedValue.
---
dlls/msxml3/node.c | 16 +++++- dlls/msxml3/tests/domdoc.c | 126 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 1ddbc07..485a108 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -949,7 +949,7 @@ static HRESULT WINAPI xmlnode_get_dataType(IXMLDOMNode*, VARIANT*); inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type) { if(!type || !lstrcmpiW(type, szString) || - !lstrcmpiW(type, szNumber)) + !lstrcmpiW(type, szNumber) || !lstrcmpiW(type, szUUID)) { V_VT(v) = VT_BSTR; V_BSTR(v) = bstr_from_xmlChar(str); @@ -1020,7 +1020,7 @@ inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type) VARIANT src; HRESULT hres;
- if(!lstrcmpiW(type, szInt)) + if(!lstrcmpiW(type, szInt) || !lstrcmpiW(type, szI4)) V_VT(v) = VT_I4; else if(!lstrcmpiW(type, szFixed)) V_VT(v) = VT_CY; @@ -1028,6 +1028,18 @@ inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type) V_VT(v) = VT_BOOL; else if(!lstrcmpiW(type, szI1)) V_VT(v) = VT_I1; + else if(!lstrcmpiW(type, szI2)) + V_VT(v) = VT_I2; + else if(!lstrcmpiW(type, szIU1)) + V_VT(v) = VT_UI1; + else if(!lstrcmpiW(type, szIU2)) + V_VT(v) = VT_UI2; + else if(!lstrcmpiW(type, szIU4)) + V_VT(v) = VT_UI4; + else if(!lstrcmpiW(type, szR4)) + V_VT(v) = VT_R4; + else if(!lstrcmpiW(type, szR8) || !lstrcmpiW(type, szFloat)) + V_VT(v) = VT_R8; else { FIXME("Type handling not yet implemented\n"); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 20c6a9f..3f02ff5 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -162,6 +162,15 @@ static const CHAR szTypeValueXML[] = " <time dt:dt="time">13:57:12.31321</time>\n" " <timetz dt:dt="time.tz">23:21:01.13+03:21</timetz>\n" " <i1 dt:dt="i1">-13</i1>\n" +" <i2 dt:dt="i2">31915</i2>\n" +" <i4 dt:dt="i4">-312232</i4>\n" +" <ui1 dt:dt="ui1">123</ui1>\n" +" <ui2 dt:dt="ui2">48282</ui2>\n" +" <ui4 dt:dt="ui4">949281</ui4>\n" +" <r4 dt:dt="r4">213124.0</r4>\n" +" <r8 dt:dt="r8">0.412</r8>\n" +" <float dt:dt="float">41221.421</float>\n" +" <uuid dt:dt="uuid">333C7BC4-460F-11D0-BC04-0080C7055a83</uuid>\n" "</root>";
static const CHAR szBasicTransformSSXMLPart1[] = @@ -4164,6 +4173,123 @@ static void test_NodeTypeValue(void)
IXMLDOMNode_Release(pNode); } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/i2"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_I2, "incorrect type\n"); + ok(V_I2(&v) == 31915, "incorrect value\n"); + VariantClear( &v ); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/i4"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_I4, "incorrect type\n"); + ok(V_I4(&v) == -312232, "incorrect value\n"); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/ui1"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_UI1, "incorrect type\n"); + ok(V_UI1(&v) == 123, "incorrect value\n"); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/ui2"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_UI2, "incorrect type\n"); + ok(V_UI2(&v) == 48282, "incorrect value\n"); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/ui4"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_UI4, "incorrect type\n"); + ok(V_UI4(&v) == 949281, "incorrect value\n"); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/r4"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_R4, "incorrect type\n"); + double_eq(213124.0, V_R4(&v)); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/r8"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_R8, "incorrect type\n"); + double_eq(0.412, V_R8(&v)); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/float"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_R8, "incorrect type\n"); + double_eq(41221.421, V_R8(&v)); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/uuid"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_BSTR, "incorrect type\n"); + ok(!lstrcmpW(V_BSTR(&v), _bstr_("333C7BC4-460F-11D0-BC04-0080C7055a83")), "incorrect value\n"); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } }
IXMLDOMDocument2_Release(doc);