[05/10] webservices: Add a mechanism to use the builtin static dictionary in the writer.

Hans Leidekker hans at codeweavers.com
Wed Sep 6 08:56:09 CDT 2017


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/msg.c                 |  2 +-
 dlls/webservices/reader.c              | 20 +++++++++---------
 dlls/webservices/string.c              |  7 ++++++-
 dlls/webservices/webservices_private.h |  3 ++-
 dlls/webservices/writer.c              | 38 ++++++++++++++++++++++++++--------
 5 files changed, 48 insertions(+), 22 deletions(-)

diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c
index 37ce3a3..7b7b526 100644
--- a/dlls/webservices/msg.c
+++ b/dlls/webservices/msg.c
@@ -1833,7 +1833,7 @@ HRESULT message_set_action( WS_MESSAGE *handle, const WS_XML_STRING *action )
     else
     {
         WS_XML_STRING *str;
-        if (!(str = dup_xml_string( action ))) hr = E_OUTOFMEMORY;
+        if (!(str = dup_xml_string( action, FALSE ))) hr = E_OUTOFMEMORY;
         else
         {
             free_xml_string( msg->action );
diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 50431bf..798e5f7 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -156,9 +156,9 @@ static WS_XML_ATTRIBUTE *dup_attribute( const WS_XML_ATTRIBUTE *src )
     dst->isXmlNs     = src->isXmlNs;
 
     if (!prefix) dst->prefix = NULL;
-    else if (!(dst->prefix = dup_xml_string( prefix ))) goto error;
-    if (!(dst->localName = dup_xml_string( localname ))) goto error;
-    if (!(dst->ns = dup_xml_string( ns ))) goto error;
+    else if (!(dst->prefix = dup_xml_string( prefix, FALSE ))) goto error;
+    if (!(dst->localName = dup_xml_string( localname, FALSE ))) goto error;
+    if (!(dst->ns = dup_xml_string( ns, FALSE ))) goto error;
 
     if (text)
     {
@@ -209,9 +209,9 @@ static struct node *dup_element_node( const WS_XML_ELEMENT_NODE *src )
     if (count && !(dst->attributes = dup_attributes( attrs, count ))) goto error;
     dst->attributeCount = count;
 
-    if (prefix && !(dst->prefix = dup_xml_string( prefix ))) goto error;
-    if (localname && !(dst->localName = dup_xml_string( localname ))) goto error;
-    if (ns && !(dst->ns = dup_xml_string( ns ))) goto error;
+    if (prefix && !(dst->prefix = dup_xml_string( prefix, FALSE ))) goto error;
+    if (localname && !(dst->localName = dup_xml_string( localname, FALSE ))) goto error;
+    if (ns && !(dst->ns = dup_xml_string( ns, FALSE ))) goto error;
     return node;
 
 error:
@@ -420,10 +420,10 @@ static HRESULT set_prefix( struct prefix *prefix, const WS_XML_STRING *str, cons
     if (str)
     {
         free_xml_string( prefix->str );
-        if (!(prefix->str = dup_xml_string( str ))) return E_OUTOFMEMORY;
+        if (!(prefix->str = dup_xml_string( str, FALSE ))) return E_OUTOFMEMORY;
     }
     if (prefix->ns) free_xml_string( prefix->ns );
-    if (!(prefix->ns = dup_xml_string( ns ))) return E_OUTOFMEMORY;
+    if (!(prefix->ns = dup_xml_string( ns, FALSE ))) return E_OUTOFMEMORY;
     return S_OK;
 }
 
@@ -1113,7 +1113,7 @@ static HRESULT parse_qname( const BYTE *str, ULONG len, WS_XML_STRING **prefix_r
 
     if ((hr = split_qname( str, len, &prefix, &localname )) != S_OK) return hr;
     if (!(*prefix_ret = alloc_xml_string( NULL, prefix.length ))) return E_OUTOFMEMORY;
-    if (!(*localname_ret = dup_xml_string( &localname )))
+    if (!(*localname_ret = dup_xml_string( &localname, FALSE )))
     {
         free_xml_string( *prefix_ret );
         return E_OUTOFMEMORY;
@@ -1821,7 +1821,7 @@ static HRESULT set_namespaces( struct reader *reader, WS_XML_ELEMENT_NODE *elem
     ULONG i;
 
     if (!(ns = get_namespace( reader, elem->prefix ))) return WS_E_INVALID_FORMAT;
-    if (!(elem->ns = dup_xml_string( ns ))) return E_OUTOFMEMORY;
+    if (!(elem->ns = dup_xml_string( ns, FALSE ))) return E_OUTOFMEMORY;
 
     for (i = 0; i < elem->attributeCount; i++)
     {
diff --git a/dlls/webservices/string.c b/dlls/webservices/string.c
index 174d494..00d0a13 100644
--- a/dlls/webservices/string.c
+++ b/dlls/webservices/string.c
@@ -210,7 +210,7 @@ void free_xml_string( WS_XML_STRING *str )
     heap_free( str );
 }
 
-WS_XML_STRING *dup_xml_string( const WS_XML_STRING *src )
+WS_XML_STRING *dup_xml_string( const WS_XML_STRING *src, BOOL use_static_dict )
 {
     WS_XML_STRING *ret;
     unsigned char *data;
@@ -224,6 +224,11 @@ WS_XML_STRING *dup_xml_string( const WS_XML_STRING *src )
         *ret = *src;
         return ret;
     }
+    if (use_static_dict && (index = find_string( &dict_builtin_static, src->bytes, src->length, &id )) == -1)
+    {
+        *ret = dict_builtin_static.dict.strings[id];
+        return ret;
+    }
     EnterCriticalSection( &dict_cs );
     if ((index = find_string( &dict_builtin, src->bytes, src->length, &id )) == -1)
     {
diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h
index 958733c..da03213 100644
--- a/dlls/webservices/webservices_private.h
+++ b/dlls/webservices/webservices_private.h
@@ -51,10 +51,11 @@ int find_string( const struct dictionary *, const unsigned char *, ULONG, ULONG
 HRESULT insert_string( struct dictionary *, unsigned char *, ULONG, int, ULONG * ) DECLSPEC_HIDDEN;
 HRESULT CALLBACK insert_string_cb( void *, const WS_XML_STRING *, BOOL *, ULONG *, WS_ERROR * ) DECLSPEC_HIDDEN;
 void clear_dict( struct dictionary * ) DECLSPEC_HIDDEN;
+HRESULT writer_enable_lookup( WS_XML_WRITER * ) DECLSPEC_HIDDEN;
 
 const char *debugstr_xmlstr( const WS_XML_STRING * ) DECLSPEC_HIDDEN;
 WS_XML_STRING *alloc_xml_string( const unsigned char *, ULONG ) DECLSPEC_HIDDEN;
-WS_XML_STRING *dup_xml_string( const WS_XML_STRING * ) DECLSPEC_HIDDEN;
+WS_XML_STRING *dup_xml_string( const WS_XML_STRING *, BOOL ) DECLSPEC_HIDDEN;
 HRESULT add_xml_string( WS_XML_STRING * ) DECLSPEC_HIDDEN;
 void free_xml_string( WS_XML_STRING * ) DECLSPEC_HIDDEN;
 HRESULT append_attribute( WS_XML_ELEMENT_NODE *, WS_XML_ATTRIBUTE * ) DECLSPEC_HIDDEN;
diff --git a/dlls/webservices/writer.c b/dlls/webservices/writer.c
index 7216fc1..4eba2db 100644
--- a/dlls/webservices/writer.c
+++ b/dlls/webservices/writer.c
@@ -86,6 +86,7 @@ struct writer
     struct xmlbuf               *output_buf;
     WS_HEAP                     *output_heap;
     const WS_XML_DICTIONARY     *dict;
+    BOOL                         dict_do_lookup;
     WS_DYNAMIC_STRING_CALLBACK   dict_cb;
     void                        *dict_cb_state;
     ULONG                        prop_count;
@@ -171,6 +172,7 @@ static HRESULT init_writer( struct writer *writer )
     writer->output_enc     = WS_XML_WRITER_ENCODING_TYPE_TEXT;
     writer->output_charset = WS_CHARSET_UTF8;
     writer->dict           = NULL;
+    writer->dict_do_lookup = FALSE;
     writer->dict_cb        = NULL;
     writer->dict_cb_state  = NULL;
     return S_OK;
@@ -1131,12 +1133,12 @@ static HRESULT add_namespace_attribute( struct writer *writer, const WS_XML_STRI
 
     attr->singleQuote = !!single;
     attr->isXmlNs = 1;
-    if (prefix && !(attr->prefix = dup_xml_string( prefix )))
+    if (prefix && !(attr->prefix = dup_xml_string( prefix, writer->dict_do_lookup )))
     {
         free_attribute( attr );
         return E_OUTOFMEMORY;
     }
-    if (!(attr->ns = dup_xml_string( ns )))
+    if (!(attr->ns = dup_xml_string( ns, writer->dict_do_lookup )))
     {
         free_attribute( attr );
         return E_OUTOFMEMORY;
@@ -1179,7 +1181,7 @@ static BOOL namespace_in_scope( const WS_XML_ELEMENT_NODE *elem, const WS_XML_ST
 static HRESULT set_current_namespace( struct writer *writer, const WS_XML_STRING *ns )
 {
     WS_XML_STRING *str;
-    if (!(str = dup_xml_string( ns ))) return E_OUTOFMEMORY;
+    if (!(str = dup_xml_string( ns, writer->dict_do_lookup ))) return E_OUTOFMEMORY;
     free_xml_string( writer->current_ns );
     writer->current_ns = str;
     return S_OK;
@@ -1545,17 +1547,17 @@ static HRESULT write_add_attribute( struct writer *writer, const WS_XML_STRING *
     if (!prefix && ns->length) prefix = elem->prefix;
 
     attr->singleQuote = !!single;
-    if (prefix && !(attr->prefix = dup_xml_string( prefix )))
+    if (prefix && !(attr->prefix = dup_xml_string( prefix, writer->dict_do_lookup )))
     {
         free_attribute( attr );
         return E_OUTOFMEMORY;
     }
-    if (!(attr->localName = dup_xml_string( localname )))
+    if (!(attr->localName = dup_xml_string( localname, writer->dict_do_lookup )))
     {
         free_attribute( attr );
         return E_OUTOFMEMORY;
     }
-    if (!(attr->ns = dup_xml_string( ns )))
+    if (!(attr->ns = dup_xml_string( ns, writer->dict_do_lookup )))
     {
         free_attribute( attr );
         return E_OUTOFMEMORY;
@@ -1750,17 +1752,17 @@ static HRESULT write_add_element_node( struct writer *writer, const WS_XML_STRIN
     if (!(node = alloc_node( WS_XML_NODE_TYPE_ELEMENT ))) return E_OUTOFMEMORY;
     elem = &node->hdr;
 
-    if (prefix && !(elem->prefix = dup_xml_string( prefix )))
+    if (prefix && !(elem->prefix = dup_xml_string( prefix, writer->dict_do_lookup )))
     {
         free_node( node );
         return E_OUTOFMEMORY;
     }
-    if (!(elem->localName = dup_xml_string( localname )))
+    if (!(elem->localName = dup_xml_string( localname, writer->dict_do_lookup )))
     {
         free_node( node );
         return E_OUTOFMEMORY;
     }
-    if (!(elem->ns = dup_xml_string( ns )))
+    if (!(elem->ns = dup_xml_string( ns, writer->dict_do_lookup )))
     {
         free_node( node );
         return E_OUTOFMEMORY;
@@ -4730,3 +4732,21 @@ done:
     LeaveCriticalSection( &writer->cs );
     return hr;
 }
+
+HRESULT writer_enable_lookup( WS_XML_WRITER *handle )
+{
+    struct writer *writer = (struct writer *)handle;
+
+    EnterCriticalSection( &writer->cs );
+
+    if (writer->magic != WRITER_MAGIC)
+    {
+        LeaveCriticalSection( &writer->cs );
+        return E_INVALIDARG;
+    }
+
+    writer->dict_do_lookup = TRUE;
+
+    LeaveCriticalSection( &writer->cs );
+    return S_OK;
+}
-- 
2.1.4




More information about the wine-patches mailing list