Signed-off-by: Hans Leidekker hans@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 ); }