xmllite: Store DTD processing mode in reader.

This commit is contained in:
Nikolay Sivov 2012-08-29 08:12:01 +04:00 committed by Alexandre Julliard
parent 5cb75c525f
commit ae0b830cf1
3 changed files with 55 additions and 6 deletions

View File

@ -44,6 +44,7 @@ typedef struct _xmlreader
ISequentialStream *stream;/* stored as sequential stream, cause currently ISequentialStream *stream;/* stored as sequential stream, cause currently
optimizations possible with IStream aren't implemented */ optimizations possible with IStream aren't implemented */
XmlReadState state; XmlReadState state;
DtdProcessing dtdmode;
UINT line, pos; /* reader position in XML stream */ UINT line, pos; /* reader position in XML stream */
} xmlreader; } xmlreader;
@ -104,7 +105,7 @@ static ULONG WINAPI xmlreader_Release(IXmlReader *iface)
if (ref == 0) if (ref == 0)
{ {
if (This->input) IUnknown_Release(This->input); if (This->input) IUnknown_Release(This->input);
if (This->stream) IUnknown_Release(This->stream); if (This->stream) ISequentialStream_Release(This->stream);
HeapFree(GetProcessHeap(), 0, This); HeapFree(GetProcessHeap(), 0, This);
} }
@ -126,7 +127,7 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
if (This->stream) if (This->stream)
{ {
IUnknown_Release(This->stream); ISequentialStream_Release(This->stream);
This->stream = NULL; This->stream = NULL;
} }
@ -167,6 +168,9 @@ static HRESULT WINAPI xmlreader_GetProperty(IXmlReader* iface, UINT property, LO
switch (property) switch (property)
{ {
case XmlReaderProperty_DtdProcessing:
*value = This->dtdmode;
break;
case XmlReaderProperty_ReadState: case XmlReaderProperty_ReadState:
*value = This->state; *value = This->state;
break; break;
@ -180,8 +184,22 @@ static HRESULT WINAPI xmlreader_GetProperty(IXmlReader* iface, UINT property, LO
static HRESULT WINAPI xmlreader_SetProperty(IXmlReader* iface, UINT property, LONG_PTR value) static HRESULT WINAPI xmlreader_SetProperty(IXmlReader* iface, UINT property, LONG_PTR value)
{ {
FIXME("(%p %u %lu): stub\n", iface, property, value); xmlreader *This = impl_from_IXmlReader(iface);
return E_NOTIMPL;
TRACE("(%p %u %lu)\n", iface, property, value);
switch (property)
{
case XmlReaderProperty_DtdProcessing:
if (value < 0 || value > _DtdProcessing_Last) return E_INVALIDARG;
This->dtdmode = value;
break;
default:
FIXME("Unimplemented property (%u)\n", property);
return E_NOTIMPL;
}
return S_OK;
} }
static HRESULT WINAPI xmlreader_Read(IXmlReader* iface, XmlNodeType *node_type) static HRESULT WINAPI xmlreader_Read(IXmlReader* iface, XmlNodeType *node_type)
@ -455,6 +473,7 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **pObject, IMalloc *pMalloc)
reader->stream = NULL; reader->stream = NULL;
reader->input = NULL; reader->input = NULL;
reader->state = XmlReadState_Closed; reader->state = XmlReadState_Closed;
reader->dtdmode = DtdProcessing_Prohibit;
reader->line = reader->pos = 0; reader->line = reader->pos = 0;
*pObject = &reader->IXmlReader_iface; *pObject = &reader->IXmlReader_iface;

View File

@ -350,19 +350,32 @@ static void test_reader_create(void)
HRESULT hr; HRESULT hr;
IXmlReader *reader; IXmlReader *reader;
IUnknown *input; IUnknown *input;
DtdProcessing dtd;
/* crashes native */ /* crashes native */
if (0) if (0)
{ {
pCreateXmlReader(&IID_IXmlReader, NULL, NULL); pCreateXmlReader(&IID_IXmlReader, NULL, NULL);
pCreateXmlReader(NULL, (LPVOID*)&reader, NULL); pCreateXmlReader(NULL, (void**)&reader, NULL);
} }
hr = pCreateXmlReader(&IID_IXmlReader, (LPVOID*)&reader, NULL); hr = pCreateXmlReader(&IID_IXmlReader, (void**)&reader, NULL);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
test_read_state(reader, XmlReadState_Closed, -1, FALSE); test_read_state(reader, XmlReadState_Closed, -1, FALSE);
dtd = 2;
hr = IXmlReader_GetProperty(reader, XmlReaderProperty_DtdProcessing, (LONG_PTR*)&dtd);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
ok(dtd == DtdProcessing_Prohibit, "got %d\n", dtd);
dtd = 2;
hr = IXmlReader_SetProperty(reader, XmlReaderProperty_DtdProcessing, dtd);
ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
hr = IXmlReader_SetProperty(reader, XmlReaderProperty_DtdProcessing, -1);
ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
/* Null input pointer, releases previous input */ /* Null input pointer, releases previous input */
hr = IXmlReader_SetInput(reader, NULL); hr = IXmlReader_SetInput(reader, NULL);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);

View File

@ -88,6 +88,23 @@ cpp_quote(" XmlReadState_EndOfFile = 3,")
cpp_quote(" XmlReadState_Closed = 4") cpp_quote(" XmlReadState_Closed = 4")
cpp_quote("} XmlReadState;") cpp_quote("} XmlReadState;")
/* conformance levels */
cpp_quote("typedef enum XmlConformanceLevel")
cpp_quote("{")
cpp_quote(" XmlConformanceLevel_Auto = 0,")
cpp_quote(" XmlConformanceLevel_Fragment = 1,")
cpp_quote(" XmlConformanceLevel_Document = 2,")
cpp_quote(" _XmlConformanceLevel_Last = 2")
cpp_quote("} XmlConformanceLevel;")
/* DTD processing mode */
cpp_quote("typedef enum DtdProcessing")
cpp_quote("{")
cpp_quote(" DtdProcessing_Prohibit = 0,")
cpp_quote(" DtdProcessing_Parse = DtdProcessing_Prohibit + 1,")
cpp_quote(" _DtdProcessing_Last = DtdProcessing_Parse")
cpp_quote("} DtdProcessing;")
/* IXmlReader properties */ /* IXmlReader properties */
cpp_quote("typedef enum XmlReaderProperty") cpp_quote("typedef enum XmlReaderProperty")
cpp_quote("{") cpp_quote("{")