Commit 02da3663 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

xmllite: Initial support for just created reader state.

parent 7b7011e5
...@@ -43,6 +43,7 @@ typedef struct _xmlreader ...@@ -43,6 +43,7 @@ typedef struct _xmlreader
IXmlReaderInput *input; IXmlReaderInput *input;
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;
} xmlreader; } xmlreader;
typedef struct _xmlreaderinput typedef struct _xmlreaderinput
...@@ -122,11 +123,21 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input) ...@@ -122,11 +123,21 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
if (This->input) if (This->input)
{ {
IUnknown_Release(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 */ /* just reset current input */
if (!input) return S_OK; if (!input)
{
This->state = XmlReadState_Closed;
return S_OK;
}
/* now try IXmlReaderInput, ISequentialStream, IStream */ /* now try IXmlReaderInput, ISequentialStream, IStream */
hr = IUnknown_QueryInterface(input, &IID_IXmlReaderInput, (void**)&This->input); hr = IUnknown_QueryInterface(input, &IID_IXmlReaderInput, (void**)&This->input);
...@@ -146,14 +157,31 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input) ...@@ -146,14 +157,31 @@ static HRESULT WINAPI xmlreader_SetInput(IXmlReader* iface, IUnknown *input)
IUnknown_Release(This->input); IUnknown_Release(This->input);
This->input = NULL; This->input = NULL;
} }
else
This->state = XmlReadState_Initial;
return hr; return hr;
} }
static HRESULT WINAPI xmlreader_GetProperty(IXmlReader* iface, UINT property, LONG_PTR *value) static HRESULT WINAPI xmlreader_GetProperty(IXmlReader* iface, UINT property, LONG_PTR *value)
{ {
FIXME("(%p %u %p): stub\n", iface, property, value); xmlreader *This = impl_from_IXmlReader(iface);
return E_NOTIMPL;
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) 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) ...@@ -418,6 +446,7 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **pObject, IMalloc *pMalloc)
reader->ref = 1; reader->ref = 1;
reader->stream = NULL; reader->stream = NULL;
reader->input = NULL; reader->input = NULL;
reader->state = XmlReadState_Closed;
*pObject = &reader->lpVtbl; *pObject = &reader->lpVtbl;
......
...@@ -107,6 +107,53 @@ static void ok_iids_(const input_iids_t *iids, const IID **expected, const IID * ...@@ -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__) #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 typedef struct _testinput
{ {
const IUnknownVtbl *lpVtbl; const IUnknownVtbl *lpVtbl;
...@@ -211,10 +258,14 @@ static void test_reader_create(void) ...@@ -211,10 +258,14 @@ static void test_reader_create(void)
hr = pCreateXmlReader(&IID_IXmlReader, (LPVOID*)&reader, NULL); hr = pCreateXmlReader(&IID_IXmlReader, (LPVOID*)&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_sate(reader, XmlReadState_Closed, FALSE);
/* 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);
test_read_sate(reader, XmlReadState_Closed, FALSE);
/* test input interface selection sequence */ /* test input interface selection sequence */
hr = testinput_createinstance((void**)&input); hr = testinput_createinstance((void**)&input);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
...@@ -267,6 +318,9 @@ static void test_readerinput(void) ...@@ -267,6 +318,9 @@ static void test_readerinput(void)
hr = IXmlReader_SetInput(reader, reader_input); hr = IXmlReader_SetInput(reader, reader_input);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
test_read_sate(reader, XmlReadState_Initial, FALSE);
/* IXmlReader grabs a IXmlReaderInput reference */ /* IXmlReader grabs a IXmlReaderInput reference */
ref = IUnknown_AddRef(reader_input); ref = IUnknown_AddRef(reader_input);
ok(ref == 3, "Expected 3, got %d\n", ref); ok(ref == 3, "Expected 3, got %d\n", ref);
...@@ -276,6 +330,12 @@ static void test_readerinput(void) ...@@ -276,6 +330,12 @@ static void test_readerinput(void)
ok(ref == 4, "Expected 4, got %d\n", ref); ok(ref == 4, "Expected 4, got %d\n", ref);
IStream_Release(stream); 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); IXmlReader_Release(reader);
ref = IStream_AddRef(stream); ref = IStream_AddRef(stream);
...@@ -330,6 +390,8 @@ static void test_readerinput(void) ...@@ -330,6 +390,8 @@ static void test_readerinput(void)
ok(hr == E_NOINTERFACE, "Expected E_NOINTERFACE, got %08x\n", hr); ok(hr == E_NOINTERFACE, "Expected E_NOINTERFACE, got %08x\n", hr);
ok_iids(&input_iids, setinput_readerinput, NULL, FALSE); ok_iids(&input_iids, setinput_readerinput, NULL, FALSE);
test_read_sate(reader, XmlReadState_Closed, FALSE);
ref = IUnknown_AddRef(input); ref = IUnknown_AddRef(input);
ok(ref == 3, "Expected 3, got %d\n", ref); ok(ref == 3, "Expected 3, got %d\n", ref);
IUnknown_Release(input); IUnknown_Release(input);
...@@ -361,6 +423,21 @@ static void test_readerinput(void) ...@@ -361,6 +423,21 @@ static void test_readerinput(void)
IUnknown_Release(input); 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) START_TEST(reader)
{ {
HRESULT r; HRESULT r;
...@@ -376,6 +453,7 @@ START_TEST(reader) ...@@ -376,6 +453,7 @@ START_TEST(reader)
test_reader_create(); test_reader_create();
test_readerinput(); test_readerinput();
test_reader_state();
CoUninitialize(); CoUninitialize();
} }
...@@ -78,6 +78,30 @@ interface IXmlReader : IUnknown ...@@ -78,6 +78,30 @@ interface IXmlReader : IUnknown
BOOL IsEOF(void); 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 */ /* IXmlReader construction */
cpp_quote("STDAPI CreateXmlReader(REFIID riid, void **ppvObject, IMalloc *pMalloc);") cpp_quote("STDAPI CreateXmlReader(REFIID riid, void **ppvObject, IMalloc *pMalloc);")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment