mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-05 11:14:05 +00:00
msxml3: Implemented xmlnode_get_nodeTypedValue 'bin.hex' data type handling.
This commit is contained in:
parent
2a9eb6e3bb
commit
3c58b1c418
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue