Nikolay Sivov : xmllite: Support get/set for XmlResolver property.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Mar 14 09:05:21 CDT 2016
Module: wine
Branch: master
Commit: aaac0db600f1c241e2fef473908f69ed3e808201
URL: http://source.winehq.org/git/wine.git/?a=commit;h=aaac0db600f1c241e2fef473908f69ed3e808201
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Mar 14 09:37:46 2016 +0300
xmllite: Support get/set for XmlResolver property.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/xmllite/reader.c | 17 +++++++++++-
dlls/xmllite/tests/reader.c | 63 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+), 1 deletion(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 8a078a4..d9ed7e8 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -243,6 +243,7 @@ typedef struct
XmlReaderResumeState resumestate;
XmlNodeType nodetype;
DtdProcessing dtdmode;
+ IXmlResolver *resolver;
UINT line, pos; /* reader position in XML stream */
struct list attrs; /* attributes list for current node */
struct attribute *attr; /* current attribute */
@@ -2472,6 +2473,7 @@ static ULONG WINAPI xmlreader_Release(IXmlReader *iface)
{
IMalloc *imalloc = This->imalloc;
if (This->input) IUnknown_Release(&This->input->IXmlReaderInput_iface);
+ if (This->resolver) IXmlResolver_Release(This->resolver);
reader_clear_attrs(This);
reader_clear_elements(This);
reader_free_strvalues(This);
@@ -2556,6 +2558,11 @@ static HRESULT WINAPI xmlreader_GetProperty(IXmlReader* iface, UINT property, LO
switch (property)
{
+ case XmlReaderProperty_XmlResolver:
+ *value = (LONG_PTR)This->resolver;
+ if (This->resolver)
+ IXmlResolver_AddRef(This->resolver);
+ break;
case XmlReaderProperty_DtdProcessing:
*value = This->dtdmode;
break;
@@ -2574,10 +2581,17 @@ static HRESULT WINAPI xmlreader_SetProperty(IXmlReader* iface, UINT property, LO
{
xmlreader *This = impl_from_IXmlReader(iface);
- TRACE("(%p)->(%s %lu)\n", This, debugstr_reader_prop(property), value);
+ TRACE("(%p)->(%s 0x%lx)\n", This, debugstr_reader_prop(property), value);
switch (property)
{
+ case XmlReaderProperty_XmlResolver:
+ if (This->resolver)
+ IXmlResolver_Release(This->resolver);
+ This->resolver = (IXmlResolver*)value;
+ if (This->resolver)
+ IXmlResolver_AddRef(This->resolver);
+ break;
case XmlReaderProperty_DtdProcessing:
if (value < 0 || value > _DtdProcessing_Last) return E_INVALIDARG;
This->dtdmode = value;
@@ -2974,6 +2988,7 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **obj, IMalloc *imalloc)
reader->instate = XmlReadInState_Initial;
reader->resumestate = XmlReadResumeState_Initial;
reader->dtdmode = DtdProcessing_Prohibit;
+ reader->resolver = NULL;
reader->line = reader->pos = 0;
reader->imalloc = imalloc;
if (imalloc) IMalloc_AddRef(imalloc);
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index a62f802..e51496c 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -386,8 +386,51 @@ static BOOL init_pointers(void)
return TRUE;
}
+static HRESULT WINAPI resolver_QI(IXmlResolver *iface, REFIID riid, void **obj)
+{
+ ok(0, "unexpected call, riid %s\n", wine_dbgstr_guid(riid));
+
+ if (IsEqualIID(riid, &IID_IXmlResolver) || IsEqualIID(riid, &IID_IUnknown))
+ {
+ *obj = iface;
+ IXmlResolver_AddRef(iface);
+ return S_OK;
+ }
+
+ *obj = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI resolver_AddRef(IXmlResolver *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI resolver_Release(IXmlResolver *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI resolver_ResolveUri(IXmlResolver *iface, const WCHAR *base_uri,
+ const WCHAR *public_id, const WCHAR *system_id, IUnknown **input)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static const IXmlResolverVtbl resolvervtbl =
+{
+ resolver_QI,
+ resolver_AddRef,
+ resolver_Release,
+ resolver_ResolveUri
+};
+
+static IXmlResolver testresolver = { &resolvervtbl };
+
static void test_reader_create(void)
{
+ IXmlResolver *resolver;
HRESULT hr;
IXmlReader *reader;
IUnknown *input;
@@ -411,6 +454,26 @@ static void test_reader_create(void)
ok(hr == S_FALSE, "got %08x\n", hr);
ok(nodetype == XmlNodeType_None, "got %d\n", nodetype);
+ resolver = (void*)0xdeadbeef;
+ hr = IXmlReader_GetProperty(reader, XmlReaderProperty_XmlResolver, (LONG_PTR*)&resolver);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(resolver == NULL, "got %p\n", resolver);
+
+ hr = IXmlReader_SetProperty(reader, XmlReaderProperty_XmlResolver, 0);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = IXmlReader_SetProperty(reader, XmlReaderProperty_XmlResolver, (LONG_PTR)&testresolver);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ resolver = NULL;
+ hr = IXmlReader_GetProperty(reader, XmlReaderProperty_XmlResolver, (LONG_PTR*)&resolver);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(resolver == &testresolver, "got %p\n", resolver);
+ IXmlResolver_Release(resolver);
+
+ hr = IXmlReader_SetProperty(reader, XmlReaderProperty_XmlResolver, 0);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
dtd = 2;
hr = IXmlReader_GetProperty(reader, XmlReaderProperty_DtdProcessing, (LONG_PTR*)&dtd);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
More information about the wine-cvs
mailing list