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
);
385 TRACE("(%p)->(%d)\n", This
, nIndex
);
387 if(nIndex
>= This
->nb_attributes
) return E_INVALIDARG
;
389 *nValue
= SysStringLen(This
->szValue
[nIndex
]);
390 *pValue
= This
->szValue
[nIndex
];
395 static HRESULT WINAPI
isaxattributes_getValueFromName(
396 ISAXAttributes
* iface
,
399 const WCHAR
*pLocalName
,
401 const WCHAR
**pValue
,
404 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
406 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
407 debugstr_w(pLocalName
), nLocalName
);
411 static HRESULT WINAPI
isaxattributes_getValueFromQName(
412 ISAXAttributes
* iface
,
415 const WCHAR
**pValue
,
418 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
420 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
424 static const struct ISAXAttributesVtbl isaxattributes_vtbl
=
426 isaxattributes_QueryInterface
,
427 isaxattributes_AddRef
,
428 isaxattributes_Release
,
429 isaxattributes_getLength
,
430 isaxattributes_getURI
,
431 isaxattributes_getLocalName
,
432 isaxattributes_getQName
,
433 isaxattributes_getName
,
434 isaxattributes_getIndexFromName
,
435 isaxattributes_getIndexFromQName
,
436 isaxattributes_getType
,
437 isaxattributes_getTypeFromName
,
438 isaxattributes_getTypeFromQName
,
439 isaxattributes_getValue
,
440 isaxattributes_getValueFromName
,
441 isaxattributes_getValueFromQName
444 static HRESULT
SAXAttributes_create(saxattributes
**attr
,
445 int nb_attributes
, const xmlChar
**xmlAttributes
)
447 saxattributes
*attributes
;
450 attributes
= HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes
));
452 return E_OUTOFMEMORY
;
454 attributes
->lpSAXAttributesVtbl
= &isaxattributes_vtbl
;
457 attributes
->nb_attributes
= nb_attributes
;
459 attributes
->szLocalname
=
460 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
461 attributes
->szPrefix
=
462 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
464 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
465 attributes
->szValue
=
466 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
468 if(!attributes
->szLocalname
|| !attributes
->szPrefix
469 || !attributes
->szURI
|| !attributes
->szValue
)
471 if(attributes
->szLocalname
)
472 HeapFree(GetProcessHeap(), 0, attributes
->szLocalname
);
473 if(attributes
->szPrefix
)
474 HeapFree(GetProcessHeap(), 0, attributes
->szPrefix
);
475 if(attributes
->szURI
)
476 HeapFree(GetProcessHeap(), 0, attributes
->szURI
);
477 if(attributes
->szValue
)
478 HeapFree(GetProcessHeap(), 0, attributes
->szValue
);
482 for(index
=0; index
<nb_attributes
; index
++)
484 attributes
->szLocalname
[index
] =
485 bstr_from_xmlChar(xmlAttributes
[index
*5]);
486 attributes
->szPrefix
[index
] =
487 bstr_from_xmlChar(xmlAttributes
[index
*5+1]);
488 attributes
->szURI
[index
] =
489 bstr_from_xmlChar(xmlAttributes
[index
*5+2]);
490 attributes
->szValue
[index
] =
491 bstr_from_xmlCharN(xmlAttributes
[index
*5+3],
492 xmlAttributes
[index
*5+4]-xmlAttributes
[index
*5+3]);
497 TRACE("returning %p\n", *attr
);
502 /*** LibXML callbacks ***/
503 static void libxmlStartDocument(void *ctx
)
505 saxlocator
*This
= ctx
;
508 if(This
->saxreader
->contentHandler
)
510 hr
= ISAXContentHandler_startDocument(This
->saxreader
->contentHandler
);
512 format_error_message_from_id(This
, hr
);
515 update_position(This
, NULL
);
518 static void libxmlEndDocument(void *ctx
)
520 saxlocator
*This
= ctx
;
526 if(This
->ret
!= S_OK
) return;
528 if(This
->saxreader
->contentHandler
)
530 hr
= ISAXContentHandler_endDocument(This
->saxreader
->contentHandler
);
532 format_error_message_from_id(This
, hr
);
536 static void libxmlStartElementNS(
538 const xmlChar
*localname
,
539 const xmlChar
*prefix
,
542 const xmlChar
**namespaces
,
545 const xmlChar
**attributes
)
547 BSTR NamespaceUri
, LocalName
, QName
;
548 saxlocator
*This
= ctx
;
552 update_position(This
, (xmlChar
*)This
->pParserCtxt
->input
->cur
+1);
554 if(This
->saxreader
->contentHandler
)
556 NamespaceUri
= bstr_from_xmlChar(URI
);
557 LocalName
= bstr_from_xmlChar(localname
);
558 QName
= bstr_from_xmlChar(localname
);
560 hr
= SAXAttributes_create(&attr
, nb_attributes
, attributes
);
563 hr
= ISAXContentHandler_startElement(
564 This
->saxreader
->contentHandler
,
565 NamespaceUri
, SysStringLen(NamespaceUri
),
566 LocalName
, SysStringLen(LocalName
),
567 QName
, SysStringLen(QName
),
568 (ISAXAttributes
*)&attr
->lpSAXAttributesVtbl
);
570 ISAXAttributes_Release((ISAXAttributes
*)&attr
->lpSAXAttributesVtbl
);
573 SysFreeString(NamespaceUri
);
574 SysFreeString(LocalName
);
575 SysFreeString(QName
);
578 format_error_message_from_id(This
, hr
);
582 static void libxmlEndElementNS(
584 const xmlChar
*localname
,
585 const xmlChar
*prefix
,
588 BSTR NamespaceUri
, LocalName
, QName
;
589 saxlocator
*This
= ctx
;
594 while(*end
!= '<' && *(end
+1) != '/') end
++;
595 update_position(This
, end
+2);
597 if(This
->saxreader
->contentHandler
)
599 NamespaceUri
= bstr_from_xmlChar(URI
);
600 LocalName
= bstr_from_xmlChar(localname
);
601 QName
= bstr_from_xmlChar(localname
);
603 hr
= ISAXContentHandler_endElement(
604 This
->saxreader
->contentHandler
,
605 NamespaceUri
, SysStringLen(NamespaceUri
),
606 LocalName
, SysStringLen(LocalName
),
607 QName
, SysStringLen(QName
));
609 SysFreeString(NamespaceUri
);
610 SysFreeString(LocalName
);
611 SysFreeString(QName
);
614 format_error_message_from_id(This
, hr
);
618 static void libxmlCharacters(
624 saxlocator
*This
= ctx
;
627 xmlChar
*lastCurCopy
;
632 if(*(This
->lastCur
-1) != '>' && *(This
->lastCur
-1) != '/') return;
634 if(*(This
->lastCur
-1) != '>')
636 end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
-len
;
637 while(*(end
-1) != '>') end
--;
638 update_position(This
, end
);
641 chEnd
= This
->lastCur
+len
;
642 while(*chEnd
!= '<') chEnd
++;
644 Chars
= bstr_from_xmlChar(ch
);
646 lastCurCopy
= This
->lastCur
;
647 columnCopy
= This
->column
;
648 lineCopy
= This
->line
;
651 if(This
->saxreader
->contentHandler
)
653 while(This
->lastCur
< chEnd
)
658 if(*end
== '\r') break;
662 Chars
= bstr_from_xmlChar(This
->lastCur
);
664 if(*end
== '\r' && *(end
+1) == '\n')
666 memmove((WCHAR
*)Chars
+(end
-This
->lastCur
),
667 (WCHAR
*)Chars
+(end
-This
->lastCur
)+1,
668 (SysStringLen(Chars
)-(end
-This
->lastCur
))*sizeof(WCHAR
));
669 SysReAllocStringLen(&Chars
, Chars
, SysStringLen(Chars
)-1);
671 else if(*end
== '\r') Chars
[end
-This
->lastCur
] = '\n';
673 hr
= ISAXContentHandler_characters(This
->saxreader
->contentHandler
, Chars
, end
-This
->lastCur
+1);
674 SysFreeString(Chars
);
677 format_error_message_from_id(This
, hr
);
681 if(*(end
+1) == '\n') end
++;
682 if(end
< chEnd
) end
++;
684 This
->column
+= end
-This
->lastCur
;
688 This
->lastCur
= lastCurCopy
;
689 This
->column
= columnCopy
;
690 This
->line
= lineCopy
;
691 update_position(This
, chEnd
);
695 static void libxmlSetDocumentLocator(
697 xmlSAXLocatorPtr loc
)
699 saxlocator
*This
= ctx
;
702 hr
= ISAXContentHandler_putDocumentLocator(This
->saxreader
->contentHandler
,
703 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
);
706 format_error_message_from_id(This
, hr
);
709 void libxmlFatalError(void *ctx
, const char *msg
, ...)
711 saxlocator
*This
= ctx
;
717 if(!This
->saxreader
->errorHandler
)
719 xmlStopParser(This
->pParserCtxt
);
724 FIXME("Error handling is not compatible.\n");
727 vsprintf(message
, msg
, args
);
730 len
= MultiByteToWideChar(CP_ACP
, 0, message
, -1, NULL
, 0);
731 wszError
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*len
);
732 MultiByteToWideChar(CP_ACP
, 0, message
, -1, (LPWSTR
)wszError
, len
);
734 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
735 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, wszError
, E_FAIL
);
737 HeapFree(GetProcessHeap(), 0, wszError
);
739 xmlStopParser(This
->pParserCtxt
);
743 /*** ISAXLocator interface ***/
744 /*** IUnknown methods ***/
745 static HRESULT WINAPI
isaxlocator_QueryInterface(ISAXLocator
* iface
, REFIID riid
, void **ppvObject
)
747 saxlocator
*This
= impl_from_ISAXLocator( iface
);
749 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
753 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
754 IsEqualGUID( riid
, &IID_ISAXLocator
))
760 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
761 return E_NOINTERFACE
;
764 ISAXLocator_AddRef( iface
);
769 static ULONG WINAPI
isaxlocator_AddRef(ISAXLocator
* iface
)
771 saxlocator
*This
= impl_from_ISAXLocator( iface
);
772 TRACE("%p\n", This
);
773 return InterlockedIncrement( &This
->ref
);
776 static ULONG WINAPI
isaxlocator_Release(
779 saxlocator
*This
= impl_from_ISAXLocator( iface
);
782 TRACE("%p\n", This
);
784 ref
= InterlockedDecrement( &This
->ref
);
788 SysFreeString(This
->publicId
);
790 SysFreeString(This
->systemId
);
792 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
793 HeapFree( GetProcessHeap(), 0, This
);
799 /*** ISAXLocator methods ***/
800 static HRESULT WINAPI
isaxlocator_getColumnNumber(
804 saxlocator
*This
= impl_from_ISAXLocator( iface
);
806 *pnColumn
= This
->column
;
810 static HRESULT WINAPI
isaxlocator_getLineNumber(
814 saxlocator
*This
= impl_from_ISAXLocator( iface
);
816 *pnLine
= This
->line
;
820 static HRESULT WINAPI
isaxlocator_getPublicId(
822 const WCHAR
** ppwchPublicId
)
825 saxlocator
*This
= impl_from_ISAXLocator( iface
);
827 if(This
->publicId
) SysFreeString(This
->publicId
);
829 publicId
= bstr_from_xmlChar(xmlSAX2GetPublicId(This
->pParserCtxt
));
830 if(SysStringLen(publicId
))
831 This
->publicId
= (WCHAR
*)&publicId
;
834 SysFreeString(publicId
);
835 This
->publicId
= NULL
;
838 *ppwchPublicId
= This
->publicId
;
842 static HRESULT WINAPI
isaxlocator_getSystemId(
844 const WCHAR
** ppwchSystemId
)
847 saxlocator
*This
= impl_from_ISAXLocator( iface
);
849 if(This
->systemId
) SysFreeString(This
->systemId
);
851 systemId
= bstr_from_xmlChar(xmlSAX2GetSystemId(This
->pParserCtxt
));
852 if(SysStringLen(systemId
))
853 This
->systemId
= (WCHAR
*)&systemId
;
856 SysFreeString(systemId
);
857 This
->systemId
= NULL
;
860 *ppwchSystemId
= This
->systemId
;
864 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
866 isaxlocator_QueryInterface
,
869 isaxlocator_getColumnNumber
,
870 isaxlocator_getLineNumber
,
871 isaxlocator_getPublicId
,
872 isaxlocator_getSystemId
875 static HRESULT
SAXLocator_create(saxreader
*reader
, saxlocator
**ppsaxlocator
)
879 locator
= HeapAlloc( GetProcessHeap(), 0, sizeof (*locator
) );
881 return E_OUTOFMEMORY
;
883 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
886 locator
->saxreader
= reader
;
887 ISAXXMLReader_AddRef((ISAXXMLReader
*)&reader
->lpSAXXMLReaderVtbl
);
889 locator
->pParserCtxt
= NULL
;
890 locator
->publicId
= NULL
;
891 locator
->systemId
= NULL
;
892 locator
->lastCur
= NULL
;
897 *ppsaxlocator
= locator
;
899 TRACE("returning %p\n", *ppsaxlocator
);
904 /*** IVBSAXXMLReader interface ***/
905 /*** IUnknown methods ***/
906 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
908 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
910 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
914 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
915 IsEqualGUID( riid
, &IID_IDispatch
) ||
916 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
920 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
922 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
926 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
927 return E_NOINTERFACE
;
930 IVBSAXXMLReader_AddRef( iface
);
935 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
937 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
938 TRACE("%p\n", This
);
939 return InterlockedIncrement( &This
->ref
);
942 static ULONG WINAPI
saxxmlreader_Release(
943 IVBSAXXMLReader
* iface
)
945 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
948 TRACE("%p\n", This
);
950 ref
= InterlockedDecrement( &This
->ref
);
953 if(This
->contentHandler
)
954 ISAXContentHandler_Release(This
->contentHandler
);
956 if(This
->errorHandler
)
957 ISAXErrorHandler_Release(This
->errorHandler
);
959 HeapFree( GetProcessHeap(), 0, This
);
965 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
967 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
969 TRACE("(%p)->(%p)\n", This
, pctinfo
);
976 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
977 IVBSAXXMLReader
*iface
,
978 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
980 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
983 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
985 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
990 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
991 IVBSAXXMLReader
*iface
,
998 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1002 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
1005 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
1006 return E_INVALIDARG
;
1008 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1011 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1012 ITypeInfo_Release(typeinfo
);
1018 static HRESULT WINAPI
saxxmlreader_Invoke(
1019 IVBSAXXMLReader
*iface
,
1020 DISPID dispIdMember
,
1024 DISPPARAMS
* pDispParams
,
1025 VARIANT
* pVarResult
,
1026 EXCEPINFO
* pExcepInfo
,
1029 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1030 ITypeInfo
*typeinfo
;
1033 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1034 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1036 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1039 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVtbl
), dispIdMember
, wFlags
, pDispParams
,
1040 pVarResult
, pExcepInfo
, puArgErr
);
1041 ITypeInfo_Release(typeinfo
);
1047 /*** IVBSAXXMLReader methods ***/
1048 static HRESULT WINAPI
saxxmlreader_getFeature(
1049 IVBSAXXMLReader
* iface
,
1050 const WCHAR
*pFeature
,
1051 VARIANT_BOOL
*pValue
)
1053 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1055 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1059 static HRESULT WINAPI
saxxmlreader_putFeature(
1060 IVBSAXXMLReader
* iface
,
1061 const WCHAR
*pFeature
,
1062 VARIANT_BOOL vfValue
)
1064 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1066 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1070 static HRESULT WINAPI
saxxmlreader_getProperty(
1071 IVBSAXXMLReader
* iface
,
1075 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1077 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
1081 static HRESULT WINAPI
saxxmlreader_putProperty(
1082 IVBSAXXMLReader
* iface
,
1086 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1088 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1092 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
1093 IVBSAXXMLReader
* iface
,
1094 IVBSAXEntityResolver
**pEntityResolver
)
1096 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1098 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1102 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
1103 IVBSAXXMLReader
* iface
,
1104 IVBSAXEntityResolver
*pEntityResolver
)
1106 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1108 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1112 static HRESULT WINAPI
saxxmlreader_getContentHandler(
1113 IVBSAXXMLReader
* iface
,
1114 IVBSAXContentHandler
**ppContentHandler
)
1116 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1118 FIXME("(%p)->(%p) stub\n", This
, ppContentHandler
);
1122 static HRESULT WINAPI
saxxmlreader_putContentHandler(
1123 IVBSAXXMLReader
* iface
,
1124 IVBSAXContentHandler
*contentHandler
)
1126 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1128 FIXME("(%p)->(%p) stub\n", This
, contentHandler
);
1132 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
1133 IVBSAXXMLReader
* iface
,
1134 IVBSAXDTDHandler
**pDTDHandler
)
1136 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1138 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1142 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
1143 IVBSAXXMLReader
* iface
,
1144 IVBSAXDTDHandler
*pDTDHandler
)
1146 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1148 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1152 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
1153 IVBSAXXMLReader
* iface
,
1154 IVBSAXErrorHandler
**pErrorHandler
)
1156 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1158 FIXME("(%p)->(%p) stub\n", This
, pErrorHandler
);
1162 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
1163 IVBSAXXMLReader
* iface
,
1164 IVBSAXErrorHandler
*errorHandler
)
1166 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1168 FIXME("(%p)->(%p) stub\n", This
, errorHandler
);
1172 static HRESULT WINAPI
saxxmlreader_getBaseURL(
1173 IVBSAXXMLReader
* iface
,
1174 const WCHAR
**pBaseUrl
)
1176 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1178 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1182 static HRESULT WINAPI
saxxmlreader_putBaseURL(
1183 IVBSAXXMLReader
* iface
,
1184 const WCHAR
*pBaseUrl
)
1186 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1188 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1192 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
1193 IVBSAXXMLReader
* iface
,
1194 const WCHAR
**pSecureBaseUrl
)
1196 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1198 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1203 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
1204 IVBSAXXMLReader
* iface
,
1205 const WCHAR
*secureBaseUrl
)
1207 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1209 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1213 static HRESULT WINAPI
saxxmlreader_parse(
1214 IVBSAXXMLReader
* iface
,
1217 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1219 FIXME("(%p) stub\n", This
);
1223 static HRESULT WINAPI
saxxmlreader_parseURL(
1224 IVBSAXXMLReader
* iface
,
1227 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1229 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1233 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
1235 saxxmlreader_QueryInterface
,
1236 saxxmlreader_AddRef
,
1237 saxxmlreader_Release
,
1238 saxxmlreader_GetTypeInfoCount
,
1239 saxxmlreader_GetTypeInfo
,
1240 saxxmlreader_GetIDsOfNames
,
1241 saxxmlreader_Invoke
,
1242 saxxmlreader_getFeature
,
1243 saxxmlreader_putFeature
,
1244 saxxmlreader_getProperty
,
1245 saxxmlreader_putProperty
,
1246 saxxmlreader_getEntityResolver
,
1247 saxxmlreader_putEntityResolver
,
1248 saxxmlreader_getContentHandler
,
1249 saxxmlreader_putContentHandler
,
1250 saxxmlreader_getDTDHandler
,
1251 saxxmlreader_putDTDHandler
,
1252 saxxmlreader_getErrorHandler
,
1253 saxxmlreader_putErrorHandler
,
1254 saxxmlreader_getBaseURL
,
1255 saxxmlreader_putBaseURL
,
1256 saxxmlreader_getSecureBaseURL
,
1257 saxxmlreader_putSecureBaseURL
,
1259 saxxmlreader_parseURL
1262 /*** ISAXXMLReader interface ***/
1263 /*** IUnknown methods ***/
1264 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
1266 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1267 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVtbl
, riid
, ppvObject
);
1270 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
1272 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1273 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVtbl
);
1276 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
1278 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1279 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVtbl
);
1282 /*** ISAXXMLReader methods ***/
1283 static HRESULT WINAPI
isaxxmlreader_getFeature(
1284 ISAXXMLReader
* iface
,
1285 const WCHAR
*pFeature
,
1286 VARIANT_BOOL
*pValue
)
1288 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1290 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1294 static HRESULT WINAPI
isaxxmlreader_putFeature(
1295 ISAXXMLReader
* iface
,
1296 const WCHAR
*pFeature
,
1297 VARIANT_BOOL vfValue
)
1299 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1301 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1305 static HRESULT WINAPI
isaxxmlreader_getProperty(
1306 ISAXXMLReader
* iface
,
1310 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1312 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
1316 static HRESULT WINAPI
isaxxmlreader_putProperty(
1317 ISAXXMLReader
* iface
,
1321 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1323 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1327 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
1328 ISAXXMLReader
* iface
,
1329 ISAXEntityResolver
**ppEntityResolver
)
1331 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1333 FIXME("(%p)->(%p) stub\n", This
, ppEntityResolver
);
1337 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
1338 ISAXXMLReader
* iface
,
1339 ISAXEntityResolver
*pEntityResolver
)
1341 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1343 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1347 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
1348 ISAXXMLReader
* iface
,
1349 ISAXContentHandler
**pContentHandler
)
1351 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1353 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
1354 if(pContentHandler
== NULL
)
1356 if(This
->contentHandler
)
1357 ISAXContentHandler_AddRef(This
->contentHandler
);
1358 *pContentHandler
= This
->contentHandler
;
1363 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
1364 ISAXXMLReader
* iface
,
1365 ISAXContentHandler
*contentHandler
)
1367 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1369 TRACE("(%p)->(%p)\n", This
, contentHandler
);
1371 ISAXContentHandler_AddRef(contentHandler
);
1372 if(This
->contentHandler
)
1373 ISAXContentHandler_Release(This
->contentHandler
);
1374 This
->contentHandler
= contentHandler
;
1379 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
1380 ISAXXMLReader
* iface
,
1381 ISAXDTDHandler
**pDTDHandler
)
1383 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1385 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1389 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
1390 ISAXXMLReader
* iface
,
1391 ISAXDTDHandler
*pDTDHandler
)
1393 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1395 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1399 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
1400 ISAXXMLReader
* iface
,
1401 ISAXErrorHandler
**pErrorHandler
)
1403 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1405 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
1406 if(pErrorHandler
== NULL
)
1408 if(This
->errorHandler
)
1409 ISAXErrorHandler_AddRef(This
->errorHandler
);
1410 *pErrorHandler
= This
->errorHandler
;
1415 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
1416 ISAXXMLReader
* iface
,
1417 ISAXErrorHandler
*errorHandler
)
1419 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1421 TRACE("(%p)->(%p)\n", This
, errorHandler
);
1423 ISAXErrorHandler_AddRef(errorHandler
);
1424 if(This
->errorHandler
)
1425 ISAXErrorHandler_Release(This
->errorHandler
);
1426 This
->errorHandler
= errorHandler
;
1431 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
1432 ISAXXMLReader
* iface
,
1433 const WCHAR
**pBaseUrl
)
1435 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1437 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1441 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
1442 ISAXXMLReader
* iface
,
1443 const WCHAR
*pBaseUrl
)
1445 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1447 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1451 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
1452 ISAXXMLReader
* iface
,
1453 const WCHAR
**pSecureBaseUrl
)
1455 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1457 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1461 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
1462 ISAXXMLReader
* iface
,
1463 const WCHAR
*secureBaseUrl
)
1465 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1467 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1471 static HRESULT
parse_buffer(saxreader
*This
, xmlChar
*buffer
)
1473 saxlocator
*locator
;
1476 hr
= SAXLocator_create(This
, &locator
);
1480 locator
->pParserCtxt
= xmlNewParserCtxt();
1481 if(!locator
->pParserCtxt
)
1483 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1487 locator
->pParserCtxt
->sax
= &locator
->saxreader
->sax
;
1488 locator
->pParserCtxt
->userData
= locator
;
1490 xmlSetupParserForBuffer(locator
->pParserCtxt
, buffer
, NULL
);
1492 if(xmlParseDocument(locator
->pParserCtxt
)) hr
= E_FAIL
;
1493 else hr
= locator
->ret
;
1495 if(locator
->pParserCtxt
)
1497 locator
->pParserCtxt
->sax
= NULL
;
1498 xmlFreeParserCtxt(locator
->pParserCtxt
);
1499 locator
->pParserCtxt
= NULL
;
1502 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1506 static HRESULT WINAPI
isaxxmlreader_parse(
1507 ISAXXMLReader
* iface
,
1510 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1511 xmlChar
*data
= NULL
;
1514 TRACE("(%p)\n", This
);
1517 switch(V_VT(&varInput
))
1520 data
= xmlChar_from_wchar(V_BSTR(&varInput
));
1521 hr
= parse_buffer(This
, data
);
1523 case VT_ARRAY
|VT_UI1
: {
1525 LONG lBound
, uBound
;
1528 hr
= SafeArrayGetLBound(V_ARRAY(&varInput
), 1, &lBound
);
1529 if(hr
!= S_OK
) break;
1530 hr
= SafeArrayGetUBound(V_ARRAY(&varInput
), 1, &uBound
);
1531 if(hr
!= S_OK
) break;
1532 dataRead
= (uBound
-lBound
)*SafeArrayGetElemsize(V_ARRAY(&varInput
));
1533 data
= HeapAlloc(GetProcessHeap(), 0, dataRead
+1);
1535 hr
= SafeArrayAccessData(V_ARRAY(&varInput
), (void**)&pSAData
);
1536 if(hr
!= S_OK
) break;
1537 memcpy(data
, pSAData
, dataRead
);
1538 data
[dataRead
] = '\0';
1539 hr
= parse_buffer(This
, data
);
1540 SafeArrayUnaccessData(V_ARRAY(&varInput
));
1545 IPersistStream
*persistStream
;
1546 IStream
*stream
= NULL
;
1547 IXMLDOMDocument
*xmlDoc
;
1549 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1550 &IID_IPersistStream
, (void**)&persistStream
) == S_OK
)
1552 hr
= IPersistStream_Save(persistStream
, stream
, TRUE
);
1553 IPersistStream_Release(persistStream
);
1554 if(hr
!= S_OK
) break;
1556 if(stream
|| IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1557 &IID_IStream
, (void**)&stream
) == S_OK
)
1564 hr
= IStream_Stat(stream
, &dataInfo
, STATFLAG_NONAME
);
1565 if(hr
== E_PENDING
) continue;
1568 data
= HeapAlloc(GetProcessHeap(), 0,
1569 dataInfo
.cbSize
.QuadPart
+1);
1572 hr
= IStream_Read(stream
, data
,
1573 dataInfo
.cbSize
.QuadPart
, &dataRead
);
1574 if(hr
== E_PENDING
) continue;
1577 data
[dataInfo
.cbSize
.QuadPart
] = '\0';
1578 hr
= parse_buffer(This
, data
);
1579 IStream_Release(stream
);
1582 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1583 &IID_IXMLDOMDocument
, (void**)&xmlDoc
) == S_OK
)
1587 IXMLDOMDocument_get_xml(xmlDoc
, &bstrData
);
1588 data
= xmlChar_from_wchar(bstrData
);
1589 hr
= parse_buffer(This
, data
);
1590 IXMLDOMDocument_Release(xmlDoc
);
1596 WARN("vt %d not implemented\n", V_VT(&varInput
));
1600 HeapFree(GetProcessHeap(), 0, data
);
1604 static HRESULT
saxreader_onDataAvailable(void *obj
, char *ptr
, DWORD len
)
1606 saxreader
*This
= obj
;
1610 data
= HeapAlloc(GetProcessHeap(), 0, len
+1);
1611 memcpy(data
, ptr
, len
);
1614 hr
= parse_buffer(This
, data
);
1616 HeapFree(GetProcessHeap(), 0, data
);
1620 static HRESULT WINAPI
isaxxmlreader_parseURL(
1621 ISAXXMLReader
* iface
,
1624 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1628 TRACE("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1630 hr
= bind_url(url
, saxreader_onDataAvailable
, This
, &bsc
);
1639 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
1641 isaxxmlreader_QueryInterface
,
1642 isaxxmlreader_AddRef
,
1643 isaxxmlreader_Release
,
1644 isaxxmlreader_getFeature
,
1645 isaxxmlreader_putFeature
,
1646 isaxxmlreader_getProperty
,
1647 isaxxmlreader_putProperty
,
1648 isaxxmlreader_getEntityResolver
,
1649 isaxxmlreader_putEntityResolver
,
1650 isaxxmlreader_getContentHandler
,
1651 isaxxmlreader_putContentHandler
,
1652 isaxxmlreader_getDTDHandler
,
1653 isaxxmlreader_putDTDHandler
,
1654 isaxxmlreader_getErrorHandler
,
1655 isaxxmlreader_putErrorHandler
,
1656 isaxxmlreader_getBaseURL
,
1657 isaxxmlreader_putBaseURL
,
1658 isaxxmlreader_getSecureBaseURL
,
1659 isaxxmlreader_putSecureBaseURL
,
1660 isaxxmlreader_parse
,
1661 isaxxmlreader_parseURL
1664 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1668 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
1670 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
1672 return E_OUTOFMEMORY
;
1674 reader
->lpVtbl
= &saxreader_vtbl
;
1675 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
1677 reader
->contentHandler
= NULL
;
1678 reader
->errorHandler
= NULL
;
1680 memset(&reader
->sax
, 0, sizeof(xmlSAXHandler
));
1681 reader
->sax
.initialized
= XML_SAX2_MAGIC
;
1682 reader
->sax
.startDocument
= libxmlStartDocument
;
1683 reader
->sax
.endDocument
= libxmlEndDocument
;
1684 reader
->sax
.startElementNs
= libxmlStartElementNS
;
1685 reader
->sax
.endElementNs
= libxmlEndElementNS
;
1686 reader
->sax
.characters
= libxmlCharacters
;
1687 reader
->sax
.setDocumentLocator
= libxmlSetDocumentLocator
;
1688 reader
->sax
.error
= libxmlFatalError
;
1689 reader
->sax
.fatalError
= libxmlFatalError
;
1691 *ppObj
= &reader
->lpVtbl
;
1693 TRACE("returning iface %p\n", *ppObj
);
1700 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1702 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1703 "libxml2 support was not present at compile time.\n");