diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c
index 61afb2db854..50712448663 100644
--- a/dlls/msxml3/element.c
+++ b/dlls/msxml3/element.c
@@ -459,7 +459,7 @@ static inline BYTE base64_to_byte(xmlChar c)
return c-'a'+26;
}
-static inline HRESULT VARIANT_from_DT(XDR_DT dt, xmlChar* str, VARIANT* v)
+static inline HRESULT variant_from_dt(XDR_DT dt, xmlChar* str, VARIANT* v)
{
VARIANT src;
HRESULT hr = S_OK;
@@ -571,9 +571,25 @@ static inline HRESULT VARIANT_from_DT(XDR_DT dt, xmlChar* str, VARIANT* v)
case DT_BIN_BASE64:
{
SAFEARRAYBOUND sab;
+ xmlChar *c1, *c2;
int i, len;
- len = xmlStrlen(str);
+ /* remove all formatting chars */
+ c1 = c2 = str;
+ len = 0;
+ while (*c2)
+ {
+ if ( *c2 == ' ' || *c2 == '\t' ||
+ *c2 == '\n' || *c2 == '\r' )
+ {
+ c2++;
+ continue;
+ }
+ *c1++ = *c2++;
+ len++;
+ }
+
+ /* skip padding */
if(str[len-2] == '=') i = 2;
else if(str[len-1] == '=') i = 1;
else i = 0;
@@ -719,23 +735,22 @@ static XDR_DT element_get_dt(xmlNodePtr node)
static HRESULT WINAPI domelem_get_nodeTypedValue(
IXMLDOMElement *iface,
- VARIANT* var1)
+ VARIANT* v)
{
domelem *This = impl_from_IXMLDOMElement( iface );
XDR_DT dt;
xmlChar* content;
HRESULT hr;
- TRACE("(%p)->(%p)\n", This, var1);
+ TRACE("(%p)->(%p)\n", This, v);
- if(!var1)
- return E_INVALIDARG;
+ if(!v) return E_INVALIDARG;
- V_VT(var1) = VT_NULL;
+ V_VT(v) = VT_NULL;
dt = element_get_dt(get_element(This));
content = xmlNodeGetContent(get_element(This));
- hr = VARIANT_from_DT(dt, content, var1);
+ hr = variant_from_dt(dt, content, v);
xmlFree(content);
return hr;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 3e60e24ded2..99553fdb83a 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -373,6 +373,8 @@ static const CHAR szTypeValueXML[] =
" 333C7BC4-460F-11D0-BC04-0080C7055a83\n"
" fffca012003c\n"
" YmFzZTY0IHRlc3Q=\n"
+" \nYmFzZTY0\nIHRlc3Q=\n\n"
+" \nYmF\r\t z ZTY0\nIHRlc3Q=\n\n"
"";
static const CHAR szBasicTransformSSXMLPart1[] =
@@ -5867,6 +5869,9 @@ static const nodetypedvalue_t get_nodetypedvalue[] = {
{ "root/r8", VT_R8, "0.412" },
{ "root/float", VT_R8, "41221.421" },
{ "root/uuid", VT_BSTR, "333C7BC4-460F-11D0-BC04-0080C7055a83" },
+ { "root/binbase64", VT_ARRAY|VT_UI1, "base64 test" },
+ { "root/binbase64_1", VT_ARRAY|VT_UI1, "base64 test" },
+ { "root/binbase64_2", VT_ARRAY|VT_UI1, "base64 test" },
{ 0 }
};
@@ -5938,21 +5943,6 @@ static void test_nodeTypedValue(void)
IXMLDOMNode_Release(node);
}
- hr = IXMLDOMDocument_selectSingleNode(doc, _bstr_("root/binbase64"), &node);
- ok(hr == S_OK, "ret %08x\n", hr );
- {
- BYTE bytes[] = {0x62,0x61,0x73,0x65,0x36,0x34,0x20,0x74,0x65,0x73,0x74};
-
- hr = IXMLDOMNode_get_nodeTypedValue(node, &value);
- ok(hr == S_OK, "ret %08x\n", hr );
- ok(V_VT(&value) == (VT_ARRAY|VT_UI1), "incorrect type\n");
- ok(V_ARRAY(&value)->rgsabound[0].cElements == 11, "incorrect array size\n");
- if(V_ARRAY(&value)->rgsabound[0].cElements == 11)
- ok(!memcmp(bytes, V_ARRAY(&value)->pvData, sizeof(bytes)), "incorrect value\n");
- VariantClear(&value);
- IXMLDOMNode_Release(node);
- }
-
hr = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("foo"), _bstr_("value"), &pi);
ok(hr == S_OK, "ret %08x\n", hr );
{
@@ -6042,6 +6032,12 @@ static void test_nodeTypedValue(void)
ok(hr == S_OK, "ret %08x\n", hr );
ok(V_VT(&value) == entry->type, "incorrect type, expected %d, got %d\n", entry->type, V_VT(&value));
+ if (entry->type == (VT_ARRAY|VT_UI1))
+ {
+ ok(V_ARRAY(&value)->rgsabound[0].cElements == strlen(entry->value),
+ "incorrect array size, got %d, expected %d\n", V_ARRAY(&value)->rgsabound[0].cElements, strlen(entry->value));
+ }
+
if (entry->type != VT_BSTR)
{
if (entry->type == VT_DATE ||
@@ -6064,8 +6060,15 @@ static void test_nodeTypedValue(void)
ok(hr == S_OK, "ret %08x\n", hr );
}
- ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0,
- "expected %s, got %s\n", entry->value, wine_dbgstr_w(V_BSTR(&value)));
+ /* for byte array from VT_ARRAY|VT_UI1 it's not a WCHAR buffer */
+ if (entry->type == (VT_ARRAY|VT_UI1))
+ {
+ ok(!memcmp( V_BSTR(&value), entry->value, strlen(entry->value)),
+ "expected %s", entry->value);
+ }
+ else
+ ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0,
+ "expected %s, got %s\n", entry->value, wine_dbgstr_w(V_BSTR(&value)));
}
else
ok(lstrcmpW( V_BSTR(&value), _bstr_(entry->value)) == 0,