diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 485a108e8ee..47f5401c7c2 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; ipvData)[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 3f02ff56756..d2203564d4b 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -171,6 +171,7 @@ static const CHAR szTypeValueXML[] = " 0.412\n" " 41221.421\n" " 333C7BC4-460F-11D0-BC04-0080C7055a83\n" +" fffca012003c\n" ""; 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);