Adam Martinson : msxml3/schema: Properly handle schema_cache_add() from a URL.

Alexandre Julliard julliard at winehq.org
Thu Nov 25 11:18:53 CST 2010


Module: wine
Branch: master
Commit: 10e2d26e3f6a1041c49c98a32e9906cefa63a77d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=10e2d26e3f6a1041c49c98a32e9906cefa63a77d

Author: Adam Martinson <amartinson at codeweavers.com>
Date:   Wed Nov 24 13:53:38 2010 -0600

msxml3/schema: Properly handle schema_cache_add() from a URL.

---

 dlls/msxml3/schema.c |   85 +++++++++++++++++++++++++++++--------------------
 1 files changed, 50 insertions(+), 35 deletions(-)

diff --git a/dlls/msxml3/schema.c b/dlls/msxml3/schema.c
index fd56aeb..eb6b6d3 100644
--- a/dlls/msxml3/schema.c
+++ b/dlls/msxml3/schema.c
@@ -818,38 +818,6 @@ static BOOL link_datatypes(xmlDocPtr schema)
     return TRUE;
 }
 
-static cache_entry* cache_entry_from_url(char const* url, xmlChar const* nsURI)
-{
-    cache_entry* entry = heap_alloc(sizeof(cache_entry));
-    xmlSchemaParserCtxtPtr spctx = xmlSchemaNewParserCtxt(url);
-    entry->type = SCHEMA_TYPE_XSD;
-    entry->ref = 0;
-    if (spctx)
-    {
-        if((entry->schema = Schema_parse(spctx)))
-        {
-            /* TODO: if the nsURI is different from the default xmlns or targetNamespace,
-             *       do we need to do something special here? */
-            xmldoc_init(entry->schema->doc, &CLSID_DOMDocument40);
-            entry->doc = entry->schema->doc;
-            xmldoc_add_ref(entry->doc);
-        }
-        else
-        {
-            heap_free(entry);
-            entry = NULL;
-        }
-        xmlSchemaFreeParserCtxt(spctx);
-    }
-    else
-    {
-        FIXME("schema for nsURI %s not found\n", wine_dbgstr_a(url));
-        heap_free(entry);
-        entry = NULL;
-    }
-    return entry;
-}
-
 static cache_entry* cache_entry_from_xsd_doc(xmlDocPtr doc, xmlChar const* nsURI)
 {
     cache_entry* entry = heap_alloc(sizeof(cache_entry));
@@ -914,6 +882,55 @@ static cache_entry* cache_entry_from_xdr_doc(xmlDocPtr doc, xmlChar const* nsURI
     return entry;
 }
 
+static cache_entry* cache_entry_from_url(VARIANT url, xmlChar const* nsURI)
+{
+    cache_entry* entry;
+    IXMLDOMDocument3* domdoc = NULL;
+    xmlDocPtr doc = NULL;
+    HRESULT hr = DOMDocument_create(&CLSID_DOMDocument, NULL, (void**)&domdoc);
+    VARIANT_BOOL b = VARIANT_FALSE;
+    SCHEMA_TYPE type = SCHEMA_TYPE_INVALID;
+
+    if (hr != S_OK)
+    {
+        FIXME("failed to create domdoc\n");
+        return NULL;
+    }
+    assert(domdoc != NULL);
+    assert(V_VT(&url) == VT_BSTR);
+
+    hr = IXMLDOMDocument3_load(domdoc, url, &b);
+    if (hr != S_OK)
+    {
+        ERR("IXMLDOMDocument3_load() returned 0x%08x\n", hr);
+        if (b != VARIANT_TRUE)
+        {
+            FIXME("Failed to load doc at %s\n", wine_dbgstr_w(V_BSTR(&url)));
+            IXMLDOMDocument3_Release(domdoc);
+            return NULL;
+        }
+    }
+    doc = xmlNodePtr_from_domnode((IXMLDOMNode*)domdoc, XML_DOCUMENT_NODE)->doc;
+    type = schema_type_from_xmlDocPtr(doc);
+
+    switch (type)
+    {
+        case SCHEMA_TYPE_XSD:
+            entry = cache_entry_from_xsd_doc(doc, nsURI);
+            break;
+        case SCHEMA_TYPE_XDR:
+            entry = cache_entry_from_xdr_doc(doc, nsURI);
+            break;
+        case SCHEMA_TYPE_INVALID:
+            entry = NULL;
+            FIXME("invalid schema\n");
+            break;
+    }
+    IXMLDOMDocument3_Release(domdoc);
+
+    return entry;
+}
+
 static HRESULT WINAPI schema_cache_QueryInterface(IXMLDOMSchemaCollection2* iface,
                                                   REFIID riid, void** ppvObject)
 {
@@ -1056,9 +1073,7 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri
 
         case VT_BSTR:
             {
-                xmlChar* url = xmlChar_from_wchar(V_BSTR(&var));
-                cache_entry* entry = cache_entry_from_url((char const*)url, name);
-                heap_free(url);
+                cache_entry* entry = cache_entry_from_url(var, name);
 
                 if (entry)
                 {




More information about the wine-cvs mailing list