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 /*** LibXML callbacks ***/
87 static void libxmlStartDocument(void *ctx
)
89 saxlocator
*This
= ctx
;
92 if(This
->saxreader
->contentHandler
)
94 hr
= ISAXContentHandler_startDocument(This
->saxreader
->contentHandler
);
97 xmlStopParser(This
->pParserCtxt
);
102 This
->lastColumn
= xmlSAX2GetColumnNumber(This
->pParserCtxt
);
103 This
->lastLine
= xmlSAX2GetLineNumber(This
->pParserCtxt
);
106 static void libxmlEndDocument(void *ctx
)
108 saxlocator
*This
= ctx
;
111 This
->lastColumn
= 0;
114 if(This
->saxreader
->contentHandler
)
116 hr
= ISAXContentHandler_endDocument(This
->saxreader
->contentHandler
);
119 xmlStopParser(This
->pParserCtxt
);
125 static void libxmlStartElementNS(
127 const xmlChar
*localname
,
128 const xmlChar
*prefix
,
131 const xmlChar
**namespaces
,
134 const xmlChar
**attributes
)
136 BSTR NamespaceUri
, LocalName
, QName
;
137 saxlocator
*This
= ctx
;
140 FIXME("Arguments processing not yet implemented.\n");
142 This
->lastColumn
= xmlSAX2GetColumnNumber(This
->pParserCtxt
)+1;
143 This
->lastLine
= xmlSAX2GetLineNumber(This
->pParserCtxt
);
145 if(This
->saxreader
->contentHandler
)
147 NamespaceUri
= bstr_from_xmlChar(URI
);
148 LocalName
= bstr_from_xmlChar(localname
);
149 QName
= bstr_from_xmlChar(localname
);
151 hr
= ISAXContentHandler_startElement(
152 This
->saxreader
->contentHandler
,
153 NamespaceUri
, SysStringLen(NamespaceUri
),
154 LocalName
, SysStringLen(LocalName
),
155 QName
, SysStringLen(QName
),
158 SysFreeString(NamespaceUri
);
159 SysFreeString(LocalName
);
160 SysFreeString(QName
);
164 xmlStopParser(This
->pParserCtxt
);
170 static void libxmlEndElementNS(
172 const xmlChar
*localname
,
173 const xmlChar
*prefix
,
176 BSTR NamespaceUri
, LocalName
, QName
;
177 saxlocator
*This
= ctx
;
180 This
->lastColumn
= xmlSAX2GetColumnNumber(This
->pParserCtxt
);
181 This
->lastLine
= xmlSAX2GetLineNumber(This
->pParserCtxt
);
183 if(This
->saxreader
->contentHandler
)
185 NamespaceUri
= bstr_from_xmlChar(URI
);
186 LocalName
= bstr_from_xmlChar(localname
);
187 QName
= bstr_from_xmlChar(localname
);
189 hr
= ISAXContentHandler_endElement(
190 This
->saxreader
->contentHandler
,
191 NamespaceUri
, SysStringLen(NamespaceUri
),
192 LocalName
, SysStringLen(LocalName
),
193 QName
, SysStringLen(QName
));
195 SysFreeString(NamespaceUri
);
196 SysFreeString(LocalName
);
197 SysFreeString(QName
);
201 xmlStopParser(This
->pParserCtxt
);
207 static void libxmlCharacters(
213 saxlocator
*This
= ctx
;
218 This
->lastColumn
= 1;
219 This
->lastLine
= xmlSAX2GetLineNumber(This
->pParserCtxt
);
221 cur
= This
->pParserCtxt
->input
->cur
;
224 for(pos
=0; pos
<len
; pos
++)
225 if(*(cur
+pos
) == '\n') This
->lastLine
--;
230 for(pos
=0; pos
<len
; pos
++)
231 if(*(cur
-pos
-1) == '\n') This
->lastLine
--;
234 for(; *cur
!='\n' && cur
!=This
->pParserCtxt
->input
->base
; cur
--)
237 if(This
->saxreader
->contentHandler
)
239 Chars
= bstr_from_xmlChar(ch
);
240 hr
= ISAXContentHandler_characters(This
->saxreader
->contentHandler
, Chars
, len
);
241 SysFreeString(Chars
);
245 xmlStopParser(This
->pParserCtxt
);
251 static void libxmlSetDocumentLocator(
253 xmlSAXLocatorPtr loc
)
255 saxlocator
*This
= ctx
;
258 hr
= ISAXContentHandler_putDocumentLocator(This
->saxreader
->contentHandler
,
259 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
);
263 xmlStopParser(This
->pParserCtxt
);
268 /*** ISAXLocator interface ***/
269 /*** IUnknown methods ***/
270 static HRESULT WINAPI
isaxlocator_QueryInterface(ISAXLocator
* iface
, REFIID riid
, void **ppvObject
)
272 saxlocator
*This
= impl_from_ISAXLocator( iface
);
274 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
278 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
279 IsEqualGUID( riid
, &IID_ISAXLocator
))
285 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
286 return E_NOINTERFACE
;
289 ISAXLocator_AddRef( iface
);
294 static ULONG WINAPI
isaxlocator_AddRef(ISAXLocator
* iface
)
296 saxlocator
*This
= impl_from_ISAXLocator( iface
);
297 TRACE("%p\n", This
);
298 return InterlockedIncrement( &This
->ref
);
301 static ULONG WINAPI
isaxlocator_Release(
304 saxlocator
*This
= impl_from_ISAXLocator( iface
);
307 TRACE("%p\n", This
);
309 ref
= InterlockedDecrement( &This
->ref
);
313 SysFreeString(This
->publicId
);
315 SysFreeString(This
->systemId
);
317 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
318 HeapFree( GetProcessHeap(), 0, This
);
324 /*** ISAXLocator methods ***/
325 static HRESULT WINAPI
isaxlocator_getColumnNumber(
329 saxlocator
*This
= impl_from_ISAXLocator( iface
);
331 *pnColumn
= This
->lastColumn
;
335 static HRESULT WINAPI
isaxlocator_getLineNumber(
339 saxlocator
*This
= impl_from_ISAXLocator( iface
);
341 *pnLine
= This
->lastLine
;
345 static HRESULT WINAPI
isaxlocator_getPublicId(
347 const WCHAR
** ppwchPublicId
)
350 saxlocator
*This
= impl_from_ISAXLocator( iface
);
352 if(This
->publicId
) SysFreeString(This
->publicId
);
354 publicId
= bstr_from_xmlChar(xmlSAX2GetPublicId(This
->pParserCtxt
));
355 if(SysStringLen(publicId
))
356 This
->publicId
= (WCHAR
*)&publicId
;
359 SysFreeString(publicId
);
360 This
->publicId
= NULL
;
363 *ppwchPublicId
= This
->publicId
;
367 static HRESULT WINAPI
isaxlocator_getSystemId(
369 const WCHAR
** ppwchSystemId
)
372 saxlocator
*This
= impl_from_ISAXLocator( iface
);
374 if(This
->systemId
) SysFreeString(This
->systemId
);
376 systemId
= bstr_from_xmlChar(xmlSAX2GetSystemId(This
->pParserCtxt
));
377 if(SysStringLen(systemId
))
378 This
->systemId
= (WCHAR
*)&systemId
;
381 SysFreeString(systemId
);
382 This
->systemId
= NULL
;
385 *ppwchSystemId
= This
->systemId
;
389 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
391 isaxlocator_QueryInterface
,
394 isaxlocator_getColumnNumber
,
395 isaxlocator_getLineNumber
,
396 isaxlocator_getPublicId
,
397 isaxlocator_getSystemId
400 static HRESULT
SAXLocator_create(saxreader
*reader
, saxlocator
**ppsaxlocator
)
404 locator
= HeapAlloc( GetProcessHeap(), 0, sizeof (*locator
) );
406 return E_OUTOFMEMORY
;
408 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
411 locator
->saxreader
= reader
;
412 ISAXXMLReader_AddRef((ISAXXMLReader
*)&reader
->lpSAXXMLReaderVtbl
);
414 locator
->pParserCtxt
= NULL
;
415 locator
->publicId
= NULL
;
416 locator
->systemId
= NULL
;
417 locator
->lastLine
= 0;
418 locator
->lastColumn
= 0;
421 *ppsaxlocator
= locator
;
423 TRACE("returning %p\n", *ppsaxlocator
);
428 /*** IVBSAXXMLReader interface ***/
429 /*** IUnknown methods ***/
430 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
432 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
434 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
438 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
439 IsEqualGUID( riid
, &IID_IDispatch
) ||
440 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
444 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
446 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
450 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
451 return E_NOINTERFACE
;
454 IVBSAXXMLReader_AddRef( iface
);
459 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
461 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
462 TRACE("%p\n", This
);
463 return InterlockedIncrement( &This
->ref
);
466 static ULONG WINAPI
saxxmlreader_Release(
467 IVBSAXXMLReader
* iface
)
469 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
472 TRACE("%p\n", This
);
474 ref
= InterlockedDecrement( &This
->ref
);
477 if(This
->contentHandler
)
478 ISAXContentHandler_Release(This
->contentHandler
);
480 if(This
->errorHandler
)
481 ISAXErrorHandler_Release(This
->errorHandler
);
483 HeapFree( GetProcessHeap(), 0, This
);
489 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
491 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
493 TRACE("(%p)->(%p)\n", This
, pctinfo
);
500 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
501 IVBSAXXMLReader
*iface
,
502 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
504 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
507 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
509 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
514 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
515 IVBSAXXMLReader
*iface
,
522 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
526 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
529 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
532 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
535 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
536 ITypeInfo_Release(typeinfo
);
542 static HRESULT WINAPI
saxxmlreader_Invoke(
543 IVBSAXXMLReader
*iface
,
548 DISPPARAMS
* pDispParams
,
550 EXCEPINFO
* pExcepInfo
,
553 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
557 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
558 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
560 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
563 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVtbl
), dispIdMember
, wFlags
, pDispParams
,
564 pVarResult
, pExcepInfo
, puArgErr
);
565 ITypeInfo_Release(typeinfo
);
571 /*** IVBSAXXMLReader methods ***/
572 static HRESULT WINAPI
saxxmlreader_getFeature(
573 IVBSAXXMLReader
* iface
,
574 const WCHAR
*pFeature
,
575 VARIANT_BOOL
*pValue
)
577 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
579 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
583 static HRESULT WINAPI
saxxmlreader_putFeature(
584 IVBSAXXMLReader
* iface
,
585 const WCHAR
*pFeature
,
586 VARIANT_BOOL vfValue
)
588 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
590 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
594 static HRESULT WINAPI
saxxmlreader_getProperty(
595 IVBSAXXMLReader
* iface
,
599 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
601 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
605 static HRESULT WINAPI
saxxmlreader_putProperty(
606 IVBSAXXMLReader
* iface
,
610 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
612 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
616 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
617 IVBSAXXMLReader
* iface
,
618 IVBSAXEntityResolver
**pEntityResolver
)
620 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
622 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
626 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
627 IVBSAXXMLReader
* iface
,
628 IVBSAXEntityResolver
*pEntityResolver
)
630 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
632 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
636 static HRESULT WINAPI
saxxmlreader_getContentHandler(
637 IVBSAXXMLReader
* iface
,
638 IVBSAXContentHandler
**ppContentHandler
)
640 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
642 FIXME("(%p)->(%p) stub\n", This
, ppContentHandler
);
646 static HRESULT WINAPI
saxxmlreader_putContentHandler(
647 IVBSAXXMLReader
* iface
,
648 IVBSAXContentHandler
*contentHandler
)
650 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
652 FIXME("(%p)->(%p) stub\n", This
, contentHandler
);
656 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
657 IVBSAXXMLReader
* iface
,
658 IVBSAXDTDHandler
**pDTDHandler
)
660 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
662 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
666 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
667 IVBSAXXMLReader
* iface
,
668 IVBSAXDTDHandler
*pDTDHandler
)
670 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
672 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
676 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
677 IVBSAXXMLReader
* iface
,
678 IVBSAXErrorHandler
**pErrorHandler
)
680 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
682 FIXME("(%p)->(%p) stub\n", This
, pErrorHandler
);
686 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
687 IVBSAXXMLReader
* iface
,
688 IVBSAXErrorHandler
*errorHandler
)
690 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
692 FIXME("(%p)->(%p) stub\n", This
, errorHandler
);
696 static HRESULT WINAPI
saxxmlreader_getBaseURL(
697 IVBSAXXMLReader
* iface
,
698 const WCHAR
**pBaseUrl
)
700 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
702 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
706 static HRESULT WINAPI
saxxmlreader_putBaseURL(
707 IVBSAXXMLReader
* iface
,
708 const WCHAR
*pBaseUrl
)
710 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
712 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
716 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
717 IVBSAXXMLReader
* iface
,
718 const WCHAR
**pSecureBaseUrl
)
720 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
722 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
727 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
728 IVBSAXXMLReader
* iface
,
729 const WCHAR
*secureBaseUrl
)
731 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
733 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
737 static HRESULT WINAPI
saxxmlreader_parse(
738 IVBSAXXMLReader
* iface
,
741 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
743 FIXME("(%p) stub\n", This
);
747 static HRESULT WINAPI
saxxmlreader_parseURL(
748 IVBSAXXMLReader
* iface
,
751 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
753 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
757 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
759 saxxmlreader_QueryInterface
,
761 saxxmlreader_Release
,
762 saxxmlreader_GetTypeInfoCount
,
763 saxxmlreader_GetTypeInfo
,
764 saxxmlreader_GetIDsOfNames
,
766 saxxmlreader_getFeature
,
767 saxxmlreader_putFeature
,
768 saxxmlreader_getProperty
,
769 saxxmlreader_putProperty
,
770 saxxmlreader_getEntityResolver
,
771 saxxmlreader_putEntityResolver
,
772 saxxmlreader_getContentHandler
,
773 saxxmlreader_putContentHandler
,
774 saxxmlreader_getDTDHandler
,
775 saxxmlreader_putDTDHandler
,
776 saxxmlreader_getErrorHandler
,
777 saxxmlreader_putErrorHandler
,
778 saxxmlreader_getBaseURL
,
779 saxxmlreader_putBaseURL
,
780 saxxmlreader_getSecureBaseURL
,
781 saxxmlreader_putSecureBaseURL
,
783 saxxmlreader_parseURL
786 /*** ISAXXMLReader interface ***/
787 /*** IUnknown methods ***/
788 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
790 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
791 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVtbl
, riid
, ppvObject
);
794 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
796 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
797 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVtbl
);
800 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
802 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
803 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVtbl
);
806 /*** ISAXXMLReader methods ***/
807 static HRESULT WINAPI
isaxxmlreader_getFeature(
808 ISAXXMLReader
* iface
,
809 const WCHAR
*pFeature
,
810 VARIANT_BOOL
*pValue
)
812 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
814 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
818 static HRESULT WINAPI
isaxxmlreader_putFeature(
819 ISAXXMLReader
* iface
,
820 const WCHAR
*pFeature
,
821 VARIANT_BOOL vfValue
)
823 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
825 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
829 static HRESULT WINAPI
isaxxmlreader_getProperty(
830 ISAXXMLReader
* iface
,
834 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
836 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
840 static HRESULT WINAPI
isaxxmlreader_putProperty(
841 ISAXXMLReader
* iface
,
845 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
847 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
851 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
852 ISAXXMLReader
* iface
,
853 ISAXEntityResolver
**ppEntityResolver
)
855 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
857 FIXME("(%p)->(%p) stub\n", This
, ppEntityResolver
);
861 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
862 ISAXXMLReader
* iface
,
863 ISAXEntityResolver
*pEntityResolver
)
865 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
867 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
871 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
872 ISAXXMLReader
* iface
,
873 ISAXContentHandler
**pContentHandler
)
875 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
877 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
878 if(pContentHandler
== NULL
)
880 if(This
->contentHandler
)
881 ISAXContentHandler_AddRef(This
->contentHandler
);
882 *pContentHandler
= This
->contentHandler
;
887 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
888 ISAXXMLReader
* iface
,
889 ISAXContentHandler
*contentHandler
)
891 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
893 TRACE("(%p)->(%p)\n", This
, contentHandler
);
895 ISAXContentHandler_AddRef(contentHandler
);
896 if(This
->contentHandler
)
897 ISAXContentHandler_Release(This
->contentHandler
);
898 This
->contentHandler
= contentHandler
;
903 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
904 ISAXXMLReader
* iface
,
905 ISAXDTDHandler
**pDTDHandler
)
907 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
909 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
913 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
914 ISAXXMLReader
* iface
,
915 ISAXDTDHandler
*pDTDHandler
)
917 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
919 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
923 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
924 ISAXXMLReader
* iface
,
925 ISAXErrorHandler
**pErrorHandler
)
927 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
929 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
930 if(pErrorHandler
== NULL
)
932 if(This
->errorHandler
)
933 ISAXErrorHandler_AddRef(This
->errorHandler
);
934 *pErrorHandler
= This
->errorHandler
;
939 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
940 ISAXXMLReader
* iface
,
941 ISAXErrorHandler
*errorHandler
)
943 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
945 TRACE("(%p)->(%p)\n", This
, errorHandler
);
947 ISAXErrorHandler_AddRef(errorHandler
);
948 if(This
->errorHandler
)
949 ISAXErrorHandler_Release(This
->errorHandler
);
950 This
->errorHandler
= errorHandler
;
955 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
956 ISAXXMLReader
* iface
,
957 const WCHAR
**pBaseUrl
)
959 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
961 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
965 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
966 ISAXXMLReader
* iface
,
967 const WCHAR
*pBaseUrl
)
969 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
971 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
975 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
976 ISAXXMLReader
* iface
,
977 const WCHAR
**pSecureBaseUrl
)
979 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
981 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
985 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
986 ISAXXMLReader
* iface
,
987 const WCHAR
*secureBaseUrl
)
989 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
991 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
995 static HRESULT WINAPI
isaxxmlreader_parse(
996 ISAXXMLReader
* iface
,
999 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1000 saxlocator
*locator
;
1001 xmlChar
*data
= NULL
;
1004 FIXME("(%p) semi-stub\n", This
);
1006 hr
= SAXLocator_create(This
, &locator
);
1011 switch(V_VT(&varInput
))
1014 locator
->pParserCtxt
= xmlNewParserCtxt();
1015 if(!locator
->pParserCtxt
)
1020 data
= xmlChar_from_wchar(V_BSTR(&varInput
));
1021 xmlSetupParserForBuffer(locator
->pParserCtxt
, data
, NULL
);
1023 locator
->pParserCtxt
->sax
= &locator
->saxreader
->sax
;
1024 locator
->pParserCtxt
->userData
= locator
;
1026 if(xmlParseDocument(locator
->pParserCtxt
)) hr
= E_FAIL
;
1027 else hr
= locator
->ret
;
1033 if(locator
->pParserCtxt
)
1035 locator
->pParserCtxt
->sax
= NULL
;
1036 xmlFreeParserCtxt(locator
->pParserCtxt
);
1037 locator
->pParserCtxt
= NULL
;
1039 HeapFree(GetProcessHeap(), 0, data
);
1040 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1044 static HRESULT WINAPI
isaxxmlreader_parseURL(
1045 ISAXXMLReader
* iface
,
1048 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1050 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1054 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
1056 isaxxmlreader_QueryInterface
,
1057 isaxxmlreader_AddRef
,
1058 isaxxmlreader_Release
,
1059 isaxxmlreader_getFeature
,
1060 isaxxmlreader_putFeature
,
1061 isaxxmlreader_getProperty
,
1062 isaxxmlreader_putProperty
,
1063 isaxxmlreader_getEntityResolver
,
1064 isaxxmlreader_putEntityResolver
,
1065 isaxxmlreader_getContentHandler
,
1066 isaxxmlreader_putContentHandler
,
1067 isaxxmlreader_getDTDHandler
,
1068 isaxxmlreader_putDTDHandler
,
1069 isaxxmlreader_getErrorHandler
,
1070 isaxxmlreader_putErrorHandler
,
1071 isaxxmlreader_getBaseURL
,
1072 isaxxmlreader_putBaseURL
,
1073 isaxxmlreader_getSecureBaseURL
,
1074 isaxxmlreader_putSecureBaseURL
,
1075 isaxxmlreader_parse
,
1076 isaxxmlreader_parseURL
1079 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1083 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
1085 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
1087 return E_OUTOFMEMORY
;
1089 reader
->lpVtbl
= &saxreader_vtbl
;
1090 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
1092 reader
->contentHandler
= NULL
;
1093 reader
->errorHandler
= NULL
;
1095 memset(&reader
->sax
, 0, sizeof(xmlSAXHandler
));
1096 reader
->sax
.initialized
= XML_SAX2_MAGIC
;
1097 reader
->sax
.startDocument
= libxmlStartDocument
;
1098 reader
->sax
.endDocument
= libxmlEndDocument
;
1099 reader
->sax
.startElementNs
= libxmlStartElementNS
;
1100 reader
->sax
.endElementNs
= libxmlEndElementNS
;
1101 reader
->sax
.characters
= libxmlCharacters
;
1102 reader
->sax
.setDocumentLocator
= libxmlSetDocumentLocator
;
1104 *ppObj
= &reader
->lpVtbl
;
1106 TRACE("returning iface %p\n", *ppObj
);
1113 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1115 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1116 "libxml2 support was not present at compile time.\n");