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
;
72 static inline saxreader
*impl_from_IVBSAXXMLReader( IVBSAXXMLReader
*iface
)
74 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpVtbl
));
77 static inline saxreader
*impl_from_ISAXXMLReader( ISAXXMLReader
*iface
)
79 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpSAXXMLReaderVtbl
));
82 static inline saxlocator
*impl_from_ISAXLocator( ISAXLocator
*iface
)
84 return (saxlocator
*)((char*)iface
- FIELD_OFFSET(saxlocator
, lpSAXLocatorVtbl
));
88 static void format_error_message_from_id(saxlocator
*This
, HRESULT hr
)
90 xmlStopParser(This
->pParserCtxt
);
93 if(This
->saxreader
->errorHandler
)
96 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
,
97 NULL
, hr
, 0, msg
, sizeof(msg
), NULL
))
99 FIXME("MSXML errors not yet supported.\n");
103 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
104 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, msg
, hr
);
108 static void update_position(saxlocator
*This
, xmlChar
*end
)
110 if(This
->lastCur
== NULL
)
112 This
->lastCur
= (xmlChar
*)This
->pParserCtxt
->input
->base
;
117 if(!end
) end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
;
119 while(This
->lastCur
< end
)
121 if(*(This
->lastCur
) == '\n')
126 else if(*(This
->lastCur
) == '\r' && (This
->lastCur
==This
->pParserCtxt
->input
->end
|| *(This
->lastCur
+1)!='\n'))
137 /*** LibXML callbacks ***/
138 static void libxmlStartDocument(void *ctx
)
140 saxlocator
*This
= ctx
;
143 if(This
->saxreader
->contentHandler
)
145 hr
= ISAXContentHandler_startDocument(This
->saxreader
->contentHandler
);
147 format_error_message_from_id(This
, hr
);
150 update_position(This
, NULL
);
153 static void libxmlEndDocument(void *ctx
)
155 saxlocator
*This
= ctx
;
161 if(This
->ret
!= S_OK
) return;
163 if(This
->saxreader
->contentHandler
)
165 hr
= ISAXContentHandler_endDocument(This
->saxreader
->contentHandler
);
167 format_error_message_from_id(This
, hr
);
171 static void libxmlStartElementNS(
173 const xmlChar
*localname
,
174 const xmlChar
*prefix
,
177 const xmlChar
**namespaces
,
180 const xmlChar
**attributes
)
182 BSTR NamespaceUri
, LocalName
, QName
;
183 saxlocator
*This
= ctx
;
186 FIXME("Arguments processing not yet implemented.\n");
188 update_position(This
, (xmlChar
*)This
->pParserCtxt
->input
->cur
+1);
190 if(This
->saxreader
->contentHandler
)
192 NamespaceUri
= bstr_from_xmlChar(URI
);
193 LocalName
= bstr_from_xmlChar(localname
);
194 QName
= bstr_from_xmlChar(localname
);
196 hr
= ISAXContentHandler_startElement(
197 This
->saxreader
->contentHandler
,
198 NamespaceUri
, SysStringLen(NamespaceUri
),
199 LocalName
, SysStringLen(LocalName
),
200 QName
, SysStringLen(QName
),
203 SysFreeString(NamespaceUri
);
204 SysFreeString(LocalName
);
205 SysFreeString(QName
);
208 format_error_message_from_id(This
, hr
);
212 static void libxmlEndElementNS(
214 const xmlChar
*localname
,
215 const xmlChar
*prefix
,
218 BSTR NamespaceUri
, LocalName
, QName
;
219 saxlocator
*This
= ctx
;
224 while(*end
!= '<' && *(end
+1) != '/') end
++;
225 update_position(This
, end
+2);
227 if(This
->saxreader
->contentHandler
)
229 NamespaceUri
= bstr_from_xmlChar(URI
);
230 LocalName
= bstr_from_xmlChar(localname
);
231 QName
= bstr_from_xmlChar(localname
);
233 hr
= ISAXContentHandler_endElement(
234 This
->saxreader
->contentHandler
,
235 NamespaceUri
, SysStringLen(NamespaceUri
),
236 LocalName
, SysStringLen(LocalName
),
237 QName
, SysStringLen(QName
));
239 SysFreeString(NamespaceUri
);
240 SysFreeString(LocalName
);
241 SysFreeString(QName
);
244 format_error_message_from_id(This
, hr
);
248 static void libxmlCharacters(
254 saxlocator
*This
= ctx
;
257 xmlChar
*lastCurCopy
;
262 if(*(This
->lastCur
-1) != '>' && *(This
->lastCur
-1) != '/') return;
264 if(*(This
->lastCur
-1) != '>')
266 end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
-len
;
267 while(*(end
-1) != '>') end
--;
268 update_position(This
, end
);
271 chEnd
= This
->lastCur
+len
;
272 while(*chEnd
!= '<') chEnd
++;
274 Chars
= bstr_from_xmlChar(ch
);
276 lastCurCopy
= This
->lastCur
;
277 columnCopy
= This
->column
;
278 lineCopy
= This
->line
;
281 if(This
->saxreader
->contentHandler
)
283 while(This
->lastCur
< chEnd
)
288 if(*end
== '\r') break;
292 Chars
= bstr_from_xmlChar(This
->lastCur
);
294 if(*end
== '\r' && *(end
+1) == '\n')
296 memmove((WCHAR
*)Chars
+(end
-This
->lastCur
),
297 (WCHAR
*)Chars
+(end
-This
->lastCur
)+1,
298 (SysStringLen(Chars
)-(end
-This
->lastCur
))*sizeof(WCHAR
));
299 SysReAllocStringLen(&Chars
, Chars
, SysStringLen(Chars
)-1);
301 else if(*end
== '\r') Chars
[end
-This
->lastCur
] = '\n';
303 hr
= ISAXContentHandler_characters(This
->saxreader
->contentHandler
, Chars
, end
-This
->lastCur
+1);
304 SysFreeString(Chars
);
307 format_error_message_from_id(This
, hr
);
311 if(*(end
+1) == '\n') end
++;
312 if(end
< chEnd
) end
++;
314 This
->column
+= end
-This
->lastCur
;
318 This
->lastCur
= lastCurCopy
;
319 This
->column
= columnCopy
;
320 This
->line
= lineCopy
;
321 update_position(This
, chEnd
);
325 static void libxmlSetDocumentLocator(
327 xmlSAXLocatorPtr loc
)
329 saxlocator
*This
= ctx
;
332 hr
= ISAXContentHandler_putDocumentLocator(This
->saxreader
->contentHandler
,
333 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
);
336 format_error_message_from_id(This
, hr
);
339 void libxmlFatalError(void *ctx
, const char *msg
, ...)
341 saxlocator
*This
= ctx
;
347 if(!This
->saxreader
->errorHandler
)
349 xmlStopParser(This
->pParserCtxt
);
354 FIXME("Error handling is not compatible.\n");
357 vsprintf(message
, msg
, args
);
360 len
= MultiByteToWideChar(CP_ACP
, 0, message
, -1, NULL
, 0);
361 wszError
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*len
);
362 MultiByteToWideChar(CP_ACP
, 0, message
, -1, (LPWSTR
)wszError
, len
);
364 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
365 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, wszError
, E_FAIL
);
367 HeapFree(GetProcessHeap(), 0, wszError
);
369 xmlStopParser(This
->pParserCtxt
);
373 /*** ISAXLocator interface ***/
374 /*** IUnknown methods ***/
375 static HRESULT WINAPI
isaxlocator_QueryInterface(ISAXLocator
* iface
, REFIID riid
, void **ppvObject
)
377 saxlocator
*This
= impl_from_ISAXLocator( iface
);
379 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
383 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
384 IsEqualGUID( riid
, &IID_ISAXLocator
))
390 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
391 return E_NOINTERFACE
;
394 ISAXLocator_AddRef( iface
);
399 static ULONG WINAPI
isaxlocator_AddRef(ISAXLocator
* iface
)
401 saxlocator
*This
= impl_from_ISAXLocator( iface
);
402 TRACE("%p\n", This
);
403 return InterlockedIncrement( &This
->ref
);
406 static ULONG WINAPI
isaxlocator_Release(
409 saxlocator
*This
= impl_from_ISAXLocator( iface
);
412 TRACE("%p\n", This
);
414 ref
= InterlockedDecrement( &This
->ref
);
418 SysFreeString(This
->publicId
);
420 SysFreeString(This
->systemId
);
422 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
423 HeapFree( GetProcessHeap(), 0, This
);
429 /*** ISAXLocator methods ***/
430 static HRESULT WINAPI
isaxlocator_getColumnNumber(
434 saxlocator
*This
= impl_from_ISAXLocator( iface
);
436 *pnColumn
= This
->column
;
440 static HRESULT WINAPI
isaxlocator_getLineNumber(
444 saxlocator
*This
= impl_from_ISAXLocator( iface
);
446 *pnLine
= This
->line
;
450 static HRESULT WINAPI
isaxlocator_getPublicId(
452 const WCHAR
** ppwchPublicId
)
455 saxlocator
*This
= impl_from_ISAXLocator( iface
);
457 if(This
->publicId
) SysFreeString(This
->publicId
);
459 publicId
= bstr_from_xmlChar(xmlSAX2GetPublicId(This
->pParserCtxt
));
460 if(SysStringLen(publicId
))
461 This
->publicId
= (WCHAR
*)&publicId
;
464 SysFreeString(publicId
);
465 This
->publicId
= NULL
;
468 *ppwchPublicId
= This
->publicId
;
472 static HRESULT WINAPI
isaxlocator_getSystemId(
474 const WCHAR
** ppwchSystemId
)
477 saxlocator
*This
= impl_from_ISAXLocator( iface
);
479 if(This
->systemId
) SysFreeString(This
->systemId
);
481 systemId
= bstr_from_xmlChar(xmlSAX2GetSystemId(This
->pParserCtxt
));
482 if(SysStringLen(systemId
))
483 This
->systemId
= (WCHAR
*)&systemId
;
486 SysFreeString(systemId
);
487 This
->systemId
= NULL
;
490 *ppwchSystemId
= This
->systemId
;
494 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
496 isaxlocator_QueryInterface
,
499 isaxlocator_getColumnNumber
,
500 isaxlocator_getLineNumber
,
501 isaxlocator_getPublicId
,
502 isaxlocator_getSystemId
505 static HRESULT
SAXLocator_create(saxreader
*reader
, saxlocator
**ppsaxlocator
)
509 locator
= HeapAlloc( GetProcessHeap(), 0, sizeof (*locator
) );
511 return E_OUTOFMEMORY
;
513 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
516 locator
->saxreader
= reader
;
517 ISAXXMLReader_AddRef((ISAXXMLReader
*)&reader
->lpSAXXMLReaderVtbl
);
519 locator
->pParserCtxt
= NULL
;
520 locator
->publicId
= NULL
;
521 locator
->systemId
= NULL
;
522 locator
->lastCur
= NULL
;
527 *ppsaxlocator
= locator
;
529 TRACE("returning %p\n", *ppsaxlocator
);
534 /*** IVBSAXXMLReader interface ***/
535 /*** IUnknown methods ***/
536 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
538 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
540 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
544 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
545 IsEqualGUID( riid
, &IID_IDispatch
) ||
546 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
550 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
552 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
556 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
557 return E_NOINTERFACE
;
560 IVBSAXXMLReader_AddRef( iface
);
565 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
567 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
568 TRACE("%p\n", This
);
569 return InterlockedIncrement( &This
->ref
);
572 static ULONG WINAPI
saxxmlreader_Release(
573 IVBSAXXMLReader
* iface
)
575 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
578 TRACE("%p\n", This
);
580 ref
= InterlockedDecrement( &This
->ref
);
583 if(This
->contentHandler
)
584 ISAXContentHandler_Release(This
->contentHandler
);
586 if(This
->errorHandler
)
587 ISAXErrorHandler_Release(This
->errorHandler
);
589 HeapFree( GetProcessHeap(), 0, This
);
595 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
597 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
599 TRACE("(%p)->(%p)\n", This
, pctinfo
);
606 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
607 IVBSAXXMLReader
*iface
,
608 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
610 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
613 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
615 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
620 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
621 IVBSAXXMLReader
*iface
,
628 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
632 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
635 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
638 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
641 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
642 ITypeInfo_Release(typeinfo
);
648 static HRESULT WINAPI
saxxmlreader_Invoke(
649 IVBSAXXMLReader
*iface
,
654 DISPPARAMS
* pDispParams
,
656 EXCEPINFO
* pExcepInfo
,
659 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
663 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
664 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
666 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
669 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVtbl
), dispIdMember
, wFlags
, pDispParams
,
670 pVarResult
, pExcepInfo
, puArgErr
);
671 ITypeInfo_Release(typeinfo
);
677 /*** IVBSAXXMLReader methods ***/
678 static HRESULT WINAPI
saxxmlreader_getFeature(
679 IVBSAXXMLReader
* iface
,
680 const WCHAR
*pFeature
,
681 VARIANT_BOOL
*pValue
)
683 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
685 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
689 static HRESULT WINAPI
saxxmlreader_putFeature(
690 IVBSAXXMLReader
* iface
,
691 const WCHAR
*pFeature
,
692 VARIANT_BOOL vfValue
)
694 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
696 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
700 static HRESULT WINAPI
saxxmlreader_getProperty(
701 IVBSAXXMLReader
* iface
,
705 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
707 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
711 static HRESULT WINAPI
saxxmlreader_putProperty(
712 IVBSAXXMLReader
* iface
,
716 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
718 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
722 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
723 IVBSAXXMLReader
* iface
,
724 IVBSAXEntityResolver
**pEntityResolver
)
726 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
728 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
732 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
733 IVBSAXXMLReader
* iface
,
734 IVBSAXEntityResolver
*pEntityResolver
)
736 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
738 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
742 static HRESULT WINAPI
saxxmlreader_getContentHandler(
743 IVBSAXXMLReader
* iface
,
744 IVBSAXContentHandler
**ppContentHandler
)
746 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
748 FIXME("(%p)->(%p) stub\n", This
, ppContentHandler
);
752 static HRESULT WINAPI
saxxmlreader_putContentHandler(
753 IVBSAXXMLReader
* iface
,
754 IVBSAXContentHandler
*contentHandler
)
756 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
758 FIXME("(%p)->(%p) stub\n", This
, contentHandler
);
762 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
763 IVBSAXXMLReader
* iface
,
764 IVBSAXDTDHandler
**pDTDHandler
)
766 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
768 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
772 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
773 IVBSAXXMLReader
* iface
,
774 IVBSAXDTDHandler
*pDTDHandler
)
776 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
778 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
782 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
783 IVBSAXXMLReader
* iface
,
784 IVBSAXErrorHandler
**pErrorHandler
)
786 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
788 FIXME("(%p)->(%p) stub\n", This
, pErrorHandler
);
792 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
793 IVBSAXXMLReader
* iface
,
794 IVBSAXErrorHandler
*errorHandler
)
796 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
798 FIXME("(%p)->(%p) stub\n", This
, errorHandler
);
802 static HRESULT WINAPI
saxxmlreader_getBaseURL(
803 IVBSAXXMLReader
* iface
,
804 const WCHAR
**pBaseUrl
)
806 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
808 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
812 static HRESULT WINAPI
saxxmlreader_putBaseURL(
813 IVBSAXXMLReader
* iface
,
814 const WCHAR
*pBaseUrl
)
816 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
818 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
822 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
823 IVBSAXXMLReader
* iface
,
824 const WCHAR
**pSecureBaseUrl
)
826 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
828 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
833 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
834 IVBSAXXMLReader
* iface
,
835 const WCHAR
*secureBaseUrl
)
837 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
839 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
843 static HRESULT WINAPI
saxxmlreader_parse(
844 IVBSAXXMLReader
* iface
,
847 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
849 FIXME("(%p) stub\n", This
);
853 static HRESULT WINAPI
saxxmlreader_parseURL(
854 IVBSAXXMLReader
* iface
,
857 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
859 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
863 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
865 saxxmlreader_QueryInterface
,
867 saxxmlreader_Release
,
868 saxxmlreader_GetTypeInfoCount
,
869 saxxmlreader_GetTypeInfo
,
870 saxxmlreader_GetIDsOfNames
,
872 saxxmlreader_getFeature
,
873 saxxmlreader_putFeature
,
874 saxxmlreader_getProperty
,
875 saxxmlreader_putProperty
,
876 saxxmlreader_getEntityResolver
,
877 saxxmlreader_putEntityResolver
,
878 saxxmlreader_getContentHandler
,
879 saxxmlreader_putContentHandler
,
880 saxxmlreader_getDTDHandler
,
881 saxxmlreader_putDTDHandler
,
882 saxxmlreader_getErrorHandler
,
883 saxxmlreader_putErrorHandler
,
884 saxxmlreader_getBaseURL
,
885 saxxmlreader_putBaseURL
,
886 saxxmlreader_getSecureBaseURL
,
887 saxxmlreader_putSecureBaseURL
,
889 saxxmlreader_parseURL
892 /*** ISAXXMLReader interface ***/
893 /*** IUnknown methods ***/
894 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
896 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
897 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVtbl
, riid
, ppvObject
);
900 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
902 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
903 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVtbl
);
906 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
908 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
909 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVtbl
);
912 /*** ISAXXMLReader methods ***/
913 static HRESULT WINAPI
isaxxmlreader_getFeature(
914 ISAXXMLReader
* iface
,
915 const WCHAR
*pFeature
,
916 VARIANT_BOOL
*pValue
)
918 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
920 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
924 static HRESULT WINAPI
isaxxmlreader_putFeature(
925 ISAXXMLReader
* iface
,
926 const WCHAR
*pFeature
,
927 VARIANT_BOOL vfValue
)
929 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
931 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
935 static HRESULT WINAPI
isaxxmlreader_getProperty(
936 ISAXXMLReader
* iface
,
940 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
942 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
946 static HRESULT WINAPI
isaxxmlreader_putProperty(
947 ISAXXMLReader
* iface
,
951 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
953 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
957 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
958 ISAXXMLReader
* iface
,
959 ISAXEntityResolver
**ppEntityResolver
)
961 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
963 FIXME("(%p)->(%p) stub\n", This
, ppEntityResolver
);
967 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
968 ISAXXMLReader
* iface
,
969 ISAXEntityResolver
*pEntityResolver
)
971 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
973 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
977 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
978 ISAXXMLReader
* iface
,
979 ISAXContentHandler
**pContentHandler
)
981 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
983 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
984 if(pContentHandler
== NULL
)
986 if(This
->contentHandler
)
987 ISAXContentHandler_AddRef(This
->contentHandler
);
988 *pContentHandler
= This
->contentHandler
;
993 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
994 ISAXXMLReader
* iface
,
995 ISAXContentHandler
*contentHandler
)
997 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
999 TRACE("(%p)->(%p)\n", This
, contentHandler
);
1001 ISAXContentHandler_AddRef(contentHandler
);
1002 if(This
->contentHandler
)
1003 ISAXContentHandler_Release(This
->contentHandler
);
1004 This
->contentHandler
= contentHandler
;
1009 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
1010 ISAXXMLReader
* iface
,
1011 ISAXDTDHandler
**pDTDHandler
)
1013 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1015 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1019 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
1020 ISAXXMLReader
* iface
,
1021 ISAXDTDHandler
*pDTDHandler
)
1023 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1025 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1029 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
1030 ISAXXMLReader
* iface
,
1031 ISAXErrorHandler
**pErrorHandler
)
1033 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1035 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
1036 if(pErrorHandler
== NULL
)
1038 if(This
->errorHandler
)
1039 ISAXErrorHandler_AddRef(This
->errorHandler
);
1040 *pErrorHandler
= This
->errorHandler
;
1045 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
1046 ISAXXMLReader
* iface
,
1047 ISAXErrorHandler
*errorHandler
)
1049 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1051 TRACE("(%p)->(%p)\n", This
, errorHandler
);
1053 ISAXErrorHandler_AddRef(errorHandler
);
1054 if(This
->errorHandler
)
1055 ISAXErrorHandler_Release(This
->errorHandler
);
1056 This
->errorHandler
= errorHandler
;
1061 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
1062 ISAXXMLReader
* iface
,
1063 const WCHAR
**pBaseUrl
)
1065 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1067 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1071 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
1072 ISAXXMLReader
* iface
,
1073 const WCHAR
*pBaseUrl
)
1075 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1077 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1081 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
1082 ISAXXMLReader
* iface
,
1083 const WCHAR
**pSecureBaseUrl
)
1085 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1087 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1091 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
1092 ISAXXMLReader
* iface
,
1093 const WCHAR
*secureBaseUrl
)
1095 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1097 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1101 static HRESULT WINAPI
isaxxmlreader_parse(
1102 ISAXXMLReader
* iface
,
1105 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1106 saxlocator
*locator
;
1107 xmlChar
*data
= NULL
;
1110 TRACE("(%p)\n", This
);
1112 hr
= SAXLocator_create(This
, &locator
);
1116 locator
->pParserCtxt
= xmlNewParserCtxt();
1117 if(!locator
->pParserCtxt
)
1119 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1123 locator
->pParserCtxt
->sax
= &locator
->saxreader
->sax
;
1124 locator
->pParserCtxt
->userData
= locator
;
1127 switch(V_VT(&varInput
))
1130 data
= xmlChar_from_wchar(V_BSTR(&varInput
));
1131 xmlSetupParserForBuffer(locator
->pParserCtxt
, data
, NULL
);
1133 case VT_ARRAY
|VT_UI1
: {
1135 LONG lBound
, uBound
;
1138 hr
= SafeArrayGetLBound(V_ARRAY(&varInput
), 1, &lBound
);
1139 if(hr
!= S_OK
) break;
1140 hr
= SafeArrayGetUBound(V_ARRAY(&varInput
), 1, &uBound
);
1141 if(hr
!= S_OK
) break;
1142 dataRead
= (uBound
-lBound
)*SafeArrayGetElemsize(V_ARRAY(&varInput
));
1143 data
= HeapAlloc(GetProcessHeap(), 0, dataRead
+1);
1145 hr
= SafeArrayAccessData(V_ARRAY(&varInput
), (void**)&pSAData
);
1146 if(hr
!= S_OK
) break;
1147 memcpy(data
, pSAData
, dataRead
);
1148 data
[dataRead
] = '\0';
1149 xmlSetupParserForBuffer(locator
->pParserCtxt
, data
, NULL
);
1150 SafeArrayUnaccessData(V_ARRAY(&varInput
));
1155 IPersistStream
*persistStream
;
1156 IStream
*stream
= NULL
;
1157 IXMLDOMDocument
*xmlDoc
;
1159 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1160 &IID_IPersistStream
, (void**)&persistStream
) == S_OK
)
1162 hr
= IPersistStream_Save(persistStream
, stream
, TRUE
);
1163 IPersistStream_Release(persistStream
);
1164 if(hr
!= S_OK
) break;
1166 if(stream
|| IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1167 &IID_IStream
, (void**)&stream
) == S_OK
)
1174 hr
= IStream_Stat(stream
, &dataInfo
, STATFLAG_NONAME
);
1175 if(hr
== E_PENDING
) continue;
1178 data
= HeapAlloc(GetProcessHeap(), 0,
1179 dataInfo
.cbSize
.QuadPart
+1);
1182 hr
= IStream_Read(stream
, data
,
1183 dataInfo
.cbSize
.QuadPart
, &dataRead
);
1184 if(hr
== E_PENDING
) continue;
1187 data
[dataInfo
.cbSize
.QuadPart
] = '\0';
1188 xmlSetupParserForBuffer(locator
->pParserCtxt
, data
, NULL
);
1189 IStream_Release(stream
);
1192 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1193 &IID_IXMLDOMDocument
, (void**)&xmlDoc
) == S_OK
)
1197 IXMLDOMDocument_get_xml(xmlDoc
, &bstrData
);
1198 data
= xmlChar_from_wchar(bstrData
);
1199 xmlSetupParserForBuffer(locator
->pParserCtxt
, data
, NULL
);
1200 IXMLDOMDocument_Release(xmlDoc
);
1206 WARN("vt %d not implemented\n", V_VT(&varInput
));
1212 if(xmlParseDocument(locator
->pParserCtxt
)) hr
= E_FAIL
;
1213 else hr
= locator
->ret
;
1216 if(locator
->pParserCtxt
)
1218 locator
->pParserCtxt
->sax
= NULL
;
1219 xmlFreeParserCtxt(locator
->pParserCtxt
);
1220 locator
->pParserCtxt
= NULL
;
1222 HeapFree(GetProcessHeap(), 0, data
);
1223 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1227 static HRESULT WINAPI
isaxxmlreader_parseURL(
1228 ISAXXMLReader
* iface
,
1231 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1233 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1237 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
1239 isaxxmlreader_QueryInterface
,
1240 isaxxmlreader_AddRef
,
1241 isaxxmlreader_Release
,
1242 isaxxmlreader_getFeature
,
1243 isaxxmlreader_putFeature
,
1244 isaxxmlreader_getProperty
,
1245 isaxxmlreader_putProperty
,
1246 isaxxmlreader_getEntityResolver
,
1247 isaxxmlreader_putEntityResolver
,
1248 isaxxmlreader_getContentHandler
,
1249 isaxxmlreader_putContentHandler
,
1250 isaxxmlreader_getDTDHandler
,
1251 isaxxmlreader_putDTDHandler
,
1252 isaxxmlreader_getErrorHandler
,
1253 isaxxmlreader_putErrorHandler
,
1254 isaxxmlreader_getBaseURL
,
1255 isaxxmlreader_putBaseURL
,
1256 isaxxmlreader_getSecureBaseURL
,
1257 isaxxmlreader_putSecureBaseURL
,
1258 isaxxmlreader_parse
,
1259 isaxxmlreader_parseURL
1262 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1266 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
1268 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
1270 return E_OUTOFMEMORY
;
1272 reader
->lpVtbl
= &saxreader_vtbl
;
1273 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
1275 reader
->contentHandler
= NULL
;
1276 reader
->errorHandler
= NULL
;
1278 memset(&reader
->sax
, 0, sizeof(xmlSAXHandler
));
1279 reader
->sax
.initialized
= XML_SAX2_MAGIC
;
1280 reader
->sax
.startDocument
= libxmlStartDocument
;
1281 reader
->sax
.endDocument
= libxmlEndDocument
;
1282 reader
->sax
.startElementNs
= libxmlStartElementNS
;
1283 reader
->sax
.endElementNs
= libxmlEndElementNS
;
1284 reader
->sax
.characters
= libxmlCharacters
;
1285 reader
->sax
.setDocumentLocator
= libxmlSetDocumentLocator
;
1286 reader
->sax
.error
= libxmlFatalError
;
1287 reader
->sax
.fatalError
= libxmlFatalError
;
1289 *ppObj
= &reader
->lpVtbl
;
1291 TRACE("returning iface %p\n", *ppObj
);
1298 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1300 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1301 "libxml2 support was not present at compile time.\n");