2 * IXmlWriter implementation
4 * Copyright 2011 Alistair Leslie-Hughes
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "xmllite_private.h"
23 /* not defined in public headers */
24 DEFINE_GUID(IID_IXmlWriterOutput
, 0xc1131708, 0x0f59, 0x477f, 0x93, 0x59, 0x7d, 0x33, 0x24, 0x51, 0xbc, 0x1a);
28 IXmlWriterOutput IXmlWriterOutput_iface
;
32 xml_encoding encoding
;
35 typedef struct _xmlwriter
37 IXmlWriter IXmlWriter_iface
;
41 static inline xmlwriter
*impl_from_IXmlWriter(IXmlWriter
*iface
)
43 return CONTAINING_RECORD(iface
, xmlwriter
, IXmlWriter_iface
);
46 static inline xmlwriteroutput
*impl_from_IXmlWriterOutput(IXmlWriterOutput
*iface
)
48 return CONTAINING_RECORD(iface
, xmlwriteroutput
, IXmlWriterOutput_iface
);
51 /* reader input memory allocation functions */
52 static inline void *writeroutput_alloc(xmlwriteroutput
*output
, size_t len
)
54 return m_alloc(output
->imalloc
, len
);
57 static inline void writeroutput_free(xmlwriteroutput
*output
, void *mem
)
59 m_free(output
->imalloc
, mem
);
62 static HRESULT WINAPI
xmlwriter_QueryInterface(IXmlWriter
*iface
, REFIID riid
, void **ppvObject
)
64 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
66 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
68 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
69 IsEqualGUID(riid
, &IID_IXmlWriter
))
74 IXmlWriter_AddRef(iface
);
79 static ULONG WINAPI
xmlwriter_AddRef(IXmlWriter
*iface
)
81 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
83 return InterlockedIncrement(&This
->ref
);
86 static ULONG WINAPI
xmlwriter_Release(IXmlWriter
*iface
)
88 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
93 ref
= InterlockedDecrement(&This
->ref
);
100 /*** IXmlWriter methods ***/
101 static HRESULT WINAPI
xmlwriter_SetOutput(IXmlWriter
*iface
, IUnknown
*pOutput
)
103 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
105 FIXME("%p %p\n", This
, pOutput
);
110 static HRESULT WINAPI
xmlwriter_GetProperty(IXmlWriter
*iface
, UINT nProperty
, LONG_PTR
*ppValue
)
112 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
114 FIXME("%p %u %p\n", This
, nProperty
, ppValue
);
119 static HRESULT WINAPI
xmlwriter_SetProperty(IXmlWriter
*iface
, UINT nProperty
, LONG_PTR pValue
)
121 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
123 FIXME("%p %u %lu\n", This
, nProperty
, pValue
);
128 static HRESULT WINAPI
xmlwriter_WriteAttributes(IXmlWriter
*iface
, IXmlReader
*pReader
,
129 BOOL fWriteDefaultAttributes
)
131 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
133 FIXME("%p %p %d\n", This
, pReader
, fWriteDefaultAttributes
);
138 static HRESULT WINAPI
xmlwriter_WriteAttributeString(IXmlWriter
*iface
, LPCWSTR pwszPrefix
,
139 LPCWSTR pwszLocalName
, LPCWSTR pwszNamespaceUri
,
142 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
144 FIXME("%p %s %s %s %s\n", This
, wine_dbgstr_w(pwszPrefix
), wine_dbgstr_w(pwszLocalName
),
145 wine_dbgstr_w(pwszNamespaceUri
), wine_dbgstr_w(pwszValue
));
150 static HRESULT WINAPI
xmlwriter_WriteCData(IXmlWriter
*iface
, LPCWSTR pwszText
)
152 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
154 FIXME("%p %s\n", This
, wine_dbgstr_w(pwszText
));
159 static HRESULT WINAPI
xmlwriter_WriteCharEntity(IXmlWriter
*iface
, WCHAR wch
)
164 static HRESULT WINAPI
xmlwriter_WriteChars(IXmlWriter
*iface
, const WCHAR
*pwch
, UINT cwch
)
166 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
168 FIXME("%p %s %d\n", This
, wine_dbgstr_w(pwch
), cwch
);
173 static HRESULT WINAPI
xmlwriter_WriteComment(IXmlWriter
*iface
, LPCWSTR pwszComment
)
178 static HRESULT WINAPI
xmlwriter_WriteDocType(IXmlWriter
*iface
, LPCWSTR pwszName
, LPCWSTR pwszPublicId
,
179 LPCWSTR pwszSystemId
, LPCWSTR pwszSubset
)
181 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
183 FIXME("%p %s %s %s %s\n", This
, wine_dbgstr_w(pwszName
), wine_dbgstr_w(pwszPublicId
),
184 wine_dbgstr_w(pwszSystemId
), wine_dbgstr_w(pwszSubset
));
189 static HRESULT WINAPI
xmlwriter_WriteElementString(IXmlWriter
*iface
, LPCWSTR pwszPrefix
,
190 LPCWSTR pwszLocalName
, LPCWSTR pwszNamespaceUri
,
193 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
195 FIXME("%p %s %s %s %s\n", This
, wine_dbgstr_w(pwszPrefix
), wine_dbgstr_w(pwszLocalName
),
196 wine_dbgstr_w(pwszNamespaceUri
), wine_dbgstr_w(pwszValue
));
201 static HRESULT WINAPI
xmlwriter_WriteEndDocument(IXmlWriter
*iface
)
203 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
210 static HRESULT WINAPI
xmlwriter_WriteEndElement(IXmlWriter
*iface
)
212 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
219 static HRESULT WINAPI
xmlwriter_WriteEntityRef(IXmlWriter
*iface
, LPCWSTR pwszName
)
221 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
223 FIXME("%p %s\n", This
, wine_dbgstr_w(pwszName
));
228 static HRESULT WINAPI
xmlwriter_WriteFullEndElement(IXmlWriter
*iface
)
230 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
237 static HRESULT WINAPI
xmlwriter_WriteName(IXmlWriter
*iface
, LPCWSTR pwszName
)
239 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
241 FIXME("%p %s\n", This
, wine_dbgstr_w(pwszName
));
246 static HRESULT WINAPI
xmlwriter_WriteNmToken(IXmlWriter
*iface
, LPCWSTR pwszNmToken
)
248 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
250 FIXME("%p %s\n", This
, wine_dbgstr_w(pwszNmToken
));
255 static HRESULT WINAPI
xmlwriter_WriteNode(IXmlWriter
*iface
, IXmlReader
*pReader
,
256 BOOL fWriteDefaultAttributes
)
258 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
260 FIXME("%p %p %d\n", This
, pReader
, fWriteDefaultAttributes
);
265 static HRESULT WINAPI
xmlwriter_WriteNodeShallow(IXmlWriter
*iface
, IXmlReader
*pReader
,
266 BOOL fWriteDefaultAttributes
)
268 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
270 FIXME("%p %p %d\n", This
, pReader
, fWriteDefaultAttributes
);
275 static HRESULT WINAPI
xmlwriter_WriteProcessingInstruction(IXmlWriter
*iface
, LPCWSTR pwszName
,
278 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
280 FIXME("%p %s %s\n", This
, wine_dbgstr_w(pwszName
), wine_dbgstr_w(pwszText
));
285 static HRESULT WINAPI
xmlwriter_WriteQualifiedName(IXmlWriter
*iface
, LPCWSTR pwszLocalName
,
286 LPCWSTR pwszNamespaceUri
)
288 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
290 FIXME("%p %s %s\n", This
, wine_dbgstr_w(pwszLocalName
), wine_dbgstr_w(pwszNamespaceUri
));
295 static HRESULT WINAPI
xmlwriter_WriteRaw(IXmlWriter
*iface
, LPCWSTR pwszData
)
297 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
299 FIXME("%p %s\n", This
, wine_dbgstr_w(pwszData
));
304 static HRESULT WINAPI
xmlwriter_WriteRawChars(IXmlWriter
*iface
, const WCHAR
*pwch
, UINT cwch
)
306 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
308 FIXME("%p %s %d\n", This
, wine_dbgstr_w(pwch
), cwch
);
313 static HRESULT WINAPI
xmlwriter_WriteStartDocument(IXmlWriter
*iface
, XmlStandalone standalone
)
315 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
322 static HRESULT WINAPI
xmlwriter_WriteStartElement(IXmlWriter
*iface
, LPCWSTR pwszPrefix
,
323 LPCWSTR pwszLocalName
, LPCWSTR pwszNamespaceUri
)
325 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
327 FIXME("%p %s %s %s\n", This
, wine_dbgstr_w(pwszPrefix
), wine_dbgstr_w(pwszLocalName
),
328 wine_dbgstr_w(pwszNamespaceUri
));
333 static HRESULT WINAPI
xmlwriter_WriteString(IXmlWriter
*iface
, LPCWSTR pwszText
)
335 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
337 FIXME("%p %s\n", This
, wine_dbgstr_w(pwszText
));
342 static HRESULT WINAPI
xmlwriter_WriteSurrogateCharEntity(IXmlWriter
*iface
, WCHAR wchLow
, WCHAR wchHigh
)
344 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
346 FIXME("%p %d %d\n", This
, wchLow
, wchHigh
);
351 static HRESULT WINAPI
xmlwriter_WriteWhitespace(IXmlWriter
*iface
, LPCWSTR pwszWhitespace
)
353 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
355 FIXME("%p %s\n", This
, wine_dbgstr_w(pwszWhitespace
));
360 static HRESULT WINAPI
xmlwriter_Flush(IXmlWriter
*iface
)
362 xmlwriter
*This
= impl_from_IXmlWriter(iface
);
369 static const struct IXmlWriterVtbl xmlwriter_vtbl
=
371 xmlwriter_QueryInterface
,
375 xmlwriter_GetProperty
,
376 xmlwriter_SetProperty
,
377 xmlwriter_WriteAttributes
,
378 xmlwriter_WriteAttributeString
,
379 xmlwriter_WriteCData
,
380 xmlwriter_WriteCharEntity
,
381 xmlwriter_WriteChars
,
382 xmlwriter_WriteComment
,
383 xmlwriter_WriteDocType
,
384 xmlwriter_WriteElementString
,
385 xmlwriter_WriteEndDocument
,
386 xmlwriter_WriteEndElement
,
387 xmlwriter_WriteEntityRef
,
388 xmlwriter_WriteFullEndElement
,
390 xmlwriter_WriteNmToken
,
392 xmlwriter_WriteNodeShallow
,
393 xmlwriter_WriteProcessingInstruction
,
394 xmlwriter_WriteQualifiedName
,
396 xmlwriter_WriteRawChars
,
397 xmlwriter_WriteStartDocument
,
398 xmlwriter_WriteStartElement
,
399 xmlwriter_WriteString
,
400 xmlwriter_WriteSurrogateCharEntity
,
401 xmlwriter_WriteWhitespace
,
405 /** IXmlWriterOutput **/
406 static HRESULT WINAPI
xmlwriteroutput_QueryInterface(IXmlWriterOutput
*iface
, REFIID riid
, void** ppvObject
)
408 xmlwriteroutput
*This
= impl_from_IXmlWriterOutput(iface
);
410 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppvObject
);
412 if (IsEqualGUID(riid
, &IID_IXmlWriterOutput
) ||
413 IsEqualGUID(riid
, &IID_IUnknown
))
419 WARN("interface %s not implemented\n", debugstr_guid(riid
));
421 return E_NOINTERFACE
;
424 IUnknown_AddRef(iface
);
429 static ULONG WINAPI
xmlwriteroutput_AddRef(IXmlWriterOutput
*iface
)
431 xmlwriteroutput
*This
= impl_from_IXmlWriterOutput(iface
);
432 ULONG ref
= InterlockedIncrement(&This
->ref
);
433 TRACE("(%p)->(%d)\n", This
, ref
);
437 static ULONG WINAPI
xmlwriteroutput_Release(IXmlWriterOutput
*iface
)
439 xmlwriteroutput
*This
= impl_from_IXmlWriterOutput(iface
);
440 LONG ref
= InterlockedDecrement(&This
->ref
);
442 TRACE("(%p)->(%d)\n", This
, ref
);
446 IMalloc
*imalloc
= This
->imalloc
;
447 if (This
->output
) IUnknown_Release(This
->output
);
448 writeroutput_free(This
, This
);
449 if (imalloc
) IMalloc_Release(imalloc
);
455 static const struct IUnknownVtbl xmlwriteroutputvtbl
=
457 xmlwriteroutput_QueryInterface
,
458 xmlwriteroutput_AddRef
,
459 xmlwriteroutput_Release
462 HRESULT WINAPI
CreateXmlWriter(REFIID riid
, void **pObject
, IMalloc
*pMalloc
)
466 TRACE("(%s, %p, %p)\n", wine_dbgstr_guid(riid
), pObject
, pMalloc
);
468 if (pMalloc
) FIXME("custom IMalloc not supported yet\n");
470 if (!IsEqualGUID(riid
, &IID_IXmlWriter
))
472 ERR("Unexpected IID requested -> (%s)\n", wine_dbgstr_guid(riid
));
476 writer
= heap_alloc(sizeof(*writer
));
477 if(!writer
) return E_OUTOFMEMORY
;
479 writer
->IXmlWriter_iface
.lpVtbl
= &xmlwriter_vtbl
;
482 *pObject
= &writer
->IXmlWriter_iface
;
484 TRACE("returning iface %p\n", *pObject
);
489 HRESULT WINAPI
CreateXmlWriterOutputWithEncodingName(IUnknown
*stream
,
492 IXmlWriterOutput
**output
)
494 xmlwriteroutput
*writeroutput
;
496 TRACE("%p %p %s %p\n", stream
, imalloc
, debugstr_w(encoding
), output
);
498 if (!stream
|| !output
) return E_INVALIDARG
;
501 writeroutput
= IMalloc_Alloc(imalloc
, sizeof(*writeroutput
));
503 writeroutput
= heap_alloc(sizeof(*writeroutput
));
504 if(!writeroutput
) return E_OUTOFMEMORY
;
506 writeroutput
->IXmlWriterOutput_iface
.lpVtbl
= &xmlwriteroutputvtbl
;
507 writeroutput
->ref
= 1;
508 writeroutput
->imalloc
= imalloc
;
509 if (imalloc
) IMalloc_AddRef(imalloc
);
510 writeroutput
->encoding
= parse_encoding_name(encoding
, -1);
512 IUnknown_QueryInterface(stream
, &IID_IUnknown
, (void**)&writeroutput
->output
);
514 *output
= &writeroutput
->IXmlWriterOutput_iface
;
516 TRACE("returning iface %p\n", *output
);