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