Hans Leidekker : webservices: Implement WsGetPrefixFromNamespace.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 23 11:24:21 CST 2016
Module: wine
Branch: master
Commit: 2a4063cd86ea196b0e4b8cc8d6e7686331e72f88
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2a4063cd86ea196b0e4b8cc8d6e7686331e72f88
Author: Hans Leidekker <hans at codeweavers.com>
Date: Tue Feb 23 13:11:52 2016 +0100
webservices: Implement WsGetPrefixFromNamespace.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/webservices/tests/writer.c | 93 +++++++++++++++++++++++++++++++++++++++
dlls/webservices/webservices.spec | 2 +-
dlls/webservices/writer.c | 31 +++++++++++++
include/webservices.h | 2 +
4 files changed, 127 insertions(+), 1 deletion(-)
diff --git a/dlls/webservices/tests/writer.c b/dlls/webservices/tests/writer.c
index 0e67eaf..446fa1d 100644
--- a/dlls/webservices/tests/writer.c
+++ b/dlls/webservices/tests/writer.c
@@ -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();
}
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index 3b0f1fc..f0a843a 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -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)
diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c
index f55f644..14bddfb 100644
--- a/dlls/webservices/writer.c
+++ b/dlls/webservices/writer.c
@@ -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;
diff --git a/include/webservices.h b/include/webservices.h
index 73b7f0a..cd82cb7 100644
--- a/include/webservices.h
+++ b/include/webservices.h
@@ -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*);
More information about the wine-cvs
mailing list