2 * SAX Reader implementation
4 * Copyright 2008 Alistair Leslie-Hughes
5 * Copyright 2008 Piotr Caban
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
38 #include "wine/debug.h"
40 #include "msxml_private.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
46 #include <libxml/SAX2.h>
48 typedef struct _saxreader
50 const struct IVBSAXXMLReaderVtbl *lpVtbl;
51 const struct ISAXXMLReaderVtbl *lpSAXXMLReaderVtbl;
53 struct ISAXContentHandler *contentHandler;
54 struct ISAXErrorHandler *errorHandler;
58 typedef struct _saxlocator
60 const struct ISAXLocatorVtbl *lpSAXLocatorVtbl;
64 xmlParserCtxtPtr pParserCtxt;
69 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
71 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpVtbl));
74 static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
76 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpSAXXMLReaderVtbl));
79 static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
81 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl));
84 /*** LibXML callbacks ***/
85 static void libxmlStartDocument(void *ctx)
87 saxlocator *This = ctx;
90 if(This->saxreader->contentHandler)
92 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
95 xmlStopParser(This->pParserCtxt);
100 This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt);
101 This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt);
104 static void libxmlEndDocument(void *ctx)
106 saxlocator *This = ctx;
109 This->lastColumn = 0;
112 if(This->saxreader->contentHandler)
114 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
117 xmlStopParser(This->pParserCtxt);
123 /*** ISAXLocator interface ***/
124 /*** IUnknown methods ***/
125 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
127 saxlocator *This = impl_from_ISAXLocator( iface );
129 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
133 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
134 IsEqualGUID( riid, &IID_ISAXLocator ))
140 FIXME("interface %s not implemented\n", debugstr_guid(riid));
141 return E_NOINTERFACE;
144 ISAXLocator_AddRef( iface );
149 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
151 saxlocator *This = impl_from_ISAXLocator( iface );
152 TRACE("%p\n", This );
153 return InterlockedIncrement( &This->ref );
156 static ULONG WINAPI isaxlocator_Release(
159 saxlocator *This = impl_from_ISAXLocator( iface );
162 TRACE("%p\n", This );
164 ref = InterlockedDecrement( &This->ref );
167 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
168 HeapFree( GetProcessHeap(), 0, This );
174 /*** ISAXLocator methods ***/
175 static HRESULT WINAPI isaxlocator_getColumnNumber(
179 saxlocator *This = impl_from_ISAXLocator( iface );
181 *pnColumn = This->lastColumn;
185 static HRESULT WINAPI isaxlocator_getLineNumber(
189 saxlocator *This = impl_from_ISAXLocator( iface );
191 *pnLine = This->lastLine;
195 static HRESULT WINAPI isaxlocator_getPublicId(
197 const WCHAR ** ppwchPublicId)
199 saxlocator *This = impl_from_ISAXLocator( iface );
201 FIXME("(%p)->(%p) stub\n", This, ppwchPublicId);
205 static HRESULT WINAPI isaxlocator_getSystemId(
207 const WCHAR ** ppwchSystemId)
209 saxlocator *This = impl_from_ISAXLocator( iface );
211 FIXME("(%p)->(%p) stub\n", This, ppwchSystemId);
215 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
217 isaxlocator_QueryInterface,
220 isaxlocator_getColumnNumber,
221 isaxlocator_getLineNumber,
222 isaxlocator_getPublicId,
223 isaxlocator_getSystemId
226 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator)
230 locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) );
232 return E_OUTOFMEMORY;
234 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
237 locator->saxreader = reader;
238 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
240 locator->pParserCtxt = NULL;
241 locator->lastLine = 0;
242 locator->lastColumn = 0;
245 *ppsaxlocator = locator;
247 TRACE("returning %p\n", *ppsaxlocator);
252 /*** IVBSAXXMLReader interface ***/
253 /*** IUnknown methods ***/
254 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
256 saxreader *This = impl_from_IVBSAXXMLReader( iface );
258 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
262 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
263 IsEqualGUID( riid, &IID_IDispatch ) ||
264 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
268 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
270 *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
274 FIXME("interface %s not implemented\n", debugstr_guid(riid));
275 return E_NOINTERFACE;
278 IVBSAXXMLReader_AddRef( iface );
283 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
285 saxreader *This = impl_from_IVBSAXXMLReader( iface );
286 TRACE("%p\n", This );
287 return InterlockedIncrement( &This->ref );
290 static ULONG WINAPI saxxmlreader_Release(
291 IVBSAXXMLReader* iface)
293 saxreader *This = impl_from_IVBSAXXMLReader( iface );
296 TRACE("%p\n", This );
298 ref = InterlockedDecrement( &This->ref );
301 if(This->contentHandler)
302 ISAXContentHandler_Release(This->contentHandler);
304 if(This->errorHandler)
305 ISAXErrorHandler_Release(This->errorHandler);
307 HeapFree( GetProcessHeap(), 0, This );
313 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
315 saxreader *This = impl_from_IVBSAXXMLReader( iface );
317 TRACE("(%p)->(%p)\n", This, pctinfo);
324 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
325 IVBSAXXMLReader *iface,
326 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
328 saxreader *This = impl_from_IVBSAXXMLReader( iface );
331 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
333 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
338 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
339 IVBSAXXMLReader *iface,
346 saxreader *This = impl_from_IVBSAXXMLReader( iface );
350 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
353 if(!rgszNames || cNames == 0 || !rgDispId)
356 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
359 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
360 ITypeInfo_Release(typeinfo);
366 static HRESULT WINAPI saxxmlreader_Invoke(
367 IVBSAXXMLReader *iface,
372 DISPPARAMS* pDispParams,
374 EXCEPINFO* pExcepInfo,
377 saxreader *This = impl_from_IVBSAXXMLReader( iface );
381 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
382 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
384 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
387 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
388 pVarResult, pExcepInfo, puArgErr);
389 ITypeInfo_Release(typeinfo);
395 /*** IVBSAXXMLReader methods ***/
396 static HRESULT WINAPI saxxmlreader_getFeature(
397 IVBSAXXMLReader* iface,
398 const WCHAR *pFeature,
399 VARIANT_BOOL *pValue)
401 saxreader *This = impl_from_IVBSAXXMLReader( iface );
403 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
407 static HRESULT WINAPI saxxmlreader_putFeature(
408 IVBSAXXMLReader* iface,
409 const WCHAR *pFeature,
410 VARIANT_BOOL vfValue)
412 saxreader *This = impl_from_IVBSAXXMLReader( iface );
414 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
418 static HRESULT WINAPI saxxmlreader_getProperty(
419 IVBSAXXMLReader* iface,
423 saxreader *This = impl_from_IVBSAXXMLReader( iface );
425 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
429 static HRESULT WINAPI saxxmlreader_putProperty(
430 IVBSAXXMLReader* iface,
434 saxreader *This = impl_from_IVBSAXXMLReader( iface );
436 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
440 static HRESULT WINAPI saxxmlreader_getEntityResolver(
441 IVBSAXXMLReader* iface,
442 IVBSAXEntityResolver **pEntityResolver)
444 saxreader *This = impl_from_IVBSAXXMLReader( iface );
446 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
450 static HRESULT WINAPI saxxmlreader_putEntityResolver(
451 IVBSAXXMLReader* iface,
452 IVBSAXEntityResolver *pEntityResolver)
454 saxreader *This = impl_from_IVBSAXXMLReader( iface );
456 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
460 static HRESULT WINAPI saxxmlreader_getContentHandler(
461 IVBSAXXMLReader* iface,
462 IVBSAXContentHandler **ppContentHandler)
464 saxreader *This = impl_from_IVBSAXXMLReader( iface );
466 FIXME("(%p)->(%p) stub\n", This, ppContentHandler);
470 static HRESULT WINAPI saxxmlreader_putContentHandler(
471 IVBSAXXMLReader* iface,
472 IVBSAXContentHandler *contentHandler)
474 saxreader *This = impl_from_IVBSAXXMLReader( iface );
476 FIXME("(%p)->(%p) stub\n", This, contentHandler);
480 static HRESULT WINAPI saxxmlreader_getDTDHandler(
481 IVBSAXXMLReader* iface,
482 IVBSAXDTDHandler **pDTDHandler)
484 saxreader *This = impl_from_IVBSAXXMLReader( iface );
486 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
490 static HRESULT WINAPI saxxmlreader_putDTDHandler(
491 IVBSAXXMLReader* iface,
492 IVBSAXDTDHandler *pDTDHandler)
494 saxreader *This = impl_from_IVBSAXXMLReader( iface );
496 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
500 static HRESULT WINAPI saxxmlreader_getErrorHandler(
501 IVBSAXXMLReader* iface,
502 IVBSAXErrorHandler **pErrorHandler)
504 saxreader *This = impl_from_IVBSAXXMLReader( iface );
506 FIXME("(%p)->(%p) stub\n", This, pErrorHandler);
510 static HRESULT WINAPI saxxmlreader_putErrorHandler(
511 IVBSAXXMLReader* iface,
512 IVBSAXErrorHandler *errorHandler)
514 saxreader *This = impl_from_IVBSAXXMLReader( iface );
516 FIXME("(%p)->(%p) stub\n", This, errorHandler);
520 static HRESULT WINAPI saxxmlreader_getBaseURL(
521 IVBSAXXMLReader* iface,
522 const WCHAR **pBaseUrl)
524 saxreader *This = impl_from_IVBSAXXMLReader( iface );
526 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
530 static HRESULT WINAPI saxxmlreader_putBaseURL(
531 IVBSAXXMLReader* iface,
532 const WCHAR *pBaseUrl)
534 saxreader *This = impl_from_IVBSAXXMLReader( iface );
536 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
540 static HRESULT WINAPI saxxmlreader_getSecureBaseURL(
541 IVBSAXXMLReader* iface,
542 const WCHAR **pSecureBaseUrl)
544 saxreader *This = impl_from_IVBSAXXMLReader( iface );
546 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
551 static HRESULT WINAPI saxxmlreader_putSecureBaseURL(
552 IVBSAXXMLReader* iface,
553 const WCHAR *secureBaseUrl)
555 saxreader *This = impl_from_IVBSAXXMLReader( iface );
557 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
561 static HRESULT WINAPI saxxmlreader_parse(
562 IVBSAXXMLReader* iface,
565 saxreader *This = impl_from_IVBSAXXMLReader( iface );
567 FIXME("(%p) stub\n", This);
571 static HRESULT WINAPI saxxmlreader_parseURL(
572 IVBSAXXMLReader* iface,
575 saxreader *This = impl_from_IVBSAXXMLReader( iface );
577 FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
581 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
583 saxxmlreader_QueryInterface,
585 saxxmlreader_Release,
586 saxxmlreader_GetTypeInfoCount,
587 saxxmlreader_GetTypeInfo,
588 saxxmlreader_GetIDsOfNames,
590 saxxmlreader_getFeature,
591 saxxmlreader_putFeature,
592 saxxmlreader_getProperty,
593 saxxmlreader_putProperty,
594 saxxmlreader_getEntityResolver,
595 saxxmlreader_putEntityResolver,
596 saxxmlreader_getContentHandler,
597 saxxmlreader_putContentHandler,
598 saxxmlreader_getDTDHandler,
599 saxxmlreader_putDTDHandler,
600 saxxmlreader_getErrorHandler,
601 saxxmlreader_putErrorHandler,
602 saxxmlreader_getBaseURL,
603 saxxmlreader_putBaseURL,
604 saxxmlreader_getSecureBaseURL,
605 saxxmlreader_putSecureBaseURL,
607 saxxmlreader_parseURL
610 /*** ISAXXMLReader interface ***/
611 /*** IUnknown methods ***/
612 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
614 saxreader *This = impl_from_ISAXXMLReader( iface );
615 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVtbl, riid, ppvObject);
618 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
620 saxreader *This = impl_from_ISAXXMLReader( iface );
621 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVtbl);
624 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
626 saxreader *This = impl_from_ISAXXMLReader( iface );
627 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVtbl);
630 /*** ISAXXMLReader methods ***/
631 static HRESULT WINAPI isaxxmlreader_getFeature(
632 ISAXXMLReader* iface,
633 const WCHAR *pFeature,
634 VARIANT_BOOL *pValue)
636 saxreader *This = impl_from_ISAXXMLReader( iface );
638 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
642 static HRESULT WINAPI isaxxmlreader_putFeature(
643 ISAXXMLReader* iface,
644 const WCHAR *pFeature,
645 VARIANT_BOOL vfValue)
647 saxreader *This = impl_from_ISAXXMLReader( iface );
649 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
653 static HRESULT WINAPI isaxxmlreader_getProperty(
654 ISAXXMLReader* iface,
658 saxreader *This = impl_from_ISAXXMLReader( iface );
660 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
664 static HRESULT WINAPI isaxxmlreader_putProperty(
665 ISAXXMLReader* iface,
669 saxreader *This = impl_from_ISAXXMLReader( iface );
671 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
675 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
676 ISAXXMLReader* iface,
677 ISAXEntityResolver **ppEntityResolver)
679 saxreader *This = impl_from_ISAXXMLReader( iface );
681 FIXME("(%p)->(%p) stub\n", This, ppEntityResolver);
685 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
686 ISAXXMLReader* iface,
687 ISAXEntityResolver *pEntityResolver)
689 saxreader *This = impl_from_ISAXXMLReader( iface );
691 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
695 static HRESULT WINAPI isaxxmlreader_getContentHandler(
696 ISAXXMLReader* iface,
697 ISAXContentHandler **pContentHandler)
699 saxreader *This = impl_from_ISAXXMLReader( iface );
701 TRACE("(%p)->(%p)\n", This, pContentHandler);
702 if(pContentHandler == NULL)
704 if(This->contentHandler)
705 ISAXContentHandler_AddRef(This->contentHandler);
706 *pContentHandler = This->contentHandler;
711 static HRESULT WINAPI isaxxmlreader_putContentHandler(
712 ISAXXMLReader* iface,
713 ISAXContentHandler *contentHandler)
715 saxreader *This = impl_from_ISAXXMLReader( iface );
717 TRACE("(%p)->(%p)\n", This, contentHandler);
719 ISAXContentHandler_AddRef(contentHandler);
720 if(This->contentHandler)
721 ISAXContentHandler_Release(This->contentHandler);
722 This->contentHandler = contentHandler;
727 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
728 ISAXXMLReader* iface,
729 ISAXDTDHandler **pDTDHandler)
731 saxreader *This = impl_from_ISAXXMLReader( iface );
733 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
737 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
738 ISAXXMLReader* iface,
739 ISAXDTDHandler *pDTDHandler)
741 saxreader *This = impl_from_ISAXXMLReader( iface );
743 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
747 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
748 ISAXXMLReader* iface,
749 ISAXErrorHandler **pErrorHandler)
751 saxreader *This = impl_from_ISAXXMLReader( iface );
753 TRACE("(%p)->(%p)\n", This, pErrorHandler);
754 if(pErrorHandler == NULL)
756 if(This->errorHandler)
757 ISAXErrorHandler_AddRef(This->errorHandler);
758 *pErrorHandler = This->errorHandler;
763 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
764 ISAXXMLReader* iface,
765 ISAXErrorHandler *errorHandler)
767 saxreader *This = impl_from_ISAXXMLReader( iface );
769 TRACE("(%p)->(%p)\n", This, errorHandler);
771 ISAXErrorHandler_AddRef(errorHandler);
772 if(This->errorHandler)
773 ISAXErrorHandler_Release(This->errorHandler);
774 This->errorHandler = errorHandler;
779 static HRESULT WINAPI isaxxmlreader_getBaseURL(
780 ISAXXMLReader* iface,
781 const WCHAR **pBaseUrl)
783 saxreader *This = impl_from_ISAXXMLReader( iface );
785 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
789 static HRESULT WINAPI isaxxmlreader_putBaseURL(
790 ISAXXMLReader* iface,
791 const WCHAR *pBaseUrl)
793 saxreader *This = impl_from_ISAXXMLReader( iface );
795 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
799 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
800 ISAXXMLReader* iface,
801 const WCHAR **pSecureBaseUrl)
803 saxreader *This = impl_from_ISAXXMLReader( iface );
805 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
809 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
810 ISAXXMLReader* iface,
811 const WCHAR *secureBaseUrl)
813 saxreader *This = impl_from_ISAXXMLReader( iface );
815 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
819 static HRESULT WINAPI isaxxmlreader_parse(
820 ISAXXMLReader* iface,
823 saxreader *This = impl_from_ISAXXMLReader( iface );
825 xmlChar *data = NULL;
828 FIXME("(%p) semi-stub\n", This);
830 hr = SAXLocator_create(This, &locator);
835 switch(V_VT(&varInput))
838 locator->pParserCtxt = xmlNewParserCtxt();
839 if(!locator->pParserCtxt)
844 data = xmlChar_from_wchar(V_BSTR(&varInput));
845 xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
847 locator->pParserCtxt->sax = &locator->saxreader->sax;
848 locator->pParserCtxt->userData = locator;
850 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
851 else hr = locator->ret;
857 if(locator->pParserCtxt)
859 locator->pParserCtxt->sax = NULL;
860 xmlFreeParserCtxt(locator->pParserCtxt);
861 locator->pParserCtxt = NULL;
863 if(data) HeapFree(GetProcessHeap(), 0, data);
864 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
868 static HRESULT WINAPI isaxxmlreader_parseURL(
869 ISAXXMLReader* iface,
872 saxreader *This = impl_from_ISAXXMLReader( iface );
874 FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
878 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
880 isaxxmlreader_QueryInterface,
881 isaxxmlreader_AddRef,
882 isaxxmlreader_Release,
883 isaxxmlreader_getFeature,
884 isaxxmlreader_putFeature,
885 isaxxmlreader_getProperty,
886 isaxxmlreader_putProperty,
887 isaxxmlreader_getEntityResolver,
888 isaxxmlreader_putEntityResolver,
889 isaxxmlreader_getContentHandler,
890 isaxxmlreader_putContentHandler,
891 isaxxmlreader_getDTDHandler,
892 isaxxmlreader_putDTDHandler,
893 isaxxmlreader_getErrorHandler,
894 isaxxmlreader_putErrorHandler,
895 isaxxmlreader_getBaseURL,
896 isaxxmlreader_putBaseURL,
897 isaxxmlreader_getSecureBaseURL,
898 isaxxmlreader_putSecureBaseURL,
900 isaxxmlreader_parseURL
903 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
907 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
909 reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) );
911 return E_OUTOFMEMORY;
913 reader->lpVtbl = &saxreader_vtbl;
914 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
916 reader->contentHandler = NULL;
917 reader->errorHandler = NULL;
919 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
920 reader->sax.initialized = XML_SAX2_MAGIC;
921 reader->sax.startDocument = libxmlStartDocument;
922 reader->sax.endDocument = libxmlEndDocument;
924 *ppObj = &reader->lpVtbl;
926 TRACE("returning iface %p\n", *ppObj);
933 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
935 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
936 "libxml2 support was not present at compile time.\n");