msvcp80: Fixed typo in spec file.
[wine] / dlls / msxml3 / xmlparser.c
1 /*
2  * XML Parser 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 COBJMACROS
21
22 #include "config.h"
23
24 #include <stdarg.h>
25 #ifdef HAVE_LIBXML2
26 # include <libxml/parser.h>
27 # include <libxml/xmlerror.h>
28 # include <libxml/HTMLtree.h>
29 #endif
30
31 #include "windef.h"
32 #include "winbase.h"
33 #include "winuser.h"
34 #include "ole2.h"
35 #include "msxml6.h"
36
37 #include "msxml_private.h"
38
39 #include "initguid.h"
40 #include "xmlparser.h"
41
42 #include "wine/debug.h"
43
44 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
45
46 typedef struct _xmlparser
47 {
48     IXMLParser IXMLParser_iface;
49     IXMLNodeFactory *nodefactory;
50     IUnknown *input;
51     LONG ref;
52
53     int flags;
54 } xmlparser;
55
56 static inline xmlparser *impl_from_IXMLParser( IXMLParser *iface )
57 {
58     return CONTAINING_RECORD(iface, xmlparser, IXMLParser_iface);
59 }
60
61 /*** IUnknown methods ***/
62 static HRESULT WINAPI xmlparser_QueryInterface(IXMLParser* iface, REFIID riid, void **ppvObject)
63 {
64     xmlparser *This = impl_from_IXMLParser( iface );
65     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
66
67     if ( IsEqualGUID( riid, &IID_IXMLParser ) ||
68          IsEqualGUID( riid, &IID_IXMLNodeSource ) ||
69          IsEqualGUID( riid, &IID_IUnknown ) )
70     {
71         *ppvObject = iface;
72     }
73     else
74     {
75         TRACE("Unsupported interface %s\n", debugstr_guid(riid));
76         *ppvObject = NULL;
77         return E_NOINTERFACE;
78     }
79
80     IXMLParser_AddRef(iface);
81     return S_OK;
82 }
83
84 static ULONG WINAPI xmlparser_AddRef(IXMLParser* iface)
85 {
86     xmlparser *This = impl_from_IXMLParser( iface );
87     ULONG ref = InterlockedIncrement( &This->ref );
88     TRACE("(%p)->(%d)\n", This, ref);
89     return ref;
90 }
91
92 static ULONG WINAPI xmlparser_Release(IXMLParser* iface)
93 {
94     xmlparser *This = impl_from_IXMLParser( iface );
95     ULONG ref = InterlockedDecrement( &This->ref );
96
97     TRACE("(%p)->(%d)\n", This, ref);
98     if ( ref == 0 )
99     {
100         if(This->input)
101             IUnknown_Release(This->input);
102
103         if(This->nodefactory)
104             IXMLNodeFactory_Release(This->nodefactory);
105
106         heap_free( This );
107     }
108
109     return ref;
110 }
111
112 /*** IXMLNodeSource methods ***/
113 static HRESULT WINAPI xmlparser_SetFactory(IXMLParser *iface, IXMLNodeFactory *pNodeFactory)
114 {
115     xmlparser *This = impl_from_IXMLParser( iface );
116
117     TRACE("(%p %p)\n", This, pNodeFactory);
118
119     if(This->nodefactory)
120         IXMLNodeFactory_Release(This->nodefactory);
121
122     This->nodefactory = pNodeFactory;
123     if(This->nodefactory)
124         IXMLNodeFactory_AddRef(This->nodefactory);
125
126     return S_OK;
127 }
128
129 static HRESULT WINAPI xmlparser_GetFactory(IXMLParser *iface, IXMLNodeFactory **ppNodeFactory)
130 {
131     xmlparser *This = impl_from_IXMLParser( iface );
132
133     TRACE("(%p, %p)\n", This, ppNodeFactory);
134
135     if(!ppNodeFactory)
136         return E_INVALIDARG;
137
138     *ppNodeFactory = This->nodefactory;
139
140     if(*ppNodeFactory)
141         IXMLNodeFactory_AddRef(*ppNodeFactory);
142
143     return S_OK;
144 }
145
146 static HRESULT WINAPI xmlparser_Abort(IXMLParser *iface, BSTR bstrErrorInfo)
147 {
148     xmlparser *This = impl_from_IXMLParser( iface );
149
150     FIXME("(%p, %s)\n", This, debugstr_w(bstrErrorInfo));
151
152     return E_NOTIMPL;
153 }
154
155 static ULONG WINAPI xmlparser_GetLineNumber(IXMLParser *iface)
156 {
157     xmlparser *This = impl_from_IXMLParser( iface );
158
159     FIXME("(%p)\n", This);
160
161     return 0;
162 }
163
164 static ULONG WINAPI xmlparser_GetLinePosition(IXMLParser *iface)
165 {
166     xmlparser *This = impl_from_IXMLParser( iface );
167
168     FIXME("(%p)\n", This);
169
170     return 0;
171 }
172
173 static ULONG WINAPI xmlparser_GetAbsolutePosition(IXMLParser *iface)
174 {
175     xmlparser *This = impl_from_IXMLParser( iface );
176
177     FIXME("(%p)\n", This);
178
179     return 0;
180 }
181
182 static HRESULT WINAPI xmlparser_GetLineBuffer(IXMLParser *iface, const WCHAR **ppBuf,
183                 ULONG *len, ULONG *startPos)
184 {
185     xmlparser *This = impl_from_IXMLParser( iface );
186
187     FIXME("(%p %p %p %p)\n", This, ppBuf, len, startPos);
188
189     return 0;
190 }
191
192 static HRESULT WINAPI xmlparser_GetLastError(IXMLParser *iface)
193 {
194     xmlparser *This = impl_from_IXMLParser( iface );
195
196     FIXME("(%p)\n", This);
197
198     return E_NOTIMPL;
199 }
200
201 static HRESULT WINAPI xmlparser_GetErrorInfo(IXMLParser *iface, BSTR *pErrorInfo)
202 {
203     xmlparser *This = impl_from_IXMLParser( iface );
204
205     FIXME("(%p %p)\n", This, pErrorInfo);
206
207     return E_NOTIMPL;
208 }
209
210 static ULONG WINAPI xmlparser_GetFlags(IXMLParser *iface)
211 {
212     xmlparser *This = impl_from_IXMLParser( iface );
213
214     TRACE("(%p)\n", This);
215
216     return This->flags;
217 }
218
219 static HRESULT WINAPI xmlparser_GetURL(IXMLParser *iface, const WCHAR **ppBuf)
220 {
221     xmlparser *This = impl_from_IXMLParser( iface );
222
223     FIXME("(%p %p)\n", This, ppBuf);
224
225     return E_NOTIMPL;
226 }
227
228 /*** IXMLParser methods ***/
229 static HRESULT WINAPI xmlparser_SetURL(IXMLParser *iface,const WCHAR *pszBaseUrl,
230                 const WCHAR *relativeUrl, BOOL async)
231 {
232     xmlparser *This = impl_from_IXMLParser( iface );
233
234     FIXME("(%p %s %s %d)\n", This, debugstr_w(pszBaseUrl), debugstr_w(relativeUrl), async);
235
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI xmlparser_Load(IXMLParser *iface, BOOL bFullyAvailable,
240                 IMoniker *pMon, LPBC pBC, DWORD dwMode)
241 {
242     xmlparser *This = impl_from_IXMLParser( iface );
243
244     FIXME("(%p %d %p %p %d)\n", This, bFullyAvailable, pMon, pBC, dwMode);
245
246     return E_NOTIMPL;
247 }
248
249 static HRESULT WINAPI xmlparser_SetInput(IXMLParser *iface, IUnknown *pStm)
250 {
251     xmlparser *This = impl_from_IXMLParser( iface );
252
253     TRACE("(%p %p)\n", This, pStm);
254
255     if(!pStm)
256         return E_INVALIDARG;
257
258     if(This->input)
259         IUnknown_Release(This->input);
260
261     This->input = pStm;
262     IUnknown_AddRef(This->input);
263
264     return S_OK;
265 }
266
267 static HRESULT WINAPI xmlparser_PushData(IXMLParser *iface, const char *pData,
268                 ULONG nChars, BOOL fLastBuffer)
269 {
270     xmlparser *This = impl_from_IXMLParser( iface );
271
272     FIXME("(%p %s %d %d)\n", This, debugstr_a(pData), nChars, fLastBuffer);
273
274     return E_NOTIMPL;
275 }
276
277 static HRESULT WINAPI xmlparser_LoadDTD(IXMLParser *iface, const WCHAR *baseUrl,
278                 const WCHAR *relativeUrl)
279 {
280     xmlparser *This = impl_from_IXMLParser( iface );
281
282     FIXME("(%p %s %s)\n", This, debugstr_w(baseUrl), debugstr_w(relativeUrl));
283
284     return E_NOTIMPL;
285 }
286
287 static HRESULT WINAPI xmlparser_LoadEntity(IXMLParser *iface, const WCHAR *baseUrl,
288                 const WCHAR *relativeUrl, BOOL fpe)
289 {
290     xmlparser *This = impl_from_IXMLParser( iface );
291
292     FIXME("(%p %s %s %d)\n", This, debugstr_w(baseUrl), debugstr_w(relativeUrl), fpe);
293
294     return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI xmlparser_ParseEntity(IXMLParser *iface, const WCHAR *text,
298                 ULONG len, BOOL fpe)
299 {
300     xmlparser *This = impl_from_IXMLParser( iface );
301
302     FIXME("(%p %s %d %d)\n", This, debugstr_w(text), len, fpe);
303
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI xmlparser_ExpandEntity(IXMLParser *iface, const WCHAR *text,
308                 ULONG len)
309 {
310     xmlparser *This = impl_from_IXMLParser( iface );
311
312     FIXME("(%p %s %d)\n", This, debugstr_w(text), len);
313
314     return E_NOTIMPL;
315 }
316
317 static HRESULT WINAPI xmlparser_SetRoot(IXMLParser *iface, PVOID pRoot)
318 {
319     xmlparser *This = impl_from_IXMLParser( iface );
320
321     FIXME("(%p %p)\n", This, pRoot);
322
323     return E_NOTIMPL;
324 }
325
326 static HRESULT WINAPI xmlparser_GetRoot( IXMLParser *iface, PVOID *ppRoot)
327 {
328     xmlparser *This = impl_from_IXMLParser( iface );
329
330     FIXME("(%p %p)\n", This, ppRoot);
331
332     return E_NOTIMPL;
333 }
334
335 static HRESULT WINAPI xmlparser_Run(IXMLParser *iface, LONG chars)
336 {
337     xmlparser *This = impl_from_IXMLParser( iface );
338
339     FIXME("(%p %d)\n", This, chars);
340
341     return E_NOTIMPL;
342 }
343
344 static HRESULT WINAPI xmlparser_GetParserState(IXMLParser *iface)
345 {
346     xmlparser *This = impl_from_IXMLParser( iface );
347
348     FIXME("(%p)\n", This);
349
350     return E_NOTIMPL;
351 }
352
353 static HRESULT WINAPI xmlparser_Suspend(IXMLParser *iface)
354 {
355     xmlparser *This = impl_from_IXMLParser( iface );
356
357     FIXME("(%p)\n", This);
358
359     return E_NOTIMPL;
360 }
361
362 static HRESULT WINAPI xmlparser_Reset(IXMLParser *iface)
363 {
364     xmlparser *This = impl_from_IXMLParser( iface );
365
366     FIXME("(%p)\n", This);
367
368     return E_NOTIMPL;
369 }
370
371 static HRESULT WINAPI xmlparser_SetFlags(IXMLParser *iface, ULONG flags)
372 {
373     xmlparser *This = impl_from_IXMLParser( iface );
374
375     TRACE("(%p %d)\n", This, flags);
376
377     This->flags = flags;
378
379     return S_OK;
380 }
381
382 static HRESULT WINAPI xmlparser_SetSecureBaseURL(IXMLParser *iface, const WCHAR *baseUrl)
383 {
384     xmlparser *This = impl_from_IXMLParser( iface );
385
386     FIXME("(%p %s)\n", This, debugstr_w(baseUrl));
387
388     return E_NOTIMPL;
389 }
390
391 static HRESULT WINAPI xmlparser_GetSecureBaseURL( IXMLParser *iface, const WCHAR **ppBuf)
392 {
393     xmlparser *This = impl_from_IXMLParser( iface );
394
395     FIXME("(%p %p)\n", This, ppBuf);
396
397     return E_NOTIMPL;
398 }
399
400
401 static const struct IXMLParserVtbl xmlparser_vtbl =
402 {
403     xmlparser_QueryInterface,
404     xmlparser_AddRef,
405     xmlparser_Release,
406     xmlparser_SetFactory,
407     xmlparser_GetFactory,
408     xmlparser_Abort,
409     xmlparser_GetLineNumber,
410     xmlparser_GetLinePosition,
411     xmlparser_GetAbsolutePosition,
412     xmlparser_GetLineBuffer,
413     xmlparser_GetLastError,
414     xmlparser_GetErrorInfo,
415     xmlparser_GetFlags,
416     xmlparser_GetURL,
417     xmlparser_SetURL,
418     xmlparser_Load,
419     xmlparser_SetInput,
420     xmlparser_PushData,
421     xmlparser_LoadDTD,
422     xmlparser_LoadEntity,
423     xmlparser_ParseEntity,
424     xmlparser_ExpandEntity,
425     xmlparser_SetRoot,
426     xmlparser_GetRoot,
427     xmlparser_Run,
428     xmlparser_GetParserState,
429     xmlparser_Suspend,
430     xmlparser_Reset,
431     xmlparser_SetFlags,
432     xmlparser_SetSecureBaseURL,
433     xmlparser_GetSecureBaseURL
434 };
435
436 HRESULT XMLParser_create(IUnknown* pUnkOuter, void**ppObj)
437 {
438     xmlparser *This;
439
440     TRACE("(%p,%p)\n", pUnkOuter, ppObj);
441
442     if (pUnkOuter)
443         FIXME("support aggregation, outer\n");
444
445     This = heap_alloc( sizeof(xmlparser) );
446     if(!This)
447         return E_OUTOFMEMORY;
448
449     This->IXMLParser_iface.lpVtbl = &xmlparser_vtbl;
450     This->nodefactory = NULL;
451     This->input = NULL;
452     This->flags = 0;
453     This->ref = 1;
454
455     *ppObj = &This->IXMLParser_iface;
456
457     TRACE("returning iface %p\n", *ppObj);
458
459     return S_OK;
460 }