msxml3: Block ::add() if collection is read-only.
This commit is contained in:
parent
95b9b82181
commit
85cf92aed0
@ -102,6 +102,7 @@ typedef struct
|
|||||||
xmlHashTablePtr cache;
|
xmlHashTablePtr cache;
|
||||||
|
|
||||||
VARIANT_BOOL validateOnLoad;
|
VARIANT_BOOL validateOnLoad;
|
||||||
|
int read_only;
|
||||||
} schema_cache;
|
} schema_cache;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -966,11 +967,13 @@ static void cache_free(void* data, xmlChar* name /* ignored */)
|
|||||||
queried at libxml2 level here. */
|
queried at libxml2 level here. */
|
||||||
HRESULT cache_from_doc_ns(IXMLDOMSchemaCollection2 *iface, xmlnode *node)
|
HRESULT cache_from_doc_ns(IXMLDOMSchemaCollection2 *iface, xmlnode *node)
|
||||||
{
|
{
|
||||||
static const xmlChar query[] = "//*/namespace::*";
|
|
||||||
schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface);
|
schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface);
|
||||||
|
static const xmlChar query[] = "//*/namespace::*";
|
||||||
xmlXPathObjectPtr nodeset;
|
xmlXPathObjectPtr nodeset;
|
||||||
xmlXPathContextPtr ctxt;
|
xmlXPathContextPtr ctxt;
|
||||||
|
|
||||||
|
This->read_only = 1;
|
||||||
|
|
||||||
ctxt = xmlXPathNewContext(node->node->doc);
|
ctxt = xmlXPathNewContext(node->node->doc);
|
||||||
|
|
||||||
nodeset = xmlXPathEvalExpression(query, ctxt);
|
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);
|
xmlChar* name = uri ? xmlchar_from_wchar(uri) : xmlchar_from_wchar(emptyW);
|
||||||
TRACE("(%p)->(%s %s)\n", This, debugstr_w(uri), debugstr_variant(&var));
|
TRACE("(%p)->(%s %s)\n", This, debugstr_w(uri), debugstr_variant(&var));
|
||||||
|
|
||||||
|
if (This->read_only) return E_FAIL;
|
||||||
|
|
||||||
switch (V_VT(&var))
|
switch (V_VT(&var))
|
||||||
{
|
{
|
||||||
case VT_NULL:
|
case VT_NULL:
|
||||||
@ -1498,6 +1503,7 @@ HRESULT SchemaCache_create(MSXML_VERSION version, IUnknown* outer, void** obj)
|
|||||||
This->ref = 1;
|
This->ref = 1;
|
||||||
This->version = version;
|
This->version = version;
|
||||||
This->validateOnLoad = VARIANT_TRUE;
|
This->validateOnLoad = VARIANT_TRUE;
|
||||||
|
This->read_only = 0;
|
||||||
init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMSchemaCollection2_iface, &schemacache_dispex);
|
init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMSchemaCollection2_iface, &schemacache_dispex);
|
||||||
|
|
||||||
*obj = &This->IXMLDOMSchemaCollection2_iface;
|
*obj = &This->IXMLDOMSchemaCollection2_iface;
|
||||||
|
@ -11400,7 +11400,6 @@ static void test_get_namespaces(void)
|
|||||||
V_VT(&v) = VT_DISPATCH;
|
V_VT(&v) = VT_DISPATCH;
|
||||||
V_DISPATCH(&v) = (IDispatch*)doc2;
|
V_DISPATCH(&v) = (IDispatch*)doc2;
|
||||||
hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v);
|
hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v);
|
||||||
todo_wine
|
|
||||||
EXPECT_HR(hr, E_FAIL);
|
EXPECT_HR(hr, E_FAIL);
|
||||||
|
|
||||||
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 0, &s);
|
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 0, &s);
|
||||||
@ -11410,16 +11409,13 @@ todo_wine
|
|||||||
|
|
||||||
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
|
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
|
||||||
EXPECT_HR(hr, S_OK);
|
EXPECT_HR(hr, S_OK);
|
||||||
todo_wine
|
|
||||||
ok(!lstrcmpW(s, _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(s));
|
ok(!lstrcmpW(s, _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(s));
|
||||||
SysFreeString(s);
|
SysFreeString(s);
|
||||||
|
|
||||||
s = (void*)0xdeadbeef;
|
s = (void*)0xdeadbeef;
|
||||||
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
|
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
|
||||||
todo_wine {
|
|
||||||
EXPECT_HR(hr, E_FAIL);
|
EXPECT_HR(hr, E_FAIL);
|
||||||
ok(s == (void*)0xdeadbeef, "got %p\n", s);
|
ok(s == (void*)0xdeadbeef, "got %p\n", s);
|
||||||
}
|
|
||||||
|
|
||||||
/* enumerate */
|
/* enumerate */
|
||||||
enumv = (void*)0xdeadbeef;
|
enumv = (void*)0xdeadbeef;
|
||||||
@ -11513,7 +11509,6 @@ todo_wine
|
|||||||
V_VT(&v) = VT_DISPATCH;
|
V_VT(&v) = VT_DISPATCH;
|
||||||
V_DISPATCH(&v) = (IDispatch*)doc2;
|
V_DISPATCH(&v) = (IDispatch*)doc2;
|
||||||
hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v);
|
hr = IXMLDOMSchemaCollection_add(collection, _bstr_(xsd_schema1_uri), v);
|
||||||
todo_wine
|
|
||||||
EXPECT_HR(hr, E_FAIL);
|
EXPECT_HR(hr, E_FAIL);
|
||||||
IXMLDOMSchemaCollection_Release(doc2);
|
IXMLDOMSchemaCollection_Release(doc2);
|
||||||
|
|
||||||
@ -11524,16 +11519,14 @@ todo_wine
|
|||||||
|
|
||||||
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
|
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 1, &s);
|
||||||
EXPECT_HR(hr, S_OK);
|
EXPECT_HR(hr, S_OK);
|
||||||
todo_wine
|
|
||||||
ok(!lstrcmpW(s, _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(s));
|
ok(!lstrcmpW(s, _bstr_("http://blahblah.org")), "got %s\n", wine_dbgstr_w(s));
|
||||||
SysFreeString(s);
|
SysFreeString(s);
|
||||||
|
|
||||||
s = (void*)0xdeadbeef;
|
s = (void*)0xdeadbeef;
|
||||||
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
|
hr = IXMLDOMSchemaCollection_get_namespaceURI(collection, 2, &s);
|
||||||
todo_wine {
|
|
||||||
EXPECT_HR(hr, E_FAIL);
|
EXPECT_HR(hr, E_FAIL);
|
||||||
ok(s == (void*)0xdeadbeef, "got %p\n", s);
|
ok(s == (void*)0xdeadbeef, "got %p\n", s);
|
||||||
}
|
|
||||||
/* enumerate */
|
/* enumerate */
|
||||||
enumv = (void*)0xdeadbeef;
|
enumv = (void*)0xdeadbeef;
|
||||||
hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);
|
hr = IXMLDOMSchemaCollection_get__newEnum(collection, (IUnknown**)&enumv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user