From 7b8929e0f5b235e69235f59f69d6482f346bf380 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 15 Mar 2016 19:54:46 +0300 Subject: [PATCH] xmllite/writer: Implement WriteCData(). Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/xmllite/tests/writer.c | 67 +++++++++++++++++++++++++++++++++++++ dlls/xmllite/writer.c | 51 ++++++++++++++++++++++++++-- 2 files changed, 115 insertions(+), 3 deletions(-) diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c index a55957e9d97..6f2232e27e6 100644 --- a/dlls/xmllite/tests/writer.c +++ b/dlls/xmllite/tests/writer.c @@ -814,6 +814,72 @@ static void test_WriteComment(void) IStream_Release(stream); } +static void test_WriteCData(void) +{ + static const WCHAR closeW[] = {']',']','>',0}; + static const WCHAR close2W[] = {'a',']',']','>','b',0}; + static const WCHAR aW[] = {'a',0}; + static const WCHAR bW[] = {'b',0}; + IXmlWriter *writer; + IStream *stream; + HGLOBAL hglobal; + HRESULT hr; + char *ptr; + + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = pCreateXmlWriter(&IID_IXmlWriter, (void**)&writer, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXmlWriter_SetProperty(writer, XmlWriterProperty_OmitXmlDeclaration, TRUE); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteCData(writer, aW); + ok(hr == E_UNEXPECTED, "got 0x%08x\n", hr); + + hr = IXmlWriter_SetOutput(writer, (IUnknown*)stream); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteStartElement(writer, NULL, bW, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteCData(writer, aW); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteCData(writer, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteCData(writer, closeW); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteCData(writer, close2W); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_Flush(writer); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = GetHGlobalFromStream(stream, &hglobal); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ptr = GlobalLock(hglobal); + ok(ptr != NULL, "got %p\n", ptr); + + ok(!strncmp(ptr, + "" + "" + "" + "" + "]]>" + "" + "b]]>", 84), "got %s\n", ptr); + + GlobalUnlock(hglobal); + + IXmlWriter_Release(writer); + IStream_Release(stream); +} + START_TEST(writer) { if (!init_pointers()) @@ -829,4 +895,5 @@ START_TEST(writer) test_bom(); test_writeenddocument(); test_WriteComment(); + test_WriteCData(); } diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index 766d33564cb..3e74389020b 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -556,13 +556,58 @@ static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR return E_NOTIMPL; } -static HRESULT WINAPI xmlwriter_WriteCData(IXmlWriter *iface, LPCWSTR pwszText) +static void write_cdata_section(xmlwriteroutput *output, const WCHAR *data, int len) +{ + static const WCHAR cdataopenW[] = {'<','!','[','C','D','A','T','A','['}; + static const WCHAR cdatacloseW[] = {']',']','>'}; + write_output_buffer(output, cdataopenW, ARRAY_SIZE(cdataopenW)); + if (data) + write_output_buffer(output, data, len); + write_output_buffer(output, cdatacloseW, ARRAY_SIZE(cdatacloseW)); +} + +static HRESULT WINAPI xmlwriter_WriteCData(IXmlWriter *iface, LPCWSTR data) { xmlwriter *This = impl_from_IXmlWriter(iface); + int len; - FIXME("%p %s\n", This, wine_dbgstr_w(pwszText)); + TRACE("%p %s\n", This, debugstr_w(data)); - return E_NOTIMPL; + switch (This->state) + { + case XmlWriterState_Initial: + return E_UNEXPECTED; + case XmlWriterState_ElemStarted: + writer_close_starttag(This); + break; + case XmlWriterState_DocClosed: + return WR_E_INVALIDACTION; + default: + ; + } + + len = data ? strlenW(data) : 0; + + if (!len) + write_cdata_section(This->output, NULL, 0); + else { + static const WCHAR cdatacloseW[] = {']',']','>',0}; + while (len) { + const WCHAR *str = strstrW(data, cdatacloseW); + if (str) { + str += 2; + write_cdata_section(This->output, data, str - data); + len -= str - data; + data = str; + } + else { + write_cdata_section(This->output, data, len); + break; + } + } + } + + return S_OK; } static HRESULT WINAPI xmlwriter_WriteCharEntity(IXmlWriter *iface, WCHAR wch)