webservices: Implement WsGetPrefixFromNamespace.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2016-02-23 13:11:52 +01:00 committed by Alexandre Julliard
parent 21d9e5181d
commit 2a4063cd86
4 changed files with 127 additions and 1 deletions

View File

@ -1211,6 +1211,98 @@ static void test_WsWriteXmlnsAttribute(void)
WsFreeWriter( writer );
}
static void prepare_prefix_test( WS_XML_WRITER *writer )
{
const WS_XML_STRING p = {1, (BYTE *)"p"}, localname = {1, (BYTE *)"t"}, ns = {2, (BYTE *)"ns"};
HRESULT hr;
hr = set_output( writer );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteStartElement( writer, &p, &localname, &ns, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteEndStartElement( writer, NULL );
ok( hr == S_OK, "got %08x\n", hr );
}
static void test_WsGetPrefixFromNamespace(void)
{
const WS_XML_STRING p = {1, (BYTE *)"p"}, localname = {1, (BYTE *)"t"}, *prefix;
const WS_XML_STRING ns = {2, (BYTE *)"ns"}, ns2 = {3, (BYTE *)"ns2"};
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, &p, &localname, &ns, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsGetPrefixFromNamespace( NULL, NULL, FALSE, NULL, NULL );
ok( hr == E_INVALIDARG, "got %08x\n", hr );
hr = WsGetPrefixFromNamespace( NULL, NULL, FALSE, &prefix, NULL );
ok( hr == E_INVALIDARG, "got %08x\n", hr );
hr = WsGetPrefixFromNamespace( writer, NULL, FALSE, &prefix, NULL );
ok( hr == E_INVALIDARG, "got %08x\n", hr );
/* element must be committed */
hr = set_output( writer );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteStartElement( writer, &p, &localname, &ns, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsGetPrefixFromNamespace( writer, &ns, TRUE, &prefix, NULL );
ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
/* but writer can't be positioned on end element node */
hr = set_output( writer );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteStartElement( writer, &p, &localname, &ns, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsWriteEndElement( writer, NULL );
ok( hr == S_OK, "got %08x\n", hr );
hr = WsGetPrefixFromNamespace( writer, &ns, TRUE, &prefix, NULL );
ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
/* required = TRUE */
prefix = NULL;
prepare_prefix_test( writer );
hr = WsGetPrefixFromNamespace( writer, &ns, TRUE, &prefix, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( prefix != NULL, "prefix not set\n" );
if (prefix)
{
ok( prefix->length == 1, "got %u\n", prefix->length );
ok( !memcmp( prefix->bytes, "p", 1 ), "wrong prefix\n" );
}
prefix = (const WS_XML_STRING *)0xdeadbeef;
hr = WsGetPrefixFromNamespace( writer, &ns2, TRUE, &prefix, NULL );
ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
ok( prefix == (const WS_XML_STRING *)0xdeadbeef, "prefix set\n" );
/* required = FALSE */
prefix = NULL;
prepare_prefix_test( writer );
hr = WsGetPrefixFromNamespace( writer, &ns, FALSE, &prefix, NULL );
ok( hr == S_OK, "got %08x\n", hr );
ok( prefix != NULL, "prefix not set\n" );
if (prefix)
{
ok( prefix->length == 1, "got %u\n", prefix->length );
ok( !memcmp( prefix->bytes, "p", 1 ), "wrong prefix\n" );
}
prefix = (const WS_XML_STRING *)0xdeadbeef;
hr = WsGetPrefixFromNamespace( writer, &ns2, FALSE, &prefix, NULL );
ok( hr == S_FALSE, "got %08x\n", hr );
ok( prefix == NULL, "prefix not set\n" );
WsFreeWriter( writer );
}
START_TEST(writer)
{
test_WsCreateWriter();
@ -1227,4 +1319,5 @@ START_TEST(writer)
test_WsWriteAttribute();
test_WsWriteStartCData();
test_WsWriteXmlnsAttribute();
test_WsGetPrefixFromNamespace();
}

View File

@ -79,7 +79,7 @@
@ stub WsGetOperationContextProperty
@ stub WsGetPolicyAlternativeCount
@ stub WsGetPolicyProperty
@ stub WsGetPrefixFromNamespace
@ stdcall WsGetPrefixFromNamespace(ptr ptr long ptr ptr)
@ stdcall WsGetReaderNode(ptr ptr ptr)
@ stub WsGetReaderPosition
@ stdcall WsGetReaderProperty(ptr long ptr long ptr)

View File

@ -493,6 +493,37 @@ static inline BOOL is_current_namespace( struct writer *writer, const WS_XML_STR
return (WsXmlStringEquals( writer->current_ns, ns, NULL ) == S_OK);
}
/**************************************************************************
* WsGetPrefixFromNamespace [webservices.@]
*/
HRESULT WINAPI WsGetPrefixFromNamespace( WS_XML_WRITER *handle, const WS_XML_STRING *ns,
BOOL required, const WS_XML_STRING **prefix,
WS_ERROR *error )
{
struct writer *writer = (struct writer *)handle;
WS_XML_ELEMENT_NODE *elem;
BOOL found = FALSE;
TRACE( "%p %s %d %p %p\n", handle, debugstr_xmlstr(ns), required, prefix, error );
if (error) FIXME( "ignoring error parameter\n" );
if (!writer || !ns || !prefix) return E_INVALIDARG;
elem = &writer->current->hdr;
if (elem->prefix && is_current_namespace( writer, ns ))
{
*prefix = elem->prefix;
found = TRUE;
}
if (!found)
{
if (required) return WS_E_INVALID_FORMAT;
*prefix = NULL;
return S_FALSE;
}
return S_OK;
}
static HRESULT set_current_namespace( struct writer *writer, const WS_XML_STRING *ns )
{
WS_XML_STRING *str;

View File

@ -556,6 +556,8 @@ void WINAPI WsFreeWriter(WS_XML_WRITER*);
HRESULT WINAPI WsGetErrorProperty(WS_ERROR*, WS_ERROR_PROPERTY_ID, void*, ULONG);
HRESULT WINAPI WsGetErrorString(WS_ERROR*, ULONG, WS_STRING*);
HRESULT WINAPI WsGetHeapProperty(WS_HEAP*, WS_HEAP_PROPERTY_ID, void*, ULONG, WS_ERROR*);
HRESULT WINAPI WsGetPrefixFromNamespace(WS_XML_WRITER*, const WS_XML_STRING*, BOOL,
const WS_XML_STRING**, WS_ERROR*);
HRESULT WINAPI WsGetReaderNode(WS_XML_READER*, const WS_XML_NODE**, WS_ERROR*);
HRESULT WINAPI WsGetReaderPosition(WS_XML_READER*, WS_XML_NODE_POSITION*, WS_ERROR*);
HRESULT WINAPI WsGetReaderProperty(WS_XML_READER*, WS_XML_READER_PROPERTY_ID, void*, ULONG, WS_ERROR*);