Nikolay Sivov : msxml3: Block ::add() if collection is read-only.

Alexandre Julliard julliard at winehq.org
Tue Jan 24 14:25:28 CST 2012


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Jan 24 10:44:19 2012 +0300

msxml3: Block ::add() if collection is read-only.

---

 dlls/msxml3/schema.c       |    8 +++++++-
 dlls/msxml3/tests/domdoc.c |    9 +--------
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/dlls/msxml3/schema.c b/dlls/msxml3/schema.c
index c614d39..253f901 100644
--- a/dlls/msxml3/schema.c
+++ b/dlls/msxml3/schema.c
@@ -102,6 +102,7 @@ typedef struct
     xmlHashTablePtr cache;
 
     VARIANT_BOOL validateOnLoad;
+    int read_only;
 } schema_cache;
 
 typedef struct
@@ -966,11 +967,13 @@ static void cache_free(void* data, xmlChar* name /* ignored */)
    queried at libxml2 level here. */
 HRESULT cache_from_doc_ns(IXMLDOMSchemaCollection2 *iface, xmlnode *node)
 {
-    static const xmlChar query[] = "//*/namespace::*";
     schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface);
+    static const xmlChar query[] = "//*/namespace::*";
     xmlXPathObjectPtr nodeset;
     xmlXPathContextPtr ctxt;
 
+    This->read_only = 1;
+
     ctxt = xmlXPathNewContext(node->node->doc);
 
     nodeset = xmlXPathEvalExpression(query, ctxt);
@@ -1111,6 +1114,8 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri
     xmlChar* name = uri ? xmlchar_from_wchar(uri) : xmlchar_from_wchar(emptyW);
     TRACE("(%p)->(%s %s)\n", This, debugstr_w(uri), debugstr_variant(&var));
 
+    if (This->read_only) return E_FAIL;
+
     switch (V_VT(&var))
     {
         case VT_NULL:
@@ -1498,6 +1503,7 @@ HRESULT SchemaCache_create(MSXML_VERSION version, IUnknown* outer, void** obj)
     This->ref = 1;
     This->version = version;
     This->validateOnLoad = VARIANT_TRUE;
+    This->read_only = 0;
     init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMSchemaCollection2_iface, &schemacache_dispex);
 
     *obj = &This->IXMLDOMSchemaCollection2_iface;
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index df8e1cb..fb3eab4 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -11400,7 +11400,6 @@ static void test_get_namespaces(void)
     V_VT(&v) = VT_DISPATCH;
     V_DISPATCH(&v) = (IDispatch*)doc2;
     hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v);
-todo_wine
     EXPECT_HR(hr, E_FAIL);
 
     hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 0, &s);
@@ -11410,16 +11409,13 @@ todo_wine
 
     hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
     EXPECT_HR(hr, S_OK);
-todo_wine
     ok(!lstrcmpW(s, _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(s));
     SysFreeString(s);
 
     s = (void*)0xdeadbeef;
     hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
-todo_wine {
     EXPECT_HR(hr, E_FAIL);
     ok(s == (void*)0xdeadbeef, "got %p\n", s);
-}
 
     /* enumerate */
     enumv = (void*)0xdeadbeef;
@@ -11513,7 +11509,6 @@ todo_wine
     V_VT(&v) = VT_DISPATCH;
     V_DISPATCH(&v) = (IDispatch*)doc2;
     hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v);
-todo_wine
     EXPECT_HR(hr, E_FAIL);
     IXMLDOMSchemaCollection_Release(doc2);
 
@@ -11524,16 +11519,14 @@ todo_wine
 
     hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
     EXPECT_HR(hr, S_OK);
-todo_wine
     ok(!lstrcmpW(s, _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(s));
     SysFreeString(s);
 
     s = (void*)0xdeadbeef;
     hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
-todo_wine {
     EXPECT_HR(hr, E_FAIL);
     ok(s == (void*)0xdeadbeef, "got %p\n", s);
-}
+
     /* enumerate */
     enumv = (void*)0xdeadbeef;
     hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);




More information about the wine-cvs mailing list