Hans Leidekker : webservices: Add support for GUID records in the writer.

Alexandre Julliard julliard at winehq.org
Wed Jul 12 15:37:25 CDT 2017


Module: wine
Branch: master
Commit: b85e6800d011a5a2203fea4dfd105ba6e0366555
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b85e6800d011a5a2203fea4dfd105ba6e0366555

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Jul 12 15:34:35 2017 +0200

webservices: Add support for GUID records in the writer.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/webservices/reader.c              | 15 +++++++++------
 dlls/webservices/webservices_private.h |  8 ++++----
 dlls/webservices/writer.c              | 33 ++++++++++++++++++++++++++-------
 3 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 4aacaf7..63de1ad 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -1541,7 +1541,7 @@ static HRESULT read_attribute_value_bin( struct reader *reader, WS_XML_ATTRIBUTE
         if (!(text_utf8 = alloc_utf8_text( str->bytes, str->length ))) return E_OUTOFMEMORY;
         break;
 
-    case RECORD_UNIQUEID_TEXT:
+    case RECORD_UNIQUE_ID_TEXT:
     {
         WS_XML_UNIQUE_ID_TEXT *text_unique_id;
         if ((hr = read_bytes( reader, (unsigned char *)&guid, sizeof(guid) )) != S_OK) return hr;
@@ -1549,7 +1549,7 @@ static HRESULT read_attribute_value_bin( struct reader *reader, WS_XML_ATTRIBUTE
         attr->value = &text_unique_id->text;
         return S_OK;
     }
-    case RECORD_UUID_TEXT:
+    case RECORD_GUID_TEXT:
     {
         WS_XML_GUID_TEXT *guid_text;
         if ((hr = read_bytes( reader, (unsigned char *)&guid, sizeof(guid) )) != S_OK) return hr;
@@ -2446,14 +2446,14 @@ static HRESULT read_text_bin( struct reader *reader )
         if (!(node = alloc_utf8_text_node( str->bytes, str->length, NULL ))) return E_OUTOFMEMORY;
         break;
     }
-    case RECORD_UNIQUEID_TEXT:
-    case RECORD_UNIQUEID_TEXT_WITH_ENDELEMENT:
+    case RECORD_UNIQUE_ID_TEXT:
+    case RECORD_UNIQUE_ID_TEXT_WITH_ENDELEMENT:
         if ((hr = read_bytes( reader, (unsigned char *)&uuid, sizeof(uuid) )) != S_OK) return hr;
         if (!(node = alloc_unique_id_text_node( &uuid ))) return E_OUTOFMEMORY;
         break;
 
-    case RECORD_UUID_TEXT:
-    case RECORD_UUID_TEXT_WITH_ENDELEMENT:
+    case RECORD_GUID_TEXT:
+    case RECORD_GUID_TEXT_WITH_ENDELEMENT:
         if ((hr = read_bytes( reader, (unsigned char *)&uuid, sizeof(uuid) )) != S_OK) return hr;
         if (!(node = alloc_guid_text_node( &uuid ))) return E_OUTOFMEMORY;
         break;
@@ -5857,6 +5857,9 @@ ULONG get_type_size( WS_TYPE type, const void *desc )
     case WS_GUID_TYPE:
         return sizeof(GUID);
 
+    case WS_UNIQUE_ID_TYPE:
+        return sizeof(WS_UNIQUE_ID);
+
     case WS_STRING_TYPE:
         return sizeof(WS_STRING);
 
diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h
index ddaf59e..b88a50c 100644
--- a/dlls/webservices/webservices_private.h
+++ b/dlls/webservices/webservices_private.h
@@ -317,12 +317,12 @@ enum record_type
     RECORD_EMPTY_TEXT_WITH_ENDELEMENT            = 0xa9,
     RECORD_DICTIONARY_TEXT                       = 0xaa,
     RECORD_DICTIONARY_TEXT_WITH_ENDELEMENT       = 0xab,
-    RECORD_UNIQUEID_TEXT                         = 0xac,
-    RECORD_UNIQUEID_TEXT_WITH_ENDELEMENT         = 0xad,
+    RECORD_UNIQUE_ID_TEXT                        = 0xac,
+    RECORD_UNIQUE_ID_TEXT_WITH_ENDELEMENT        = 0xad,
     RECORD_TIMESPAN_TEXT                         = 0xae,
     RECORD_TIMESPAN_TEXT_WITH_ENDELEMENT         = 0xaf,
-    RECORD_UUID_TEXT                             = 0xb0,
-    RECORD_UUID_TEXT_WITH_ENDELEMENT             = 0xb1,
+    RECORD_GUID_TEXT                             = 0xb0,
+    RECORD_GUID_TEXT_WITH_ENDELEMENT             = 0xb1,
     RECORD_UINT64_TEXT                           = 0xb2,
     RECORD_UINT64_TEXT_WITH_ENDELEMENT           = 0xb3,
     RECORD_BOOL_TEXT                             = 0xb4,
diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c
index 78afa4a..e3b9214 100644
--- a/dlls/webservices/writer.c
+++ b/dlls/webservices/writer.c
@@ -716,6 +716,9 @@ static enum record_type get_attr_text_record_type( const WS_XML_TEXT *text )
         if (text_double->value <= MAX_INT32) return RECORD_INT32_TEXT;
         return RECORD_INT64_TEXT;
     }
+    case WS_XML_TEXT_TYPE_GUID:
+        return RECORD_GUID_TEXT;
+
     default:
         FIXME( "unhandled text type %u\n", text->textType );
         return 0;
@@ -851,8 +854,15 @@ static HRESULT write_attribute_value_bin( struct writer *writer, const WS_XML_TE
         write_bytes( writer, (const BYTE *)&text_double->value, sizeof(text_double->value) );
         return S_OK;
     }
+    case RECORD_GUID_TEXT:
+    {
+        WS_XML_GUID_TEXT *text_guid = (WS_XML_GUID_TEXT *)text;
+        if ((hr = write_grow_buffer( writer, sizeof(text_guid->value) )) != S_OK) return hr;
+        write_bytes( writer, (const BYTE *)&text_guid->value, sizeof(text_guid->value) );
+        return S_OK;
+    }
     default:
-        ERR( "unhandled record type %02x\n", type );
+        FIXME( "unhandled record type %02x\n", type );
         return E_NOTIMPL;
     }
 }
