Adam Martinson : msxml3: Implement schema_cache_get_namespaceURI().
Alexandre Julliard
julliard at winehq.org
Thu Oct 21 10:50:48 CDT 2010
Module: wine
Branch: master
Commit: d87b8b8eb94e703cc4b910504e1a87e0d09162bf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d87b8b8eb94e703cc4b910504e1a87e0d09162bf
Author: Adam Martinson <amartinson at codeweavers.com>
Date: Wed Oct 20 16:37:06 2010 -0500
msxml3: Implement schema_cache_get_namespaceURI().
---
dlls/msxml3/schema.c | 29 +++++++++-
dlls/msxml3/tests/schema.c | 138 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 165 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/schema.c b/dlls/msxml3/schema.c
index 2df038f..93aa2ca 100644
--- a/dlls/msxml3/schema.c
+++ b/dlls/msxml3/schema.c
@@ -85,6 +85,12 @@ typedef struct _cache_entry
LONG ref;
} cache_entry;
+typedef struct _cache_index_data
+{
+ LONG index;
+ BSTR* out;
+} cache_index_data;
+
static LONG cache_entry_add_ref(cache_entry* entry)
{
LONG ref = InterlockedIncrement(&entry->ref);
@@ -468,10 +474,29 @@ static HRESULT WINAPI schema_cache_get_length(IXMLDOMSchemaCollection *iface, LO
return S_OK;
}
+static void cache_index(void* data /* ignored */, void* index, xmlChar* name)
+{
+ cache_index_data* index_data = (cache_index_data*)index;
+
+ if (index_data->index-- == 0)
+ *index_data->out = bstr_from_xmlChar(name);
+}
+
static HRESULT WINAPI schema_cache_get_namespaceURI(IXMLDOMSchemaCollection *iface, LONG index, BSTR *len)
{
- FIXME("stub\n");
- return E_NOTIMPL;
+ schema_cache* This = impl_from_IXMLDOMSchemaCollection(iface);
+ cache_index_data data = {index,len};
+ TRACE("(%p)->(%i, %p)\n", This, index, len);
+
+ if (!len)
+ return E_POINTER;
+ *len = NULL;
+
+ if (index >= xmlHashSize(This->cache))
+ return E_FAIL;
+
+ xmlHashScan(This->cache, cache_index, &data);
+ return S_OK;
}
static void cache_copy(void* data, void* dest, xmlChar* name)
diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c
index 0754a1b..69a0dc3 100644
--- a/dlls/msxml3/tests/schema.c
+++ b/dlls/msxml3/tests/schema.c
@@ -530,6 +530,143 @@ static void test_length(void)
free_bstrs();
}
+static void test_collection_content(void)
+{
+ IXMLDOMDocument2 *schema1, *schema2, *schema3, *schema4, *schema5;
+ IXMLDOMSchemaCollection *cache1, *cache2;
+ VARIANT_BOOL b;
+ BSTR bstr;
+ BSTR content[5] = {NULL, NULL, NULL, NULL, NULL};
+ LONG length;
+ int i, j;
+
+ schema1 = create_document_version(30, &IID_IXMLDOMDocument2);
+ schema2 = create_document_version(30, &IID_IXMLDOMDocument2);
+ schema3 = create_document_version(30, &IID_IXMLDOMDocument2);
+
+ cache1 = create_cache_version(30, &IID_IXMLDOMSchemaCollection);
+ cache2 = create_cache_version(40, &IID_IXMLDOMSchemaCollection);
+
+ if (!schema1 || !schema2 || !schema3 || !cache1)
+ {
+ if (schema1) IXMLDOMDocument2_Release(schema1);
+ if (schema2) IXMLDOMDocument2_Release(schema2);
+ if (schema3) IXMLDOMDocument2_Release(schema3);
+
+ if (cache1) IXMLDOMSchemaCollection_Release(cache1);
+
+ return;
+ }
+
+ ole_check(IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b));
+ ok(b == VARIANT_TRUE, "failed to load XML\n");
+
+ ole_check(IXMLDOMDocument2_loadXML(schema2, _bstr_(xdr_schema2_xml), &b));
+ ok(b == VARIANT_TRUE, "failed to load XML\n");
+
+ ole_check(IXMLDOMDocument2_loadXML(schema3, _bstr_(xdr_schema3_xml), &b));
+ ok(b == VARIANT_TRUE, "failed to load XML\n");
+
+ ole_check(IXMLDOMSchemaCollection_add(cache1, _bstr_(xdr_schema1_uri), _variantdoc_(schema1)));
+ ole_check(IXMLDOMSchemaCollection_add(cache1, _bstr_(xdr_schema2_uri), _variantdoc_(schema2)));
+ ole_check(IXMLDOMSchemaCollection_add(cache1, _bstr_(xdr_schema3_uri), _variantdoc_(schema3)));
+
+ length = -1;
+ ole_check(IXMLDOMSchemaCollection_get_length(cache1, &length));
+ ok(length == 3, "expected length 3, got %i\n", length);
+
+ IXMLDOMDocument2_Release(schema1);
+ IXMLDOMDocument2_Release(schema2);
+ IXMLDOMDocument2_Release(schema3);
+
+ if (cache2)
+ {
+ schema1 = create_document_version(40, &IID_IXMLDOMDocument2);
+ schema2 = create_document_version(40, &IID_IXMLDOMDocument2);
+ schema3 = create_document_version(40, &IID_IXMLDOMDocument2);
+ schema4 = create_document_version(40, &IID_IXMLDOMDocument2);
+ schema5 = create_document_version(40, &IID_IXMLDOMDocument2);
+ ole_check(IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b));
+ ok(b == VARIANT_TRUE, "failed to load XML\n");
+ ole_check(IXMLDOMDocument2_loadXML(schema2, _bstr_(xdr_schema2_xml), &b));
+ ok(b == VARIANT_TRUE, "failed to load XML\n");
+ ole_check(IXMLDOMDocument2_loadXML(schema3, _bstr_(xsd_schema1_xml), &b));
+ ok(b == VARIANT_TRUE, "failed to load XML\n");
+ ole_check(IXMLDOMDocument2_loadXML(schema4, _bstr_(xsd_schema2_xml), &b));
+ ok(b == VARIANT_TRUE, "failed to load XML\n");
+ ole_check(IXMLDOMDocument2_loadXML(schema5, _bstr_(xsd_schema3_xml), &b));
+ ok(b == VARIANT_TRUE, "failed to load XML\n");
+
+ /* combining XDR and XSD schemas in the same cache is fine */
+ ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xdr_schema1_uri), _variantdoc_(schema1)));
+ ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xdr_schema2_uri), _variantdoc_(schema2)));
+ ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema1_uri), _variantdoc_(schema3)));
+ ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema2_uri), _variantdoc_(schema4)));
+ ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema3_uri), _variantdoc_(schema5)));
+
+ length = -1;
+ ole_check(IXMLDOMSchemaCollection_get_length(cache2, &length));
+ ok(length == 5, "expected length 5, got %i\n", length);
+
+ IXMLDOMDocument2_Release(schema1);
+ IXMLDOMDocument2_Release(schema2);
+ IXMLDOMDocument2_Release(schema3);
+ IXMLDOMDocument2_Release(schema4);
+ IXMLDOMDocument2_Release(schema5);
+ }
+
+ bstr = NULL;
+ /* error if index is out of range */
+ ole_expect(IXMLDOMSchemaCollection_get_namespaceURI(cache1, 3, &bstr), E_FAIL);
+ if (bstr) SysFreeString(bstr);
+ /* error if return pointer is NULL */
+ ole_expect(IXMLDOMSchemaCollection_get_namespaceURI(cache1, 0, NULL), E_POINTER);
+ /* pointer is checked first */
+ ole_expect(IXMLDOMSchemaCollection_get_namespaceURI(cache1, 3, NULL), E_POINTER);
+
+ for (i = 0; i < 3; ++i)
+ {
+ bstr = NULL;
+ ole_check(IXMLDOMSchemaCollection_get_namespaceURI(cache1, i, &bstr));
+ ok(bstr != NULL && *bstr, "expected non-empty string\n");
+ content[i] = bstr;
+
+ for (j = 0; j < i; ++j)
+ ok(lstrcmpW(content[j], bstr), "got duplicate entry\n");
+ }
+
+ for (i = 0; i < 3; ++i)
+ {
+ SysFreeString(content[i]);
+ content[i] = NULL;
+ }
+
+ if (cache2)
+ {
+ for (i = 0; i < 5; ++i)
+ {
+ bstr = NULL;
+ ole_check(IXMLDOMSchemaCollection_get_namespaceURI(cache2, i, &bstr));
+ ok(bstr != NULL && *bstr, "expected non-empty string\n");
+
+ for (j = 0; j < i; ++j)
+ ok(lstrcmpW(content[j], bstr), "got duplicate entry\n");
+ content[i] = bstr;
+ }
+
+ for (i = 0; i < 5; ++i)
+ {
+ SysFreeString(content[i]);
+ content[i] = NULL;
+ }
+ }
+
+ IXMLDOMSchemaCollection_Release(cache1);
+ if (cache2) IXMLDOMSchemaCollection_Release(cache2);
+
+ free_bstrs();
+}
+
START_TEST(schema)
{
HRESULT r;
@@ -540,6 +677,7 @@ START_TEST(schema)
test_schema_refs();
test_collection_refs();
test_length();
+ test_collection_content();
CoUninitialize();
}
More information about the wine-cvs
mailing list