[PATCH 2/4] webservices: Accept empty namespace in attribute type mapping.
Hans Leidekker
hans at codeweavers.com
Fri Mar 27 09:47:39 CDT 2020
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/webservices/reader.c | 21 ++++++++++++++++++---
dlls/webservices/tests/reader.c | 29 ++++++++++++++++++++++++++++-
2 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 119043f705..4d37a38a8a 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -4343,9 +4343,24 @@ static HRESULT get_text( struct reader *reader, WS_TYPE_MAPPING mapping, const W
{
case WS_ATTRIBUTE_TYPE_MAPPING:
{
- ULONG index;
- if (!(*found = find_attribute( reader, localname, ns, &index ))) return S_OK;
- return get_attribute_text( reader, index, ret );
+ ULONG i;
+ WS_XML_ELEMENT_NODE *elem = &reader->current->hdr;
+
+ *found = FALSE;
+ for (i = 0; i < elem->attributeCount; i++)
+ {
+ const WS_XML_STRING *localname2 = elem->attributes[i]->localName;
+ const WS_XML_STRING *ns2 = elem->attributes[i]->ns;
+
+ if (cmp_name( localname->bytes, localname->length, localname2->bytes, localname2->length )) continue;
+ if (!ns->length || !cmp_name( ns->bytes, ns->length, ns2->bytes, ns2->length ))
+ {
+ *found = TRUE;
+ break;
+ }
+ }
+ if (!*found) return S_OK;
+ return get_attribute_text( reader, i, ret );
}
case WS_ELEMENT_TYPE_MAPPING:
case WS_ELEMENT_CONTENT_TYPE_MAPPING:
diff --git a/dlls/webservices/tests/reader.c b/dlls/webservices/tests/reader.c
index ef6fd8808e..733ebe3eb1 100644
--- a/dlls/webservices/tests/reader.c
+++ b/dlls/webservices/tests/reader.c
@@ -2556,7 +2556,8 @@ static void test_cdata(void)
static void test_WsFindAttribute(void)
{
static const char test[] = "<t attr='value' attr2='value2'></t>";
- WS_XML_STRING ns = {0, NULL}, localname = {4, (BYTE *)"attr"};
+ static const char test2[] = "<p:t attr='value' p:attr2='value2' xmlns:p=\"ns\"></t>";
+ WS_XML_STRING ns = {0, NULL}, ns2 = {2, (BYTE *)"ns"}, localname = {4, (BYTE *)"attr"};
WS_XML_STRING localname2 = {5, (BYTE *)"attr2"}, localname3 = {5, (BYTE *)"attr3"};
WS_XML_READER *reader;
ULONG index;
@@ -2638,6 +2639,32 @@ static void test_WsFindAttribute(void)
ok( hr == S_FALSE, "got %08x\n", hr );
ok( index == ~0u, "got %u\n", index );
+ hr = set_input( reader, test2, sizeof(test2) - 1 );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ hr = WsReadNode( reader, NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ index = 0xdeadbeef;
+ hr = WsFindAttribute( reader, &localname, &ns, TRUE, &index, NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !index, "got %u\n", index );
+
+ hr = WsFindAttribute( reader, &localname2, &ns2, TRUE, &index, NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ hr = WsFindAttribute( reader, &localname2, &ns, TRUE, &index, NULL );
+ ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
+
+ hr = set_input( reader, test2, sizeof(test2) - 1 );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ hr = WsReadNode( reader, NULL );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ hr = WsFindAttribute( reader, &localname, &ns2, TRUE, &index, NULL );
+ ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
+
WsFreeReader( reader );
}
--
2.20.1
More information about the wine-devel
mailing list