webservices: Accept empty namespace in attribute type mapping.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Hans Leidekker 2020-03-27 15:47:39 +01:00 committed by Alexandre Julliard
parent 9d530346cc
commit 6d5eef9c94
2 changed files with 46 additions and 4 deletions

View File

@ -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:

View File

@ -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 );
}