Piotr Caban : msxml3: Implemented xmlnode_get_nodeTypedValue 'bin.hex' data type handling.
Alexandre Julliard
julliard at winehq.org
Fri Nov 20 10:47:59 CST 2009
Module: wine
Branch: master
Commit: 3c58b1c418bdf4f8c5f4266860c7f26fe717b228
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3c58b1c418bdf4f8c5f4266860c7f26fe717b228
Author: Piotr Caban <piotr.caban at 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);
More information about the wine-cvs
mailing list