Signed-off-by: Owen Rudge orudge@codeweavers.com --- dlls/wsdapi/soap.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-)
On Fri, Mar 23, 2018 at 10:04:47PM +0000, Owen Rudge wrote:
Signed-off-by: Owen Rudge orudge@codeweavers.com
dlls/wsdapi/soap.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-)
diff --git a/dlls/wsdapi/soap.c b/dlls/wsdapi/soap.c index 40edd15463..ba0484c274 100644 --- a/dlls/wsdapi/soap.c +++ b/dlls/wsdapi/soap.c @@ -130,9 +130,66 @@ static inline void free_xml_string(WS_XML_STRING *value) heap_free(value); }
+static BOOL write_xml_attribute(WSDXML_ATTRIBUTE *attribute, WS_XML_WRITER *writer) +{
- WS_XML_STRING *local_name = NULL, *element_ns = NULL, *ns_prefix = NULL;
- WS_XML_UTF16_TEXT utf16_text;
- BOOL retVal = FALSE;
- int text_len;
- HRESULT ret;
Usually if you've got two different 'return' variables then it's a good sign something can be improved. This is another case where the function could return HRESULT.
- if (attribute == NULL)
return TRUE;
- /* Start the attribute */
- local_name = populate_xml_string(attribute->Name->LocalName);
- if (local_name == NULL) goto cleanup;
- if (attribute->Name->Space == NULL)
- {
element_ns = populate_xml_string(emptyString);
if (element_ns == NULL) goto cleanup;
ns_prefix = NULL;
- }
- else
- {
element_ns = populate_xml_string(attribute->Name->Space->Uri);
if (element_ns == NULL) goto cleanup;
ns_prefix = populate_xml_string(attribute->Name->Space->PreferredPrefix);
if (ns_prefix == NULL) goto cleanup;
- }
- ret = WsWriteStartAttribute(writer, ns_prefix, local_name, element_ns, FALSE, NULL);
- if (FAILED(ret)) goto cleanup;
- text_len = lstrlenW(attribute->Value);
- utf16_text.text.textType = WS_XML_TEXT_TYPE_UTF16;
- utf16_text.bytes = (BYTE *)attribute->Value;
- utf16_text.byteCount = min(WSD_MAX_TEXT_LENGTH, text_len) * sizeof(WCHAR);
- ret = WsWriteText(writer, (WS_XML_TEXT *)&utf16_text, NULL);
- if (FAILED(ret)) goto cleanup;
- ret = WsWriteEndAttribute(writer, NULL);
- if (FAILED(ret)) goto cleanup;
- retVal = TRUE;
+cleanup:
- free_xml_string(local_name);
- free_xml_string(element_ns);
- free_xml_string(ns_prefix);
- return retVal;
+}
static BOOL write_xml_element(WSDXML_ELEMENT *element, WS_XML_WRITER *writer) { WS_XML_STRING *local_name = NULL, *element_ns = NULL, *ns_prefix = NULL;
- WSDXML_ATTRIBUTE *current_attribute; WS_XML_UTF16_TEXT utf16_text; WSDXML_NODE *current_child; WSDXML_TEXT *node_as_text;
@@ -156,7 +213,14 @@ static BOOL write_xml_element(WSDXML_ELEMENT *element, WS_XML_WRITER *writer) ret = WsWriteStartElement(writer, ns_prefix, local_name, element_ns, NULL); if (FAILED(ret)) goto cleanup;
- /* TODO: Write attributes */
- /* Write attributes */
- current_attribute = element->FirstAttribute;
- while (current_attribute != NULL)
- {
if (!write_xml_attribute(current_attribute, writer)) goto cleanup;
'ret' would be set to the return value and tested here.
current_attribute = current_attribute->Next;
}
/* Write child elements */ current_child = element->FirstChild;