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