2 * SAX Reader implementation
4 * Copyright 2008 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
37 #include "wine/debug.h"
39 #include "msxml_private.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(msxml
);
45 #include <libxml/SAX2.h>
47 typedef struct _saxreader
49 const struct IVBSAXXMLReaderVtbl
*lpVtbl
;
50 const struct ISAXXMLReaderVtbl
*lpSAXXMLReaderVtbl
;
52 struct ISAXContentHandler
*contentHandler
;
56 static inline saxreader
*impl_from_IVBSAXXMLReader( IVBSAXXMLReader
*iface
)
58 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpVtbl
));
61 static inline saxreader
*impl_from_ISAXXMLReader( ISAXXMLReader
*iface
)
63 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpSAXXMLReaderVtbl
));
66 /*** IVBSAXXMLReader interface ***/
67 /*** IUnknown methods ***/
68 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
70 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
72 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
76 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
77 IsEqualGUID( riid
, &IID_IDispatch
) ||
78 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
82 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
84 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
88 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
92 IVBSAXXMLReader_AddRef( iface
);
97 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
99 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
100 TRACE("%p\n", This
);
101 return InterlockedIncrement( &This
->ref
);
104 static ULONG WINAPI
saxxmlreader_Release(
105 IVBSAXXMLReader
* iface
)
107 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
110 TRACE("%p\n", This
);
112 ref
= InterlockedDecrement( &This
->ref
);
115 if(This
->contentHandler
)
116 ISAXContentHandler_Release(This
->contentHandler
);
118 HeapFree( GetProcessHeap(), 0, This
);
124 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
126 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
128 TRACE("(%p)->(%p)\n", This
, pctinfo
);
135 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
136 IVBSAXXMLReader
*iface
,
137 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
139 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
142 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
144 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
149 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
150 IVBSAXXMLReader
*iface
,
157 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
161 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
164 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
167 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
170 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
171 ITypeInfo_Release(typeinfo
);
177 static HRESULT WINAPI
saxxmlreader_Invoke(
178 IVBSAXXMLReader
*iface
,
183 DISPPARAMS
* pDispParams
,
185 EXCEPINFO
* pExcepInfo
,
188 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
192 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
193 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
195 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
198 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVtbl
), dispIdMember
, wFlags
, pDispParams
,
199 pVarResult
, pExcepInfo
, puArgErr
);
200 ITypeInfo_Release(typeinfo
);
206 /*** IVBSAXXMLReader methods ***/
207 static HRESULT WINAPI
saxxmlreader_getFeature(
208 IVBSAXXMLReader
* iface
,
209 const WCHAR
*pFeature
,
210 VARIANT_BOOL
*pValue
)
212 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
214 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
218 static HRESULT WINAPI
saxxmlreader_putFeature(
219 IVBSAXXMLReader
* iface
,
220 const WCHAR
*pFeature
,
221 VARIANT_BOOL vfValue
)
223 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
225 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
229 static HRESULT WINAPI
saxxmlreader_getProperty(
230 IVBSAXXMLReader
* iface
,
234 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
236 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
240 static HRESULT WINAPI
saxxmlreader_putProperty(
241 IVBSAXXMLReader
* iface
,
245 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
247 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
251 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
252 IVBSAXXMLReader
* iface
,
253 IVBSAXEntityResolver
**pEntityResolver
)
255 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
257 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
261 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
262 IVBSAXXMLReader
* iface
,
263 IVBSAXEntityResolver
*pEntityResolver
)
265 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
267 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
271 static HRESULT WINAPI
saxxmlreader_getContentHandler(
272 IVBSAXXMLReader
* iface
,
273 IVBSAXContentHandler
**ppContentHandler
)
275 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
277 FIXME("(%p)->(%p) stub\n", This
, ppContentHandler
);
281 static HRESULT WINAPI
saxxmlreader_putContentHandler(
282 IVBSAXXMLReader
* iface
,
283 IVBSAXContentHandler
*contentHandler
)
285 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
287 FIXME("(%p)->(%p) stub\n", This
, contentHandler
);
291 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
292 IVBSAXXMLReader
* iface
,
293 IVBSAXDTDHandler
**pDTDHandler
)
295 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
297 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
301 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
302 IVBSAXXMLReader
* iface
,
303 IVBSAXDTDHandler
*pDTDHandler
)
305 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
307 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
311 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
312 IVBSAXXMLReader
* iface
,
313 IVBSAXErrorHandler
**pErrorHandler
)
315 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
317 FIXME("(%p)->(%p) stub\n", This
, pErrorHandler
);
321 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
322 IVBSAXXMLReader
* iface
,
323 IVBSAXErrorHandler
*errorHandler
)
325 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
327 FIXME("(%p)->(%p) stub\n", This
, errorHandler
);
331 static HRESULT WINAPI
saxxmlreader_getBaseURL(
332 IVBSAXXMLReader
* iface
,
333 const WCHAR
**pBaseUrl
)
335 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
337 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
341 static HRESULT WINAPI
saxxmlreader_putBaseURL(
342 IVBSAXXMLReader
* iface
,
343 const WCHAR
*pBaseUrl
)
345 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
347 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
351 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
352 IVBSAXXMLReader
* iface
,
353 const WCHAR
**pSecureBaseUrl
)
355 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
357 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
362 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
363 IVBSAXXMLReader
* iface
,
364 const WCHAR
*secureBaseUrl
)
366 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
368 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
372 static HRESULT WINAPI
saxxmlreader_parse(
373 IVBSAXXMLReader
* iface
,
376 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
378 FIXME("(%p) stub\n", This
);
382 static HRESULT WINAPI
saxxmlreader_parseURL(
383 IVBSAXXMLReader
* iface
,
386 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
388 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
392 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
394 saxxmlreader_QueryInterface
,
396 saxxmlreader_Release
,
397 saxxmlreader_GetTypeInfoCount
,
398 saxxmlreader_GetTypeInfo
,
399 saxxmlreader_GetIDsOfNames
,
401 saxxmlreader_getFeature
,
402 saxxmlreader_putFeature
,
403 saxxmlreader_getProperty
,
404 saxxmlreader_putProperty
,
405 saxxmlreader_getEntityResolver
,
406 saxxmlreader_putEntityResolver
,
407 saxxmlreader_getContentHandler
,
408 saxxmlreader_putContentHandler
,
409 saxxmlreader_getDTDHandler
,
410 saxxmlreader_putDTDHandler
,
411 saxxmlreader_getErrorHandler
,
412 saxxmlreader_putErrorHandler
,
413 saxxmlreader_getBaseURL
,
414 saxxmlreader_putBaseURL
,
415 saxxmlreader_getSecureBaseURL
,
416 saxxmlreader_putSecureBaseURL
,
418 saxxmlreader_parseURL
421 /*** ISAXXMLReader interface ***/
422 /*** IUnknown methods ***/
423 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
425 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
426 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVtbl
, riid
, ppvObject
);
429 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
431 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
432 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVtbl
);
435 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
437 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
438 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVtbl
);
441 /*** ISAXXMLReader methods ***/
442 static HRESULT WINAPI
isaxxmlreader_getFeature(
443 ISAXXMLReader
* iface
,
444 const WCHAR
*pFeature
,
445 VARIANT_BOOL
*pValue
)
447 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
449 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
453 static HRESULT WINAPI
isaxxmlreader_putFeature(
454 ISAXXMLReader
* iface
,
455 const WCHAR
*pFeature
,
456 VARIANT_BOOL vfValue
)
458 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
460 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
464 static HRESULT WINAPI
isaxxmlreader_getProperty(
465 ISAXXMLReader
* iface
,
469 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
471 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
475 static HRESULT WINAPI
isaxxmlreader_putProperty(
476 ISAXXMLReader
* iface
,
480 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
482 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
486 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
487 ISAXXMLReader
* iface
,
488 ISAXEntityResolver
**ppEntityResolver
)
490 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
492 FIXME("(%p)->(%p) stub\n", This
, ppEntityResolver
);
496 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
497 ISAXXMLReader
* iface
,
498 ISAXEntityResolver
*pEntityResolver
)
500 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
502 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
506 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
507 ISAXXMLReader
* iface
,
508 ISAXContentHandler
**pContentHandler
)
510 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
512 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
513 if(This
->contentHandler
)
514 ISAXContentHandler_AddRef(This
->contentHandler
);
515 *pContentHandler
= This
->contentHandler
;
520 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
521 ISAXXMLReader
* iface
,
522 ISAXContentHandler
*contentHandler
)
524 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
526 TRACE("(%p)->(%p)\n", This
, contentHandler
);
528 ISAXContentHandler_AddRef(contentHandler
);
529 if(This
->contentHandler
)
530 ISAXContentHandler_Release(This
->contentHandler
);
531 This
->contentHandler
= contentHandler
;
536 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
537 ISAXXMLReader
* iface
,
538 ISAXDTDHandler
**pDTDHandler
)
540 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
542 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
546 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
547 ISAXXMLReader
* iface
,
548 ISAXDTDHandler
*pDTDHandler
)
550 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
552 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
556 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
557 ISAXXMLReader
* iface
,
558 ISAXErrorHandler
**pErrorHandler
)
560 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
562 FIXME("(%p)->(%p) stub\n", This
, pErrorHandler
);
566 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
567 ISAXXMLReader
* iface
,
568 ISAXErrorHandler
*errorHandler
)
570 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
572 FIXME("(%p)->(%p) stub\n", This
, errorHandler
);
576 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
577 ISAXXMLReader
* iface
,
578 const WCHAR
**pBaseUrl
)
580 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
582 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
586 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
587 ISAXXMLReader
* iface
,
588 const WCHAR
*pBaseUrl
)
590 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
592 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
596 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
597 ISAXXMLReader
* iface
,
598 const WCHAR
**pSecureBaseUrl
)
600 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
602 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
606 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
607 ISAXXMLReader
* iface
,
608 const WCHAR
*secureBaseUrl
)
610 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
612 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
616 static HRESULT WINAPI
isaxxmlreader_parse(
617 ISAXXMLReader
* iface
,
620 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
622 FIXME("(%p) stub\n", This
);
626 static HRESULT WINAPI
isaxxmlreader_parseURL(
627 ISAXXMLReader
* iface
,
630 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
632 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
636 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
638 isaxxmlreader_QueryInterface
,
639 isaxxmlreader_AddRef
,
640 isaxxmlreader_Release
,
641 isaxxmlreader_getFeature
,
642 isaxxmlreader_putFeature
,
643 isaxxmlreader_getProperty
,
644 isaxxmlreader_putProperty
,
645 isaxxmlreader_getEntityResolver
,
646 isaxxmlreader_putEntityResolver
,
647 isaxxmlreader_getContentHandler
,
648 isaxxmlreader_putContentHandler
,
649 isaxxmlreader_getDTDHandler
,
650 isaxxmlreader_putDTDHandler
,
651 isaxxmlreader_getErrorHandler
,
652 isaxxmlreader_putErrorHandler
,
653 isaxxmlreader_getBaseURL
,
654 isaxxmlreader_putBaseURL
,
655 isaxxmlreader_getSecureBaseURL
,
656 isaxxmlreader_putSecureBaseURL
,
658 isaxxmlreader_parseURL
661 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
665 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
667 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
669 return E_OUTOFMEMORY
;
671 reader
->lpVtbl
= &saxreader_vtbl
;
672 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
674 reader
->contentHandler
= NULL
;
676 *ppObj
= &reader
->lpVtbl
;
678 TRACE("returning iface %p\n", *ppObj
);
685 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
687 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
688 "libxml2 support was not present at compile time.\n");