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 static void libxmlStartElementNS(
125 const xmlChar *localname,
126 const xmlChar *prefix,
129 const xmlChar **namespaces,
132 const xmlChar **attributes)
134 BSTR NamespaceUri, LocalName, QName;
135 saxlocator *This = ctx;
138 FIXME("Arguments processing not yet implemented.\n");
140 This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt)+1;
141 This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt);
143 if(This->saxreader->contentHandler)
145 NamespaceUri = bstr_from_xmlChar(URI);
146 LocalName = bstr_from_xmlChar(localname);
147 QName = bstr_from_xmlChar(localname);
149 hr = ISAXContentHandler_startElement(
150 This->saxreader->contentHandler,
151 NamespaceUri, SysStringLen(NamespaceUri),
152 LocalName, SysStringLen(LocalName),
153 QName, SysStringLen(QName),
156 SysFreeString(NamespaceUri);
157 SysFreeString(LocalName);
158 SysFreeString(QName);
162 xmlStopParser(This->pParserCtxt);
168 static void libxmlEndElementNS(
170 const xmlChar *localname,
171 const xmlChar *prefix,
174 BSTR NamespaceUri, LocalName, QName;
175 saxlocator *This = ctx;
178 This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt);
179 This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt);
181 if(This->saxreader->contentHandler)
183 NamespaceUri = bstr_from_xmlChar(URI);
184 LocalName = bstr_from_xmlChar(localname);
185 QName = bstr_from_xmlChar(localname);
187 hr = ISAXContentHandler_endElement(
188 This->saxreader->contentHandler,
189 NamespaceUri, SysStringLen(NamespaceUri),
190 LocalName, SysStringLen(LocalName),
191 QName, SysStringLen(QName));
193 SysFreeString(NamespaceUri);
194 SysFreeString(LocalName);
195 SysFreeString(QName);
199 xmlStopParser(This->pParserCtxt);
205 /*** ISAXLocator interface ***/
206 /*** IUnknown methods ***/
207 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
209 saxlocator *This = impl_from_ISAXLocator( iface );
211 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
215 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
216 IsEqualGUID( riid, &IID_ISAXLocator ))
222 FIXME("interface %s not implemented\n", debugstr_guid(riid));
223 return E_NOINTERFACE;
226 ISAXLocator_AddRef( iface );
231 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
233 saxlocator *This = impl_from_ISAXLocator( iface );
234 TRACE("%p\n", This );
235 return InterlockedIncrement( &This->ref );
238 static ULONG WINAPI isaxlocator_Release(
241 saxlocator *This = impl_from_ISAXLocator( iface );
244 TRACE("%p\n", This );
246 ref = InterlockedDecrement( &This->ref );
249 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
250 HeapFree( GetProcessHeap(), 0, This );
256 /*** ISAXLocator methods ***/
257 static HRESULT WINAPI isaxlocator_getColumnNumber(
261 saxlocator *This = impl_from_ISAXLocator( iface );
263 *pnColumn = This->lastColumn;
267 static HRESULT WINAPI isaxlocator_getLineNumber(
271 saxlocator *This = impl_from_ISAXLocator( iface );
273 *pnLine = This->lastLine;
277 static HRESULT WINAPI isaxlocator_getPublicId(
279 const WCHAR ** ppwchPublicId)
281 saxlocator *This = impl_from_ISAXLocator( iface );
283 FIXME("(%p)->(%p) stub\n", This, ppwchPublicId);
287 static HRESULT WINAPI isaxlocator_getSystemId(
289 const WCHAR ** ppwchSystemId)
291 saxlocator *This = impl_from_ISAXLocator( iface );
293 FIXME("(%p)->(%p) stub\n", This, ppwchSystemId);
297 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
299 isaxlocator_QueryInterface,
302 isaxlocator_getColumnNumber,
303 isaxlocator_getLineNumber,
304 isaxlocator_getPublicId,
305 isaxlocator_getSystemId
308 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator)
312 locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) );
314 return E_OUTOFMEMORY;
316 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
319 locator->saxreader = reader;
320 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
322 locator->pParserCtxt = NULL;
323 locator->lastLine = 0;
324 locator->lastColumn = 0;
327 *ppsaxlocator = locator;
329 TRACE("returning %p\n", *ppsaxlocator);
334 /*** IVBSAXXMLReader interface ***/
335 /*** IUnknown methods ***/
336 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
338 saxreader *This = impl_from_IVBSAXXMLReader( iface );
340 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
344 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
345 IsEqualGUID( riid, &IID_IDispatch ) ||
346 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
350 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
352 *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
356 FIXME("interface %s not implemented\n", debugstr_guid(riid));
357 return E_NOINTERFACE;
360 IVBSAXXMLReader_AddRef( iface );
365 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
367 saxreader *This = impl_from_IVBSAXXMLReader( iface );
368 TRACE("%p\n", This );
369 return InterlockedIncrement( &This->ref );
372 static ULONG WINAPI saxxmlreader_Release(
373 IVBSAXXMLReader* iface)
375 saxreader *This = impl_from_IVBSAXXMLReader( iface );
378 TRACE("%p\n", This );
380 ref = InterlockedDecrement( &This->ref );
383 if(This->contentHandler)
384 ISAXContentHandler_Release(This->contentHandler);
386 if(This->errorHandler)
387 ISAXErrorHandler_Release(This->errorHandler);
389 HeapFree( GetProcessHeap(), 0, This );
395 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
397 saxreader *This = impl_from_IVBSAXXMLReader( iface );
399 TRACE("(%p)->(%p)\n", This, pctinfo);
406 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
407 IVBSAXXMLReader *iface,
408 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
410 saxreader *This = impl_from_IVBSAXXMLReader( iface );
413 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
415 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
420 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
421 IVBSAXXMLReader *iface,
428 saxreader *This = impl_from_IVBSAXXMLReader( iface );
432 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
435 if(!rgszNames || cNames == 0 || !rgDispId)
438 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
441 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
442 ITypeInfo_Release(typeinfo);
448 static HRESULT WINAPI saxxmlreader_Invoke(
449 IVBSAXXMLReader *iface,
454 DISPPARAMS* pDispParams,
456 EXCEPINFO* pExcepInfo,
459 saxreader *This = impl_from_IVBSAXXMLReader( iface );
463 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
464 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
466 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
469 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
470 pVarResult, pExcepInfo, puArgErr);
471 ITypeInfo_Release(typeinfo);
477 /*** IVBSAXXMLReader methods ***/
478 static HRESULT WINAPI saxxmlreader_getFeature(
479 IVBSAXXMLReader* iface,
480 const WCHAR *pFeature,
481 VARIANT_BOOL *pValue)
483 saxreader *This = impl_from_IVBSAXXMLReader( iface );
485 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
489 static HRESULT WINAPI saxxmlreader_putFeature(
490 IVBSAXXMLReader* iface,
491 const WCHAR *pFeature,
492 VARIANT_BOOL vfValue)
494 saxreader *This = impl_from_IVBSAXXMLReader( iface );
496 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
500 static HRESULT WINAPI saxxmlreader_getProperty(
501 IVBSAXXMLReader* iface,
505 saxreader *This = impl_from_IVBSAXXMLReader( iface );
507 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
511 static HRESULT WINAPI saxxmlreader_putProperty(
512 IVBSAXXMLReader* iface,
516 saxreader *This = impl_from_IVBSAXXMLReader( iface );
518 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
522 static HRESULT WINAPI saxxmlreader_getEntityResolver(
523 IVBSAXXMLReader* iface,
524 IVBSAXEntityResolver **pEntityResolver)
526 saxreader *This = impl_from_IVBSAXXMLReader( iface );
528 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
532 static HRESULT WINAPI saxxmlreader_putEntityResolver(
533 IVBSAXXMLReader* iface,
534 IVBSAXEntityResolver *pEntityResolver)
536 saxreader *This = impl_from_IVBSAXXMLReader( iface );
538 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
542 static HRESULT WINAPI saxxmlreader_getContentHandler(
543 IVBSAXXMLReader* iface,
544 IVBSAXContentHandler **ppContentHandler)
546 saxreader *This = impl_from_IVBSAXXMLReader( iface );
548 FIXME("(%p)->(%p) stub\n", This, ppContentHandler);
552 static HRESULT WINAPI saxxmlreader_putContentHandler(
553 IVBSAXXMLReader* iface,
554 IVBSAXContentHandler *contentHandler)
556 saxreader *This = impl_from_IVBSAXXMLReader( iface );
558 FIXME("(%p)->(%p) stub\n", This, contentHandler);
562 static HRESULT WINAPI saxxmlreader_getDTDHandler(
563 IVBSAXXMLReader* iface,
564 IVBSAXDTDHandler **pDTDHandler)
566 saxreader *This = impl_from_IVBSAXXMLReader( iface );
568 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
572 static HRESULT WINAPI saxxmlreader_putDTDHandler(
573 IVBSAXXMLReader* iface,
574 IVBSAXDTDHandler *pDTDHandler)
576 saxreader *This = impl_from_IVBSAXXMLReader( iface );
578 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
582 static HRESULT WINAPI saxxmlreader_getErrorHandler(
583 IVBSAXXMLReader* iface,
584 IVBSAXErrorHandler **pErrorHandler)
586 saxreader *This = impl_from_IVBSAXXMLReader( iface );
588 FIXME("(%p)->(%p) stub\n", This, pErrorHandler);
592 static HRESULT WINAPI saxxmlreader_putErrorHandler(
593 IVBSAXXMLReader* iface,
594 IVBSAXErrorHandler *errorHandler)
596 saxreader *This = impl_from_IVBSAXXMLReader( iface );
598 FIXME("(%p)->(%p) stub\n", This, errorHandler);
602 static HRESULT WINAPI saxxmlreader_getBaseURL(
603 IVBSAXXMLReader* iface,
604 const WCHAR **pBaseUrl)
606 saxreader *This = impl_from_IVBSAXXMLReader( iface );
608 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
612 static HRESULT WINAPI saxxmlreader_putBaseURL(
613 IVBSAXXMLReader* iface,
614 const WCHAR *pBaseUrl)
616 saxreader *This = impl_from_IVBSAXXMLReader( iface );
618 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
622 static HRESULT WINAPI saxxmlreader_getSecureBaseURL(
623 IVBSAXXMLReader* iface,
624 const WCHAR **pSecureBaseUrl)
626 saxreader *This = impl_from_IVBSAXXMLReader( iface );
628 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
633 static HRESULT WINAPI saxxmlreader_putSecureBaseURL(
634 IVBSAXXMLReader* iface,
635 const WCHAR *secureBaseUrl)
637 saxreader *This = impl_from_IVBSAXXMLReader( iface );
639 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
643 static HRESULT WINAPI saxxmlreader_parse(
644 IVBSAXXMLReader* iface,
647 saxreader *This = impl_from_IVBSAXXMLReader( iface );
649 FIXME("(%p) stub\n", This);
653 static HRESULT WINAPI saxxmlreader_parseURL(
654 IVBSAXXMLReader* iface,
657 saxreader *This = impl_from_IVBSAXXMLReader( iface );
659 FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
663 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
665 saxxmlreader_QueryInterface,
667 saxxmlreader_Release,
668 saxxmlreader_GetTypeInfoCount,
669 saxxmlreader_GetTypeInfo,
670 saxxmlreader_GetIDsOfNames,
672 saxxmlreader_getFeature,
673 saxxmlreader_putFeature,
674 saxxmlreader_getProperty,
675 saxxmlreader_putProperty,
676 saxxmlreader_getEntityResolver,
677 saxxmlreader_putEntityResolver,
678 saxxmlreader_getContentHandler,
679 saxxmlreader_putContentHandler,
680 saxxmlreader_getDTDHandler,
681 saxxmlreader_putDTDHandler,
682 saxxmlreader_getErrorHandler,
683 saxxmlreader_putErrorHandler,
684 saxxmlreader_getBaseURL,
685 saxxmlreader_putBaseURL,
686 saxxmlreader_getSecureBaseURL,
687 saxxmlreader_putSecureBaseURL,
689 saxxmlreader_parseURL
692 /*** ISAXXMLReader interface ***/
693 /*** IUnknown methods ***/
694 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
696 saxreader *This = impl_from_ISAXXMLReader( iface );
697 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVtbl, riid, ppvObject);
700 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
702 saxreader *This = impl_from_ISAXXMLReader( iface );
703 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVtbl);
706 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
708 saxreader *This = impl_from_ISAXXMLReader( iface );
709 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVtbl);
712 /*** ISAXXMLReader methods ***/
713 static HRESULT WINAPI isaxxmlreader_getFeature(
714 ISAXXMLReader* iface,
715 const WCHAR *pFeature,
716 VARIANT_BOOL *pValue)
718 saxreader *This = impl_from_ISAXXMLReader( iface );
720 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
724 static HRESULT WINAPI isaxxmlreader_putFeature(
725 ISAXXMLReader* iface,
726 const WCHAR *pFeature,
727 VARIANT_BOOL vfValue)
729 saxreader *This = impl_from_ISAXXMLReader( iface );
731 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
735 static HRESULT WINAPI isaxxmlreader_getProperty(
736 ISAXXMLReader* iface,
740 saxreader *This = impl_from_ISAXXMLReader( iface );
742 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
746 static HRESULT WINAPI isaxxmlreader_putProperty(
747 ISAXXMLReader* iface,
751 saxreader *This = impl_from_ISAXXMLReader( iface );
753 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
757 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
758 ISAXXMLReader* iface,
759 ISAXEntityResolver **ppEntityResolver)
761 saxreader *This = impl_from_ISAXXMLReader( iface );
763 FIXME("(%p)->(%p) stub\n", This, ppEntityResolver);
767 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
768 ISAXXMLReader* iface,
769 ISAXEntityResolver *pEntityResolver)
771 saxreader *This = impl_from_ISAXXMLReader( iface );
773 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
777 static HRESULT WINAPI isaxxmlreader_getContentHandler(
778 ISAXXMLReader* iface,
779 ISAXContentHandler **pContentHandler)
781 saxreader *This = impl_from_ISAXXMLReader( iface );
783 TRACE("(%p)->(%p)\n", This, pContentHandler);
784 if(pContentHandler == NULL)
786 if(This->contentHandler)
787 ISAXContentHandler_AddRef(This->contentHandler);
788 *pContentHandler = This->contentHandler;
793 static HRESULT WINAPI isaxxmlreader_putContentHandler(
794 ISAXXMLReader* iface,
795 ISAXContentHandler *contentHandler)
797 saxreader *This = impl_from_ISAXXMLReader( iface );
799 TRACE("(%p)->(%p)\n", This, contentHandler);
801 ISAXContentHandler_AddRef(contentHandler);
802 if(This->contentHandler)
803 ISAXContentHandler_Release(This->contentHandler);
804 This->contentHandler = contentHandler;
809 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
810 ISAXXMLReader* iface,
811 ISAXDTDHandler **pDTDHandler)
813 saxreader *This = impl_from_ISAXXMLReader( iface );
815 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
819 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
820 ISAXXMLReader* iface,
821 ISAXDTDHandler *pDTDHandler)
823 saxreader *This = impl_from_ISAXXMLReader( iface );
825 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
829 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
830 ISAXXMLReader* iface,
831 ISAXErrorHandler **pErrorHandler)
833 saxreader *This = impl_from_ISAXXMLReader( iface );
835 TRACE("(%p)->(%p)\n", This, pErrorHandler);
836 if(pErrorHandler == NULL)
838 if(This->errorHandler)
839 ISAXErrorHandler_AddRef(This->errorHandler);
840 *pErrorHandler = This->errorHandler;
845 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
846 ISAXXMLReader* iface,
847 ISAXErrorHandler *errorHandler)
849 saxreader *This = impl_from_ISAXXMLReader( iface );
851 TRACE("(%p)->(%p)\n", This, errorHandler);
853 ISAXErrorHandler_AddRef(errorHandler);
854 if(This->errorHandler)
855 ISAXErrorHandler_Release(This->errorHandler);
856 This->errorHandler = errorHandler;
861 static HRESULT WINAPI isaxxmlreader_getBaseURL(
862 ISAXXMLReader* iface,
863 const WCHAR **pBaseUrl)
865 saxreader *This = impl_from_ISAXXMLReader( iface );
867 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
871 static HRESULT WINAPI isaxxmlreader_putBaseURL(
872 ISAXXMLReader* iface,
873 const WCHAR *pBaseUrl)
875 saxreader *This = impl_from_ISAXXMLReader( iface );
877 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
881 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
882 ISAXXMLReader* iface,
883 const WCHAR **pSecureBaseUrl)
885 saxreader *This = impl_from_ISAXXMLReader( iface );
887 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
891 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
892 ISAXXMLReader* iface,
893 const WCHAR *secureBaseUrl)
895 saxreader *This = impl_from_ISAXXMLReader( iface );
897 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
901 static HRESULT WINAPI isaxxmlreader_parse(
902 ISAXXMLReader* iface,
905 saxreader *This = impl_from_ISAXXMLReader( iface );
907 xmlChar *data = NULL;
910 FIXME("(%p) semi-stub\n", This);
912 hr = SAXLocator_create(This, &locator);
917 switch(V_VT(&varInput))
920 locator->pParserCtxt = xmlNewParserCtxt();
921 if(!locator->pParserCtxt)
926 data = xmlChar_from_wchar(V_BSTR(&varInput));
927 xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
929 locator->pParserCtxt->sax = &locator->saxreader->sax;
930 locator->pParserCtxt->userData = locator;
932 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
933 else hr = locator->ret;
939 if(locator->pParserCtxt)
941 locator->pParserCtxt->sax = NULL;
942 xmlFreeParserCtxt(locator->pParserCtxt);
943 locator->pParserCtxt = NULL;
945 if(data) HeapFree(GetProcessHeap(), 0, data);
946 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
950 static HRESULT WINAPI isaxxmlreader_parseURL(
951 ISAXXMLReader* iface,
954 saxreader *This = impl_from_ISAXXMLReader( iface );
956 FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
960 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
962 isaxxmlreader_QueryInterface,
963 isaxxmlreader_AddRef,
964 isaxxmlreader_Release,
965 isaxxmlreader_getFeature,
966 isaxxmlreader_putFeature,
967 isaxxmlreader_getProperty,
968 isaxxmlreader_putProperty,
969 isaxxmlreader_getEntityResolver,
970 isaxxmlreader_putEntityResolver,
971 isaxxmlreader_getContentHandler,
972 isaxxmlreader_putContentHandler,
973 isaxxmlreader_getDTDHandler,
974 isaxxmlreader_putDTDHandler,
975 isaxxmlreader_getErrorHandler,
976 isaxxmlreader_putErrorHandler,
977 isaxxmlreader_getBaseURL,
978 isaxxmlreader_putBaseURL,
979 isaxxmlreader_getSecureBaseURL,
980 isaxxmlreader_putSecureBaseURL,
982 isaxxmlreader_parseURL
985 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
989 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
991 reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) );
993 return E_OUTOFMEMORY;
995 reader->lpVtbl = &saxreader_vtbl;
996 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
998 reader->contentHandler = NULL;
999 reader->errorHandler = NULL;
1001 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
1002 reader->sax.initialized = XML_SAX2_MAGIC;
1003 reader->sax.startDocument = libxmlStartDocument;
1004 reader->sax.endDocument = libxmlEndDocument;
1005 reader->sax.startElementNs = libxmlStartElementNS;
1006 reader->sax.endElementNs = libxmlEndElementNS;
1008 *ppObj = &reader->lpVtbl;
1010 TRACE("returning iface %p\n", *ppObj);
1017 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1019 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1020 "libxml2 support was not present at compile time.\n");