xmllite: Support get/set for XmlResolver property.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e625e86ee1
commit
aaac0db600
|
@ -243,6 +243,7 @@ typedef struct
|
||||||
XmlReaderResumeState resumestate;
|
XmlReaderResumeState resumestate;
|
||||||
XmlNodeType nodetype;
|
XmlNodeType nodetype;
|
||||||
DtdProcessing dtdmode;
|
DtdProcessing dtdmode;
|
||||||
|
IXmlResolver *resolver;
|
||||||
UINT line, pos; /* reader position in XML stream */
|
UINT line, pos; /* reader position in XML stream */
|
||||||
struct list attrs; /* attributes list for current node */
|
struct list attrs; /* attributes list for current node */
|
||||||
struct attribute *attr; /* current attribute */
|
struct attribute *attr; /* current attribute */
|
||||||
|
@ -2472,6 +2473,7 @@ static ULONG WINAPI xmlreader_Release(IXmlReader *iface)
|
||||||
{
|
{
|
||||||
IMalloc *imalloc = This->imalloc;
|
IMalloc *imalloc = This->imalloc;
|
||||||
if (This->input) IUnknown_Release(&This->input->IXmlReaderInput_iface);
|
if (This->input) IUnknown_Release(&This->input->IXmlReaderInput_iface);
|
||||||
|
if (This->resolver) IXmlResolver_Release(This->resolver);
|
||||||
reader_clear_attrs(This);
|
reader_clear_attrs(This);
|
||||||
reader_clear_elements(This);
|
reader_clear_elements(This);
|
||||||
reader_free_strvalues(This);
|
reader_free_strvalues(This);
|
||||||
|
@ -2556,6 +2558,11 @@ static HRESULT WINAPI xmlreader_GetProperty(IXmlReader* iface, UINT property, LO
|
||||||
|
|
||||||
switch (property)
|
switch (property)
|
||||||
{
|
{
|
||||||
|
case XmlReaderProperty_XmlResolver:
|
||||||
|
*value = (LONG_PTR)This->resolver;
|
||||||
|
if (This->resolver)
|
||||||
|
IXmlResolver_AddRef(This->resolver);
|
||||||
|
break;
|
||||||
case XmlReaderProperty_DtdProcessing:
|
case XmlReaderProperty_DtdProcessing:
|
||||||
*value = This->dtdmode;
|
*value = This->dtdmode;
|
||||||
break;
|
break;
|
||||||
|
@ -2574,10 +2581,17 @@ static HRESULT WINAPI xmlreader_SetProperty(IXmlReader* iface, UINT property, LO
|
||||||
{
|
{
|
||||||
xmlreader *This = impl_from_IXmlReader(iface);
|
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)
|
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:
|
case XmlReaderProperty_DtdProcessing:
|
||||||
if (value < 0 || value > _DtdProcessing_Last) return E_INVALIDARG;
|
if (value < 0 || value > _DtdProcessing_Last) return E_INVALIDARG;
|
||||||
This->dtdmode = value;
|
This->dtdmode = value;
|
||||||
|
@ -2974,6 +2988,7 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **obj, IMalloc *imalloc)
|
||||||
reader->instate = XmlReadInState_Initial;
|
reader->instate = XmlReadInState_Initial;
|
||||||
reader->resumestate = XmlReadResumeState_Initial;
|
reader->resumestate = XmlReadResumeState_Initial;
|
||||||
reader->dtdmode = DtdProcessing_Prohibit;
|
reader->dtdmode = DtdProcessing_Prohibit;
|
||||||
|
reader->resolver = NULL;
|
||||||
reader->line = reader->pos = 0;
|
reader->line = reader->pos = 0;
|
||||||
reader->imalloc = imalloc;
|
reader->imalloc = imalloc;
|
||||||
if (imalloc) IMalloc_AddRef(imalloc);
|
if (imalloc) IMalloc_AddRef(imalloc);
|
||||||
|
|
|
@ -386,8 +386,51 @@ static BOOL init_pointers(void)
|
||||||
return TRUE;
|
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)
|
static void test_reader_create(void)
|
||||||
{
|
{
|
||||||
|
IXmlResolver *resolver;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
IXmlReader *reader;
|
IXmlReader *reader;
|
||||||
IUnknown *input;
|
IUnknown *input;
|
||||||
|
@ -411,6 +454,26 @@ static void test_reader_create(void)
|
||||||
ok(hr == S_FALSE, "got %08x\n", hr);
|
ok(hr == S_FALSE, "got %08x\n", hr);
|
||||||
ok(nodetype == XmlNodeType_None, "got %d\n", nodetype);
|
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;
|
dtd = 2;
|
||||||
hr = IXmlReader_GetProperty(reader, XmlReaderProperty_DtdProcessing, (LONG_PTR*)&dtd);
|
hr = IXmlReader_GetProperty(reader, XmlReaderProperty_DtdProcessing, (LONG_PTR*)&dtd);
|
||||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
||||||
|
|
Loading…
Reference in New Issue