[LT2013]
[reactos.git] / dll / win32 / xmllite / writer.c
1 /*
2 * IXmlWriter implementation
3 *
4 * Copyright 2011 Alistair Leslie-Hughes
5 *
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.
10 *
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.
15 *
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
19 */
20 #define WIN32_NO_STATUS
21 #define _INC_WINDOWS
22 #define COM_NO_WINDOWS_H
23
24 #define COBJMACROS
25
26 #include <stdarg.h>
27 #include <windef.h>
28 #include <winbase.h>
29 #include <objbase.h>
30 #include <xmllite.h>
31
32 #include <wine/debug.h>
33
34 WINE_DEFAULT_DEBUG_CHANNEL(xmllite);
35
36 typedef struct _xmlwriter
37 {
38 IXmlWriter IXmlWriter_iface;
39 LONG ref;
40 } xmlwriter;
41
42 static inline xmlwriter *impl_from_IXmlWriter(IXmlWriter *iface)
43 {
44 return CONTAINING_RECORD(iface, xmlwriter, IXmlWriter_iface);
45 }
46
47 static HRESULT WINAPI xmlwriter_QueryInterface(IXmlWriter *iface, REFIID riid, void **ppvObject)
48 {
49 xmlwriter *This = impl_from_IXmlWriter(iface);
50
51 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
52
53 if (IsEqualGUID(riid, &IID_IUnknown) ||
54 IsEqualGUID(riid, &IID_IXmlWriter))
55 {
56 *ppvObject = iface;
57 }
58
59 IXmlWriter_AddRef(iface);
60
61 return S_OK;
62 }
63
64 static ULONG WINAPI xmlwriter_AddRef(IXmlWriter *iface)
65 {
66 xmlwriter *This = impl_from_IXmlWriter(iface);
67 TRACE("%p\n", This);
68 return InterlockedIncrement(&This->ref);
69 }
70
71 static ULONG WINAPI xmlwriter_Release(IXmlWriter *iface)
72 {
73 xmlwriter *This = impl_from_IXmlWriter(iface);
74 LONG ref;
75
76 TRACE("%p\n", This);
77
78 ref = InterlockedDecrement(&This->ref);
79 if (ref == 0)
80 {
81 HeapFree(GetProcessHeap(), 0, This);
82 }
83
84 return ref;
85 }
86
87 /*** IXmlWriter methods ***/
88 static HRESULT WINAPI xmlwriter_SetOutput(IXmlWriter *iface, IUnknown *pOutput)
89 {
90 xmlwriter *This = impl_from_IXmlWriter(iface);
91
92 FIXME("%p %p\n", This, pOutput);
93
94 return E_NOTIMPL;
95 }
96
97 static HRESULT WINAPI xmlwriter_GetProperty(IXmlWriter *iface, UINT nProperty, LONG_PTR *ppValue)
98 {
99 xmlwriter *This = impl_from_IXmlWriter(iface);
100
101 FIXME("%p %u %p\n", This, nProperty, ppValue);
102
103 return E_NOTIMPL;
104 }
105
106 static HRESULT WINAPI xmlwriter_SetProperty(IXmlWriter *iface, UINT nProperty, LONG_PTR pValue)
107 {
108 xmlwriter *This = impl_from_IXmlWriter(iface);
109
110 FIXME("%p %u %lu\n", This, nProperty, pValue);
111
112 return E_NOTIMPL;
113 }
114
115 static HRESULT WINAPI xmlwriter_WriteAttributes(IXmlWriter *iface, IXmlReader *pReader,
116 BOOL fWriteDefaultAttributes)
117 {
118 xmlwriter *This = impl_from_IXmlWriter(iface);
119
120 FIXME("%p %p %d\n", This, pReader, fWriteDefaultAttributes);
121
122 return E_NOTIMPL;
123 }
124
125 static HRESULT WINAPI xmlwriter_WriteAttributeString(IXmlWriter *iface, LPCWSTR pwszPrefix,
126 LPCWSTR pwszLocalName, LPCWSTR pwszNamespaceUri,
127 LPCWSTR pwszValue)
128 {
129 xmlwriter *This = impl_from_IXmlWriter(iface);
130
131 FIXME("%p %s %s %s %s\n", This, wine_dbgstr_w(pwszPrefix), wine_dbgstr_w(pwszLocalName),
132 wine_dbgstr_w(pwszNamespaceUri), wine_dbgstr_w(pwszValue));
133
134 return E_NOTIMPL;
135 }
136
137 static HRESULT WINAPI xmlwriter_WriteCData(IXmlWriter *iface, LPCWSTR pwszText)
138 {
139 xmlwriter *This = impl_from_IXmlWriter(iface);
140
141 FIXME("%p %s\n", This, wine_dbgstr_w(pwszText));
142
143 return E_NOTIMPL;
144 }
145
146 static HRESULT WINAPI xmlwriter_WriteCharEntity(IXmlWriter *iface, WCHAR wch)
147 {
148 return E_NOTIMPL;
149 }
150
151 static HRESULT WINAPI xmlwriter_WriteChars(IXmlWriter *iface, const WCHAR *pwch, UINT cwch)
152 {
153 xmlwriter *This = impl_from_IXmlWriter(iface);
154
155 FIXME("%p %s %d\n", This, wine_dbgstr_w(pwch), cwch);
156
157 return E_NOTIMPL;
158 }
159
160 static HRESULT WINAPI xmlwriter_WriteComment(IXmlWriter *iface, LPCWSTR pwszComment)
161 {
162 return E_NOTIMPL;
163 }
164
165 static HRESULT WINAPI xmlwriter_WriteDocType(IXmlWriter *iface, LPCWSTR pwszName, LPCWSTR pwszPublicId,
166 LPCWSTR pwszSystemId, LPCWSTR pwszSubset)
167 {
168 xmlwriter *This = impl_from_IXmlWriter(iface);
169
170 FIXME("%p %s %s %s %s\n", This, wine_dbgstr_w(pwszName), wine_dbgstr_w(pwszPublicId),
171 wine_dbgstr_w(pwszSystemId), wine_dbgstr_w(pwszSubset));
172
173 return E_NOTIMPL;
174 }
175
176 static HRESULT WINAPI xmlwriter_WriteElementString(IXmlWriter *iface, LPCWSTR pwszPrefix,
177 LPCWSTR pwszLocalName, LPCWSTR pwszNamespaceUri,
178 LPCWSTR pwszValue)
179 {
180 xmlwriter *This = impl_from_IXmlWriter(iface);
181
182 FIXME("%p %s %s %s %s\n", This, wine_dbgstr_w(pwszPrefix), wine_dbgstr_w(pwszLocalName),
183 wine_dbgstr_w(pwszNamespaceUri), wine_dbgstr_w(pwszValue));
184
185 return E_NOTIMPL;
186 }
187
188 static HRESULT WINAPI xmlwriter_WriteEndDocument(IXmlWriter *iface)
189 {
190 xmlwriter *This = impl_from_IXmlWriter(iface);
191
192 FIXME("%p\n", This);
193
194 return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI xmlwriter_WriteEndElement(IXmlWriter *iface)
198 {
199 xmlwriter *This = impl_from_IXmlWriter(iface);
200
201 FIXME("%p\n", This);
202
203 return E_NOTIMPL;
204 }
205
206 static HRESULT WINAPI xmlwriter_WriteEntityRef(IXmlWriter *iface, LPCWSTR pwszName)
207 {
208 xmlwriter *This = impl_from_IXmlWriter(iface);
209
210 FIXME("%p %s\n", This, wine_dbgstr_w(pwszName));
211
212 return E_NOTIMPL;
213 }
214
215 static HRESULT WINAPI xmlwriter_WriteFullEndElement(IXmlWriter *iface)
216 {
217 xmlwriter *This = impl_from_IXmlWriter(iface);
218
219 FIXME("%p\n", This);
220
221 return E_NOTIMPL;
222 }
223
224 static HRESULT WINAPI xmlwriter_WriteName(IXmlWriter *iface, LPCWSTR pwszName)
225 {
226 xmlwriter *This = impl_from_IXmlWriter(iface);
227
228 FIXME("%p %s\n", This, wine_dbgstr_w(pwszName));
229
230 return E_NOTIMPL;
231 }
232
233 static HRESULT WINAPI xmlwriter_WriteNmToken(IXmlWriter *iface, LPCWSTR pwszNmToken)
234 {
235 xmlwriter *This = impl_from_IXmlWriter(iface);
236
237 FIXME("%p %s\n", This, wine_dbgstr_w(pwszNmToken));
238
239 return E_NOTIMPL;
240 }
241
242 static HRESULT WINAPI xmlwriter_WriteNode(IXmlWriter *iface, IXmlReader *pReader,
243 BOOL fWriteDefaultAttributes)
244 {
245 xmlwriter *This = impl_from_IXmlWriter(iface);
246
247 FIXME("%p %p %d\n", This, pReader, fWriteDefaultAttributes);
248
249 return E_NOTIMPL;
250 }
251
252 static HRESULT WINAPI xmlwriter_WriteNodeShallow(IXmlWriter *iface, IXmlReader *pReader,
253 BOOL fWriteDefaultAttributes)
254 {
255 xmlwriter *This = impl_from_IXmlWriter(iface);
256
257 FIXME("%p %p %d\n", This, pReader, fWriteDefaultAttributes);
258
259 return E_NOTIMPL;
260 }
261
262 static HRESULT WINAPI xmlwriter_WriteProcessingInstruction(IXmlWriter *iface, LPCWSTR pwszName,
263 LPCWSTR pwszText)
264 {
265 xmlwriter *This = impl_from_IXmlWriter(iface);
266
267 FIXME("%p %s %s\n", This, wine_dbgstr_w(pwszName), wine_dbgstr_w(pwszText));
268
269 return E_NOTIMPL;
270 }
271
272 static HRESULT WINAPI xmlwriter_WriteQualifiedName(IXmlWriter *iface, LPCWSTR pwszLocalName,
273 LPCWSTR pwszNamespaceUri)
274 {
275 xmlwriter *This = impl_from_IXmlWriter(iface);
276
277 FIXME("%p %s %s\n", This, wine_dbgstr_w(pwszLocalName), wine_dbgstr_w(pwszNamespaceUri));
278
279 return E_NOTIMPL;
280 }
281
282 static HRESULT WINAPI xmlwriter_WriteRaw(IXmlWriter *iface, LPCWSTR pwszData)
283 {
284 xmlwriter *This = impl_from_IXmlWriter(iface);
285
286 FIXME("%p %s\n", This, wine_dbgstr_w(pwszData));
287
288 return E_NOTIMPL;
289 }
290
291 static HRESULT WINAPI xmlwriter_WriteRawChars(IXmlWriter *iface, const WCHAR *pwch, UINT cwch)
292 {
293 xmlwriter *This = impl_from_IXmlWriter(iface);
294
295 FIXME("%p %s %d\n", This, wine_dbgstr_w(pwch), cwch);
296
297 return E_NOTIMPL;
298 }
299
300 static HRESULT WINAPI xmlwriter_WriteStartDocument(IXmlWriter *iface, XmlStandalone standalone)
301 {
302 xmlwriter *This = impl_from_IXmlWriter(iface);
303
304 FIXME("%p\n", This);
305
306 return E_NOTIMPL;
307 }
308
309 static HRESULT WINAPI xmlwriter_WriteStartElement(IXmlWriter *iface, LPCWSTR pwszPrefix,
310 LPCWSTR pwszLocalName, LPCWSTR pwszNamespaceUri)
311 {
312 xmlwriter *This = impl_from_IXmlWriter(iface);
313
314 FIXME("%p %s %s %s\n", This, wine_dbgstr_w(pwszPrefix), wine_dbgstr_w(pwszLocalName),
315 wine_dbgstr_w(pwszNamespaceUri));
316
317 return E_NOTIMPL;
318 }
319
320 static HRESULT WINAPI xmlwriter_WriteString(IXmlWriter *iface, LPCWSTR pwszText)
321 {
322 xmlwriter *This = impl_from_IXmlWriter(iface);
323
324 FIXME("%p %s\n", This, wine_dbgstr_w(pwszText));
325
326 return E_NOTIMPL;
327 }
328
329 static HRESULT WINAPI xmlwriter_WriteSurrogateCharEntity(IXmlWriter *iface, WCHAR wchLow, WCHAR wchHigh)
330 {
331 xmlwriter *This = impl_from_IXmlWriter(iface);
332
333 FIXME("%p %d %d\n", This, wchLow, wchHigh);
334
335 return E_NOTIMPL;
336 }
337
338 static HRESULT WINAPI xmlwriter_WriteWhitespace(IXmlWriter *iface, LPCWSTR pwszWhitespace)
339 {
340 xmlwriter *This = impl_from_IXmlWriter(iface);
341
342 FIXME("%p %s\n", This, wine_dbgstr_w(pwszWhitespace));
343
344 return E_NOTIMPL;
345 }
346
347 static HRESULT WINAPI xmlwriter_Flush(IXmlWriter *iface)
348 {
349 xmlwriter *This = impl_from_IXmlWriter(iface);
350
351 FIXME("%p\n", This);
352
353 return E_NOTIMPL;
354 }
355
356 static const struct IXmlWriterVtbl xmlwriter_vtbl =
357 {
358 xmlwriter_QueryInterface,
359 xmlwriter_AddRef,
360 xmlwriter_Release,
361 xmlwriter_SetOutput,
362 xmlwriter_GetProperty,
363 xmlwriter_SetProperty,
364 xmlwriter_WriteAttributes,
365 xmlwriter_WriteAttributeString,
366 xmlwriter_WriteCData,
367 xmlwriter_WriteCharEntity,
368 xmlwriter_WriteChars,
369 xmlwriter_WriteComment,
370 xmlwriter_WriteDocType,
371 xmlwriter_WriteElementString,
372 xmlwriter_WriteEndDocument,
373 xmlwriter_WriteEndElement,
374 xmlwriter_WriteEntityRef,
375 xmlwriter_WriteFullEndElement,
376 xmlwriter_WriteName,
377 xmlwriter_WriteNmToken,
378 xmlwriter_WriteNode,
379 xmlwriter_WriteNodeShallow,
380 xmlwriter_WriteProcessingInstruction,
381 xmlwriter_WriteQualifiedName,
382 xmlwriter_WriteRaw,
383 xmlwriter_WriteRawChars,
384 xmlwriter_WriteStartDocument,
385 xmlwriter_WriteStartElement,
386 xmlwriter_WriteString,
387 xmlwriter_WriteSurrogateCharEntity,
388 xmlwriter_WriteWhitespace,
389 xmlwriter_Flush
390 };
391
392 HRESULT WINAPI CreateXmlWriter(REFIID riid, void **pObject, IMalloc *pMalloc)
393 {
394 xmlwriter *writer;
395
396 TRACE("(%s, %p, %p)\n", wine_dbgstr_guid(riid), pObject, pMalloc);
397
398 if (pMalloc) FIXME("custom IMalloc not supported yet\n");
399
400 if (!IsEqualGUID(riid, &IID_IXmlWriter))
401 {
402 ERR("Unexpected IID requested -> (%s)\n", wine_dbgstr_guid(riid));
403 return E_FAIL;
404 }
405
406 writer = HeapAlloc(GetProcessHeap(), 0, sizeof (*writer));
407 if(!writer) return E_OUTOFMEMORY;
408
409 writer->IXmlWriter_iface.lpVtbl = &xmlwriter_vtbl;
410 writer->ref = 1;
411
412 *pObject = &writer->IXmlWriter_iface;
413
414 TRACE("returning iface %p\n", *pObject);
415
416 return S_OK;
417 }