Nikolay Sivov : msxml3: Add support for bin.hex element type encoding.
Alexandre Julliard
julliard at winehq.org
Mon Jul 2 13:22:02 CDT 2012
Module: wine
Branch: master
Commit: a9aee4c03fbd0862cb0c1e481331bc6b9de7c158
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a9aee4c03fbd0862cb0c1e481331bc6b9de7c158
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Jul 2 09:43:27 2012 +0400
msxml3: Add support for bin.hex element type encoding.
---
dlls/msxml3/element.c | 50 ++++++++++++++++++++++++++++++++++++
dlls/msxml3/tests/domdoc.c | 61 +++++++++++++++++++++++++++++++++++++++----
2 files changed, 105 insertions(+), 6 deletions(-)
diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index db6b283..eee737e 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -801,6 +801,23 @@ static HRESULT encode_base64(const BYTE *buf, int len, BSTR *ret)
return S_OK;
}
+static HRESULT encode_binhex(const BYTE *buf, int len, BSTR *ret)
+{
+ static const char byte_to_hex[16] = "0123456789abcdef";
+ int i;
+
+ *ret = SysAllocStringLen(NULL, len*2);
+ if (!*ret) return E_OUTOFMEMORY;
+
+ for (i = 0; i < len; i++)
+ {
+ (*ret)[2*i] = byte_to_hex[buf[i] >> 4];
+ (*ret)[2*i+1] = byte_to_hex[0x0f & buf[i]];
+ }
+
+ return S_OK;
+}
+
static HRESULT WINAPI domelem_put_nodeTypedValue(
IXMLDOMElement *iface,
VARIANT value)
@@ -865,6 +882,39 @@ static HRESULT WINAPI domelem_put_nodeTypedValue(
return E_NOTIMPL;
}
break;
+ case DT_BIN_HEX:
+ if (V_VT(&value) == (VT_UI1|VT_ARRAY))
+ {
+ UINT dim = SafeArrayGetDim(V_ARRAY(&value));
+ LONG lbound, ubound;
+ BSTR encoded;
+ BYTE *ptr;
+ int len;
+
+ if (dim > 1)
+ FIXME("unexpected array dimension count %u\n", dim);
+
+ SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
+ SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
+
+ len = (ubound - lbound + 1)*SafeArrayGetElemsize(V_ARRAY(&value));
+
+ hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
+ if (FAILED(hr)) return hr;
+
+ hr = encode_binhex(ptr, len, &encoded);
+ SafeArrayUnaccessData(V_ARRAY(&value));
+ if (FAILED(hr)) return hr;
+
+ hr = node_set_content(&This->node, encoded);
+ SysFreeString(encoded);
+ }
+ else
+ {
+ FIXME("unhandled variant type %d for dt:%s\n", V_VT(&value), debugstr_dt(dt));
+ return E_NOTIMPL;
+ }
+ break;
default:
FIXME("not implemented for dt:%s\n", debugstr_dt(dt));
return E_NOTIMPL;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 5dc2581..4b68e74 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -9165,6 +9165,8 @@ static void test_createProcessingInstruction(void)
static void test_put_nodeTypedValue(void)
{
+ static const BYTE binhexdata[16] =
+ {0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf};
IXMLDOMDocument *doc;
IXMLDOMElement *elem;
VARIANT type, value;
@@ -9179,28 +9181,28 @@ static void test_put_nodeTypedValue(void)
if (!doc) return;
hr = IXMLDOMDocument_createElement(doc, _bstr_("Element"), &elem);
- ok(hr == S_OK, "got 0x%08x\n", hr);
+ EXPECT_HR(hr, S_OK);
V_VT(&type) = VT_EMPTY;
hr = IXMLDOMElement_get_dataType(elem, &type);
- ok(hr == S_FALSE, "got 0x%08x\n", hr);
+ EXPECT_HR(hr, S_FALSE);
ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
/* set typed value for untyped node */
V_VT(&type) = VT_I1;
V_I1(&type) = 1;
hr = IXMLDOMElement_put_nodeTypedValue(elem, type);
- ok(hr == S_OK, "got 0x%08x\n", hr);
+ EXPECT_HR(hr, S_OK);
V_VT(&type) = VT_EMPTY;
hr = IXMLDOMElement_get_dataType(elem, &type);
- ok(hr == S_FALSE, "got 0x%08x\n", hr);
+ EXPECT_HR(hr, S_FALSE);
ok(V_VT(&type) == VT_NULL, "got %d, expected VT_NULL\n", V_VT(&type));
/* no type info stored */
V_VT(&type) = VT_EMPTY;
hr = IXMLDOMElement_get_nodeTypedValue(elem, &type);
- ok(hr == S_OK, "got 0x%08x\n", hr);
+ EXPECT_HR(hr, S_OK);
ok(V_VT(&type) == VT_BSTR, "got %d, expected VT_BSTR\n", V_VT(&type));
ok(memcmp(V_BSTR(&type), _bstr_("1"), 2*sizeof(WCHAR)) == 0,
"got %s, expected \"1\"\n", wine_dbgstr_w(V_BSTR(&type)));
@@ -9257,7 +9259,7 @@ static void test_put_nodeTypedValue(void)
hr = SafeArrayAccessData(array, (void*)&ptr);
EXPECT_HR(hr, S_OK);
memcpy(ptr, "dGVzdA=", strlen("dGVzdA="));
- SafeArrayUnaccessData(V_ARRAY(&value));
+ SafeArrayUnaccessData(array);
V_VT(&value) = VT_UI1|VT_ARRAY;
V_ARRAY(&value) = array;
@@ -9290,7 +9292,54 @@ static void test_put_nodeTypedValue(void)
EXPECT_HR(hr, S_OK);
ok(!lstrcmpW(str, _bstr_("ZEdWemRBPQ==")), "%s\n", wine_dbgstr_w(str));
IXMLDOMNode_Release(node);
+ SafeArrayDestroyData(array);
+ /* bin.hex */
+ V_VT(&value) = VT_BSTR;
+ V_BSTR(&value) = _bstr_("");
+ hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMElement_put_dataType(elem, _bstr_("bin.hex"));
+ EXPECT_HR(hr, S_OK);
+
+ array = SafeArrayCreateVector(VT_UI1, 0, 16);
+ hr = SafeArrayAccessData(array, (void*)&ptr);
+ EXPECT_HR(hr, S_OK);
+ memcpy(ptr, binhexdata, sizeof(binhexdata));
+ SafeArrayUnaccessData(array);
+
+ V_VT(&value) = VT_UI1|VT_ARRAY;
+ V_ARRAY(&value) = array;
+ hr = IXMLDOMElement_put_nodeTypedValue(elem, value);
+ EXPECT_HR(hr, S_OK);
+
+ V_VT(&value) = VT_EMPTY;
+ hr = IXMLDOMElement_get_nodeTypedValue(elem, &value);
+ EXPECT_HR(hr, S_OK);
+ ok(V_VT(&value) == (VT_UI1|VT_ARRAY), "got %d\n", V_VT(&value));
+ ok(SafeArrayGetDim(V_ARRAY(&value)) == 1, "got wrong dimension\n");
+ ubound = 0;
+ hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &ubound);
+ EXPECT_HR(hr, S_OK);
+ ok(ubound == 15, "got %d\n", ubound);
+ lbound = 0;
+ hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &lbound);
+ EXPECT_HR(hr, S_OK);
+ ok(lbound == 0, "got %d\n", lbound);
+ hr = SafeArrayAccessData(V_ARRAY(&value), (void*)&ptr);
+ EXPECT_HR(hr, S_OK);
+ ok(!memcmp(ptr, binhexdata, sizeof(binhexdata)), "got wrong data\n");
+ SafeArrayUnaccessData(V_ARRAY(&value));
+ VariantClear(&value);
+
+ /* if set with VT_UI1|VT_ARRAY it's encoded */
+ hr = IXMLDOMElement_get_firstChild(elem, &node);
+ EXPECT_HR(hr, S_OK);
+ hr = IXMLDOMNode_get_text(node, &str);
+ EXPECT_HR(hr, S_OK);
+ ok(!lstrcmpW(str, _bstr_("000102030405060708090a0b0c0d0e0f")), "%s\n", wine_dbgstr_w(str));
+ IXMLDOMNode_Release(node);
SafeArrayDestroyData(array);
IXMLDOMElement_Release(elem);
More information about the wine-cvs
mailing list