[PATCH v3 5/6] xmllite: Handle DTD with a namespace.
Jeff Smith
whydoubt at gmail.com
Tue Oct 29 14:36:03 CDT 2019
Signed-off-by: Jeff Smith <whydoubt at gmail.com>
---
dlls/xmllite/reader.c | 23 ++++++++++++-------
dlls/xmllite/tests/reader.c | 46 +++++++++++++++++++++++++++++++++++--
2 files changed, 59 insertions(+), 10 deletions(-)
diff --git a/dlls/xmllite/reader.c b/dlls/xmllite/reader.c
index 88db0df4c2..3875676f01 100644
--- a/dlls/xmllite/reader.c
+++ b/dlls/xmllite/reader.c
@@ -1965,7 +1965,7 @@ static HRESULT reader_parse_qname(xmlreader *reader, strval *prefix, strval *loc
static HRESULT reader_parse_dtd(xmlreader *reader)
{
static const WCHAR doctypeW[] = {'<','!','D','O','C','T','Y','P','E',0};
- strval name;
+ strval prefix, local, qname;
WCHAR *cur;
HRESULT hr;
@@ -1980,7 +1980,7 @@ static HRESULT reader_parse_dtd(xmlreader *reader)
if (!reader_skipspaces(reader)) return WC_E_WHITESPACE;
/* name */
- hr = reader_parse_name(reader, &name);
+ hr = reader_parse_qname(reader, &prefix, &local, &qname);
if (FAILED(hr)) return WC_E_DECLDOCTYPE;
reader_skipspaces(reader);
@@ -2002,9 +2002,12 @@ static HRESULT reader_parse_dtd(xmlreader *reader)
reader->nodetype = XmlNodeType_DocumentType;
reader_free_strvalued(reader, &reader->empty_element.localname);
- reader_strvaldup(reader, &name, &reader->empty_element.localname);
- reader_free_strvalued(reader, &reader->empty_element.qname);
- reader_strvaldup(reader, &name, &reader->empty_element.qname);
+ reader_strvaldup(reader, &local, &reader->empty_element.localname);
+ if (prefix.len)
+ {
+ reader_strvaldup(reader, &prefix, &reader->empty_element.prefix);
+ reader_strvaldup(reader, &qname, &reader->empty_element.qname);
+ }
return S_OK;
}
@@ -3138,9 +3141,13 @@ static HRESULT WINAPI xmlreader_GetQualifiedName(IXmlReader* iface, LPCWSTR *nam
}
break;
case XmlNodeType_DocumentType:
- *name = This->empty_element.qname.str;
- *len = This->empty_element.qname.len;
- break;
+ if (This->empty_element.prefix.len)
+ {
+ *name = This->empty_element.qname.str;
+ *len = This->empty_element.qname.len;
+ break;
+ }
+ /* fallthrough */
case XmlNodeType_XmlDeclaration:
case XmlNodeType_ProcessingInstruction:
*name = This->empty_element.localname.str;
diff --git a/dlls/xmllite/tests/reader.c b/dlls/xmllite/tests/reader.c
index 2a6d8a053c..a928456571 100644
--- a/dlls/xmllite/tests/reader.c
+++ b/dlls/xmllite/tests/reader.c
@@ -1315,7 +1315,6 @@ static void test_read_public_dtd(void)
move_to_element(reader);
name = reader_name(reader, "testdtd");
qname = reader_qname(reader, "testdtd");
-todo_wine
ok(name == qname, "name != qname\n");
IXmlReader_Release(reader);
@@ -1362,7 +1361,6 @@ static void test_read_system_dtd(void)
move_to_element(reader);
name = reader_name(reader, "testdtd");
qname = reader_qname(reader, "testdtd");
-todo_wine
ok(name == qname, "name != qname\n");
read_node(reader, XmlNodeType_Comment);
@@ -1370,6 +1368,49 @@ todo_wine
IXmlReader_Release(reader);
}
+static const char test_system_dtd_ns[] =
+ "<!DOCTYPE a:testdtd SYSTEM \"externalid uri\" >";
+
+static void test_read_system_dtd_ns(void)
+{
+ IXmlReader *reader;
+ XmlNodeType type;
+ UINT count;
+ HRESULT hr;
+
+ hr = CreateXmlReader(&IID_IXmlReader, (void**)&reader, NULL);
+ ok(hr == S_OK, "S_OK, got %08x\n", hr);
+
+ hr = IXmlReader_SetProperty(reader, XmlReaderProperty_DtdProcessing, DtdProcessing_Parse);
+ ok(hr == S_OK, "got 0x%8x\n", hr);
+
+ set_input_string(reader, test_system_dtd_ns);
+
+ read_node(reader, XmlNodeType_DocumentType);
+
+ count = 0;
+ hr = IXmlReader_GetAttributeCount(reader, &count);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(count == 1, "got %d\n", count);
+
+ hr = IXmlReader_MoveToFirstAttribute(reader);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ type = XmlNodeType_None;
+ hr = IXmlReader_GetNodeType(reader, &type);
+ ok(hr == S_OK, "got %08x\n", hr);
+ ok(type == XmlNodeType_Attribute, "got %d\n", type);
+
+ reader_name(reader, "SYSTEM");
+ reader_value(reader, "externalid uri");
+
+ move_to_element(reader);
+ reader_name(reader, "testdtd");
+ reader_qname(reader, "a:testdtd");
+
+ IXmlReader_Release(reader);
+}
+
static struct test_entry element_tests[] = {
{ "<a/>", "a", "", S_OK },
{ "<a />", "a", "", S_OK },
@@ -2652,6 +2693,7 @@ START_TEST(reader)
test_read_comment();
test_read_pi();
test_read_system_dtd();
+ test_read_system_dtd_ns();
test_read_public_dtd();
test_read_element();
test_isemptyelement();
--
2.21.0
More information about the wine-devel
mailing list