Nikolay Sivov : xmllite/writer: Preserve original encoding name spelling in writer output.

Alexandre Julliard julliard at winehq.org
Mon Apr 3 14:01:46 CDT 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Mar 30 21:35:17 2017 +0300

xmllite/writer: Preserve original encoding name spelling in writer output.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/xmllite/tests/writer.c | 29 +++++++++++++++++++++++++++++
 dlls/xmllite/writer.c       | 34 +++++++++++++++++++++++++++-------
 2 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c
index 74546e0..62ab871 100644
--- a/dlls/xmllite/tests/writer.c
+++ b/dlls/xmllite/tests/writer.c
@@ -324,9 +324,12 @@ todo_wine
 static void test_writestartdocument(void)
 {
     static const char fullprolog[] = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
+    static const char *prologversion2 = "<?xml version=\"1.0\" encoding=\"uS-asCii\"?>";
     static const char prologversion[] = "<?xml version=\"1.0\"?>";
     static const WCHAR versionW[] = {'v','e','r','s','i','o','n','=','"','1','.','0','"',0};
+    static const WCHAR usasciiW[] = {'u','S','-','a','s','C','i','i',0};
     static const WCHAR xmlW[] = {'x','m','l',0};
+    IXmlWriterOutput *output;
     IXmlWriter *writer;
     IStream *stream;
     HRESULT hr;
@@ -386,6 +389,32 @@ static void test_writestartdocument(void)
 
     IStream_Release(stream);
     IXmlWriter_Release(writer);
+
+    /* create with us-ascii */
+    hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    output = NULL;
+    hr = CreateXmlWriterOutputWithEncodingName((IUnknown *)stream, NULL, usasciiW, &output);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = CreateXmlWriter(&IID_IXmlWriter, (void **)&writer, NULL);
+    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+    hr = IXmlWriter_SetOutput(writer, output);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IXmlWriter_Flush(writer);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    CHECK_OUTPUT(stream, prologversion2);
+
+    IStream_Release(stream);
+    IXmlWriter_Release(writer);
+    IUnknown_Release(output);
 }
 
 static void test_flush(void)
diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c
index 3a0bd29..a841614 100644
--- a/dlls/xmllite/writer.c
+++ b/dlls/xmllite/writer.c
@@ -73,6 +73,7 @@ typedef struct
     ISequentialStream *stream;
     IMalloc *imalloc;
     xml_encoding encoding;
+    WCHAR *encoding_name; /* exactly as specified on output creation */
     struct output_buffer buffer;
 } xmlwriteroutput;
 
@@ -373,6 +374,14 @@ static HRESULT write_encoding_bom(xmlwriter *writer)
     return S_OK;
 }
 
+static const WCHAR *get_output_encoding_name(xmlwriteroutput *output)
+{
+    if (output->encoding_name)
+        return output->encoding_name;
+
+    return get_encoding_name(output->encoding);
+}
+
 static HRESULT write_xmldecl(xmlwriter *writer, XmlStandalone standalone)
 {
     static const WCHAR versionW[] = {'<','?','x','m','l',' ','v','e','r','s','i','o','n','=','"','1','.','0','"'};
@@ -387,7 +396,7 @@ static HRESULT write_xmldecl(xmlwriter *writer, XmlStandalone standalone)
 
     /* encoding */
     write_output_buffer(writer->output, encodingW, ARRAY_SIZE(encodingW));
-    write_output_buffer_quoted(writer->output, get_encoding_name(writer->output->encoding), -1);
+    write_output_buffer_quoted(writer->output, get_output_encoding_name(writer->output), -1);
 
     /* standalone */
     if (standalone == XmlStandalone_Omit)
@@ -1366,6 +1375,7 @@ static ULONG WINAPI xmlwriteroutput_Release(IXmlWriterOutput *iface)
         if (This->output) IUnknown_Release(This->output);
         if (This->stream) ISequentialStream_Release(This->stream);
         free_output_buffer(This);
+        writeroutput_free(This, This->encoding_name);
         writeroutput_free(This, This);
         if (imalloc) IMalloc_Release(imalloc);
     }
@@ -1420,8 +1430,8 @@ HRESULT WINAPI CreateXmlWriter(REFIID riid, void **obj, IMalloc *imalloc)
     return S_OK;
 }
 
-static HRESULT create_writer(IUnknown *stream, IMalloc *imalloc, xml_encoding encoding,
-                             IXmlWriterOutput **output)
+static HRESULT create_writer_output(IUnknown *stream, IMalloc *imalloc, xml_encoding encoding,
+    const WCHAR *encoding_name, IXmlWriterOutput **output)
 {
     xmlwriteroutput *writeroutput;
     HRESULT hr;
@@ -1432,12 +1442,14 @@ static HRESULT create_writer(IUnknown *stream, IMalloc *imalloc, xml_encoding en
         writeroutput = IMalloc_Alloc(imalloc, sizeof(*writeroutput));
     else
         writeroutput = heap_alloc(sizeof(*writeroutput));
-    if(!writeroutput) return E_OUTOFMEMORY;
+    if (!writeroutput)
+        return E_OUTOFMEMORY;
 
     writeroutput->IXmlWriterOutput_iface.lpVtbl = &xmlwriteroutputvtbl;
     writeroutput->ref = 1;
     writeroutput->imalloc = imalloc;
-    if (imalloc) IMalloc_AddRef(imalloc);
+    if (imalloc)
+        IMalloc_AddRef(imalloc);
     writeroutput->encoding = encoding;
     writeroutput->stream = NULL;
     hr = init_output_buffer(writeroutput);
@@ -1446,6 +1458,14 @@ static HRESULT create_writer(IUnknown *stream, IMalloc *imalloc, xml_encoding en
         return hr;
     }
 
+    if (encoding_name) {
+        unsigned int size = (strlenW(encoding_name) + 1) * sizeof(WCHAR);
+        writeroutput->encoding_name = writeroutput_alloc(writeroutput, size);
+        memcpy(writeroutput->encoding_name, encoding_name, size);
+    }
+    else
+        writeroutput->encoding_name = NULL;
+
     IUnknown_QueryInterface(stream, &IID_IUnknown, (void**)&writeroutput->output);
 
     *output = &writeroutput->IXmlWriterOutput_iface;
@@ -1468,7 +1488,7 @@ HRESULT WINAPI CreateXmlWriterOutputWithEncodingName(IUnknown *stream,
     if (!stream || !output) return E_INVALIDARG;
 
     xml_enc = parse_encoding_name(encoding ? encoding : utf8W, -1);
-    return create_writer(stream, imalloc, xml_enc, output);
+    return create_writer_output(stream, imalloc, xml_enc, encoding, output);
 }
 
 HRESULT WINAPI CreateXmlWriterOutputWithEncodingCodePage(IUnknown *stream,
@@ -1483,5 +1503,5 @@ HRESULT WINAPI CreateXmlWriterOutputWithEncodingCodePage(IUnknown *stream,
     if (!stream || !output) return E_INVALIDARG;
 
     xml_enc = get_encoding_from_codepage(codepage);
-    return create_writer(stream, imalloc, xml_enc, output);
+    return create_writer_output(stream, imalloc, xml_enc, NULL, output);
 }




More information about the wine-cvs mailing list