Commit e091c1ec authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

webservices: Set namespace attributes for prefixes introduced by attributes.

parent 4331bb78
...@@ -3470,6 +3470,32 @@ static void test_binary_encoding(void) ...@@ -3470,6 +3470,32 @@ static void test_binary_encoding(void)
WsFreeWriter( writer ); WsFreeWriter( writer );
} }
static void test_namespaces(void)
{
WS_XML_STRING prefix = {1, (BYTE *)"p"}, prefix2 = {1, (BYTE *)"q"};
WS_XML_STRING localname = {1, (BYTE *)"t"}, localname2 = {1, (BYTE *)"a"};
WS_XML_STRING ns = {1, (BYTE *)"n"}, ns2 = {1, (BYTE *)"o"};
WS_XML_WRITER *writer;
HRESULT hr;
hr = WsCreateWriter( NULL, 0, &writer, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = set_output( writer );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteStartElement( writer, &prefix, &localname, &ns, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteStartAttribute( writer, &prefix2, &localname2, &ns2, FALSE, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteEndAttribute( writer, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteEndElement( writer, NULL );
ok( hr == S_OK, "got %08x\n", hr );
check_output( writer, "<p:t q:a=\"\" xmlns:p=\"n\" xmlns:q=\"o\"/>", __LINE__ );
WsFreeWriter( writer );
}
START_TEST(writer) START_TEST(writer)
{ {
test_WsCreateWriter(); test_WsCreateWriter();
...@@ -3508,4 +3534,5 @@ START_TEST(writer) ...@@ -3508,4 +3534,5 @@ START_TEST(writer)
test_WsWriteChars(); test_WsWriteChars();
test_WsWriteCharsUtf8(); test_WsWriteCharsUtf8();
test_binary_encoding(); test_binary_encoding();
test_namespaces();
} }
...@@ -615,15 +615,6 @@ HRESULT WINAPI WsGetPrefixFromNamespace( WS_XML_WRITER *handle, const WS_XML_STR ...@@ -615,15 +615,6 @@ HRESULT WINAPI WsGetPrefixFromNamespace( WS_XML_WRITER *handle, const WS_XML_STR
return hr; return hr;
} }
static HRESULT set_current_namespace( struct writer *writer, const WS_XML_STRING *ns )
{
WS_XML_STRING *str;
if (!(str = alloc_xml_string( ns->bytes, ns->length ))) return E_OUTOFMEMORY;
heap_free( writer->current_ns );
writer->current_ns = str;
return S_OK;
}
static HRESULT write_namespace_attribute_text( struct writer *writer, const WS_XML_ATTRIBUTE *attr ) static HRESULT write_namespace_attribute_text( struct writer *writer, const WS_XML_ATTRIBUTE *attr )
{ {
unsigned char quote = attr->singleQuote ? '\'' : '"'; unsigned char quote = attr->singleQuote ? '\'' : '"';
...@@ -747,8 +738,8 @@ static HRESULT write_namespace_attribute( struct writer *writer, const WS_XML_AT ...@@ -747,8 +738,8 @@ static HRESULT write_namespace_attribute( struct writer *writer, const WS_XML_AT
} }
} }
static HRESULT write_add_namespace_attribute( struct writer *writer, const WS_XML_STRING *prefix, static HRESULT add_namespace_attribute( struct writer *writer, const WS_XML_STRING *prefix,
const WS_XML_STRING *ns, BOOL single ) const WS_XML_STRING *ns, BOOL single )
{ {
WS_XML_ATTRIBUTE *attr; WS_XML_ATTRIBUTE *attr;
WS_XML_ELEMENT_NODE *elem = &writer->current->hdr; WS_XML_ELEMENT_NODE *elem = &writer->current->hdr;
...@@ -803,17 +794,35 @@ static BOOL namespace_in_scope( const WS_XML_ELEMENT_NODE *elem, const WS_XML_ST ...@@ -803,17 +794,35 @@ static BOOL namespace_in_scope( const WS_XML_ELEMENT_NODE *elem, const WS_XML_ST
return FALSE; return FALSE;
} }
static HRESULT write_set_element_namespace( struct writer *writer ) static HRESULT set_current_namespace( struct writer *writer, const WS_XML_STRING *ns )
{
WS_XML_STRING *str;
if (!(str = alloc_xml_string( ns->bytes, ns->length ))) return E_OUTOFMEMORY;
heap_free( writer->current_ns );
writer->current_ns = str;
return S_OK;
}
static HRESULT set_namespaces( struct writer *writer )
{ {
WS_XML_ELEMENT_NODE *elem = &writer->current->hdr; WS_XML_ELEMENT_NODE *elem = &writer->current->hdr;
HRESULT hr; HRESULT hr;
ULONG i;
if (!elem->ns->length || namespace_in_scope( elem, elem->prefix, elem->ns )) return S_OK; if (elem->ns->length && !namespace_in_scope( elem, elem->prefix, elem->ns ))
{
if ((hr = add_namespace_attribute( writer, elem->prefix, elem->ns, FALSE )) != S_OK) return hr;
if ((hr = set_current_namespace( writer, elem->ns )) != S_OK) return hr;
}
if ((hr = write_add_namespace_attribute( writer, elem->prefix, elem->ns, FALSE )) != S_OK) for (i = 0; i < elem->attributeCount; i++)
return hr; {
const WS_XML_ATTRIBUTE *attr = elem->attributes[i];
if (!attr->ns->length || namespace_in_scope( elem, attr->prefix, attr->ns )) continue;
if ((hr = add_namespace_attribute( writer, attr->prefix, attr->ns, FALSE )) != S_OK) return hr;
}
return set_current_namespace( writer, elem->ns ); return S_OK;
} }
/************************************************************************** /**************************************************************************
...@@ -1026,7 +1035,7 @@ static HRESULT write_endelement_node( struct writer *writer ) ...@@ -1026,7 +1035,7 @@ static HRESULT write_endelement_node( struct writer *writer )
if (!(node = write_find_startelement( writer ))) return WS_E_INVALID_FORMAT; if (!(node = write_find_startelement( writer ))) return WS_E_INVALID_FORMAT;
if (writer->state == WRITER_STATE_STARTELEMENT) if (writer->state == WRITER_STATE_STARTELEMENT)
{ {
if ((hr = write_set_element_namespace( writer )) != S_OK) return hr; if ((hr = set_namespaces( writer )) != S_OK) return hr;
if ((hr = write_startelement( writer )) != S_OK) return hr; if ((hr = write_startelement( writer )) != S_OK) return hr;
} }
if ((hr = write_close_element( writer, node )) != S_OK) return hr; if ((hr = write_close_element( writer, node )) != S_OK) return hr;
...@@ -1109,7 +1118,7 @@ HRESULT WINAPI WsWriteEndStartElement( WS_XML_WRITER *handle, WS_ERROR *error ) ...@@ -1109,7 +1118,7 @@ HRESULT WINAPI WsWriteEndStartElement( WS_XML_WRITER *handle, WS_ERROR *error )
return WS_E_INVALID_OPERATION; return WS_E_INVALID_OPERATION;
} }
if ((hr = write_set_element_namespace( writer )) != S_OK) goto done; if ((hr = set_namespaces( writer )) != S_OK) goto done;
if ((hr = write_startelement( writer )) != S_OK) goto done; if ((hr = write_startelement( writer )) != S_OK) goto done;
if ((hr = write_endstartelement( writer )) != S_OK) goto done; if ((hr = write_endstartelement( writer )) != S_OK) goto done;
writer->state = WRITER_STATE_ENDSTARTELEMENT; writer->state = WRITER_STATE_ENDSTARTELEMENT;
...@@ -1198,7 +1207,7 @@ static HRESULT write_flush( struct writer *writer ) ...@@ -1198,7 +1207,7 @@ static HRESULT write_flush( struct writer *writer )
if (writer->state == WRITER_STATE_STARTELEMENT) if (writer->state == WRITER_STATE_STARTELEMENT)
{ {
HRESULT hr; HRESULT hr;
if ((hr = write_set_element_namespace( writer )) != S_OK) return hr; if ((hr = set_namespaces( writer )) != S_OK) return hr;
if ((hr = write_startelement( writer )) != S_OK) return hr; if ((hr = write_startelement( writer )) != S_OK) return hr;
if ((hr = write_endstartelement( writer )) != S_OK) return hr; if ((hr = write_endstartelement( writer )) != S_OK) return hr;
writer->state = WRITER_STATE_ENDSTARTELEMENT; writer->state = WRITER_STATE_ENDSTARTELEMENT;
...@@ -2086,7 +2095,7 @@ static HRESULT write_add_nil_attribute( struct writer *writer ) ...@@ -2086,7 +2095,7 @@ static HRESULT write_add_nil_attribute( struct writer *writer )
if ((hr = write_add_attribute( writer, &prefix, &localname, &ns, FALSE )) != S_OK) return hr; if ((hr = write_add_attribute( writer, &prefix, &localname, &ns, FALSE )) != S_OK) return hr;
if ((hr = write_set_attribute_value( writer, &value.text )) != S_OK) return hr; if ((hr = write_set_attribute_value( writer, &value.text )) != S_OK) return hr;
return write_add_namespace_attribute( writer, &prefix, &ns, FALSE ); return add_namespace_attribute( writer, &prefix, &ns, FALSE );
} }
static HRESULT get_value_ptr( WS_WRITE_OPTION option, const void *value, ULONG size, ULONG expected_size, static HRESULT get_value_ptr( WS_WRITE_OPTION option, const void *value, ULONG size, ULONG expected_size,
...@@ -3124,7 +3133,7 @@ HRESULT WINAPI WsWriteXmlnsAttribute( WS_XML_WRITER *handle, const WS_XML_STRING ...@@ -3124,7 +3133,7 @@ HRESULT WINAPI WsWriteXmlnsAttribute( WS_XML_WRITER *handle, const WS_XML_STRING
} }
if (!namespace_in_scope( &writer->current->hdr, prefix, ns )) if (!namespace_in_scope( &writer->current->hdr, prefix, ns ))
hr = write_add_namespace_attribute( writer, prefix, ns, single ); hr = add_namespace_attribute( writer, prefix, ns, single );
LeaveCriticalSection( &writer->cs ); LeaveCriticalSection( &writer->cs );
return hr; return hr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment