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;
71 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
73 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpVtbl));
76 static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
78 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpSAXXMLReaderVtbl));
81 static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
83 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl));
86 static void format_error_message_from_id(saxlocator *This, HRESULT hr)
88 xmlStopParser(This->pParserCtxt);
91 if(This->saxreader->errorHandler)
94 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
95 NULL, hr, 0, msg, sizeof(msg), NULL))
97 FIXME("MSXML errors not yet supported.\n");
101 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
102 (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
106 /*** LibXML callbacks ***/
107 static void libxmlStartDocument(void *ctx)
109 saxlocator *This = ctx;
112 if(This->saxreader->contentHandler)
114 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
116 format_error_message_from_id(This, hr);
119 This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt);
120 This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt);
123 static void libxmlEndDocument(void *ctx)
125 saxlocator *This = ctx;
128 This->lastColumn = 0;
131 if(This->ret != S_OK) return;
133 if(This->saxreader->contentHandler)
135 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
137 format_error_message_from_id(This, hr);
141 static void libxmlStartElementNS(
143 const xmlChar *localname,
144 const xmlChar *prefix,
147 const xmlChar **namespaces,
150 const xmlChar **attributes)
152 BSTR NamespaceUri, LocalName, QName;
153 saxlocator *This = ctx;
156 FIXME("Arguments processing not yet implemented.\n");
158 This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt)+1;
159 This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt);
161 if(This->saxreader->contentHandler)
163 NamespaceUri = bstr_from_xmlChar(URI);
164 LocalName = bstr_from_xmlChar(localname);
165 QName = bstr_from_xmlChar(localname);
167 hr = ISAXContentHandler_startElement(
168 This->saxreader->contentHandler,
169 NamespaceUri, SysStringLen(NamespaceUri),
170 LocalName, SysStringLen(LocalName),
171 QName, SysStringLen(QName),
174 SysFreeString(NamespaceUri);
175 SysFreeString(LocalName);
176 SysFreeString(QName);
179 format_error_message_from_id(This, hr);
183 static void libxmlEndElementNS(
185 const xmlChar *localname,
186 const xmlChar *prefix,
189 BSTR NamespaceUri, LocalName, QName;
190 saxlocator *This = ctx;
193 This->lastColumn = xmlSAX2GetColumnNumber(This->pParserCtxt);
194 This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt);
196 if(This->saxreader->contentHandler)
198 NamespaceUri = bstr_from_xmlChar(URI);
199 LocalName = bstr_from_xmlChar(localname);
200 QName = bstr_from_xmlChar(localname);
202 hr = ISAXContentHandler_endElement(
203 This->saxreader->contentHandler,
204 NamespaceUri, SysStringLen(NamespaceUri),
205 LocalName, SysStringLen(LocalName),
206 QName, SysStringLen(QName));
208 SysFreeString(NamespaceUri);
209 SysFreeString(LocalName);
210 SysFreeString(QName);
213 format_error_message_from_id(This, hr);
217 static void libxmlCharacters(
223 saxlocator *This = ctx;
228 This->lastColumn = 1;
229 This->lastLine = xmlSAX2GetLineNumber(This->pParserCtxt);
231 cur = This->pParserCtxt->input->cur;
234 for(pos=0; pos<len; pos++)
235 if(*(cur+pos) == '\n') This->lastLine--;
240 for(pos=0; pos<len; pos++)
241 if(*(cur-pos-1) == '\n') This->lastLine--;
244 for(; *cur!='\n' && cur!=This->pParserCtxt->input->base; cur--)
247 if(This->saxreader->contentHandler)
249 Chars = bstr_from_xmlChar(ch);
250 hr = ISAXContentHandler_characters(This->saxreader->contentHandler, Chars, len);
251 SysFreeString(Chars);
254 format_error_message_from_id(This, hr);
258 static void libxmlSetDocumentLocator(
260 xmlSAXLocatorPtr loc)
262 saxlocator *This = ctx;
265 hr = ISAXContentHandler_putDocumentLocator(This->saxreader->contentHandler,
266 (ISAXLocator*)&This->lpSAXLocatorVtbl);
269 format_error_message_from_id(This, hr);
272 void libxmlFatalError(void *ctx, const char *msg, ...)
274 saxlocator *This = ctx;
280 if(!This->saxreader->errorHandler)
282 xmlStopParser(This->pParserCtxt);
287 FIXME("Error handling is not compatible.\n");
290 vsprintf(message, msg, args);
293 len = MultiByteToWideChar(CP_ACP, 0, message, -1, NULL, 0);
294 wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
295 MultiByteToWideChar(CP_ACP, 0, message, -1, (LPWSTR)wszError, len);
297 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
298 (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
300 HeapFree(GetProcessHeap(), 0, wszError);
302 xmlStopParser(This->pParserCtxt);
306 /*** ISAXLocator interface ***/
307 /*** IUnknown methods ***/
308 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
310 saxlocator *This = impl_from_ISAXLocator( iface );
312 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
316 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
317 IsEqualGUID( riid, &IID_ISAXLocator ))
323 FIXME("interface %s not implemented\n", debugstr_guid(riid));
324 return E_NOINTERFACE;
327 ISAXLocator_AddRef( iface );
332 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
334 saxlocator *This = impl_from_ISAXLocator( iface );
335 TRACE("%p\n", This );
336 return InterlockedIncrement( &This->ref );
339 static ULONG WINAPI isaxlocator_Release(
342 saxlocator *This = impl_from_ISAXLocator( iface );
345 TRACE("%p\n", This );
347 ref = InterlockedDecrement( &This->ref );
351 SysFreeString(This->publicId);
353 SysFreeString(This->systemId);
355 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
356 HeapFree( GetProcessHeap(), 0, This );
362 /*** ISAXLocator methods ***/
363 static HRESULT WINAPI isaxlocator_getColumnNumber(
367 saxlocator *This = impl_from_ISAXLocator( iface );
369 *pnColumn = This->lastColumn;
373 static HRESULT WINAPI isaxlocator_getLineNumber(
377 saxlocator *This = impl_from_ISAXLocator( iface );
379 *pnLine = This->lastLine;
383 static HRESULT WINAPI isaxlocator_getPublicId(
385 const WCHAR ** ppwchPublicId)
388 saxlocator *This = impl_from_ISAXLocator( iface );
390 if(This->publicId) SysFreeString(This->publicId);
392 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
393 if(SysStringLen(publicId))
394 This->publicId = (WCHAR*)&publicId;
397 SysFreeString(publicId);
398 This->publicId = NULL;
401 *ppwchPublicId = This->publicId;
405 static HRESULT WINAPI isaxlocator_getSystemId(
407 const WCHAR ** ppwchSystemId)
410 saxlocator *This = impl_from_ISAXLocator( iface );
412 if(This->systemId) SysFreeString(This->systemId);
414 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
415 if(SysStringLen(systemId))
416 This->systemId = (WCHAR*)&systemId;
419 SysFreeString(systemId);
420 This->systemId = NULL;
423 *ppwchSystemId = This->systemId;
427 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
429 isaxlocator_QueryInterface,
432 isaxlocator_getColumnNumber,
433 isaxlocator_getLineNumber,
434 isaxlocator_getPublicId,
435 isaxlocator_getSystemId
438 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator)
442 locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) );
444 return E_OUTOFMEMORY;
446 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
449 locator->saxreader = reader;
450 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
452 locator->pParserCtxt = NULL;
453 locator->publicId = NULL;
454 locator->systemId = NULL;
455 locator->lastLine = 0;
456 locator->lastColumn = 0;
459 *ppsaxlocator = locator;
461 TRACE("returning %p\n", *ppsaxlocator);
466 /*** IVBSAXXMLReader interface ***/
467 /*** IUnknown methods ***/
468 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
470 saxreader *This = impl_from_IVBSAXXMLReader( iface );
472 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
476 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
477 IsEqualGUID( riid, &IID_IDispatch ) ||
478 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
482 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
484 *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
488 FIXME("interface %s not implemented\n", debugstr_guid(riid));
489 return E_NOINTERFACE;
492 IVBSAXXMLReader_AddRef( iface );
497 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
499 saxreader *This = impl_from_IVBSAXXMLReader( iface );
500 TRACE("%p\n", This );
501 return InterlockedIncrement( &This->ref );
504 static ULONG WINAPI saxxmlreader_Release(
505 IVBSAXXMLReader* iface)
507 saxreader *This = impl_from_IVBSAXXMLReader( iface );
510 TRACE("%p\n", This );
512 ref = InterlockedDecrement( &This->ref );
515 if(This->contentHandler)
516 ISAXContentHandler_Release(This->contentHandler);
518 if(This->errorHandler)
519 ISAXErrorHandler_Release(This->errorHandler);
521 HeapFree( GetProcessHeap(), 0, This );
527 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
529 saxreader *This = impl_from_IVBSAXXMLReader( iface );
531 TRACE("(%p)->(%p)\n", This, pctinfo);
538 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
539 IVBSAXXMLReader *iface,
540 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
542 saxreader *This = impl_from_IVBSAXXMLReader( iface );
545 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
547 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
552 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
553 IVBSAXXMLReader *iface,
560 saxreader *This = impl_from_IVBSAXXMLReader( iface );
564 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
567 if(!rgszNames || cNames == 0 || !rgDispId)
570 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
573 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
574 ITypeInfo_Release(typeinfo);
580 static HRESULT WINAPI saxxmlreader_Invoke(
581 IVBSAXXMLReader *iface,
586 DISPPARAMS* pDispParams,
588 EXCEPINFO* pExcepInfo,
591 saxreader *This = impl_from_IVBSAXXMLReader( iface );
595 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
596 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
598 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
601 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
602 pVarResult, pExcepInfo, puArgErr);
603 ITypeInfo_Release(typeinfo);
609 /*** IVBSAXXMLReader methods ***/
610 static HRESULT WINAPI saxxmlreader_getFeature(
611 IVBSAXXMLReader* iface,
612 const WCHAR *pFeature,
613 VARIANT_BOOL *pValue)
615 saxreader *This = impl_from_IVBSAXXMLReader( iface );
617 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
621 static HRESULT WINAPI saxxmlreader_putFeature(
622 IVBSAXXMLReader* iface,
623 const WCHAR *pFeature,
624 VARIANT_BOOL vfValue)
626 saxreader *This = impl_from_IVBSAXXMLReader( iface );
628 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
632 static HRESULT WINAPI saxxmlreader_getProperty(
633 IVBSAXXMLReader* iface,
637 saxreader *This = impl_from_IVBSAXXMLReader( iface );
639 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
643 static HRESULT WINAPI saxxmlreader_putProperty(
644 IVBSAXXMLReader* iface,
648 saxreader *This = impl_from_IVBSAXXMLReader( iface );
650 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
654 static HRESULT WINAPI saxxmlreader_getEntityResolver(
655 IVBSAXXMLReader* iface,
656 IVBSAXEntityResolver **pEntityResolver)
658 saxreader *This = impl_from_IVBSAXXMLReader( iface );
660 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
664 static HRESULT WINAPI saxxmlreader_putEntityResolver(
665 IVBSAXXMLReader* iface,
666 IVBSAXEntityResolver *pEntityResolver)
668 saxreader *This = impl_from_IVBSAXXMLReader( iface );
670 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
674 static HRESULT WINAPI saxxmlreader_getContentHandler(
675 IVBSAXXMLReader* iface,
676 IVBSAXContentHandler **ppContentHandler)
678 saxreader *This = impl_from_IVBSAXXMLReader( iface );
680 FIXME("(%p)->(%p) stub\n", This, ppContentHandler);
684 static HRESULT WINAPI saxxmlreader_putContentHandler(
685 IVBSAXXMLReader* iface,
686 IVBSAXContentHandler *contentHandler)
688 saxreader *This = impl_from_IVBSAXXMLReader( iface );
690 FIXME("(%p)->(%p) stub\n", This, contentHandler);
694 static HRESULT WINAPI saxxmlreader_getDTDHandler(
695 IVBSAXXMLReader* iface,
696 IVBSAXDTDHandler **pDTDHandler)
698 saxreader *This = impl_from_IVBSAXXMLReader( iface );
700 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
704 static HRESULT WINAPI saxxmlreader_putDTDHandler(
705 IVBSAXXMLReader* iface,
706 IVBSAXDTDHandler *pDTDHandler)
708 saxreader *This = impl_from_IVBSAXXMLReader( iface );
710 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
714 static HRESULT WINAPI saxxmlreader_getErrorHandler(
715 IVBSAXXMLReader* iface,
716 IVBSAXErrorHandler **pErrorHandler)
718 saxreader *This = impl_from_IVBSAXXMLReader( iface );
720 FIXME("(%p)->(%p) stub\n", This, pErrorHandler);
724 static HRESULT WINAPI saxxmlreader_putErrorHandler(
725 IVBSAXXMLReader* iface,
726 IVBSAXErrorHandler *errorHandler)
728 saxreader *This = impl_from_IVBSAXXMLReader( iface );
730 FIXME("(%p)->(%p) stub\n", This, errorHandler);
734 static HRESULT WINAPI saxxmlreader_getBaseURL(
735 IVBSAXXMLReader* iface,
736 const WCHAR **pBaseUrl)
738 saxreader *This = impl_from_IVBSAXXMLReader( iface );
740 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
744 static HRESULT WINAPI saxxmlreader_putBaseURL(
745 IVBSAXXMLReader* iface,
746 const WCHAR *pBaseUrl)
748 saxreader *This = impl_from_IVBSAXXMLReader( iface );
750 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
754 static HRESULT WINAPI saxxmlreader_getSecureBaseURL(
755 IVBSAXXMLReader* iface,
756 const WCHAR **pSecureBaseUrl)
758 saxreader *This = impl_from_IVBSAXXMLReader( iface );
760 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
765 static HRESULT WINAPI saxxmlreader_putSecureBaseURL(
766 IVBSAXXMLReader* iface,
767 const WCHAR *secureBaseUrl)
769 saxreader *This = impl_from_IVBSAXXMLReader( iface );
771 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
775 static HRESULT WINAPI saxxmlreader_parse(
776 IVBSAXXMLReader* iface,
779 saxreader *This = impl_from_IVBSAXXMLReader( iface );
781 FIXME("(%p) stub\n", This);
785 static HRESULT WINAPI saxxmlreader_parseURL(
786 IVBSAXXMLReader* iface,
789 saxreader *This = impl_from_IVBSAXXMLReader( iface );
791 FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
795 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
797 saxxmlreader_QueryInterface,
799 saxxmlreader_Release,
800 saxxmlreader_GetTypeInfoCount,
801 saxxmlreader_GetTypeInfo,
802 saxxmlreader_GetIDsOfNames,
804 saxxmlreader_getFeature,
805 saxxmlreader_putFeature,
806 saxxmlreader_getProperty,
807 saxxmlreader_putProperty,
808 saxxmlreader_getEntityResolver,
809 saxxmlreader_putEntityResolver,
810 saxxmlreader_getContentHandler,
811 saxxmlreader_putContentHandler,
812 saxxmlreader_getDTDHandler,
813 saxxmlreader_putDTDHandler,
814 saxxmlreader_getErrorHandler,
815 saxxmlreader_putErrorHandler,
816 saxxmlreader_getBaseURL,
817 saxxmlreader_putBaseURL,
818 saxxmlreader_getSecureBaseURL,
819 saxxmlreader_putSecureBaseURL,
821 saxxmlreader_parseURL
824 /*** ISAXXMLReader interface ***/
825 /*** IUnknown methods ***/
826 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
828 saxreader *This = impl_from_ISAXXMLReader( iface );
829 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVtbl, riid, ppvObject);
832 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
834 saxreader *This = impl_from_ISAXXMLReader( iface );
835 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVtbl);
838 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
840 saxreader *This = impl_from_ISAXXMLReader( iface );
841 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVtbl);
844 /*** ISAXXMLReader methods ***/
845 static HRESULT WINAPI isaxxmlreader_getFeature(
846 ISAXXMLReader* iface,
847 const WCHAR *pFeature,
848 VARIANT_BOOL *pValue)
850 saxreader *This = impl_from_ISAXXMLReader( iface );
852 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
856 static HRESULT WINAPI isaxxmlreader_putFeature(
857 ISAXXMLReader* iface,
858 const WCHAR *pFeature,
859 VARIANT_BOOL vfValue)
861 saxreader *This = impl_from_ISAXXMLReader( iface );
863 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
867 static HRESULT WINAPI isaxxmlreader_getProperty(
868 ISAXXMLReader* iface,
872 saxreader *This = impl_from_ISAXXMLReader( iface );
874 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
878 static HRESULT WINAPI isaxxmlreader_putProperty(
879 ISAXXMLReader* iface,
883 saxreader *This = impl_from_ISAXXMLReader( iface );
885 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
889 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
890 ISAXXMLReader* iface,
891 ISAXEntityResolver **ppEntityResolver)
893 saxreader *This = impl_from_ISAXXMLReader( iface );
895 FIXME("(%p)->(%p) stub\n", This, ppEntityResolver);
899 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
900 ISAXXMLReader* iface,
901 ISAXEntityResolver *pEntityResolver)
903 saxreader *This = impl_from_ISAXXMLReader( iface );
905 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
909 static HRESULT WINAPI isaxxmlreader_getContentHandler(
910 ISAXXMLReader* iface,
911 ISAXContentHandler **pContentHandler)
913 saxreader *This = impl_from_ISAXXMLReader( iface );
915 TRACE("(%p)->(%p)\n", This, pContentHandler);
916 if(pContentHandler == NULL)
918 if(This->contentHandler)
919 ISAXContentHandler_AddRef(This->contentHandler);
920 *pContentHandler = This->contentHandler;
925 static HRESULT WINAPI isaxxmlreader_putContentHandler(
926 ISAXXMLReader* iface,
927 ISAXContentHandler *contentHandler)
929 saxreader *This = impl_from_ISAXXMLReader( iface );
931 TRACE("(%p)->(%p)\n", This, contentHandler);
933 ISAXContentHandler_AddRef(contentHandler);
934 if(This->contentHandler)
935 ISAXContentHandler_Release(This->contentHandler);
936 This->contentHandler = contentHandler;
941 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
942 ISAXXMLReader* iface,
943 ISAXDTDHandler **pDTDHandler)
945 saxreader *This = impl_from_ISAXXMLReader( iface );
947 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
951 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
952 ISAXXMLReader* iface,
953 ISAXDTDHandler *pDTDHandler)
955 saxreader *This = impl_from_ISAXXMLReader( iface );
957 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
961 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
962 ISAXXMLReader* iface,
963 ISAXErrorHandler **pErrorHandler)
965 saxreader *This = impl_from_ISAXXMLReader( iface );
967 TRACE("(%p)->(%p)\n", This, pErrorHandler);
968 if(pErrorHandler == NULL)
970 if(This->errorHandler)
971 ISAXErrorHandler_AddRef(This->errorHandler);
972 *pErrorHandler = This->errorHandler;
977 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
978 ISAXXMLReader* iface,
979 ISAXErrorHandler *errorHandler)
981 saxreader *This = impl_from_ISAXXMLReader( iface );
983 TRACE("(%p)->(%p)\n", This, errorHandler);
985 ISAXErrorHandler_AddRef(errorHandler);
986 if(This->errorHandler)
987 ISAXErrorHandler_Release(This->errorHandler);
988 This->errorHandler = errorHandler;
993 static HRESULT WINAPI isaxxmlreader_getBaseURL(
994 ISAXXMLReader* iface,
995 const WCHAR **pBaseUrl)
997 saxreader *This = impl_from_ISAXXMLReader( iface );
999 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
1003 static HRESULT WINAPI isaxxmlreader_putBaseURL(
1004 ISAXXMLReader* iface,
1005 const WCHAR *pBaseUrl)
1007 saxreader *This = impl_from_ISAXXMLReader( iface );
1009 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
1013 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
1014 ISAXXMLReader* iface,
1015 const WCHAR **pSecureBaseUrl)
1017 saxreader *This = impl_from_ISAXXMLReader( iface );
1019 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
1023 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
1024 ISAXXMLReader* iface,
1025 const WCHAR *secureBaseUrl)
1027 saxreader *This = impl_from_ISAXXMLReader( iface );
1029 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
1033 static HRESULT WINAPI isaxxmlreader_parse(
1034 ISAXXMLReader* iface,
1037 saxreader *This = impl_from_ISAXXMLReader( iface );
1038 saxlocator *locator;
1039 xmlChar *data = NULL;
1042 FIXME("(%p) semi-stub\n", This);
1044 hr = SAXLocator_create(This, &locator);
1049 switch(V_VT(&varInput))
1052 locator->pParserCtxt = xmlNewParserCtxt();
1053 if(!locator->pParserCtxt)
1058 data = xmlChar_from_wchar(V_BSTR(&varInput));
1059 xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
1061 locator->pParserCtxt->sax = &locator->saxreader->sax;
1062 locator->pParserCtxt->userData = locator;
1064 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1065 else hr = locator->ret;
1067 case VT_ARRAY|VT_UI1:
1068 locator->pParserCtxt = xmlNewParserCtxt();
1069 if(!locator->pParserCtxt)
1075 hr = SafeArrayAccessData(V_ARRAY(&varInput), (void**)&data);
1076 if(hr != S_OK) break;
1077 xmlSetupParserForBuffer(locator->pParserCtxt, data, NULL);
1078 SafeArrayUnaccessData(V_ARRAY(&varInput));
1080 locator->pParserCtxt->sax = &locator->saxreader->sax;
1081 locator->pParserCtxt->userData = locator;
1083 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1084 else hr = locator->ret;
1090 if(locator->pParserCtxt)
1092 locator->pParserCtxt->sax = NULL;
1093 xmlFreeParserCtxt(locator->pParserCtxt);
1094 locator->pParserCtxt = NULL;
1096 HeapFree(GetProcessHeap(), 0, data);
1097 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1101 static HRESULT WINAPI isaxxmlreader_parseURL(
1102 ISAXXMLReader* iface,
1105 saxreader *This = impl_from_ISAXXMLReader( iface );
1107 FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
1111 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
1113 isaxxmlreader_QueryInterface,
1114 isaxxmlreader_AddRef,
1115 isaxxmlreader_Release,
1116 isaxxmlreader_getFeature,
1117 isaxxmlreader_putFeature,
1118 isaxxmlreader_getProperty,
1119 isaxxmlreader_putProperty,
1120 isaxxmlreader_getEntityResolver,
1121 isaxxmlreader_putEntityResolver,
1122 isaxxmlreader_getContentHandler,
1123 isaxxmlreader_putContentHandler,
1124 isaxxmlreader_getDTDHandler,
1125 isaxxmlreader_putDTDHandler,
1126 isaxxmlreader_getErrorHandler,
1127 isaxxmlreader_putErrorHandler,
1128 isaxxmlreader_getBaseURL,
1129 isaxxmlreader_putBaseURL,
1130 isaxxmlreader_getSecureBaseURL,
1131 isaxxmlreader_putSecureBaseURL,
1132 isaxxmlreader_parse,
1133 isaxxmlreader_parseURL
1136 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1140 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
1142 reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) );
1144 return E_OUTOFMEMORY;
1146 reader->lpVtbl = &saxreader_vtbl;
1147 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
1149 reader->contentHandler = NULL;
1150 reader->errorHandler = NULL;
1152 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
1153 reader->sax.initialized = XML_SAX2_MAGIC;
1154 reader->sax.startDocument = libxmlStartDocument;
1155 reader->sax.endDocument = libxmlEndDocument;
1156 reader->sax.startElementNs = libxmlStartElementNS;
1157 reader->sax.endElementNs = libxmlEndElementNS;
1158 reader->sax.characters = libxmlCharacters;
1159 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
1160 reader->sax.error = libxmlFatalError;
1161 reader->sax.fatalError = libxmlFatalError;
1163 *ppObj = &reader->lpVtbl;
1165 TRACE("returning iface %p\n", *ppObj);
1172 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1174 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1175 "libxml2 support was not present at compile time.\n");