[3/6] webservices: Implement WsWriteValue.

Hans Leidekker hans at codeweavers.com
Fri Jan 29 06:27:27 CST 2016


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/tests/writer.c   | 107 ++++++++++++++++++++++++++++++++++++++
 dlls/webservices/webservices.spec |   2 +-
 dlls/webservices/writer.c         |  57 ++++++++++++++++++++
 3 files changed, 165 insertions(+), 1 deletion(-)

diff --git a/dlls/webservices/tests/writer.c b/dlls/webservices/tests/writer.c
index 37f62c6..252ac2c 100644
--- a/dlls/webservices/tests/writer.c
+++ b/dlls/webservices/tests/writer.c
@@ -800,6 +800,112 @@ static void test_WsWriteElement(void)
     WsFreeWriter( writer );
 }
 
+static void test_WsWriteValue(void)
+{
+    HRESULT hr;
+    WS_XML_WRITER *writer;
+    WS_XML_STRING localname = {1, (BYTE *)"t"}, ns = {0, NULL};
+    ULONG i;
+    static const struct
+    {
+        WS_VALUE_TYPE type;
+        INT64         val;
+        ULONG         size;
+        const char   *result;
+        const char   *result2;
+    }
+    tests[] =
+    {
+        { WS_BOOL_VALUE_TYPE, ~0, sizeof(BOOL), "<t>true</t>", "<t t=\"true\"/>" },
+        { WS_BOOL_VALUE_TYPE, FALSE, sizeof(BOOL), "<t>false</t>", "<t t=\"false\"/>" },
+        { WS_INT8_VALUE_TYPE, -128, sizeof(INT8), "<t>-128</t>", "<t t=\"-128\"/>" },
+        { WS_INT16_VALUE_TYPE, -32768, sizeof(INT16), "<t>-32768</t>", "<t t=\"-32768\"/>" },
+        { WS_INT32_VALUE_TYPE, -2147483647 - 1, sizeof(INT32), "<t>-2147483648</t>",
+          "<t t=\"-2147483648\"/>" },
+        { WS_INT64_VALUE_TYPE, -9223372036854775807 - 1, sizeof(INT64), "<t>-9223372036854775808</t>",
+          "<t t=\"-9223372036854775808\"/>" },
+        { WS_UINT8_VALUE_TYPE, 255, sizeof(UINT8), "<t>255</t>", "<t t=\"255\"/>" },
+        { WS_UINT16_VALUE_TYPE, 65535, sizeof(UINT16), "<t>65535</t>", "<t t=\"65535\"/>" },
+        { WS_UINT32_VALUE_TYPE, ~0u, sizeof(UINT32), "<t>4294967295</t>", "<t t=\"4294967295\"/>" },
+        { WS_UINT64_VALUE_TYPE, ~0, sizeof(UINT64), "<t>18446744073709551615</t>",
+          "<t t=\"18446744073709551615\"/>" },
+    };
+
+    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 = WsWriteValue( NULL, tests[0].type, &tests[0].val, tests[0].size, NULL );
+    ok( hr == E_INVALIDARG, "got %08x\n", hr );
+
+    hr = WsWriteValue( writer, tests[0].type, &tests[0].val, tests[0].size, NULL );
+    ok( hr == WS_E_INVALID_FORMAT, "got %08x\n", hr );
+
+    hr = set_output( writer );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsWriteStartElement( writer, NULL, &localname, &ns, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    /* zero size */
+    hr = WsWriteValue( writer, tests[0].type, &tests[0].val, 0, NULL );
+    ok( hr == E_INVALIDARG, "got %08x\n", hr );
+
+    hr = set_output( writer );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = WsWriteStartElement( writer, NULL, &localname, &ns, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    /* NULL value */
+    hr = WsWriteValue( writer, tests[0].type, NULL, 0, NULL );
+    ok( hr == E_INVALIDARG, "got %08x\n", hr );
+
+    /* element type mapping */
+    for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+    {
+        hr = set_output( writer );
+        ok( hr == S_OK, "got %08x\n", hr );
+
+        hr = WsWriteStartElement( writer, NULL, &localname, &ns, NULL );
+        ok( hr == S_OK, "got %08x\n", hr );
+
+        hr = WsWriteValue( writer, tests[i].type, &tests[i].val, tests[i].size, NULL );
+        ok( hr == S_OK, "%u: got %08x\n", i, hr );
+
+        hr = WsWriteEndElement( writer, NULL );
+        ok( hr == S_OK, "got %08x\n", hr );
+        check_output( writer, tests[i].result, __LINE__ );
+    }
+
+    /* attribute type mapping */
+    for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+    {
+        hr = set_output( writer );
+        ok( hr == S_OK, "got %08x\n", hr );
+
+        hr = WsWriteStartElement( writer, NULL, &localname, &ns, NULL );
+        ok( hr == S_OK, "got %08x\n", hr );
+
+        hr = WsWriteStartAttribute( writer, NULL, &localname, &ns, FALSE, NULL );
+        ok( hr == S_OK, "got %08x\n", hr );
+
+        hr = WsWriteValue( writer, tests[i].type, &tests[i].val, tests[i].size, NULL );
+        ok( hr == S_OK, "%u: got %08x\n", i, 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, tests[i].result2, __LINE__ );
+    }
+
+    WsFreeWriter( writer );
+}
+
 START_TEST(writer)
 {
     test_WsCreateWriter();
@@ -810,6 +916,7 @@ START_TEST(writer)
     test_WsWriteStartAttribute();
     test_WsWriteType();
     test_WsWriteElement();
+    test_WsWriteValue();
     test_basic_type();
     test_simple_struct_type();
 }
diff --git a/dlls/webservices/webservices.spec b/dlls/webservices/webservices.spec
index a6656ab..4bda968 100644
--- a/dlls/webservices/webservices.spec
+++ b/dlls/webservices/webservices.spec
@@ -186,7 +186,7 @@
 @ stdcall WsWriteStartElement(ptr ptr ptr ptr ptr)
 @ stdcall WsWriteText(ptr ptr ptr)
 @ stdcall WsWriteType(ptr long long ptr long ptr long ptr)
-@ stub WsWriteValue
+@ stdcall WsWriteValue(ptr long ptr long ptr)
 @ stdcall WsWriteXmlBuffer(ptr ptr ptr)
 @ stdcall WsWriteXmlBufferToBytes(ptr ptr ptr ptr long ptr ptr ptr ptr)
 @ stub WsWriteXmlnsAttribute
diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c
index 20a76de..05094cd 100644
--- a/dlls/webservices/writer.c
+++ b/dlls/webservices/writer.c
@@ -1414,6 +1414,63 @@ HRESULT WINAPI WsWriteType( WS_XML_WRITER *handle, WS_TYPE_MAPPING mapping, WS_T
     return hr;
 }
 
+static WS_TYPE map_value_type( WS_VALUE_TYPE type )
+{
+    switch (type)
+    {
+    case WS_BOOL_VALUE_TYPE:     return WS_BOOL_TYPE;
+    case WS_INT8_VALUE_TYPE:     return WS_INT8_TYPE;
+    case WS_INT16_VALUE_TYPE:    return WS_INT16_TYPE;
+    case WS_INT32_VALUE_TYPE:    return WS_INT32_TYPE;
+    case WS_INT64_VALUE_TYPE:    return WS_INT64_TYPE;
+    case WS_UINT8_VALUE_TYPE:    return WS_UINT8_TYPE;
+    case WS_UINT16_VALUE_TYPE:   return WS_UINT16_TYPE;
+    case WS_UINT32_VALUE_TYPE:   return WS_UINT32_TYPE;
+    case WS_UINT64_VALUE_TYPE:   return WS_UINT64_TYPE;
+    case WS_FLOAT_VALUE_TYPE:    return WS_FLOAT_TYPE;
+    case WS_DOUBLE_VALUE_TYPE:   return WS_DOUBLE_TYPE;
+    case WS_DECIMAL_VALUE_TYPE:  return WS_DECIMAL_TYPE;
+    case WS_DATETIME_VALUE_TYPE: return WS_DATETIME_TYPE;
+    case WS_TIMESPAN_VALUE_TYPE: return WS_TIMESPAN_TYPE;
+    case WS_GUID_VALUE_TYPE:     return WS_GUID_TYPE;
+    default:
+        FIXME( "unhandled type %u\n", type );
+        return ~0u;
+    }
+}
+
+/**************************************************************************
+ *          WsWriteValue		[webservices.@]
+ */
+HRESULT WINAPI WsWriteValue( WS_XML_WRITER *handle, WS_VALUE_TYPE value_type, const void *value,
+                             ULONG size, WS_ERROR *error )
+{
+    struct writer *writer = (struct writer *)handle;
+    WS_TYPE_MAPPING mapping;
+    WS_TYPE type;
+
+    TRACE( "%p %u %p %u %p\n", handle, value_type, value, size, error );
+    if (error) FIXME( "ignoring error parameter\n" );
+
+    if (!writer || !value || (type = map_value_type( value_type )) == ~0u) return E_INVALIDARG;
+
+    switch (writer->state)
+    {
+    case WRITER_STATE_STARTATTRIBUTE:
+        mapping = WS_ATTRIBUTE_TYPE_MAPPING;
+        break;
+
+    case WRITER_STATE_STARTELEMENT:
+        mapping = WS_ELEMENT_TYPE_MAPPING;
+        break;
+
+    default:
+        return WS_E_INVALID_FORMAT;
+    }
+
+    return write_type( writer, mapping, type, NULL, WS_WRITE_REQUIRED_VALUE, value, size );
+}
+
 /**************************************************************************
  *          WsWriteXmlBuffer		[webservices.@]
  */
-- 
2.7.0.rc3




More information about the wine-patches mailing list