Nikolay Sivov : msxml3: Support VT_BSTR|VT_BYREF as source in load().
Alexandre Julliard
julliard at winehq.org
Wed Mar 16 12:22:36 CDT 2011
Module: wine
Branch: master
Commit: cde8e6c8cc69ca0b3542779a5cdf5e88475c7465
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cde8e6c8cc69ca0b3542779a5cdf5e88475c7465
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Mar 16 00:35:55 2011 +0300
msxml3: Support VT_BSTR|VT_BYREF as source in load().
---
dlls/msxml3/domdoc.c | 24 ++++++++++--------
dlls/msxml3/main.c | 3 ++
dlls/msxml3/tests/domdoc.c | 57 ++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 71 insertions(+), 13 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 7d1b352..43bcb77 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -2104,7 +2104,7 @@ static HRESULT doread( domdoc *This, LPWSTR filename )
static HRESULT WINAPI domdoc_load(
IXMLDOMDocument3 *iface,
- VARIANT xmlSource,
+ VARIANT source,
VARIANT_BOOL* isSuccessful )
{
domdoc *This = impl_from_IXMLDOMDocument3( iface );
@@ -2114,19 +2114,23 @@ static HRESULT WINAPI domdoc_load(
IStream *pStream = NULL;
xmlDocPtr xmldoc;
- TRACE("(%p)->type %d\n", This, V_VT(&xmlSource) );
+ TRACE("(%p)->(%s)\n", This, debugstr_variant(&source));
*isSuccessful = VARIANT_FALSE;
assert( &This->node );
- switch( V_VT(&xmlSource) )
+ switch( V_VT(&source) )
{
case VT_BSTR:
- filename = V_BSTR(&xmlSource);
+ filename = V_BSTR(&source);
+ break;
+ case VT_BSTR|VT_BYREF:
+ if (!V_BSTRREF(&source)) return E_INVALIDARG;
+ filename = *V_BSTRREF(&source);
break;
case VT_UNKNOWN:
- hr = IUnknown_QueryInterface(V_UNKNOWN(&xmlSource), &IID_IXMLDOMDocument3, (void**)&pNewDoc);
+ hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IXMLDOMDocument3, (void**)&pNewDoc);
if(hr == S_OK)
{
if(pNewDoc)
@@ -2141,7 +2145,7 @@ static HRESULT WINAPI domdoc_load(
return hr;
}
}
- hr = IUnknown_QueryInterface(V_UNKNOWN(&xmlSource), &IID_IStream, (void**)&pStream);
+ hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IStream, (void**)&pStream);
if(hr == S_OK)
{
IPersistStream *pDocStream;
@@ -2170,14 +2174,12 @@ static HRESULT WINAPI domdoc_load(
else
{
/* ISequentialStream */
- FIXME("Unknown type not supported (%d) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&xmlSource)->lpVtbl);
+ FIXME("Unknown type not supported (%d) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&source)->lpVtbl);
}
break;
default:
- FIXME("VT type not supported (%d)\n", V_VT(&xmlSource));
- }
-
- TRACE("filename (%s)\n", debugstr_w(filename));
+ FIXME("VT type not supported (%d)\n", V_VT(&source));
+ }
if ( filename )
{
diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c
index 6cbdd99..01eabab 100644
--- a/dlls/msxml3/main.c
+++ b/dlls/msxml3/main.c
@@ -286,6 +286,9 @@ const char *debugstr_variant(const VARIANT *v)
return wine_dbg_sprintf("{VT_UNKNOWN: %p}", V_UNKNOWN(v));
case VT_UINT:
return wine_dbg_sprintf("{VT_UINT: %u}", V_UINT(v));
+ case VT_BSTR|VT_BYREF:
+ return wine_dbg_sprintf("{VT_BSTR|VT_BYREF: ptr %p, data %s}",
+ V_BSTRREF(v), V_BSTRREF(v) ? debugstr_w(*V_BSTRREF(v)) : NULL);
default:
return wine_dbg_sprintf("{vt %d}", V_VT(v));
}
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 6948201..3e60e24 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -5686,7 +5686,7 @@ static void test_save(void)
IXMLDOMDocument_Release(doc);
- hfile = CreateFile("test.xml", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+ hfile = CreateFileA("test.xml", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
ok(hfile != INVALID_HANDLE_VALUE, "Could not open file: %u\n", GetLastError());
if(hfile == INVALID_HANDLE_VALUE) return;
@@ -6097,7 +6097,7 @@ static void test_TransformWithLoadingLocalFile(void)
GetTempPathA(MAX_PATH, lpPathBuffer);
strcat(lpPathBuffer, "customers.xml" );
- file = CreateFile(lpPathBuffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
+ file = CreateFileA(lpPathBuffer, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError());
if(file == INVALID_HANDLE_VALUE)
return;
@@ -8609,6 +8609,58 @@ static void test_selection(void)
free_bstrs();
}
+static void test_load(void)
+{
+ IXMLDOMDocument *doc;
+ VARIANT_BOOL b;
+ HANDLE hfile;
+ VARIANT src;
+ HRESULT hr;
+ BOOL ret;
+ BSTR path;
+ DWORD written;
+
+ /* prepare a file */
+ hfile = CreateFileA("test.xml", GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
+ ok(hfile != INVALID_HANDLE_VALUE, "failed to create test file\n");
+ if(hfile == INVALID_HANDLE_VALUE) return;
+
+ ret = WriteFile(hfile, szNonUnicodeXML, sizeof(szNonUnicodeXML)-1, &written, NULL);
+ ok(ret, "WriteFile failed\n");
+
+ CloseHandle(hfile);
+
+ doc = create_document(&IID_IXMLDOMDocument);
+
+ path = _bstr_("test.xml");
+
+ /* load from path: VT_BSTR */
+ V_VT(&src) = VT_BSTR;
+ V_BSTR(&src) = path;
+ hr = IXMLDOMDocument_load(doc, src, &b);
+ EXPECT_HR(hr, S_OK);
+ ok(b == VARIANT_TRUE, "got %d\n", b);
+
+ /* load from a path: VT_BSTR|VT_BYREF */
+ V_VT(&src) = VT_BSTR | VT_BYREF;
+ V_BSTRREF(&src) = &path;
+ hr = IXMLDOMDocument_load(doc, src, &b);
+ EXPECT_HR(hr, S_OK);
+ ok(b == VARIANT_TRUE, "got %d\n", b);
+
+ /* load from a path: VT_BSTR|VT_BYREF, null ptr */
+ V_VT(&src) = VT_BSTR | VT_BYREF;
+ V_BSTRREF(&src) = NULL;
+ hr = IXMLDOMDocument_load(doc, src, &b);
+ EXPECT_HR(hr, E_INVALIDARG);
+ ok(b == VARIANT_FALSE, "got %d\n", b);
+
+ IXMLDOMDocument_Release(doc);
+
+ DeleteFileA("test.xml");
+ free_bstrs();
+}
+
START_TEST(domdoc)
{
IXMLDOMDocument *doc;
@@ -8680,6 +8732,7 @@ START_TEST(domdoc)
test_get_nodeTypeString();
test_get_attributes();
test_selection();
+ test_load();
test_xsltemplate();
More information about the wine-cvs
mailing list