Module: wine Branch: master Commit: 3c58b1c418bdf4f8c5f4266860c7f26fe717b228 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3c58b1c418bdf4f8c5f4266860...
Author: Piotr Caban piotr.caban@gmail.com Date: Thu Nov 19 20:50:33 2009 +0100
msxml3: Implemented xmlnode_get_nodeTypedValue 'bin.hex' data type handling.
---
dlls/msxml3/node.c | 26 ++++++++++++++++++++++++++ dlls/msxml3/tests/domdoc.c | 18 ++++++++++++++++++ 2 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 485a108..47f5401 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -946,6 +946,13 @@ static HRESULT WINAPI xmlnode_get_definition(
static HRESULT WINAPI xmlnode_get_dataType(IXMLDOMNode*, VARIANT*);
+inline BYTE hex_to_byte(xmlChar c) +{ + if(c <= '9') return c-'0'; + if(c <= 'F') return c-'A'+10; + return c-'a'+10; +} + inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type) { if(!type || !lstrcmpiW(type, szString) || @@ -1015,6 +1022,25 @@ inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type)
VariantClear(&src); } + else if(!lstrcmpiW(type, szBinHex)) + { + SAFEARRAYBOUND sab; + int i, len; + + len = xmlStrlen(str)/2; + sab.lLbound = 0; + sab.cElements = len; + + V_VT(v) = (VT_ARRAY|VT_UI1); + V_ARRAY(v) = SafeArrayCreate(VT_UI1, 1, &sab); + + if(!V_ARRAY(v)) + return E_OUTOFMEMORY; + + for(i=0; i<len; i++) + ((BYTE*)V_ARRAY(v)->pvData)[i] = (hex_to_byte(str[2*i])<<4) + + hex_to_byte(str[2*i+1]); + } else { VARIANT src; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 3f02ff5..d220356 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -171,6 +171,7 @@ static const CHAR szTypeValueXML[] = " <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" +" <binhex dt:dt="bin.hex">fffca012003c</binhex>\n" "</root>";
static const CHAR szBasicTransformSSXMLPart1[] = @@ -4290,6 +4291,23 @@ static void test_NodeTypeValue(void)
IXMLDOMNode_Release(pNode); } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/binhex"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + BYTE bytes[] = {0xff,0xfc,0xa0,0x12,0x00,0x3c}; + + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == (VT_ARRAY|VT_UI1), "incorrect type\n"); + ok(V_ARRAY(&v)->rgsabound[0].cElements == 6, "incorrect array size\n"); + if(V_ARRAY(&v)->rgsabound[0].cElements == 6) + ok(!memcmp(bytes, V_ARRAY(&v)->pvData, sizeof(bytes)), "incorrect value\n"); + VariantClear(&v); + + IXMLDOMNode_Release(pNode); + } }
IXMLDOMDocument2_Release(doc);