@@ -2481,6 +2491,9 @@ static enum record_type get_text_record_type( const WS_XML_TEXT *text )
         if (text_double->value <= MAX_INT32) return RECORD_INT32_TEXT_WITH_ENDELEMENT;
         return RECORD_INT64_TEXT_WITH_ENDELEMENT;
     }
+    case WS_XML_TEXT_TYPE_GUID:
+        return RECORD_GUID_TEXT_WITH_ENDELEMENT;
+
     default:
         FIXME( "unhandled text type %u\n", text->textType );
         return 0;
@@ -2621,6 +2634,14 @@ static HRESULT write_text_bin( struct writer *writer, const WS_XML_TEXT *text, U
         write_bytes( writer, (const BYTE *)&text_double->value, sizeof(text_double->value) );
         return S_OK;
     }
+    case RECORD_GUID_TEXT_WITH_ENDELEMENT:
+    {
+        WS_XML_GUID_TEXT *text_guid = (WS_XML_GUID_TEXT *)text;
+        if ((hr = write_grow_buffer( writer, 1 + sizeof(text_guid->value) )) != S_OK) return hr;
+        write_char( writer, type );
+        write_bytes( writer, (const BYTE *)&text_guid->value, sizeof(text_guid->value) );
+        return S_OK;
+    }
     default:
         FIXME( "unhandled record type %02x\n", type );
         return E_NOTIMPL;
@@ -3160,8 +3181,7 @@ static HRESULT write_type_guid( struct writer *writer, WS_TYPE_MAPPING mapping,
                                 const WS_GUID_DESCRIPTION *desc, WS_WRITE_OPTION option,
                                 const void *value, ULONG size )
 {
-    WS_XML_UTF8_TEXT utf8;
-    unsigned char buf[37]; /* "00000000-0000-0000-0000-000000000000" */
+    WS_XML_GUID_TEXT text_guid;
     const GUID *ptr;
     HRESULT hr;
 
@@ -3175,10 +3195,9 @@ static HRESULT write_type_guid( struct writer *writer, WS_TYPE_MAPPING mapping,
     if ((hr = get_value_ptr( option, value, size, sizeof(GUID), (const void **)&ptr )) != S_OK) return hr;
     if (option == WS_WRITE_NILLABLE_POINTER && !ptr) return write_add_nil_attribute( writer );
 
-    utf8.text.textType = WS_XML_TEXT_TYPE_UTF8;
-    utf8.value.bytes   = buf;
-    utf8.value.length  = format_guid( ptr, buf );
-    return write_type_text( writer, mapping, &utf8.text );
+    text_guid.text.textType = WS_XML_TEXT_TYPE_GUID;
+    text_guid.value         = *ptr;
+    return write_type_text( writer, mapping, &text_guid.text );
 }
 
 static HRESULT write_type_unique_id( struct writer *writer, WS_TYPE_MAPPING mapping,




More information about the wine-cvs mailing list