diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index f29315459a3..491060572e2 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -957,6 +957,73 @@ inline HRESULT VARIANT_from_xmlChar(xmlChar *str, VARIANT *v, BSTR type) if(!V_BSTR(v)) return E_OUTOFMEMORY; } + else if(!lstrcmpiW(type, szDateTime) || !lstrcmpiW(type, szDateTimeTZ) || + !lstrcmpiW(type, szDate) || !lstrcmpiW(type, szTime) || + !lstrcmpiW(type, szTimeTZ)) + { + VARIANT src; + WCHAR *p, *e; + SYSTEMTIME st; + DOUBLE date = 0.0; + + st.wYear = 1899; + st.wMonth = 12; + st.wDay = 30; + st.wDayOfWeek = st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0; + + V_VT(&src) = VT_BSTR; + V_BSTR(&src) = bstr_from_xmlChar(str); + + if(!V_BSTR(&src)) + return E_OUTOFMEMORY; + + p = V_BSTR(&src); + e = p + SysStringLen(V_BSTR(&src)); + + if(p+4-13\n" " 7322.9371\n" " 1\n" +" 2009-11-18T03:21:33.12\n" +" 2003-07-11T11:13:57+03:00\n" +" 3721-11-01\n" +" \n" +" 23:21:01.13+03:21\n" ""; static const CHAR szBasicTransformSSXMLPart1[] = @@ -252,6 +257,8 @@ static WCHAR szStrangeChars[] = {'&','x',' ',0x2103, 0}; ok(r == (expect), #expr " returned %x, expected %x\n", r, expect); \ } +#define double_eq(x, y) ok((x)-(y)<=1e-14*(x) && (x)-(y)>=-1e-14*(x), "expected %.16g, got %.16g\n", x, y) + static BSTR alloc_str_from_narrow(const char *str) { int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); @@ -4087,6 +4094,71 @@ static void test_NodeTypeValue(void) IXMLDOMNode_Release(pNode); } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/datetime"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_DATE, "incorrect type\n"); + double_eq(40135.13996666666, V_DATE(&v)); + VariantClear( &v ); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/datetimetz"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_DATE, "incorrect type\n"); + double_eq(37813.59302083334, V_DATE(&v)); + VariantClear( &v ); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/date"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_DATE, "incorrect type\n"); + double_eq(665413.0, V_DATE(&v)); + VariantClear( &v ); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/time"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_DATE, "incorrect type\n"); + double_eq(0.581392511574074, V_DATE(&v)); + VariantClear( &v ); + + IXMLDOMNode_Release(pNode); + } + + hr = IXMLDOMDocument2_selectSingleNode(doc, _bstr_("root/timetz"), &pNode); + ok(hr == S_OK, "ret %08x\n", hr ); + if(hr == S_OK) + { + hr = IXMLDOMNode_get_nodeTypedValue(pNode, &v); + ok(hr == S_OK, "ret %08x\n", hr ); + ok(V_VT(&v) == VT_DATE, "incorrect type\n"); + double_eq(1.112513078703703, V_DATE(&v)); + VariantClear( &v ); + + IXMLDOMNode_Release(pNode); + } } IXMLDOMDocument2_Release(doc);