Implement IXMLDOMDocument::get_url() with some tests
Nikolay Sivov
bunglehead at gmail.com
Tue Feb 2 15:45:56 CST 2010
---
dlls/msxml3/domdoc.c | 44 ++++++++++++++++----
dlls/msxml3/tests/Makefile.in | 2 +-
dlls/msxml3/tests/domdoc.c | 91 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 128 insertions(+), 9 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index e75537f..815d8aa 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -68,6 +68,7 @@ typedef struct _domdoc
IXMLDOMSchemaCollection *schema;
bsc_t *bsc;
HRESULT error;
+ WCHAR *url;
/* IPersistStream */
IStream *stream;
@@ -504,15 +505,14 @@ static ULONG WINAPI domdoc_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- if(This->bsc)
- detach_bsc(This->bsc);
+ if (This->bsc) detach_bsc(This->bsc);
- if (This->site)
- IUnknown_Release( This->site );
+ if (This->site) IUnknown_Release( This->site );
destroy_xmlnode(&This->node);
- if(This->schema) IXMLDOMSchemaCollection_Release( This->schema );
+ if (This->schema) IXMLDOMSchemaCollection_Release( This->schema );
if (This->stream) IStream_Release(This->stream);
- HeapFree( GetProcessHeap(), 0, This );
+ heap_free( This->url );
+ heap_free( This );
}
return ref;
@@ -1497,6 +1497,9 @@ static HRESULT WINAPI domdoc_load(
TRACE("filename (%s)\n", debugstr_w(filename));
+ heap_free(This->url);
+ This->url = NULL;
+
if ( filename )
{
hr = doread( This, filename );
@@ -1505,8 +1508,23 @@ static HRESULT WINAPI domdoc_load(
This->error = E_FAIL;
else
{
+ DWORD written;
+
hr = This->error = S_OK;
*isSuccessful = VARIANT_TRUE;
+
+ This->url = heap_alloc(INTERNET_MAX_URL_LENGTH * sizeof(WCHAR));
+ written = INTERNET_MAX_URL_LENGTH;
+ if (UrlCanonicalizeW(filename, This->url, &written, 0) == S_OK)
+ {
+ /* save some memory here */
+ This->url = heap_realloc(This->url, (written+1) * sizeof(WCHAR));
+ }
+ else
+ {
+ heap_free(This->url);
+ This->url = NULL;
+ }
}
}
@@ -1556,8 +1574,15 @@ static HRESULT WINAPI domdoc_get_url(
IXMLDOMDocument2 *iface,
BSTR* urlString )
{
- FIXME("\n");
- return E_NOTIMPL;
+ domdoc *This = impl_from_IXMLDOMDocument2( iface );
+
+ TRACE("(%p)->(%p)\n", This, urlString);
+
+ if (!urlString) return E_INVALIDARG;
+
+ *urlString = SysAllocString(This->url);
+
+ return This->url ? S_OK : S_FALSE;
}
@@ -1643,6 +1668,9 @@ static HRESULT WINAPI domdoc_loadXML(
if(!xmldoc)
xmldoc = xmlNewDoc(NULL);
+ heap_free( This->url );
+ This->url = NULL;
+
xmldoc->_private = create_priv();
hr2 = attach_xmldoc( &This->node, xmldoc );
if( FAILED(hr2) )
diff --git a/dlls/msxml3/tests/Makefile.in b/dlls/msxml3/tests/Makefile.in
index 5e1740c..b8a02a8 100644
--- a/dlls/msxml3/tests/Makefile.in
+++ b/dlls/msxml3/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = msxml3.dll
-IMPORTS = oleaut32 ole32 user32 kernel32
+IMPORTS = oleaut32 ole32 user32 kernel32 shlwapi
CTESTS = \
domdoc.c \
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index bc052be..43332ff 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -23,6 +23,7 @@
#define COBJMACROS
#include "windows.h"
+#include "shlwapi.h"
#include "ole2.h"
#include "xmldom.h"
#include "msxml2.h"
@@ -604,6 +605,12 @@ static void test_domdoc( void )
ok( b == VARIANT_TRUE, "failed to load XML string\n");
SysFreeString( str );
+ /* url is not set */
+ str = (BSTR)0xdeadbeef;
+ r = IXMLDOMDocument_get_url( doc, &str );
+ ok( r == S_FALSE, "expected S_FALSE, got %08x\n", r);
+ ok( str == NULL, "expected NULL pointer\n");
+
/* check if nodename is correct */
r = IXMLDOMDocument_get_nodeName( doc, NULL );
ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
@@ -4641,6 +4648,89 @@ static void test_TransformWithLoadingLocalFile(void)
free_bstrs();
}
+static void test_get_url(void)
+{
+ IXMLDOMDocument2 *doc;
+ CHAR path[MAX_PATH], path_url[MAX_PATH];
+ HANDLE file;
+ HRESULT hr;
+ DWORD dwWritten;
+ VARIANT_BOOL res;
+ VARIANT src;
+ BSTR url, str;
+
+ GetTempPathA(MAX_PATH, path);
+ strcat(path, "customers.xml" );
+
+ file = CreateFile(path, 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;
+
+ WriteFile(file, szExampleXML, strlen(szExampleXML), &dwWritten, NULL);
+ CloseHandle(file);
+
+ hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
+ ok(hr == S_OK, "ret %08x\n", hr );
+ if( hr != S_OK )
+ {
+ DeleteFile(path);
+ return;
+ }
+
+ /* null argument */
+ hr = IXMLDOMDocument2_get_url( doc, NULL );
+ ok( hr == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", hr);
+
+ V_VT(&src) = VT_BSTR;
+ V_BSTR(&src) = _bstr_(path);
+ hr = IXMLDOMDocument2_load( doc, src, &res );
+ ok(hr == S_OK, "ret %08x\n", hr );
+
+ url = (BSTR)0xdeadbeef;
+ hr = IXMLDOMDocument2_get_url( doc, &url );
+ ok( hr == S_OK, "expected S_OK, got %08x\n", hr);
+ dwWritten = sizeof(path_url)/sizeof(CHAR);
+ hr = UrlCanonicalizeA(path, path_url, &dwWritten, 0);
+ ok( hr == S_OK, "expected S_OK, got %08x\n", hr);
+ ok(!lstrcmpW(url, _bstr_(path_url)), "wrong url returned\n");
+ SysFreeString(url);
+
+ /* try to load a document from a nonexistent file */
+ res = VARIANT_TRUE;
+ str = SysAllocString( szNonExistentFile );
+ VariantInit(&src);
+ V_VT(&src) = VT_BSTR;
+ V_BSTR(&src) = str;
+
+ hr = IXMLDOMDocument2_load( doc, src, &res);
+ ok( hr == S_FALSE, "load (from file) failed\n");
+ ok( res == VARIANT_FALSE, "failed to load XML file\n");
+ SysFreeString( str );
+
+ url = (BSTR)0xdeadbeef;
+ hr = IXMLDOMDocument2_get_url( doc, &url );
+ ok( hr == S_FALSE, "expected S_FALSE, got %08x\n", hr);
+ ok( url == NULL, "expected NULL, got %p\n", url );
+
+ /* now something from memory */
+ res = VARIANT_FALSE;
+ str = SysAllocString( szComplete1 );
+ hr = IXMLDOMDocument2_loadXML( doc, str, &res );
+ ok( hr == S_OK, "loadXML failed\n");
+ ok( res == VARIANT_TRUE, "failed to load XML string\n");
+ SysFreeString( str );
+
+ url = (BSTR)0xdeadbeef;
+ hr = IXMLDOMDocument2_get_url( doc, &url );
+ ok( hr == S_FALSE, "expected S_FALSE, got %08x\n", hr);
+ ok( url == NULL, "expected NULL, got %p\n", url );
+
+ IXMLDOMDocument2_Release(doc);
+
+ DeleteFile(path);
+ free_bstrs();
+}
+
START_TEST(domdoc)
{
HRESULT r;
@@ -4671,6 +4761,7 @@ START_TEST(domdoc)
test_FormattingXML();
test_NodeTypeValue();
test_TransformWithLoadingLocalFile();
+ test_get_url();
CoUninitialize();
}
--
1.5.6.5
--=-JZPgczNDSNlSBAozBtu7--
More information about the wine-patches
mailing list