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
;
83 static inline saxreader
*impl_from_IVBSAXXMLReader( IVBSAXXMLReader
*iface
)
85 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpVtbl
));
88 static inline saxreader
*impl_from_ISAXXMLReader( ISAXXMLReader
*iface
)
90 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpSAXXMLReaderVtbl
));
93 static inline saxlocator
*impl_from_ISAXLocator( ISAXLocator
*iface
)
95 return (saxlocator
*)((char*)iface
- FIELD_OFFSET(saxlocator
, lpSAXLocatorVtbl
));
98 static inline saxattributes
*impl_from_ISAXAttributes( ISAXAttributes
*iface
)
100 return (saxattributes
*)((char*)iface
- FIELD_OFFSET(saxattributes
, lpSAXAttributesVtbl
));
104 BSTR
bstr_from_xmlCharN(const xmlChar
*buf
, int len
)
113 dLen
= MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)buf
, len
, NULL
, 0);
114 if(len
!= -1) dLen
++;
115 str
= (LPWSTR
)HeapAlloc(GetProcessHeap(), 0, dLen
* sizeof (WCHAR
));
118 MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)buf
, len
, str
, dLen
);
119 if(len
!= -1) str
[dLen
-1] = '\0';
120 bstr
= SysAllocString(str
);
121 HeapFree(GetProcessHeap(), 0, str
);
126 static void format_error_message_from_id(saxlocator
*This
, HRESULT hr
)
128 xmlStopParser(This
->pParserCtxt
);
131 if(This
->saxreader
->errorHandler
)
134 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
,
135 NULL
, hr
, 0, msg
, sizeof(msg
), NULL
))
137 FIXME("MSXML errors not yet supported.\n");
141 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
142 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, msg
, hr
);
146 static void update_position(saxlocator
*This
, xmlChar
*end
)
148 if(This
->lastCur
== NULL
)
150 This
->lastCur
= (xmlChar
*)This
->pParserCtxt
->input
->base
;
155 if(!end
) end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
;
157 while(This
->lastCur
< end
)
159 if(*(This
->lastCur
) == '\n')
164 else if(*(This
->lastCur
) == '\r' && (This
->lastCur
==This
->pParserCtxt
->input
->end
|| *(This
->lastCur
+1)!='\n'))
175 /*** ISAXAttributes interface ***/
176 /*** IUnknown methods ***/
177 static HRESULT WINAPI
isaxattributes_QueryInterface(
178 ISAXAttributes
* iface
,
182 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
184 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
188 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
189 IsEqualGUID(riid
, &IID_ISAXAttributes
))
195 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
196 return E_NOINTERFACE
;
199 ISAXAttributes_AddRef(iface
);
204 static ULONG WINAPI
isaxattributes_AddRef(ISAXAttributes
* iface
)
206 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
208 return InterlockedIncrement(&This
->ref
);
211 static ULONG WINAPI
isaxattributes_Release(ISAXAttributes
* iface
)
213 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
218 ref
= InterlockedDecrement(&This
->ref
);
222 for(index
=0; index
<This
->nb_attributes
; index
++)
224 SysFreeString(This
->szLocalname
[index
]);
225 SysFreeString(This
->szPrefix
[index
]);
226 SysFreeString(This
->szURI
[index
]);
227 SysFreeString(This
->szValue
[index
]);
230 HeapFree(GetProcessHeap(), 0, This
->szLocalname
);
231 HeapFree(GetProcessHeap(), 0, This
->szPrefix
);
232 HeapFree(GetProcessHeap(), 0, This
->szURI
);
233 HeapFree(GetProcessHeap(), 0, This
->szValue
);
235 HeapFree(GetProcessHeap(), 0, This
);
241 /*** ISAXAttributes methods ***/
242 static HRESULT WINAPI
isaxattributes_getLength(
243 ISAXAttributes
* iface
,
246 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
248 *length
= This
->nb_attributes
;
249 TRACE("Length set to %d\n", *length
);
253 static HRESULT WINAPI
isaxattributes_getURI(
254 ISAXAttributes
* iface
,
259 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
261 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
265 static HRESULT WINAPI
isaxattributes_getLocalName(
266 ISAXAttributes
* iface
,
268 const WCHAR
**pLocalName
,
269 int *pLocalNameLength
)
271 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
272 TRACE("(%p)->(%d)\n", This
, nIndex
);
274 if(nIndex
>= This
->nb_attributes
) return E_INVALIDARG
;
276 *pLocalNameLength
= SysStringLen(This
->szLocalname
[nIndex
]);
277 *pLocalName
= This
->szLocalname
[nIndex
];
282 static HRESULT WINAPI
isaxattributes_getQName(
283 ISAXAttributes
* iface
,
285 const WCHAR
**pQName
,
288 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
290 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
294 static HRESULT WINAPI
isaxattributes_getName(
295 ISAXAttributes
* iface
,
299 const WCHAR
**pLocalName
,
301 const WCHAR
**pQName
,
304 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
306 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
310 static HRESULT WINAPI
isaxattributes_getIndexFromName(
311 ISAXAttributes
* iface
,
314 const WCHAR
*pLocalName
,
318 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
320 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), cUriLength
,
321 debugstr_w(pLocalName
), cocalNameLength
);
325 static HRESULT WINAPI
isaxattributes_getIndexFromQName(
326 ISAXAttributes
* iface
,
331 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
333 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQNameLength
);
337 static HRESULT WINAPI
isaxattributes_getType(
338 ISAXAttributes
* iface
,
343 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
345 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
349 static HRESULT WINAPI
isaxattributes_getTypeFromName(
350 ISAXAttributes
* iface
,
353 const WCHAR
*pLocalName
,
358 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
360 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
361 debugstr_w(pLocalName
), nLocalName
);
365 static HRESULT WINAPI
isaxattributes_getTypeFromQName(
366 ISAXAttributes
* iface
,
372 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
374 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
378 static HRESULT WINAPI
isaxattributes_getValue(
379 ISAXAttributes
* iface
,
381 const WCHAR
**pValue
,
384 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
386 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
390 static HRESULT WINAPI
isaxattributes_getValueFromName(
391 ISAXAttributes
* iface
,
394 const WCHAR
*pLocalName
,
396 const WCHAR
**pValue
,
399 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
401 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
402 debugstr_w(pLocalName
), nLocalName
);
406 static HRESULT WINAPI
isaxattributes_getValueFromQName(
407 ISAXAttributes
* iface
,
410 const WCHAR
**pValue
,
413 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
415 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
419 static const struct ISAXAttributesVtbl isaxattributes_vtbl
=
421 isaxattributes_QueryInterface
,
422 isaxattributes_AddRef
,
423 isaxattributes_Release
,
424 isaxattributes_getLength
,
425 isaxattributes_getURI
,
426 isaxattributes_getLocalName
,
427 isaxattributes_getQName
,
428 isaxattributes_getName
,
429 isaxattributes_getIndexFromName
,
430 isaxattributes_getIndexFromQName
,
431 isaxattributes_getType
,
432 isaxattributes_getTypeFromName
,
433 isaxattributes_getTypeFromQName
,
434 isaxattributes_getValue
,
435 isaxattributes_getValueFromName
,
436 isaxattributes_getValueFromQName
439 static HRESULT
SAXAttributes_create(saxattributes
**attr
,
440 int nb_attributes
, const xmlChar
**xmlAttributes
)
442 saxattributes
*attributes
;
445 attributes
= HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes
));
447 return E_OUTOFMEMORY
;
449 attributes
->lpSAXAttributesVtbl
= &isaxattributes_vtbl
;
452 attributes
->nb_attributes
= nb_attributes
;
454 attributes
->szLocalname
=
455 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
456 attributes
->szPrefix
=
457 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
459 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
460 attributes
->szValue
=
461 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
463 if(!attributes
->szLocalname
|| !attributes
->szPrefix
464 || !attributes
->szURI
|| !attributes
->szValue
)
466 if(attributes
->szLocalname
)
467 HeapFree(GetProcessHeap(), 0, attributes
->szLocalname
);
468 if(attributes
->szPrefix
)
469 HeapFree(GetProcessHeap(), 0, attributes
->szPrefix
);
470 if(attributes
->szURI
)
471 HeapFree(GetProcessHeap(), 0, attributes
->szURI
);
472 if(attributes
->szValue
)
473 HeapFree(GetProcessHeap(), 0, attributes
->szValue
);
477 for(index
=0; index
<nb_attributes
; index
++)
479 attributes
->szLocalname
[index
] =
480 bstr_from_xmlChar(xmlAttributes
[index
*5]);
481 attributes
->szPrefix
[index
] =
482 bstr_from_xmlChar(xmlAttributes
[index
*5+1]);
483 attributes
->szURI
[index
] =
484 bstr_from_xmlChar(xmlAttributes
[index
*5+2]);
485 attributes
->szValue
[index
] =
486 bstr_from_xmlCharN(xmlAttributes
[index
*5+3],
487 xmlAttributes
[index
*5+4]-xmlAttributes
[index
*5+3]);
492 TRACE("returning %p\n", *attr
);
497 /*** LibXML callbacks ***/
498 static void libxmlStartDocument(void *ctx
)
500 saxlocator
*This
= ctx
;
503 if(This
->saxreader
->contentHandler
)
505 hr
= ISAXContentHandler_startDocument(This
->saxreader
->contentHandler
);
507 format_error_message_from_id(This
, hr
);
510 update_position(This
, NULL
);
513 static void libxmlEndDocument(void *ctx
)
515 saxlocator
*This
= ctx
;
521 if(This
->ret
!= S_OK
) return;
523 if(This
->saxreader
->contentHandler
)
525 hr
= ISAXContentHandler_endDocument(This
->saxreader
->contentHandler
);
527 format_error_message_from_id(This
, hr
);
531 static void libxmlStartElementNS(
533 const xmlChar
*localname
,
534 const xmlChar
*prefix
,
537 const xmlChar
**namespaces
,
540 const xmlChar
**attributes
)
542 BSTR NamespaceUri
, LocalName
, QName
;
543 saxlocator
*This
= ctx
;
547 FIXME("Arguments processing not yet implemented.\n");
549 update_position(This
, (xmlChar
*)This
->pParserCtxt
->input
->cur
+1);
551 if(This
->saxreader
->contentHandler
)
553 NamespaceUri
= bstr_from_xmlChar(URI
);
554 LocalName
= bstr_from_xmlChar(localname
);
555 QName
= bstr_from_xmlChar(localname
);
557 hr
= SAXAttributes_create(&attr
, nb_attributes
, attributes
);
560 hr
= ISAXContentHandler_startElement(
561 This
->saxreader
->contentHandler
,
562 NamespaceUri
, SysStringLen(NamespaceUri
),
563 LocalName
, SysStringLen(LocalName
),
564 QName
, SysStringLen(QName
),
565 (ISAXAttributes
*)&attr
->lpSAXAttributesVtbl
);
567 ISAXAttributes_Release((ISAXAttributes
*)&attr
->lpSAXAttributesVtbl
);
570 SysFreeString(NamespaceUri
);
571 SysFreeString(LocalName
);
572 SysFreeString(QName
);
575 format_error_message_from_id(This
, hr
);
579 static void libxmlEndElementNS(
581 const xmlChar
*localname
,
582 const xmlChar
*prefix
,
585 BSTR NamespaceUri
, LocalName
, QName
;
586 saxlocator
*This
= ctx
;
591 while(*end
!= '<' && *(end
+1) != '/') end
++;
592 update_position(This
, end
+2);
594 if(This
->saxreader
->contentHandler
)
596 NamespaceUri
= bstr_from_xmlChar(URI
);
597 LocalName
= bstr_from_xmlChar(localname
);
598 QName
= bstr_from_xmlChar(localname
);
600 hr
= ISAXContentHandler_endElement(
601 This
->saxreader
->contentHandler
,
602 NamespaceUri
, SysStringLen(NamespaceUri
),
603 LocalName
, SysStringLen(LocalName
),
604 QName
, SysStringLen(QName
));
606 SysFreeString(NamespaceUri
);
607 SysFreeString(LocalName
);
608 SysFreeString(QName
);
611 format_error_message_from_id(This
, hr
);
615 static void libxmlCharacters(
621 saxlocator
*This
= ctx
;
624 xmlChar
*lastCurCopy
;
629 if(*(This
->lastCur
-1) != '>' && *(This
->lastCur
-1) != '/') return;
631 if(*(This
->lastCur
-1) != '>')
633 end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
-len
;
634 while(*(end
-1) != '>') end
--;
635 update_position(This
, end
);
638 chEnd
= This
->lastCur
+len
;
639 while(*chEnd
!= '<') chEnd
++;
641 Chars
= bstr_from_xmlChar(ch
);
643 lastCurCopy
= This
->lastCur
;
644 columnCopy
= This
->column
;
645 lineCopy
= This
->line
;
648 if(This
->saxreader
->contentHandler
)
650 while(This
->lastCur
< chEnd
)
655 if(*end
== '\r') break;
659 Chars
= bstr_from_xmlChar(This
->lastCur
);
661 if(*end
== '\r' && *(end
+1) == '\n')
663 memmove((WCHAR
*)Chars
+(end
-This
->lastCur
),
664 (WCHAR
*)Chars
+(end
-This
->lastCur
)+1,
665 (SysStringLen(Chars
)-(end
-This
->lastCur
))*sizeof(WCHAR
));
666 SysReAllocStringLen(&Chars
, Chars
, SysStringLen(Chars
)-1);
668 else if(*end
== '\r') Chars
[end
-This
->lastCur
] = '\n';
670 hr
= ISAXContentHandler_characters(This
->saxreader
->contentHandler
, Chars
, end
-This
->lastCur
+1);
671 SysFreeString(Chars
);
674 format_error_message_from_id(This
, hr
);
678 if(*(end
+1) == '\n') end
++;
679 if(end
< chEnd
) end
++;
681 This
->column
+= end
-This
->lastCur
;
685 This
->lastCur
= lastCurCopy
;
686 This
->column
= columnCopy
;
687 This
->line
= lineCopy
;
688 update_position(This
, chEnd
);
692 static void libxmlSetDocumentLocator(
694 xmlSAXLocatorPtr loc
)
696 saxlocator
*This
= ctx
;
699 hr
= ISAXContentHandler_putDocumentLocator(This
->saxreader
->contentHandler
,
700 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
);
703 format_error_message_from_id(This
, hr
);
706 void libxmlFatalError(void *ctx
, const char *msg
, ...)
708 saxlocator
*This
= ctx
;
714 if(!This
->saxreader
->errorHandler
)
716 xmlStopParser(This
->pParserCtxt
);
721 FIXME("Error handling is not compatible.\n");
724 vsprintf(message
, msg
, args
);
727 len
= MultiByteToWideChar(CP_ACP
, 0, message
, -1, NULL
, 0);
728 wszError
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*len
);
729 MultiByteToWideChar(CP_ACP
, 0, message
, -1, (LPWSTR
)wszError
, len
);
731 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
732 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, wszError
, E_FAIL
);
734 HeapFree(GetProcessHeap(), 0, wszError
);
736 xmlStopParser(This
->pParserCtxt
);
740 /*** ISAXLocator interface ***/
741 /*** IUnknown methods ***/
742 static HRESULT WINAPI
isaxlocator_QueryInterface(ISAXLocator
* iface
, REFIID riid
, void **ppvObject
)
744 saxlocator
*This
= impl_from_ISAXLocator( iface
);
746 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
750 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
751 IsEqualGUID( riid
, &IID_ISAXLocator
))
757 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
758 return E_NOINTERFACE
;
761 ISAXLocator_AddRef( iface
);
766 static ULONG WINAPI
isaxlocator_AddRef(ISAXLocator
* iface
)
768 saxlocator
*This
= impl_from_ISAXLocator( iface
);
769 TRACE("%p\n", This
);
770 return InterlockedIncrement( &This
->ref
);
773 static ULONG WINAPI
isaxlocator_Release(
776 saxlocator
*This
= impl_from_ISAXLocator( iface
);
779 TRACE("%p\n", This
);
781 ref
= InterlockedDecrement( &This
->ref
);
785 SysFreeString(This
->publicId
);
787 SysFreeString(This
->systemId
);
789 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
790 HeapFree( GetProcessHeap(), 0, This
);
796 /*** ISAXLocator methods ***/
797 static HRESULT WINAPI
isaxlocator_getColumnNumber(
801 saxlocator
*This
= impl_from_ISAXLocator( iface
);
803 *pnColumn
= This
->column
;
807 static HRESULT WINAPI
isaxlocator_getLineNumber(
811 saxlocator
*This
= impl_from_ISAXLocator( iface
);
813 *pnLine
= This
->line
;
817 static HRESULT WINAPI
isaxlocator_getPublicId(
819 const WCHAR
** ppwchPublicId
)
822 saxlocator
*This
= impl_from_ISAXLocator( iface
);
824 if(This
->publicId
) SysFreeString(This
->publicId
);
826 publicId
= bstr_from_xmlChar(xmlSAX2GetPublicId(This
->pParserCtxt
));
827 if(SysStringLen(publicId
))
828 This
->publicId
= (WCHAR
*)&publicId
;
831 SysFreeString(publicId
);
832 This
->publicId
= NULL
;
835 *ppwchPublicId
= This
->publicId
;
839 static HRESULT WINAPI
isaxlocator_getSystemId(
841 const WCHAR
** ppwchSystemId
)
844 saxlocator
*This
= impl_from_ISAXLocator( iface
);
846 if(This
->systemId
) SysFreeString(This
->systemId
);
848 systemId
= bstr_from_xmlChar(xmlSAX2GetSystemId(This
->pParserCtxt
));
849 if(SysStringLen(systemId
))
850 This
->systemId
= (WCHAR
*)&systemId
;
853 SysFreeString(systemId
);
854 This
->systemId
= NULL
;
857 *ppwchSystemId
= This
->systemId
;
861 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
863 isaxlocator_QueryInterface
,
866 isaxlocator_getColumnNumber
,
867 isaxlocator_getLineNumber
,
868 isaxlocator_getPublicId
,
869 isaxlocator_getSystemId
872 static HRESULT
SAXLocator_create(saxreader
*reader
, saxlocator
**ppsaxlocator
)
876 locator
= HeapAlloc( GetProcessHeap(), 0, sizeof (*locator
) );
878 return E_OUTOFMEMORY
;
880 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
883 locator
->saxreader
= reader
;
884 ISAXXMLReader_AddRef((ISAXXMLReader
*)&reader
->lpSAXXMLReaderVtbl
);
886 locator
->pParserCtxt
= NULL
;
887 locator
->publicId
= NULL
;
888 locator
->systemId
= NULL
;
889 locator
->lastCur
= NULL
;
894 *ppsaxlocator
= locator
;
896 TRACE("returning %p\n", *ppsaxlocator
);
901 /*** IVBSAXXMLReader interface ***/
902 /*** IUnknown methods ***/
903 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
905 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
907 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
911 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
912 IsEqualGUID( riid
, &IID_IDispatch
) ||
913 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
917 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
919 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
923 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
924 return E_NOINTERFACE
;
927 IVBSAXXMLReader_AddRef( iface
);
932 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
934 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
935 TRACE("%p\n", This
);
936 return InterlockedIncrement( &This
->ref
);
939 static ULONG WINAPI
saxxmlreader_Release(
940 IVBSAXXMLReader
* iface
)
942 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
945 TRACE("%p\n", This
);
947 ref
= InterlockedDecrement( &This
->ref
);
950 if(This
->contentHandler
)
951 ISAXContentHandler_Release(This
->contentHandler
);
953 if(This
->errorHandler
)
954 ISAXErrorHandler_Release(This
->errorHandler
);
956 HeapFree( GetProcessHeap(), 0, This
);
962 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
964 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
966 TRACE("(%p)->(%p)\n", This
, pctinfo
);
973 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
974 IVBSAXXMLReader
*iface
,
975 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
977 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
980 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
982 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
987 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
988 IVBSAXXMLReader
*iface
,
995 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
999 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
1002 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
1003 return E_INVALIDARG
;
1005 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1008 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1009 ITypeInfo_Release(typeinfo
);
1015 static HRESULT WINAPI
saxxmlreader_Invoke(
1016 IVBSAXXMLReader
*iface
,
1017 DISPID dispIdMember
,
1021 DISPPARAMS
* pDispParams
,
1022 VARIANT
* pVarResult
,
1023 EXCEPINFO
* pExcepInfo
,
1026 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1027 ITypeInfo
*typeinfo
;
1030 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1031 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1033 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1036 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVtbl
), dispIdMember
, wFlags
, pDispParams
,
1037 pVarResult
, pExcepInfo
, puArgErr
);
1038 ITypeInfo_Release(typeinfo
);
1044 /*** IVBSAXXMLReader methods ***/
1045 static HRESULT WINAPI
saxxmlreader_getFeature(
1046 IVBSAXXMLReader
* iface
,
1047 const WCHAR
*pFeature
,
1048 VARIANT_BOOL
*pValue
)
1050 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1052 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1056 static HRESULT WINAPI
saxxmlreader_putFeature(
1057 IVBSAXXMLReader
* iface
,
1058 const WCHAR
*pFeature
,
1059 VARIANT_BOOL vfValue
)
1061 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1063 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1067 static HRESULT WINAPI
saxxmlreader_getProperty(
1068 IVBSAXXMLReader
* iface
,
1072 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1074 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
1078 static HRESULT WINAPI
saxxmlreader_putProperty(
1079 IVBSAXXMLReader
* iface
,
1083 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1085 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1089 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
1090 IVBSAXXMLReader
* iface
,
1091 IVBSAXEntityResolver
**pEntityResolver
)
1093 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1095 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1099 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
1100 IVBSAXXMLReader
* iface
,
1101 IVBSAXEntityResolver
*pEntityResolver
)
1103 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1105 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1109 static HRESULT WINAPI
saxxmlreader_getContentHandler(
1110 IVBSAXXMLReader
* iface
,
1111 IVBSAXContentHandler
**ppContentHandler
)
1113 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1115 FIXME("(%p)->(%p) stub\n", This
, ppContentHandler
);
1119 static HRESULT WINAPI
saxxmlreader_putContentHandler(
1120 IVBSAXXMLReader
* iface
,
1121 IVBSAXContentHandler
*contentHandler
)
1123 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1125 FIXME("(%p)->(%p) stub\n", This
, contentHandler
);
1129 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
1130 IVBSAXXMLReader
* iface
,
1131 IVBSAXDTDHandler
**pDTDHandler
)
1133 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1135 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1139 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
1140 IVBSAXXMLReader
* iface
,
1141 IVBSAXDTDHandler
*pDTDHandler
)
1143 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1145 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1149 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
1150 IVBSAXXMLReader
* iface
,
1151 IVBSAXErrorHandler
**pErrorHandler
)
1153 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1155 FIXME("(%p)->(%p) stub\n", This
, pErrorHandler
);
1159 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
1160 IVBSAXXMLReader
* iface
,
1161 IVBSAXErrorHandler
*errorHandler
)
1163 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1165 FIXME("(%p)->(%p) stub\n", This
, errorHandler
);
1169 static HRESULT WINAPI
saxxmlreader_getBaseURL(
1170 IVBSAXXMLReader
* iface
,
1171 const WCHAR
**pBaseUrl
)
1173 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1175 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1179 static HRESULT WINAPI
saxxmlreader_putBaseURL(
1180 IVBSAXXMLReader
* iface
,
1181 const WCHAR
*pBaseUrl
)
1183 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1185 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1189 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
1190 IVBSAXXMLReader
* iface
,
1191 const WCHAR
**pSecureBaseUrl
)
1193 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1195 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1200 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
1201 IVBSAXXMLReader
* iface
,
1202 const WCHAR
*secureBaseUrl
)
1204 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1206 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1210 static HRESULT WINAPI
saxxmlreader_parse(
1211 IVBSAXXMLReader
* iface
,
1214 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1216 FIXME("(%p) stub\n", This
);
1220 static HRESULT WINAPI
saxxmlreader_parseURL(
1221 IVBSAXXMLReader
* iface
,
1224 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1226 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1230 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
1232 saxxmlreader_QueryInterface
,
1233 saxxmlreader_AddRef
,
1234 saxxmlreader_Release
,
1235 saxxmlreader_GetTypeInfoCount
,
1236 saxxmlreader_GetTypeInfo
,
1237 saxxmlreader_GetIDsOfNames
,
1238 saxxmlreader_Invoke
,
1239 saxxmlreader_getFeature
,
1240 saxxmlreader_putFeature
,
1241 saxxmlreader_getProperty
,
1242 saxxmlreader_putProperty
,
1243 saxxmlreader_getEntityResolver
,
1244 saxxmlreader_putEntityResolver
,
1245 saxxmlreader_getContentHandler
,
1246 saxxmlreader_putContentHandler
,
1247 saxxmlreader_getDTDHandler
,
1248 saxxmlreader_putDTDHandler
,
1249 saxxmlreader_getErrorHandler
,
1250 saxxmlreader_putErrorHandler
,
1251 saxxmlreader_getBaseURL
,
1252 saxxmlreader_putBaseURL
,
1253 saxxmlreader_getSecureBaseURL
,
1254 saxxmlreader_putSecureBaseURL
,
1256 saxxmlreader_parseURL
1259 /*** ISAXXMLReader interface ***/
1260 /*** IUnknown methods ***/
1261 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
1263 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1264 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVtbl
, riid
, ppvObject
);
1267 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
1269 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1270 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVtbl
);
1273 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
1275 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1276 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVtbl
);
1279 /*** ISAXXMLReader methods ***/
1280 static HRESULT WINAPI
isaxxmlreader_getFeature(
1281 ISAXXMLReader
* iface
,
1282 const WCHAR
*pFeature
,
1283 VARIANT_BOOL
*pValue
)
1285 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1287 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1291 static HRESULT WINAPI
isaxxmlreader_putFeature(
1292 ISAXXMLReader
* iface
,
1293 const WCHAR
*pFeature
,
1294 VARIANT_BOOL vfValue
)
1296 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1298 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1302 static HRESULT WINAPI
isaxxmlreader_getProperty(
1303 ISAXXMLReader
* iface
,
1307 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1309 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
1313 static HRESULT WINAPI
isaxxmlreader_putProperty(
1314 ISAXXMLReader
* iface
,
1318 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1320 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1324 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
1325 ISAXXMLReader
* iface
,
1326 ISAXEntityResolver
**ppEntityResolver
)
1328 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1330 FIXME("(%p)->(%p) stub\n", This
, ppEntityResolver
);
1334 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
1335 ISAXXMLReader
* iface
,
1336 ISAXEntityResolver
*pEntityResolver
)
1338 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1340 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1344 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
1345 ISAXXMLReader
* iface
,
1346 ISAXContentHandler
**pContentHandler
)
1348 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1350 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
1351 if(pContentHandler
== NULL
)
1353 if(This
->contentHandler
)
1354 ISAXContentHandler_AddRef(This
->contentHandler
);
1355 *pContentHandler
= This
->contentHandler
;
1360 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
1361 ISAXXMLReader
* iface
,
1362 ISAXContentHandler
*contentHandler
)
1364 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1366 TRACE("(%p)->(%p)\n", This
, contentHandler
);
1368 ISAXContentHandler_AddRef(contentHandler
);
1369 if(This
->contentHandler
)
1370 ISAXContentHandler_Release(This
->contentHandler
);
1371 This
->contentHandler
= contentHandler
;
1376 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
1377 ISAXXMLReader
* iface
,
1378 ISAXDTDHandler
**pDTDHandler
)
1380 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1382 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1386 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
1387 ISAXXMLReader
* iface
,
1388 ISAXDTDHandler
*pDTDHandler
)
1390 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1392 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1396 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
1397 ISAXXMLReader
* iface
,
1398 ISAXErrorHandler
**pErrorHandler
)
1400 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1402 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
1403 if(pErrorHandler
== NULL
)
1405 if(This
->errorHandler
)
1406 ISAXErrorHandler_AddRef(This
->errorHandler
);
1407 *pErrorHandler
= This
->errorHandler
;
1412 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
1413 ISAXXMLReader
* iface
,
1414 ISAXErrorHandler
*errorHandler
)
1416 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1418 TRACE("(%p)->(%p)\n", This
, errorHandler
);
1420 ISAXErrorHandler_AddRef(errorHandler
);
1421 if(This
->errorHandler
)
1422 ISAXErrorHandler_Release(This
->errorHandler
);
1423 This
->errorHandler
= errorHandler
;
1428 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
1429 ISAXXMLReader
* iface
,
1430 const WCHAR
**pBaseUrl
)
1432 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1434 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1438 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
1439 ISAXXMLReader
* iface
,
1440 const WCHAR
*pBaseUrl
)
1442 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1444 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1448 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
1449 ISAXXMLReader
* iface
,
1450 const WCHAR
**pSecureBaseUrl
)
1452 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1454 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1458 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
1459 ISAXXMLReader
* iface
,
1460 const WCHAR
*secureBaseUrl
)
1462 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1464 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1468 static HRESULT
parse_buffer(saxreader
*This
, xmlChar
*buffer
)
1470 saxlocator
*locator
;
1473 hr
= SAXLocator_create(This
, &locator
);
1477 locator
->pParserCtxt
= xmlNewParserCtxt();
1478 if(!locator
->pParserCtxt
)
1480 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1484 locator
->pParserCtxt
->sax
= &locator
->saxreader
->sax
;
1485 locator
->pParserCtxt
->userData
= locator
;
1487 xmlSetupParserForBuffer(locator
->pParserCtxt
, buffer
, NULL
);
1489 if(xmlParseDocument(locator
->pParserCtxt
)) hr
= E_FAIL
;
1490 else hr
= locator
->ret
;
1492 if(locator
->pParserCtxt
)
1494 locator
->pParserCtxt
->sax
= NULL
;
1495 xmlFreeParserCtxt(locator
->pParserCtxt
);
1496 locator
->pParserCtxt
= NULL
;
1499 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1503 static HRESULT WINAPI
isaxxmlreader_parse(
1504 ISAXXMLReader
* iface
,
1507 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1508 xmlChar
*data
= NULL
;
1511 TRACE("(%p)\n", This
);
1514 switch(V_VT(&varInput
))
1517 data
= xmlChar_from_wchar(V_BSTR(&varInput
));
1518 hr
= parse_buffer(This
, data
);
1520 case VT_ARRAY
|VT_UI1
: {
1522 LONG lBound
, uBound
;
1525 hr
= SafeArrayGetLBound(V_ARRAY(&varInput
), 1, &lBound
);
1526 if(hr
!= S_OK
) break;
1527 hr
= SafeArrayGetUBound(V_ARRAY(&varInput
), 1, &uBound
);
1528 if(hr
!= S_OK
) break;
1529 dataRead
= (uBound
-lBound
)*SafeArrayGetElemsize(V_ARRAY(&varInput
));
1530 data
= HeapAlloc(GetProcessHeap(), 0, dataRead
+1);
1532 hr
= SafeArrayAccessData(V_ARRAY(&varInput
), (void**)&pSAData
);
1533 if(hr
!= S_OK
) break;
1534 memcpy(data
, pSAData
, dataRead
);
1535 data
[dataRead
] = '\0';
1536 hr
= parse_buffer(This
, data
);
1537 SafeArrayUnaccessData(V_ARRAY(&varInput
));
1542 IPersistStream
*persistStream
;
1543 IStream
*stream
= NULL
;
1544 IXMLDOMDocument
*xmlDoc
;
1546 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1547 &IID_IPersistStream
, (void**)&persistStream
) == S_OK
)
1549 hr
= IPersistStream_Save(persistStream
, stream
, TRUE
);
1550 IPersistStream_Release(persistStream
);
1551 if(hr
!= S_OK
) break;
1553 if(stream
|| IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1554 &IID_IStream
, (void**)&stream
) == S_OK
)
1561 hr
= IStream_Stat(stream
, &dataInfo
, STATFLAG_NONAME
);
1562 if(hr
== E_PENDING
) continue;
1565 data
= HeapAlloc(GetProcessHeap(), 0,
1566 dataInfo
.cbSize
.QuadPart
+1);
1569 hr
= IStream_Read(stream
, data
,
1570 dataInfo
.cbSize
.QuadPart
, &dataRead
);
1571 if(hr
== E_PENDING
) continue;
1574 data
[dataInfo
.cbSize
.QuadPart
] = '\0';
1575 hr
= parse_buffer(This
, data
);
1576 IStream_Release(stream
);
1579 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1580 &IID_IXMLDOMDocument
, (void**)&xmlDoc
) == S_OK
)
1584 IXMLDOMDocument_get_xml(xmlDoc
, &bstrData
);
1585 data
= xmlChar_from_wchar(bstrData
);
1586 hr
= parse_buffer(This
, data
);
1587 IXMLDOMDocument_Release(xmlDoc
);
1593 WARN("vt %d not implemented\n", V_VT(&varInput
));
1597 HeapFree(GetProcessHeap(), 0, data
);
1601 static HRESULT
saxreader_onDataAvailable(void *obj
, char *ptr
, DWORD len
)
1603 saxreader
*This
= obj
;
1607 data
= HeapAlloc(GetProcessHeap(), 0, len
+1);
1608 memcpy(data
, ptr
, len
);
1611 hr
= parse_buffer(This
, data
);
1613 HeapFree(GetProcessHeap(), 0, data
);
1617 static HRESULT WINAPI
isaxxmlreader_parseURL(
1618 ISAXXMLReader
* iface
,
1621 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1625 TRACE("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1627 hr
= bind_url(url
, saxreader_onDataAvailable
, This
, &bsc
);
1636 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
1638 isaxxmlreader_QueryInterface
,
1639 isaxxmlreader_AddRef
,
1640 isaxxmlreader_Release
,
1641 isaxxmlreader_getFeature
,
1642 isaxxmlreader_putFeature
,
1643 isaxxmlreader_getProperty
,
1644 isaxxmlreader_putProperty
,
1645 isaxxmlreader_getEntityResolver
,
1646 isaxxmlreader_putEntityResolver
,
1647 isaxxmlreader_getContentHandler
,
1648 isaxxmlreader_putContentHandler
,
1649 isaxxmlreader_getDTDHandler
,
1650 isaxxmlreader_putDTDHandler
,
1651 isaxxmlreader_getErrorHandler
,
1652 isaxxmlreader_putErrorHandler
,
1653 isaxxmlreader_getBaseURL
,
1654 isaxxmlreader_putBaseURL
,
1655 isaxxmlreader_getSecureBaseURL
,
1656 isaxxmlreader_putSecureBaseURL
,
1657 isaxxmlreader_parse
,
1658 isaxxmlreader_parseURL
1661 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1665 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
1667 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
1669 return E_OUTOFMEMORY
;
1671 reader
->lpVtbl
= &saxreader_vtbl
;
1672 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
1674 reader
->contentHandler
= NULL
;
1675 reader
->errorHandler
= NULL
;
1677 memset(&reader
->sax
, 0, sizeof(xmlSAXHandler
));
1678 reader
->sax
.initialized
= XML_SAX2_MAGIC
;
1679 reader
->sax
.startDocument
= libxmlStartDocument
;
1680 reader
->sax
.endDocument
= libxmlEndDocument
;
1681 reader
->sax
.startElementNs
= libxmlStartElementNS
;
1682 reader
->sax
.endElementNs
= libxmlEndElementNS
;
1683 reader
->sax
.characters
= libxmlCharacters
;
1684 reader
->sax
.setDocumentLocator
= libxmlSetDocumentLocator
;
1685 reader
->sax
.error
= libxmlFatalError
;
1686 reader
->sax
.fatalError
= libxmlFatalError
;
1688 *ppObj
= &reader
->lpVtbl
;
1690 TRACE("returning iface %p\n", *ppObj
);
1697 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1699 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1700 "libxml2 support was not present at compile time.\n");