Module: wine Branch: master Commit: 2177403b8ebefcf8641505f8946e429f9960cb6f URL: http://source.winehq.org/git/wine.git/?a=commit;h=2177403b8ebefcf8641505f894...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed May 21 00:24:49 2014 +0400
xmllite/writer: Initial implementation of WriteStartElement().
---
dlls/xmllite/tests/writer.c | 92 +++++++++++++++++++++++++++++++++++++++++++ dlls/xmllite/writer.c | 49 ++++++++++++++++++----- 2 files changed, 132 insertions(+), 9 deletions(-)
diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c index 6800cd2..7631b45 100644 --- a/dlls/xmllite/tests/writer.c +++ b/dlls/xmllite/tests/writer.c @@ -410,6 +410,7 @@ static void test_bom(void) static const WCHAR versionW[] = {'v','e','r','s','i','o','n','=','"','1','.','0','"',0}; static const WCHAR utf16W[] = {'u','t','f','-','1','6',0}; static const WCHAR xmlW[] = {'x','m','l',0}; + static const WCHAR aW[] = {'a',0}; IXmlWriterOutput *output; unsigned char *ptr; IXmlWriter *writer; @@ -473,8 +474,98 @@ static void test_bom(void) GlobalUnlock(hglobal);
IUnknown_Release(output); + IStream_Release(stream); + + /* start with element */ + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = pCreateXmlWriterOutputWithEncodingName((IUnknown*)stream, NULL, utf16W, &output); + ok(hr == S_OK, "got %08x\n", hr); + + hr = IXmlWriter_SetOutput(writer, output); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteStartElement(writer, NULL, aW, NULL); + 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[0] == 0xff && ptr[1] == 0xfe, "got %x,%x\n", ptr[0], ptr[1]); + GlobalUnlock(hglobal); + + IUnknown_Release(output); + IStream_Release(stream); + IXmlWriter_Release(writer); +} + +static void test_writestartelement(void) +{ + static const WCHAR aW[] = {'a',0}; + char *ptr; + IXmlWriter *writer; + IStream *stream; + HGLOBAL hglobal; + HRESULT hr; + + 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_WriteStartElement(writer, NULL, aW, NULL); + 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, aW, NULL, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteStartElement(writer, NULL, NULL, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteStartElement(writer, NULL, NULL, aW); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteStartElement(writer, NULL, aW, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = GetHGlobalFromStream(stream, &hglobal); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Yes); + ok(hr == WR_E_INVALIDACTION, "got 0x%08x\n", hr); + + hr = IXmlWriter_Flush(writer); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ptr = GlobalLock(hglobal); + ok(!strncmp(ptr, "<a", 2), "got %s\n", ptr); + GlobalUnlock(hglobal); + + hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Yes); + ok(hr == WR_E_INVALIDACTION, "got 0x%08x\n", hr); + + /* write another element without closing previous one */ + hr = IXmlWriter_WriteStartElement(writer, NULL, aW, NULL); + ok(hr == WR_E_INVALIDACTION, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteStartElement(writer, NULL, NULL, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IXmlWriter_WriteProcessingInstruction(writer, aW, aW); + ok(hr == WR_E_INVALIDACTION, "got 0x%08x\n", hr); + IStream_Release(stream); + IXmlWriter_Release(writer); }
START_TEST(writer) @@ -485,6 +576,7 @@ START_TEST(writer) test_writer_create(); test_writeroutput(); test_writestartdocument(); + test_writestartelement(); test_flush(); test_omitxmldeclaration(); test_bom(); diff --git a/dlls/xmllite/writer.c b/dlls/xmllite/writer.c index a1f409c..1a21ef4 100644 --- a/dlls/xmllite/writer.c +++ b/dlls/xmllite/writer.c @@ -51,7 +51,8 @@ typedef enum XmlWriterState_Initial, /* output is not set yet */ XmlWriterState_Ready, /* SetOutput() was called, ready to start */ XmlWriterState_PIDocStarted, /* document was started with manually added 'xml' PI */ - XmlWriterState_DocStarted /* document was started with WriteStartDocument() */ + XmlWriterState_DocStarted, /* document was started with WriteStartDocument() */ + XmlWriterState_ElemStarted /* writing element */ } XmlWriterState;
typedef struct @@ -593,11 +594,19 @@ static HRESULT WINAPI xmlwriter_WriteProcessingInstruction(IXmlWriter *iface, LP
TRACE("(%p)->(%s %s)\n", This, wine_dbgstr_w(name), wine_dbgstr_w(text));
- if (This->state == XmlWriterState_Initial) + switch (This->state) + { + case XmlWriterState_Initial: return E_UNEXPECTED; - - if (This->state == XmlWriterState_DocStarted && !strcmpW(name, xmlW)) + case XmlWriterState_DocStarted: + if (!strcmpW(name, xmlW)) + return WR_E_INVALIDACTION; + break; + case XmlWriterState_ElemStarted: return WR_E_INVALIDACTION; + default: + ; + }
write_encoding_bom(This); write_output_buffer(This->output, openpiW, sizeof(openpiW)/sizeof(WCHAR)); @@ -656,6 +665,7 @@ static HRESULT WINAPI xmlwriter_WriteStartDocument(IXmlWriter *iface, XmlStandal This->state = XmlWriterState_DocStarted; return S_OK; case XmlWriterState_DocStarted: + case XmlWriterState_ElemStarted: return WR_E_INVALIDACTION; default: ; @@ -690,15 +700,36 @@ static HRESULT WINAPI xmlwriter_WriteStartDocument(IXmlWriter *iface, XmlStandal return S_OK; }
-static HRESULT WINAPI xmlwriter_WriteStartElement(IXmlWriter *iface, LPCWSTR pwszPrefix, - LPCWSTR pwszLocalName, LPCWSTR pwszNamespaceUri) +static HRESULT WINAPI xmlwriter_WriteStartElement(IXmlWriter *iface, LPCWSTR prefix, LPCWSTR local_name, LPCWSTR uri) { xmlwriter *This = impl_from_IXmlWriter(iface); + static const WCHAR ltW[] = {'<'};
- FIXME("%p %s %s %s\n", This, wine_dbgstr_w(pwszPrefix), wine_dbgstr_w(pwszLocalName), - wine_dbgstr_w(pwszNamespaceUri)); + TRACE("(%p)->(%s %s %s)\n", This, wine_dbgstr_w(prefix), wine_dbgstr_w(local_name), wine_dbgstr_w(uri));
- return E_NOTIMPL; + if (This->state == XmlWriterState_Initial) + return E_UNEXPECTED; + + if (!local_name) + return E_INVALIDARG; + + if (This->state == XmlWriterState_ElemStarted) + return WR_E_INVALIDACTION; + + write_encoding_bom(This); + This->state = XmlWriterState_ElemStarted; + + write_output_buffer(This->output, ltW, 1); + + if (prefix) { + static const WCHAR colW[] = {':'}; + write_output_buffer(This->output, prefix, -1); + write_output_buffer(This->output, colW, 1); + } + + write_output_buffer(This->output, local_name, -1); + + return S_OK; }
static HRESULT WINAPI xmlwriter_WriteString(IXmlWriter *iface, LPCWSTR pwszText)