[PATCH 2/2] Initial support for just created reader state

Nikolay Sivov bunglehead at gmail.com
Sat Jan 23 14:03:14 CST 2010


---
 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 07b54d6..4410f02 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -44,6 +44,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
@@ -123,11 +124,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);
@@ -147,14 +158,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)
@@ -419,6 +447,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 e64b63b..18ae499 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 dbbb0d9..552b5d6 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);")
 
-- 
1.5.6.5


--=-pnYSqVYMyVTHbwcXfIUY--




More information about the wine-patches mailing list