Adam Martinson : msxml3/domdoc: Add support for VT_ARRAY|VT_UI1 in domdoc_load().
Alexandre Julliard
julliard at winehq.org
Fri May 20 12:44:34 CDT 2011
Module: wine
Branch: master
Commit: f730d13c84507023cc18c97d391c8f84a4f8e431
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f730d13c84507023cc18c97d391c8f84a4f8e431
Author: Adam Martinson <amartinson at codeweavers.com>
Date: Fri May 20 10:05:38 2011 -0500
msxml3/domdoc: Add support for VT_ARRAY|VT_UI1 in domdoc_load().
---
dlls/msxml3/domdoc.c | 47 ++++++++++++++++++++++
dlls/msxml3/tests/domdoc.c | 94 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 140 insertions(+), 1 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 07391b4..122d62f 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -2113,6 +2113,8 @@ static HRESULT WINAPI domdoc_load(
TRACE("(%p)->(%s)\n", This, debugstr_variant(&source));
+ if (!isSuccessful)
+ return E_POINTER;
*isSuccessful = VARIANT_FALSE;
assert( &This->node );
@@ -2126,6 +2128,51 @@ static HRESULT WINAPI domdoc_load(
if (!V_BSTRREF(&source)) return E_INVALIDARG;
filename = *V_BSTRREF(&source);
break;
+ case VT_ARRAY|VT_UI1:
+ {
+ SAFEARRAY *psa = V_ARRAY(&source);
+ char *str;
+ LONG len;
+ UINT dim = SafeArrayGetDim(psa);
+
+ switch (dim)
+ {
+ case 0:
+ ERR("SAFEARRAY == NULL\n");
+ hr = This->error = E_INVALIDARG;
+ break;
+ case 1:
+ /* Only takes UTF-8 strings.
+ * NOT NULL-terminated. */
+ SafeArrayAccessData(psa, (void**)&str);
+ SafeArrayGetUBound(psa, 1, &len);
+
+ if ((xmldoc = doparse(This, str, ++len, XML_CHAR_ENCODING_UTF8)))
+ {
+ hr = This->error = S_OK;
+ *isSuccessful = VARIANT_TRUE;
+ TRACE("parsed document %p\n", xmldoc);
+ }
+ else
+ {
+ This->error = E_FAIL;
+ TRACE("failed to parse document\n");
+ }
+
+ SafeArrayUnaccessData(psa);
+
+ if(xmldoc)
+ {
+ xmldoc->_private = create_priv();
+ return attach_xmldoc(This, xmldoc);
+ }
+ break;
+ default:
+ FIXME("unhandled SAFEARRAY dim: %d\n", dim);
+ hr = This->error = E_NOTIMPL;
+ }
+ }
+ break;
case VT_UNKNOWN:
hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IXMLDOMDocument3, (void**)&pNewDoc);
if(hr == S_OK)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index f828241..abb282a 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -9946,13 +9946,15 @@ static void test_selection(void)
static void test_load(void)
{
IXMLDOMDocument *doc;
+ IXMLDOMNodeList *list;
VARIANT_BOOL b;
HANDLE hfile;
VARIANT src;
HRESULT hr;
BOOL ret;
- BSTR path;
+ BSTR path, bstr1, bstr2;
DWORD written;
+ void* ptr;
/* prepare a file */
hfile = CreateFileA("test.xml", GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
@@ -9992,6 +9994,96 @@ static void test_load(void)
IXMLDOMDocument_Release(doc);
DeleteFileA("test.xml");
+
+ doc = create_document(&IID_IXMLDOMDocument);
+
+ hr = IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &b);
+ EXPECT_HR(hr, S_OK);
+ ok(b == VARIANT_TRUE, "got %d\n", b);
+
+ hr = IXMLDOMDocument_selectNodes(doc, _bstr_("//*"), &list);
+ EXPECT_HR(hr, S_OK);
+ bstr1 = _bstr_(list_to_string(list));
+
+ hr = IXMLDOMNodeList_reset(list);
+ EXPECT_HR(hr, S_OK);
+
+ IXMLDOMDocument_Release(doc);
+
+ doc = create_document(&IID_IXMLDOMDocument);
+
+ VariantInit(&src);
+ V_ARRAY(&src) = SafeArrayCreateVector(VT_UI1, 0, lstrlenA(szExampleXML));
+ V_VT(&src) = VT_ARRAY|VT_UI1;
+ ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
+ ptr = NULL;
+ hr = SafeArrayAccessData(V_ARRAY(&src), &ptr);
+ EXPECT_HR(hr, S_OK);
+ ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
+
+ memcpy(ptr, szExampleXML, lstrlenA(szExampleXML));
+ hr = SafeArrayUnlock(V_ARRAY(&src));
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMDocument_load(doc, src, &b);
+ EXPECT_HR(hr, S_OK);
+ ok(b == VARIANT_TRUE, "got %d\n", b);
+
+ hr = IXMLDOMDocument_selectNodes(doc, _bstr_("//*"), &list);
+ EXPECT_HR(hr, S_OK);
+ bstr2 = _bstr_(list_to_string(list));
+
+ hr = IXMLDOMNodeList_reset(list);
+ EXPECT_HR(hr, S_OK);
+
+ ok(lstrcmpW(bstr1, bstr2) == 0, "strings not equal: %s : %s\n",
+ wine_dbgstr_w(bstr1), wine_dbgstr_w(bstr2));
+
+ IXMLDOMDocument_Release(doc);
+ IXMLDOMNodeList_Release(list);
+ VariantClear(&src);
+
+ /* UTF-16 isn't accepted */
+ doc = create_document(&IID_IXMLDOMDocument);
+
+ V_ARRAY(&src) = SafeArrayCreateVector(VT_UI1, 0, lstrlenW(szComplete1) * sizeof(WCHAR));
+ V_VT(&src) = VT_ARRAY|VT_UI1;
+ ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
+ ptr = NULL;
+ hr = SafeArrayAccessData(V_ARRAY(&src), &ptr);
+ EXPECT_HR(hr, S_OK);
+ ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
+
+ memcpy(ptr, szComplete1, lstrlenW(szComplete1) * sizeof(WCHAR));
+ hr = SafeArrayUnlock(V_ARRAY(&src));
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMDocument_load(doc, src, &b);
+ todo_wine EXPECT_HR(hr, S_FALSE);
+ todo_wine ok(b == VARIANT_FALSE, "got %d\n", b);
+
+ VariantClear(&src);
+
+ /* it doesn't like it as a VT_ARRAY|VT_UI2 either */
+ V_ARRAY(&src) = SafeArrayCreateVector(VT_UI2, 0, lstrlenW(szComplete1));
+ V_VT(&src) = VT_ARRAY|VT_UI2;
+ ok(V_ARRAY(&src) != NULL, "SafeArrayCreateVector() returned NULL\n");
+ ptr = NULL;
+ hr = SafeArrayAccessData(V_ARRAY(&src), &ptr);
+ EXPECT_HR(hr, S_OK);
+ ok(ptr != NULL, "SafeArrayAccessData() returned NULL\n");
+
+ memcpy(ptr, szComplete1, lstrlenW(szComplete1) * sizeof(WCHAR));
+ hr = SafeArrayUnlock(V_ARRAY(&src));
+ EXPECT_HR(hr, S_OK);
+
+ hr = IXMLDOMDocument_load(doc, src, &b);
+ todo_wine EXPECT_HR(hr, E_INVALIDARG);
+ ok(b == VARIANT_FALSE, "got %d\n", b);
+
+ VariantClear(&src);
+ IXMLDOMDocument_Release(doc);
+
free_bstrs();
}
More information about the wine-cvs
mailing list