diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c index 74546e01511..62ab8714d0c 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[] = ""; + static const char *prologversion2 = ""; static const char prologversion[] = ""; 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 3a0bd29afa4..a8416143ccb 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); }