Nikolay Sivov : xmllite: Report node value for comment nodes.

Alexandre Julliard julliard at winehq.org
Tue Jan 8 13:58:44 CST 2013


Module: wine
Branch: master
Commit: 57148ae964314378ad8999b904fafab6b616858c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=57148ae964314378ad8999b904fafab6b616858c

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Jan  8 14:32:21 2013 +0400

xmllite: Report node value for comment nodes.

---

 dlls/xmllite/reader.c       |   23 ++++++++++++-----
 dlls/xmllite/tests/reader.c |   58 +++++++++++++++++++++++++-----------------
 2 files changed, 50 insertions(+), 31 deletions(-)

diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 82aca68..7d3d93a 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -56,6 +56,7 @@ typedef enum
 {
     StringValue_LocalName,
     StringValue_QualifiedName,
+    StringValue_Value,
     StringValue_Last
 } XmlReaderStringValue;
 
@@ -889,7 +890,7 @@ static HRESULT reader_parse_xmldecl(xmlreader *reader)
 /* [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' */
 static HRESULT reader_parse_comment(xmlreader *reader)
 {
-    const WCHAR *start, *ptr;
+    WCHAR *start, *ptr;
 
     /* skip '<!--' */
     reader_skipn(reader, 4);
@@ -904,11 +905,14 @@ static HRESULT reader_parse_comment(xmlreader *reader)
             {
                 if (ptr[2] == '>')
                 {
+                    strval value = { start, ptr-start };
+
                     TRACE("%s\n", debugstr_wn(start, ptr-start));
                     /* skip '-->' */
                     reader_skipn(reader, 3);
                     reader_set_strvalue(reader, StringValue_LocalName, &strval_empty);
                     reader_set_strvalue(reader, StringValue_QualifiedName, &strval_empty);
+                    reader_set_strvalue(reader, StringValue_Value, &value);
                     reader->nodetype = XmlNodeType_Comment;
                     return S_OK;
                 }
@@ -1421,12 +1425,14 @@ static HRESULT WINAPI xmlreader_GetPrefix(IXmlReader* iface,
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI xmlreader_GetValue(IXmlReader* iface,
-                                         LPCWSTR *value,
-                                         UINT *value_length)
+static HRESULT WINAPI xmlreader_GetValue(IXmlReader* iface, LPCWSTR *value, UINT *len)
 {
-    FIXME("(%p %p %p): stub\n", iface, value, value_length);
-    return E_NOTIMPL;
+    xmlreader *This = impl_from_IXmlReader(iface);
+
+    TRACE("(%p)->(%p %p)\n", This, value, len);
+    *value = This->strvalues[StringValue_Value].str;
+    if (len) *len = This->strvalues[StringValue_Value].len;
+    return S_OK;
 }
 
 static HRESULT WINAPI xmlreader_ReadValueChunk(IXmlReader* iface,
@@ -1600,6 +1606,7 @@ static const struct IUnknownVtbl xmlreaderinput_vtbl =
 HRESULT WINAPI CreateXmlReader(REFIID riid, void **obj, IMalloc *imalloc)
 {
     xmlreader *reader;
+    int i;
 
     TRACE("(%s, %p, %p)\n", wine_dbgstr_guid(riid), obj, imalloc);
 
@@ -1628,7 +1635,9 @@ HRESULT WINAPI CreateXmlReader(REFIID riid, void **obj, IMalloc *imalloc)
     list_init(&reader->attrs);
     reader->attr_count = 0;
     reader->attr = NULL;
-    memset(&reader->strvalues, 0, sizeof(reader->strvalues));
+
+    for (i = 0; i < StringValue_Last; i++)
+        reader->strvalues[i] = strval_empty;
 
     *obj = &reader->IXmlReader_iface;
 
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 2de1047..cd22f49 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -648,10 +648,8 @@ static void test_read_xmldeclaration(void)
     test_read_state(reader, XmlReadState_Interactive, -1, 0);
 
     hr = IXmlReader_GetValue(reader, &val, NULL);
-todo_wine
     ok(hr == S_OK, "got %08x\n", hr);
-    if (hr == S_OK)
-        ok(*val == 0, "got %s\n", wine_dbgstr_w(val));
+    ok(*val == 0, "got %s\n", wine_dbgstr_w(val));
 
     /* check attributes */
     hr = IXmlReader_MoveToNextAttribute(reader);
@@ -717,14 +715,16 @@ todo_wine {
 struct test_entry {
     const char *xml;
     const char *name;
+    const char *value;
     HRESULT hr;
     HRESULT hr_broken; /* this is set to older version results */
 };
 
 static struct test_entry comment_tests[] = {
-    { "<!-- comment -->", "", S_OK },
-    { "<!-- - comment-->", "", S_OK },
-    { "<!-- -- comment-->", NULL, WC_E_COMMENT, WC_E_GREATERTHAN },
+    { "<!-- comment -->", "", " comment ", S_OK },
+    { "<!-- - comment-->", "", " - comment", S_OK },
+    { "<!-- -- comment-->", NULL, NULL, WC_E_COMMENT, WC_E_GREATERTHAN },
+    { "<!-- -- comment--->", NULL, NULL, WC_E_COMMENT, WC_E_GREATERTHAN },
     { NULL }
 };
 
@@ -754,29 +754,39 @@ static void test_read_comment(void)
             ok(hr == test->hr, "got %08x for %s\n", hr, test->xml);
         if (hr == S_OK)
         {
-            const WCHAR *name;
-            WCHAR *name_exp;
+            const WCHAR *str;
+            WCHAR *str_exp;
             UINT len;
 
             ok(type == XmlNodeType_Comment, "got %d for %s\n", type, test->xml);
 
             len = 1;
-            name = NULL;
-            hr = IXmlReader_GetLocalName(reader, &name, &len);
+            str = NULL;
+            hr = IXmlReader_GetLocalName(reader, &str, &len);
             ok(hr == S_OK, "got 0x%08x\n", hr);
             ok(len == strlen(test->name), "got %u\n", len);
-            name_exp = a2w(test->name);
-            ok(!lstrcmpW(name, name_exp), "got %s\n", wine_dbgstr_w(name));
-            free_str(name_exp);
+            str_exp = a2w(test->name);
+            ok(!lstrcmpW(str, str_exp), "got %s\n", wine_dbgstr_w(str));
+            free_str(str_exp);
 
             len = 1;
-            name = NULL;
-            hr = IXmlReader_GetQualifiedName(reader, &name, &len);
+            str = NULL;
+            hr = IXmlReader_GetQualifiedName(reader, &str, &len);
             ok(hr == S_OK, "got 0x%08x\n", hr);
             ok(len == strlen(test->name), "got %u\n", len);
-            name_exp = a2w(test->name);
-            ok(!lstrcmpW(name, name_exp), "got %s\n", wine_dbgstr_w(name));
-            free_str(name_exp);
+            str_exp = a2w(test->name);
+            ok(!lstrcmpW(str, str_exp), "got %s\n", wine_dbgstr_w(str));
+            free_str(str_exp);
+
+            /* value */
+            len = 1;
+            str = NULL;
+            hr = IXmlReader_GetValue(reader, &str, &len);
+            ok(hr == S_OK, "got 0x%08x\n", hr);
+            ok(len == strlen(test->value), "got %u\n", len);
+            str_exp = a2w(test->value);
+            ok(!lstrcmpW(str, str_exp), "got %s\n", wine_dbgstr_w(str));
+            free_str(str_exp);
         }
 
         IStream_Release(stream);
@@ -787,12 +797,12 @@ static void test_read_comment(void)
 }
 
 static struct test_entry pi_tests[] = {
-    { "<?pi?>", "pi", S_OK },
-    { "<?pi ?>", "pi", S_OK },
-    { "<?pi:pi?>", NULL, NC_E_NAMECOLON, WC_E_NAMECHARACTER },
-    { "<?:pi ?>", NULL, WC_E_PI, WC_E_NAMECHARACTER },
-    { "<?-pi ?>", NULL, WC_E_PI, WC_E_NAMECHARACTER },
-    { "<?xml-stylesheet ?>", "xml-stylesheet", S_OK },
+    { "<?pi?>", "pi", "", S_OK },
+    { "<?pi ?>", "pi", "", S_OK },
+    { "<?pi:pi?>", NULL, NULL, NC_E_NAMECOLON, WC_E_NAMECHARACTER },
+    { "<?:pi ?>", NULL, NULL, WC_E_PI, WC_E_NAMECHARACTER },
+    { "<?-pi ?>", NULL, NULL, WC_E_PI, WC_E_NAMECHARACTER },
+    { "<?xml-stylesheet ?>", "xml-stylesheet", "", S_OK },
     { NULL }
 };
 




More information about the wine-cvs mailing list