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 typedef struct _saxattributes
74 const struct ISAXAttributesVtbl
*lpSAXAttributesVtbl
;
78 static inline saxreader
*impl_from_IVBSAXXMLReader( IVBSAXXMLReader
*iface
)
80 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpVtbl
));
83 static inline saxreader
*impl_from_ISAXXMLReader( ISAXXMLReader
*iface
)
85 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpSAXXMLReaderVtbl
));
88 static inline saxlocator
*impl_from_ISAXLocator( ISAXLocator
*iface
)
90 return (saxlocator
*)((char*)iface
- FIELD_OFFSET(saxlocator
, lpSAXLocatorVtbl
));
93 static inline saxattributes
*impl_from_ISAXAttributes( ISAXAttributes
*iface
)
95 return (saxattributes
*)((char*)iface
- FIELD_OFFSET(saxattributes
, lpSAXAttributesVtbl
));
99 static void format_error_message_from_id(saxlocator
*This
, HRESULT hr
)
101 xmlStopParser(This
->pParserCtxt
);
104 if(This
->saxreader
->errorHandler
)
107 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
,
108 NULL
, hr
, 0, msg
, sizeof(msg
), NULL
))
110 FIXME("MSXML errors not yet supported.\n");
114 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
115 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, msg
, hr
);
119 static void update_position(saxlocator
*This
, xmlChar
*end
)
121 if(This
->lastCur
== NULL
)
123 This
->lastCur
= (xmlChar
*)This
->pParserCtxt
->input
->base
;
128 if(!end
) end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
;
130 while(This
->lastCur
< end
)
132 if(*(This
->lastCur
) == '\n')
137 else if(*(This
->lastCur
) == '\r' && (This
->lastCur
==This
->pParserCtxt
->input
->end
|| *(This
->lastCur
+1)!='\n'))
148 /*** ISAXAttributes interface ***/
149 /*** IUnknown methods ***/
150 static HRESULT WINAPI
isaxattributes_QueryInterface(
151 ISAXAttributes
* iface
,
155 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
157 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
161 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
162 IsEqualGUID(riid
, &IID_ISAXAttributes
))
168 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
169 return E_NOINTERFACE
;
172 ISAXAttributes_AddRef(iface
);
177 static ULONG WINAPI
isaxattributes_AddRef(ISAXAttributes
* iface
)
179 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
181 return InterlockedIncrement(&This
->ref
);
184 static ULONG WINAPI
isaxattributes_Release(ISAXAttributes
* iface
)
186 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
191 ref
= InterlockedDecrement(&This
->ref
);
194 HeapFree(GetProcessHeap(), 0, This
);
200 /*** ISAXAttributes methods ***/
201 static HRESULT WINAPI
isaxattributes_getLength(
202 ISAXAttributes
* iface
,
205 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
207 FIXME("(%p) stub\n", This
);
211 static HRESULT WINAPI
isaxattributes_getURI(
212 ISAXAttributes
* iface
,
217 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
219 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
223 static HRESULT WINAPI
isaxattributes_getLocalName(
224 ISAXAttributes
* iface
,
226 const WCHAR
**pLocalName
,
227 int *pLocalNameLength
)
229 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
231 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
235 static HRESULT WINAPI
isaxattributes_getQName(
236 ISAXAttributes
* iface
,
238 const WCHAR
**pQName
,
241 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
243 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
247 static HRESULT WINAPI
isaxattributes_getName(
248 ISAXAttributes
* iface
,
252 const WCHAR
**pLocalName
,
254 const WCHAR
**pQName
,
257 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
259 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
263 static HRESULT WINAPI
isaxattributes_getIndexFromName(
264 ISAXAttributes
* iface
,
267 const WCHAR
*pLocalName
,
271 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
273 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), cUriLength
,
274 debugstr_w(pLocalName
), cocalNameLength
);
278 static HRESULT WINAPI
isaxattributes_getIndexFromQName(
279 ISAXAttributes
* iface
,
284 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
286 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQNameLength
);
290 static HRESULT WINAPI
isaxattributes_getType(
291 ISAXAttributes
* iface
,
296 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
298 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
302 static HRESULT WINAPI
isaxattributes_getTypeFromName(
303 ISAXAttributes
* iface
,
306 const WCHAR
*pLocalName
,
311 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
313 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
314 debugstr_w(pLocalName
), nLocalName
);
318 static HRESULT WINAPI
isaxattributes_getTypeFromQName(
319 ISAXAttributes
* iface
,
325 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
327 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
331 static HRESULT WINAPI
isaxattributes_getValue(
332 ISAXAttributes
* iface
,
334 const WCHAR
**pValue
,
337 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
339 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
343 static HRESULT WINAPI
isaxattributes_getValueFromName(
344 ISAXAttributes
* iface
,
347 const WCHAR
*pLocalName
,
349 const WCHAR
**pValue
,
352 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
354 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
355 debugstr_w(pLocalName
), nLocalName
);
359 static HRESULT WINAPI
isaxattributes_getValueFromQName(
360 ISAXAttributes
* iface
,
363 const WCHAR
**pValue
,
366 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
368 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
372 static const struct ISAXAttributesVtbl isaxattributes_vtbl
=
374 isaxattributes_QueryInterface
,
375 isaxattributes_AddRef
,
376 isaxattributes_Release
,
377 isaxattributes_getLength
,
378 isaxattributes_getURI
,
379 isaxattributes_getLocalName
,
380 isaxattributes_getQName
,
381 isaxattributes_getName
,
382 isaxattributes_getIndexFromName
,
383 isaxattributes_getIndexFromQName
,
384 isaxattributes_getType
,
385 isaxattributes_getTypeFromName
,
386 isaxattributes_getTypeFromQName
,
387 isaxattributes_getValue
,
388 isaxattributes_getValueFromName
,
389 isaxattributes_getValueFromQName
392 static HRESULT
SAXAttributes_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
394 saxattributes
*attributes
;
396 attributes
= HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes
));
398 return E_OUTOFMEMORY
;
400 attributes
->lpSAXAttributesVtbl
= &isaxattributes_vtbl
;
405 TRACE("returning %p\n", *ppObj
);
410 /*** LibXML callbacks ***/
411 static void libxmlStartDocument(void *ctx
)
413 saxlocator
*This
= ctx
;
416 if(This
->saxreader
->contentHandler
)
418 hr
= ISAXContentHandler_startDocument(This
->saxreader
->contentHandler
);
420 format_error_message_from_id(This
, hr
);
423 update_position(This
, NULL
);
426 static void libxmlEndDocument(void *ctx
)
428 saxlocator
*This
= ctx
;
434 if(This
->ret
!= S_OK
) return;
436 if(This
->saxreader
->contentHandler
)
438 hr
= ISAXContentHandler_endDocument(This
->saxreader
->contentHandler
);
440 format_error_message_from_id(This
, hr
);
444 static void libxmlStartElementNS(
446 const xmlChar
*localname
,
447 const xmlChar
*prefix
,
450 const xmlChar
**namespaces
,
453 const xmlChar
**attributes
)
455 BSTR NamespaceUri
, LocalName
, QName
;
456 saxlocator
*This
= ctx
;
458 ISAXAttributes
*attr
;
460 FIXME("Arguments processing not yet implemented.\n");
462 update_position(This
, (xmlChar
*)This
->pParserCtxt
->input
->cur
+1);
464 if(This
->saxreader
->contentHandler
)
466 NamespaceUri
= bstr_from_xmlChar(URI
);
467 LocalName
= bstr_from_xmlChar(localname
);
468 QName
= bstr_from_xmlChar(localname
);
470 SAXAttributes_create(NULL
, (void*)&attr
);
472 hr
= ISAXContentHandler_startElement(
473 This
->saxreader
->contentHandler
,
474 NamespaceUri
, SysStringLen(NamespaceUri
),
475 LocalName
, SysStringLen(LocalName
),
476 QName
, SysStringLen(QName
),
479 SysFreeString(NamespaceUri
);
480 SysFreeString(LocalName
);
481 SysFreeString(QName
);
483 ISAXAttributes_Release(attr
);
486 format_error_message_from_id(This
, hr
);
490 static void libxmlEndElementNS(
492 const xmlChar
*localname
,
493 const xmlChar
*prefix
,
496 BSTR NamespaceUri
, LocalName
, QName
;
497 saxlocator
*This
= ctx
;
502 while(*end
!= '<' && *(end
+1) != '/') end
++;
503 update_position(This
, end
+2);
505 if(This
->saxreader
->contentHandler
)
507 NamespaceUri
= bstr_from_xmlChar(URI
);
508 LocalName
= bstr_from_xmlChar(localname
);
509 QName
= bstr_from_xmlChar(localname
);
511 hr
= ISAXContentHandler_endElement(
512 This
->saxreader
->contentHandler
,
513 NamespaceUri
, SysStringLen(NamespaceUri
),
514 LocalName
, SysStringLen(LocalName
),
515 QName
, SysStringLen(QName
));
517 SysFreeString(NamespaceUri
);
518 SysFreeString(LocalName
);
519 SysFreeString(QName
);
522 format_error_message_from_id(This
, hr
);
526 static void libxmlCharacters(
532 saxlocator
*This
= ctx
;
535 xmlChar
*lastCurCopy
;
540 if(*(This
->lastCur
-1) != '>' && *(This
->lastCur
-1) != '/') return;
542 if(*(This
->lastCur
-1) != '>')
544 end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
-len
;
545 while(*(end
-1) != '>') end
--;
546 update_position(This
, end
);
549 chEnd
= This
->lastCur
+len
;
550 while(*chEnd
!= '<') chEnd
++;
552 Chars
= bstr_from_xmlChar(ch
);
554 lastCurCopy
= This
->lastCur
;
555 columnCopy
= This
->column
;
556 lineCopy
= This
->line
;
559 if(This
->saxreader
->contentHandler
)
561 while(This
->lastCur
< chEnd
)
566 if(*end
== '\r') break;
570 Chars
= bstr_from_xmlChar(This
->lastCur
);
572 if(*end
== '\r' && *(end
+1) == '\n')
574 memmove((WCHAR
*)Chars
+(end
-This
->lastCur
),
575 (WCHAR
*)Chars
+(end
-This
->lastCur
)+1,
576 (SysStringLen(Chars
)-(end
-This
->lastCur
))*sizeof(WCHAR
));
577 SysReAllocStringLen(&Chars
, Chars
, SysStringLen(Chars
)-1);
579 else if(*end
== '\r') Chars
[end
-This
->lastCur
] = '\n';
581 hr
= ISAXContentHandler_characters(This
->saxreader
->contentHandler
, Chars
, end
-This
->lastCur
+1);
582 SysFreeString(Chars
);
585 format_error_message_from_id(This
, hr
);
589 if(*(end
+1) == '\n') end
++;
590 if(end
< chEnd
) end
++;
592 This
->column
+= end
-This
->lastCur
;
596 This
->lastCur
= lastCurCopy
;
597 This
->column
= columnCopy
;
598 This
->line
= lineCopy
;
599 update_position(This
, chEnd
);
603 static void libxmlSetDocumentLocator(
605 xmlSAXLocatorPtr loc
)
607 saxlocator
*This
= ctx
;
610 hr
= ISAXContentHandler_putDocumentLocator(This
->saxreader
->contentHandler
,
611 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
);
614 format_error_message_from_id(This
, hr
);
617 void libxmlFatalError(void *ctx
, const char *msg
, ...)
619 saxlocator
*This
= ctx
;
625 if(!This
->saxreader
->errorHandler
)
627 xmlStopParser(This
->pParserCtxt
);
632 FIXME("Error handling is not compatible.\n");
635 vsprintf(message
, msg
, args
);
638 len
= MultiByteToWideChar(CP_ACP
, 0, message
, -1, NULL
, 0);
639 wszError
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*len
);
640 MultiByteToWideChar(CP_ACP
, 0, message
, -1, (LPWSTR
)wszError
, len
);
642 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
643 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, wszError
, E_FAIL
);
645 HeapFree(GetProcessHeap(), 0, wszError
);
647 xmlStopParser(This
->pParserCtxt
);
651 /*** ISAXLocator interface ***/
652 /*** IUnknown methods ***/
653 static HRESULT WINAPI
isaxlocator_QueryInterface(ISAXLocator
* iface
, REFIID riid
, void **ppvObject
)
655 saxlocator
*This
= impl_from_ISAXLocator( iface
);
657 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
661 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
662 IsEqualGUID( riid
, &IID_ISAXLocator
))
668 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
669 return E_NOINTERFACE
;
672 ISAXLocator_AddRef( iface
);
677 static ULONG WINAPI
isaxlocator_AddRef(ISAXLocator
* iface
)
679 saxlocator
*This
= impl_from_ISAXLocator( iface
);
680 TRACE("%p\n", This
);
681 return InterlockedIncrement( &This
->ref
);
684 static ULONG WINAPI
isaxlocator_Release(
687 saxlocator
*This
= impl_from_ISAXLocator( iface
);
690 TRACE("%p\n", This
);
692 ref
= InterlockedDecrement( &This
->ref
);
696 SysFreeString(This
->publicId
);
698 SysFreeString(This
->systemId
);
700 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
701 HeapFree( GetProcessHeap(), 0, This
);
707 /*** ISAXLocator methods ***/
708 static HRESULT WINAPI
isaxlocator_getColumnNumber(
712 saxlocator
*This
= impl_from_ISAXLocator( iface
);
714 *pnColumn
= This
->column
;
718 static HRESULT WINAPI
isaxlocator_getLineNumber(
722 saxlocator
*This
= impl_from_ISAXLocator( iface
);
724 *pnLine
= This
->line
;
728 static HRESULT WINAPI
isaxlocator_getPublicId(
730 const WCHAR
** ppwchPublicId
)
733 saxlocator
*This
= impl_from_ISAXLocator( iface
);
735 if(This
->publicId
) SysFreeString(This
->publicId
);
737 publicId
= bstr_from_xmlChar(xmlSAX2GetPublicId(This
->pParserCtxt
));
738 if(SysStringLen(publicId
))
739 This
->publicId
= (WCHAR
*)&publicId
;
742 SysFreeString(publicId
);
743 This
->publicId
= NULL
;
746 *ppwchPublicId
= This
->publicId
;
750 static HRESULT WINAPI
isaxlocator_getSystemId(
752 const WCHAR
** ppwchSystemId
)
755 saxlocator
*This
= impl_from_ISAXLocator( iface
);
757 if(This
->systemId
) SysFreeString(This
->systemId
);
759 systemId
= bstr_from_xmlChar(xmlSAX2GetSystemId(This
->pParserCtxt
));
760 if(SysStringLen(systemId
))
761 This
->systemId
= (WCHAR
*)&systemId
;
764 SysFreeString(systemId
);
765 This
->systemId
= NULL
;
768 *ppwchSystemId
= This
->systemId
;
772 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
774 isaxlocator_QueryInterface
,
777 isaxlocator_getColumnNumber
,
778 isaxlocator_getLineNumber
,
779 isaxlocator_getPublicId
,
780 isaxlocator_getSystemId
783 static HRESULT
SAXLocator_create(saxreader
*reader
, saxlocator
**ppsaxlocator
)
787 locator
= HeapAlloc( GetProcessHeap(), 0, sizeof (*locator
) );
789 return E_OUTOFMEMORY
;
791 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
794 locator
->saxreader
= reader
;
795 ISAXXMLReader_AddRef((ISAXXMLReader
*)&reader
->lpSAXXMLReaderVtbl
);
797 locator
->pParserCtxt
= NULL
;
798 locator
->publicId
= NULL
;
799 locator
->systemId
= NULL
;
800 locator
->lastCur
= NULL
;
805 *ppsaxlocator
= locator
;
807 TRACE("returning %p\n", *ppsaxlocator
);
812 /*** IVBSAXXMLReader interface ***/
813 /*** IUnknown methods ***/
814 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
816 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
818 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
822 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
823 IsEqualGUID( riid
, &IID_IDispatch
) ||
824 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
828 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
830 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
834 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
835 return E_NOINTERFACE
;
838 IVBSAXXMLReader_AddRef( iface
);
843 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
845 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
846 TRACE("%p\n", This
);
847 return InterlockedIncrement( &This
->ref
);
850 static ULONG WINAPI
saxxmlreader_Release(
851 IVBSAXXMLReader
* iface
)
853 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
856 TRACE("%p\n", This
);
858 ref
= InterlockedDecrement( &This
->ref
);
861 if(This
->contentHandler
)
862 ISAXContentHandler_Release(This
->contentHandler
);
864 if(This
->errorHandler
)
865 ISAXErrorHandler_Release(This
->errorHandler
);
867 HeapFree( GetProcessHeap(), 0, This
);
873 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
875 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
877 TRACE("(%p)->(%p)\n", This
, pctinfo
);
884 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
885 IVBSAXXMLReader
*iface
,
886 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
888 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
891 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
893 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
898 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
899 IVBSAXXMLReader
*iface
,
906 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
910 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
913 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
916 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
919 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
920 ITypeInfo_Release(typeinfo
);
926 static HRESULT WINAPI
saxxmlreader_Invoke(
927 IVBSAXXMLReader
*iface
,
932 DISPPARAMS
* pDispParams
,
934 EXCEPINFO
* pExcepInfo
,
937 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
941 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
942 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
944 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
947 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVtbl
), dispIdMember
, wFlags
, pDispParams
,
948 pVarResult
, pExcepInfo
, puArgErr
);
949 ITypeInfo_Release(typeinfo
);
955 /*** IVBSAXXMLReader methods ***/
956 static HRESULT WINAPI
saxxmlreader_getFeature(
957 IVBSAXXMLReader
* iface
,
958 const WCHAR
*pFeature
,
959 VARIANT_BOOL
*pValue
)
961 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
963 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
967 static HRESULT WINAPI
saxxmlreader_putFeature(
968 IVBSAXXMLReader
* iface
,
969 const WCHAR
*pFeature
,
970 VARIANT_BOOL vfValue
)
972 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
974 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
978 static HRESULT WINAPI
saxxmlreader_getProperty(
979 IVBSAXXMLReader
* iface
,
983 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
985 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
989 static HRESULT WINAPI
saxxmlreader_putProperty(
990 IVBSAXXMLReader
* iface
,
994 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
996 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1000 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
1001 IVBSAXXMLReader
* iface
,
1002 IVBSAXEntityResolver
**pEntityResolver
)
1004 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1006 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1010 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
1011 IVBSAXXMLReader
* iface
,
1012 IVBSAXEntityResolver
*pEntityResolver
)
1014 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1016 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1020 static HRESULT WINAPI
saxxmlreader_getContentHandler(
1021 IVBSAXXMLReader
* iface
,
1022 IVBSAXContentHandler
**ppContentHandler
)
1024 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1026 FIXME("(%p)->(%p) stub\n", This
, ppContentHandler
);
1030 static HRESULT WINAPI
saxxmlreader_putContentHandler(
1031 IVBSAXXMLReader
* iface
,
1032 IVBSAXContentHandler
*contentHandler
)
1034 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1036 FIXME("(%p)->(%p) stub\n", This
, contentHandler
);
1040 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
1041 IVBSAXXMLReader
* iface
,
1042 IVBSAXDTDHandler
**pDTDHandler
)
1044 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1046 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1050 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
1051 IVBSAXXMLReader
* iface
,
1052 IVBSAXDTDHandler
*pDTDHandler
)
1054 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1056 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1060 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
1061 IVBSAXXMLReader
* iface
,
1062 IVBSAXErrorHandler
**pErrorHandler
)
1064 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1066 FIXME("(%p)->(%p) stub\n", This
, pErrorHandler
);
1070 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
1071 IVBSAXXMLReader
* iface
,
1072 IVBSAXErrorHandler
*errorHandler
)
1074 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1076 FIXME("(%p)->(%p) stub\n", This
, errorHandler
);
1080 static HRESULT WINAPI
saxxmlreader_getBaseURL(
1081 IVBSAXXMLReader
* iface
,
1082 const WCHAR
**pBaseUrl
)
1084 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1086 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1090 static HRESULT WINAPI
saxxmlreader_putBaseURL(
1091 IVBSAXXMLReader
* iface
,
1092 const WCHAR
*pBaseUrl
)
1094 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1096 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1100 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
1101 IVBSAXXMLReader
* iface
,
1102 const WCHAR
**pSecureBaseUrl
)
1104 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1106 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1111 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
1112 IVBSAXXMLReader
* iface
,
1113 const WCHAR
*secureBaseUrl
)
1115 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1117 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1121 static HRESULT WINAPI
saxxmlreader_parse(
1122 IVBSAXXMLReader
* iface
,
1125 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1127 FIXME("(%p) stub\n", This
);
1131 static HRESULT WINAPI
saxxmlreader_parseURL(
1132 IVBSAXXMLReader
* iface
,
1135 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1137 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1141 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
1143 saxxmlreader_QueryInterface
,
1144 saxxmlreader_AddRef
,
1145 saxxmlreader_Release
,
1146 saxxmlreader_GetTypeInfoCount
,
1147 saxxmlreader_GetTypeInfo
,
1148 saxxmlreader_GetIDsOfNames
,
1149 saxxmlreader_Invoke
,
1150 saxxmlreader_getFeature
,
1151 saxxmlreader_putFeature
,
1152 saxxmlreader_getProperty
,
1153 saxxmlreader_putProperty
,
1154 saxxmlreader_getEntityResolver
,
1155 saxxmlreader_putEntityResolver
,
1156 saxxmlreader_getContentHandler
,
1157 saxxmlreader_putContentHandler
,
1158 saxxmlreader_getDTDHandler
,
1159 saxxmlreader_putDTDHandler
,
1160 saxxmlreader_getErrorHandler
,
1161 saxxmlreader_putErrorHandler
,
1162 saxxmlreader_getBaseURL
,
1163 saxxmlreader_putBaseURL
,
1164 saxxmlreader_getSecureBaseURL
,
1165 saxxmlreader_putSecureBaseURL
,
1167 saxxmlreader_parseURL
1170 /*** ISAXXMLReader interface ***/
1171 /*** IUnknown methods ***/
1172 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
1174 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1175 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVtbl
, riid
, ppvObject
);
1178 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
1180 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1181 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVtbl
);
1184 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
1186 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1187 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVtbl
);
1190 /*** ISAXXMLReader methods ***/
1191 static HRESULT WINAPI
isaxxmlreader_getFeature(
1192 ISAXXMLReader
* iface
,
1193 const WCHAR
*pFeature
,
1194 VARIANT_BOOL
*pValue
)
1196 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1198 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1202 static HRESULT WINAPI
isaxxmlreader_putFeature(
1203 ISAXXMLReader
* iface
,
1204 const WCHAR
*pFeature
,
1205 VARIANT_BOOL vfValue
)
1207 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1209 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1213 static HRESULT WINAPI
isaxxmlreader_getProperty(
1214 ISAXXMLReader
* iface
,
1218 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1220 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
1224 static HRESULT WINAPI
isaxxmlreader_putProperty(
1225 ISAXXMLReader
* iface
,
1229 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1231 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1235 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
1236 ISAXXMLReader
* iface
,
1237 ISAXEntityResolver
**ppEntityResolver
)
1239 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1241 FIXME("(%p)->(%p) stub\n", This
, ppEntityResolver
);
1245 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
1246 ISAXXMLReader
* iface
,
1247 ISAXEntityResolver
*pEntityResolver
)
1249 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1251 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1255 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
1256 ISAXXMLReader
* iface
,
1257 ISAXContentHandler
**pContentHandler
)
1259 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1261 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
1262 if(pContentHandler
== NULL
)
1264 if(This
->contentHandler
)
1265 ISAXContentHandler_AddRef(This
->contentHandler
);
1266 *pContentHandler
= This
->contentHandler
;
1271 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
1272 ISAXXMLReader
* iface
,
1273 ISAXContentHandler
*contentHandler
)
1275 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1277 TRACE("(%p)->(%p)\n", This
, contentHandler
);
1279 ISAXContentHandler_AddRef(contentHandler
);
1280 if(This
->contentHandler
)
1281 ISAXContentHandler_Release(This
->contentHandler
);
1282 This
->contentHandler
= contentHandler
;
1287 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
1288 ISAXXMLReader
* iface
,
1289 ISAXDTDHandler
**pDTDHandler
)
1291 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1293 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1297 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
1298 ISAXXMLReader
* iface
,
1299 ISAXDTDHandler
*pDTDHandler
)
1301 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1303 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1307 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
1308 ISAXXMLReader
* iface
,
1309 ISAXErrorHandler
**pErrorHandler
)
1311 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1313 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
1314 if(pErrorHandler
== NULL
)
1316 if(This
->errorHandler
)
1317 ISAXErrorHandler_AddRef(This
->errorHandler
);
1318 *pErrorHandler
= This
->errorHandler
;
1323 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
1324 ISAXXMLReader
* iface
,
1325 ISAXErrorHandler
*errorHandler
)
1327 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1329 TRACE("(%p)->(%p)\n", This
, errorHandler
);
1331 ISAXErrorHandler_AddRef(errorHandler
);
1332 if(This
->errorHandler
)
1333 ISAXErrorHandler_Release(This
->errorHandler
);
1334 This
->errorHandler
= errorHandler
;
1339 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
1340 ISAXXMLReader
* iface
,
1341 const WCHAR
**pBaseUrl
)
1343 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1345 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1349 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
1350 ISAXXMLReader
* iface
,
1351 const WCHAR
*pBaseUrl
)
1353 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1355 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1359 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
1360 ISAXXMLReader
* iface
,
1361 const WCHAR
**pSecureBaseUrl
)
1363 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1365 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1369 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
1370 ISAXXMLReader
* iface
,
1371 const WCHAR
*secureBaseUrl
)
1373 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1375 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1379 static HRESULT
parse_buffer(saxreader
*This
, xmlChar
*buffer
)
1381 saxlocator
*locator
;
1384 hr
= SAXLocator_create(This
, &locator
);
1388 locator
->pParserCtxt
= xmlNewParserCtxt();
1389 if(!locator
->pParserCtxt
)
1391 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1395 locator
->pParserCtxt
->sax
= &locator
->saxreader
->sax
;
1396 locator
->pParserCtxt
->userData
= locator
;
1398 xmlSetupParserForBuffer(locator
->pParserCtxt
, buffer
, NULL
);
1400 if(xmlParseDocument(locator
->pParserCtxt
)) hr
= E_FAIL
;
1401 else hr
= locator
->ret
;
1403 if(locator
->pParserCtxt
)
1405 locator
->pParserCtxt
->sax
= NULL
;
1406 xmlFreeParserCtxt(locator
->pParserCtxt
);
1407 locator
->pParserCtxt
= NULL
;
1410 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1414 static HRESULT WINAPI
isaxxmlreader_parse(
1415 ISAXXMLReader
* iface
,
1418 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1419 xmlChar
*data
= NULL
;
1422 TRACE("(%p)\n", This
);
1425 switch(V_VT(&varInput
))
1428 data
= xmlChar_from_wchar(V_BSTR(&varInput
));
1429 hr
= parse_buffer(This
, data
);
1431 case VT_ARRAY
|VT_UI1
: {
1433 LONG lBound
, uBound
;
1436 hr
= SafeArrayGetLBound(V_ARRAY(&varInput
), 1, &lBound
);
1437 if(hr
!= S_OK
) break;
1438 hr
= SafeArrayGetUBound(V_ARRAY(&varInput
), 1, &uBound
);
1439 if(hr
!= S_OK
) break;
1440 dataRead
= (uBound
-lBound
)*SafeArrayGetElemsize(V_ARRAY(&varInput
));
1441 data
= HeapAlloc(GetProcessHeap(), 0, dataRead
+1);
1443 hr
= SafeArrayAccessData(V_ARRAY(&varInput
), (void**)&pSAData
);
1444 if(hr
!= S_OK
) break;
1445 memcpy(data
, pSAData
, dataRead
);
1446 data
[dataRead
] = '\0';
1447 hr
= parse_buffer(This
, data
);
1448 SafeArrayUnaccessData(V_ARRAY(&varInput
));
1453 IPersistStream
*persistStream
;
1454 IStream
*stream
= NULL
;
1455 IXMLDOMDocument
*xmlDoc
;
1457 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1458 &IID_IPersistStream
, (void**)&persistStream
) == S_OK
)
1460 hr
= IPersistStream_Save(persistStream
, stream
, TRUE
);
1461 IPersistStream_Release(persistStream
);
1462 if(hr
!= S_OK
) break;
1464 if(stream
|| IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1465 &IID_IStream
, (void**)&stream
) == S_OK
)
1472 hr
= IStream_Stat(stream
, &dataInfo
, STATFLAG_NONAME
);
1473 if(hr
== E_PENDING
) continue;
1476 data
= HeapAlloc(GetProcessHeap(), 0,
1477 dataInfo
.cbSize
.QuadPart
+1);
1480 hr
= IStream_Read(stream
, data
,
1481 dataInfo
.cbSize
.QuadPart
, &dataRead
);
1482 if(hr
== E_PENDING
) continue;
1485 data
[dataInfo
.cbSize
.QuadPart
] = '\0';
1486 hr
= parse_buffer(This
, data
);
1487 IStream_Release(stream
);
1490 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1491 &IID_IXMLDOMDocument
, (void**)&xmlDoc
) == S_OK
)
1495 IXMLDOMDocument_get_xml(xmlDoc
, &bstrData
);
1496 data
= xmlChar_from_wchar(bstrData
);
1497 hr
= parse_buffer(This
, data
);
1498 IXMLDOMDocument_Release(xmlDoc
);
1504 WARN("vt %d not implemented\n", V_VT(&varInput
));
1508 HeapFree(GetProcessHeap(), 0, data
);
1512 static HRESULT
saxreader_onDataAvailable(void *obj
, char *ptr
, DWORD len
)
1514 saxreader
*This
= obj
;
1518 data
= HeapAlloc(GetProcessHeap(), 0, len
+1);
1519 memcpy(data
, ptr
, len
);
1522 hr
= parse_buffer(This
, data
);
1524 HeapFree(GetProcessHeap(), 0, data
);
1528 static HRESULT WINAPI
isaxxmlreader_parseURL(
1529 ISAXXMLReader
* iface
,
1532 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1536 TRACE("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1538 hr
= bind_url(url
, saxreader_onDataAvailable
, This
, &bsc
);
1547 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
1549 isaxxmlreader_QueryInterface
,
1550 isaxxmlreader_AddRef
,
1551 isaxxmlreader_Release
,
1552 isaxxmlreader_getFeature
,
1553 isaxxmlreader_putFeature
,
1554 isaxxmlreader_getProperty
,
1555 isaxxmlreader_putProperty
,
1556 isaxxmlreader_getEntityResolver
,
1557 isaxxmlreader_putEntityResolver
,
1558 isaxxmlreader_getContentHandler
,
1559 isaxxmlreader_putContentHandler
,
1560 isaxxmlreader_getDTDHandler
,
1561 isaxxmlreader_putDTDHandler
,
1562 isaxxmlreader_getErrorHandler
,
1563 isaxxmlreader_putErrorHandler
,
1564 isaxxmlreader_getBaseURL
,
1565 isaxxmlreader_putBaseURL
,
1566 isaxxmlreader_getSecureBaseURL
,
1567 isaxxmlreader_putSecureBaseURL
,
1568 isaxxmlreader_parse
,
1569 isaxxmlreader_parseURL
1572 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1576 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
1578 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
1580 return E_OUTOFMEMORY
;
1582 reader
->lpVtbl
= &saxreader_vtbl
;
1583 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
1585 reader
->contentHandler
= NULL
;
1586 reader
->errorHandler
= NULL
;
1588 memset(&reader
->sax
, 0, sizeof(xmlSAXHandler
));
1589 reader
->sax
.initialized
= XML_SAX2_MAGIC
;
1590 reader
->sax
.startDocument
= libxmlStartDocument
;
1591 reader
->sax
.endDocument
= libxmlEndDocument
;
1592 reader
->sax
.startElementNs
= libxmlStartElementNS
;
1593 reader
->sax
.endElementNs
= libxmlEndElementNS
;
1594 reader
->sax
.characters
= libxmlCharacters
;
1595 reader
->sax
.setDocumentLocator
= libxmlSetDocumentLocator
;
1596 reader
->sax
.error
= libxmlFatalError
;
1597 reader
->sax
.fatalError
= libxmlFatalError
;
1599 *ppObj
= &reader
->lpVtbl
;
1601 TRACE("returning iface %p\n", *ppObj
);
1608 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1610 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1611 "libxml2 support was not present at compile time.\n");