From 02da36631ec7f3de6f762fa7ecc16916c75a04e2 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sat, 23 Jan 2010 23:03:14 +0300 Subject: [PATCH] xmllite: Initial support for just created reader state. --- dlls/xmllite/reader.c | 37 ++++++++++++++++-- dlls/xmllite/tests/reader.c | 78 +++++++++++++++++++++++++++++++++++++ include/xmllite.idl | 24 ++++++++++++ 3 files changed, 135 insertions(+), 4 deletions(-) diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c index 51fe44d8d14..ee4a00cdf7c 100644 --- a/dlls/xmllite/reader.c +++ b/dlls/xmllite/reader.c @@ -43,6 +43,7 @@ typedef struct _xmlreader IXmlReaderInput *input; ISequentialStream *stream;/* stored as sequential stream, cause currently optimizations possible with IStream aren't implemented */ + XmlReadState state; } xmlreader; typedef struct _xmlreaderinput @@ -122,11 +123,21 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input) if (This->input) { IUnknown_Release(This->input); - This->input = NULL; + This->input = NULL; + } + + if (This->stream) + { + IUnknown_Release(This->stream); + This->stream = NULL; } /* just reset current input */ - if (!input) return S_OK; + if (!input) + { + This->state = XmlReadState_Closed; + return S_OK; + } /* now try IXmlReaderInput, ISequentialStream, IStream */ hr = IUnknown_QueryInterface(input, &IID_IXmlReaderInput, (void**)&This->input); @@ -146,14 +157,31 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input) IUnknown_Release(This->input); This->input = NULL; } + else + This->state = XmlReadState_Initial; return hr; } static HRESULT WINAPI xmlreader_GetProperty(IXmlReader* iface, UINT property, LONG_PTR *value) { - FIXME("(%p %u %p): stub\n", iface, property, value); - return E_NOTIMPL; + xmlreader *This = impl_from_IXmlReader(iface); + + TRACE("(%p %u %p)\n", This, property, value); + + if (!value) return E_INVALIDARG; + + switch (property) + { + case XmlReaderProperty_ReadState: + *value = This->state; + break; + default: + FIXME("Unimplemented property (%u)\n", property); + return E_NOTIMPL; + } + + return S_OK; } static HRESULT WINAPI xmlreader_SetProperty(IXmlReader* iface, UINT property, LONG_PTR value) @@ -418,6 +446,7 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **pObject, IMalloc *pMalloc) reader->ref = 1; reader->stream = NULL; reader->input = NULL; + reader->state = XmlReadState_Closed; *pObject = &reader->lpVtbl; diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c index e64b63b9067..18ae499f1ff 100644 --- a/dlls/xmllite/tests/reader.c +++ b/dlls/xmllite/tests/reader.c @@ -107,6 +107,53 @@ static void ok_iids_(const input_iids_t *iids, const IID **expected, const IID * } #define ok_iids(got, exp, brk, todo) ok_iids_(got, exp, brk, todo, __LINE__) +static const char *state_to_str(XmlReadState state) +{ + static const char* state_names[] = { + "XmlReadState_Initial", + "XmlReadState_Interactive", + "XmlReadState_Error", + "XmlReadState_EndOfFile", + "XmlReadState_Closed" + }; + + static const char unknown[] = "unknown"; + + switch (state) + { + case XmlReadState_Initial: + case XmlReadState_Interactive: + case XmlReadState_Error: + case XmlReadState_EndOfFile: + case XmlReadState_Closed: + return state_names[state]; + default: + return unknown; + } +} + +static void test_read_state_(IXmlReader *reader, XmlReadState expected, int todo, int line) +{ + XmlReadState state; + HRESULT hr; + + state = -1; /* invalid value */ + hr = IXmlReader_GetProperty(reader, XmlReaderProperty_ReadState, (LONG_PTR*)&state); + ok_(__FILE__, line)(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + if (todo) + { + todo_wine + ok_(__FILE__, line)(state == expected, "Expected (%s), got (%s)\n", + state_to_str(expected), state_to_str(state)); + } + else + ok_(__FILE__, line)(state == expected, "Expected (%s), got (%s)\n", + state_to_str(expected), state_to_str(state)); +} + +#define test_read_sate(reader, exp, todo) test_read_state_(reader, exp, todo, __LINE__) + typedef struct _testinput { const IUnknownVtbl *lpVtbl; @@ -211,10 +258,14 @@ static void test_reader_create(void) hr = pCreateXmlReader(&IID_IXmlReader, (LPVOID*)&reader, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + test_read_sate(reader, XmlReadState_Closed, FALSE); + /* Null input pointer, releases previous input */ hr = IXmlReader_SetInput(reader, NULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + test_read_sate(reader, XmlReadState_Closed, FALSE); + /* test input interface selection sequence */ hr = testinput_createinstance((void**)&input); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -267,6 +318,9 @@ static void test_readerinput(void) hr = IXmlReader_SetInput(reader, reader_input); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + test_read_sate(reader, XmlReadState_Initial, FALSE); + /* IXmlReader grabs a IXmlReaderInput reference */ ref = IUnknown_AddRef(reader_input); ok(ref == 3, "Expected 3, got %d\n", ref); @@ -276,6 +330,12 @@ static void test_readerinput(void) ok(ref == 4, "Expected 4, got %d\n", ref); IStream_Release(stream); + /* reset input and check state */ + hr = IXmlReader_SetInput(reader, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + test_read_sate(reader, XmlReadState_Closed, FALSE); + IXmlReader_Release(reader); ref = IStream_AddRef(stream); @@ -330,6 +390,8 @@ static void test_readerinput(void) ok(hr == E_NOINTERFACE, "Expected E_NOINTERFACE, got %08x\n", hr); ok_iids(&input_iids, setinput_readerinput, NULL, FALSE); + test_read_sate(reader, XmlReadState_Closed, FALSE); + ref = IUnknown_AddRef(input); ok(ref == 3, "Expected 3, got %d\n", ref); IUnknown_Release(input); @@ -361,6 +423,21 @@ static void test_readerinput(void) IUnknown_Release(input); } +static void test_reader_state(void) +{ + IXmlReader *reader; + HRESULT hr; + + hr = pCreateXmlReader(&IID_IXmlReader, (LPVOID*)&reader, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + /* invalid arguments */ + hr = IXmlReader_GetProperty(reader, XmlReaderProperty_ReadState, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + IXmlReader_Release(reader); +} + START_TEST(reader) { HRESULT r; @@ -376,6 +453,7 @@ START_TEST(reader) test_reader_create(); test_readerinput(); + test_reader_state(); CoUninitialize(); } diff --git a/include/xmllite.idl b/include/xmllite.idl index dbbb0d94874..552b5d646b9 100644 --- a/include/xmllite.idl +++ b/include/xmllite.idl @@ -78,6 +78,30 @@ interface IXmlReader : IUnknown BOOL IsEOF(void); } +/* IXmlReader state */ +cpp_quote("typedef enum XmlReadState") +cpp_quote("{") +cpp_quote(" XmlReadState_Initial = 0,") +cpp_quote(" XmlReadState_Interactive = 1,") +cpp_quote(" XmlReadState_Error = 2,") +cpp_quote(" XmlReadState_EndOfFile = 3,") +cpp_quote(" XmlReadState_Closed = 4") +cpp_quote("} XmlReadState;") + +/* IXmlReader properties */ +cpp_quote("typedef enum XmlReaderProperty") +cpp_quote("{") +cpp_quote(" XmlReaderProperty_MultiLanguage = 0,") +cpp_quote(" XmlReaderProperty_ConformanceLevel = XmlReaderProperty_MultiLanguage + 1,") +cpp_quote(" XmlReaderProperty_RandomAccess = XmlReaderProperty_ConformanceLevel + 1,") +cpp_quote(" XmlReaderProperty_XmlResolver = XmlReaderProperty_RandomAccess + 1,") +cpp_quote(" XmlReaderProperty_DtdProcessing = XmlReaderProperty_XmlResolver + 1,") +cpp_quote(" XmlReaderProperty_ReadState = XmlReaderProperty_DtdProcessing + 1,") +cpp_quote(" XmlReaderProperty_MaxElementDepth = XmlReaderProperty_ReadState + 1,") +cpp_quote(" XmlReaderProperty_MaxEntityExpansion = XmlReaderProperty_MaxElementDepth + 1,") +cpp_quote(" _XmlReaderProperty_Last = XmlReaderProperty_MaxEntityExpansion") +cpp_quote("} XmlReaderProperty;") + /* IXmlReader construction */ cpp_quote("STDAPI CreateXmlReader(REFIID riid, void **ppvObject, IMalloc *pMalloc);")