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>
47 #include <libxml/parserInternals.h>
49 typedef struct _saxreader
51 const struct IVBSAXXMLReaderVtbl
*lpVBSAXXMLReaderVtbl
;
52 const struct ISAXXMLReaderVtbl
*lpSAXXMLReaderVtbl
;
54 struct ISAXContentHandler
*contentHandler
;
55 struct IVBSAXContentHandler
*vbcontentHandler
;
56 struct ISAXErrorHandler
*errorHandler
;
57 struct IVBSAXErrorHandler
*vberrorHandler
;
61 typedef struct _saxlocator
63 const struct IVBSAXLocatorVtbl
*lpVBSAXLocatorVtbl
;
64 const struct ISAXLocatorVtbl
*lpSAXLocatorVtbl
;
68 xmlParserCtxtPtr pParserCtxt
;
77 typedef struct _saxattributes
79 const struct IVBSAXAttributesVtbl
*lpVBSAXAttributesVtbl
;
80 const struct ISAXAttributesVtbl
*lpSAXAttributesVtbl
;
90 static inline saxreader
*impl_from_IVBSAXXMLReader( IVBSAXXMLReader
*iface
)
92 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpVBSAXXMLReaderVtbl
));
95 static inline saxreader
*impl_from_ISAXXMLReader( ISAXXMLReader
*iface
)
97 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpSAXXMLReaderVtbl
));
100 static inline saxlocator
*impl_from_IVBSAXLocator( IVBSAXLocator
*iface
)
102 return (saxlocator
*)((char*)iface
- FIELD_OFFSET(saxlocator
, lpVBSAXLocatorVtbl
));
105 static inline saxlocator
*impl_from_ISAXLocator( ISAXLocator
*iface
)
107 return (saxlocator
*)((char*)iface
- FIELD_OFFSET(saxlocator
, lpSAXLocatorVtbl
));
110 static inline saxattributes
*impl_from_IVBSAXAttributes( IVBSAXAttributes
*iface
)
112 return (saxattributes
*)((char*)iface
- FIELD_OFFSET(saxattributes
, lpVBSAXAttributesVtbl
));
115 static inline saxattributes
*impl_from_ISAXAttributes( ISAXAttributes
*iface
)
117 return (saxattributes
*)((char*)iface
- FIELD_OFFSET(saxattributes
, lpSAXAttributesVtbl
));
121 BSTR
bstr_from_xmlCharN(const xmlChar
*buf
, int len
)
130 dLen
= MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)buf
, len
, NULL
, 0);
131 if(len
!= -1) dLen
++;
132 str
= (LPWSTR
)HeapAlloc(GetProcessHeap(), 0, dLen
* sizeof (WCHAR
));
135 MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)buf
, len
, str
, dLen
);
136 if(len
!= -1) str
[dLen
-1] = '\0';
137 bstr
= SysAllocString(str
);
138 HeapFree(GetProcessHeap(), 0, str
);
143 static void format_error_message_from_id(saxlocator
*This
, HRESULT hr
)
145 xmlStopParser(This
->pParserCtxt
);
148 if(This
->saxreader
->errorHandler
)
151 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
,
152 NULL
, hr
, 0, msg
, sizeof(msg
), NULL
))
154 FIXME("MSXML errors not yet supported.\n");
158 if(This
->vbInterface
)
160 BSTR bstrMsg
= SysAllocString(msg
);
161 IVBSAXErrorHandler_fatalError(This
->saxreader
->vberrorHandler
,
162 (IVBSAXLocator
*)&This
->lpVBSAXLocatorVtbl
, &bstrMsg
, hr
);
165 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
166 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, msg
, hr
);
170 static void update_position(saxlocator
*This
, xmlChar
*end
)
172 if(This
->lastCur
== NULL
)
174 This
->lastCur
= (xmlChar
*)This
->pParserCtxt
->input
->base
;
178 else if(This
->lastCur
< This
->pParserCtxt
->input
->base
)
180 This
->lastCur
= (xmlChar
*)This
->pParserCtxt
->input
->base
;
185 if(!end
) end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
;
187 while(This
->lastCur
< end
)
189 if(*(This
->lastCur
) == '\n')
194 else if(*(This
->lastCur
) == '\r' && (This
->lastCur
==This
->pParserCtxt
->input
->end
|| *(This
->lastCur
+1)!='\n'))
205 /*** IVBSAXAttributes interface ***/
206 /*** IUnknown methods ***/
207 static HRESULT WINAPI
ivbsaxattributes_QueryInterface(
208 IVBSAXAttributes
* iface
,
212 saxattributes
*This
= impl_from_IVBSAXAttributes(iface
);
214 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
218 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
219 IsEqualGUID(riid
, &IID_IDispatch
) ||
220 IsEqualGUID(riid
, &IID_IVBSAXAttributes
))
226 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
227 return E_NOINTERFACE
;
230 IVBSAXAttributes_AddRef(iface
);
235 static ULONG WINAPI
ivbsaxattributes_AddRef(IVBSAXAttributes
* iface
)
237 saxattributes
*This
= impl_from_IVBSAXAttributes(iface
);
238 return ISAXAttributes_AddRef((ISAXAttributes
*)&This
->lpSAXAttributesVtbl
);
241 static ULONG WINAPI
ivbsaxattributes_Release(IVBSAXAttributes
* iface
)
243 saxattributes
*This
= impl_from_IVBSAXAttributes(iface
);
244 return ISAXAttributes_Release((ISAXAttributes
*)&This
->lpSAXAttributesVtbl
);
247 /*** IDispatch methods ***/
248 static HRESULT WINAPI
ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes
*iface
, UINT
* pctinfo
)
250 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
252 TRACE("(%p)->(%p)\n", This
, pctinfo
);
259 static HRESULT WINAPI
ivbsaxattributes_GetTypeInfo(
260 IVBSAXAttributes
*iface
,
261 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
263 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
266 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
268 hr
= get_typeinfo(IVBSAXAttributes_tid
, ppTInfo
);
273 static HRESULT WINAPI
ivbsaxattributes_GetIDsOfNames(
274 IVBSAXAttributes
*iface
,
281 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
285 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
288 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
291 hr
= get_typeinfo(IVBSAXAttributes_tid
, &typeinfo
);
294 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
295 ITypeInfo_Release(typeinfo
);
301 static HRESULT WINAPI
ivbsaxattributes_Invoke(
302 IVBSAXAttributes
*iface
,
307 DISPPARAMS
* pDispParams
,
309 EXCEPINFO
* pExcepInfo
,
312 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
316 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
317 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
319 hr
= get_typeinfo(IVBSAXAttributes_tid
, &typeinfo
);
322 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXAttributesVtbl
), dispIdMember
, wFlags
, pDispParams
,
323 pVarResult
, pExcepInfo
, puArgErr
);
324 ITypeInfo_Release(typeinfo
);
330 /*** IVBSAXAttributes methods ***/
331 static HRESULT WINAPI
ivbsaxattributes_get_length(
332 IVBSAXAttributes
* iface
,
335 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
336 return ISAXAttributes_getLength(
337 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
341 static HRESULT WINAPI
ivbsaxattributes_getURI(
342 IVBSAXAttributes
* iface
,
347 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
348 return ISAXAttributes_getURI(
349 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
350 nIndex
, (const WCHAR
**)uri
, &len
);
353 static HRESULT WINAPI
ivbsaxattributes_getLocalName(
354 IVBSAXAttributes
* iface
,
359 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
360 return ISAXAttributes_getLocalName(
361 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
362 nIndex
, (const WCHAR
**)localName
, &len
);
365 static HRESULT WINAPI
ivbsaxattributes_getQName(
366 IVBSAXAttributes
* iface
,
371 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
372 return ISAXAttributes_getQName(
373 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
374 nIndex
, (const WCHAR
**)QName
, &len
);
377 static HRESULT WINAPI
ivbsaxattributes_getIndexFromName(
378 IVBSAXAttributes
* iface
,
383 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
384 return ISAXAttributes_getIndexFromName(
385 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
386 (const WCHAR
*)uri
, SysStringLen(uri
),
387 (const WCHAR
*)localName
, SysStringLen(localName
), index
);
390 static HRESULT WINAPI
ivbsaxattributes_getIndexFromQName(
391 IVBSAXAttributes
* iface
,
395 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
396 return ISAXAttributes_getIndexFromQName(
397 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
398 (const WCHAR
*)QName
, SysStringLen(QName
), index
);
401 static HRESULT WINAPI
ivbsaxattributes_getType(
402 IVBSAXAttributes
* iface
,
407 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
408 return ISAXAttributes_getType(
409 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
410 nIndex
, (const WCHAR
**)type
, &len
);
413 static HRESULT WINAPI
ivbsaxattributes_getTypeFromName(
414 IVBSAXAttributes
* iface
,
420 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
421 return ISAXAttributes_getTypeFromName(
422 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
423 (const WCHAR
*)uri
, SysStringLen(uri
),
424 (const WCHAR
*)localName
, SysStringLen(localName
),
425 (const WCHAR
**)type
, &len
);
428 static HRESULT WINAPI
ivbsaxattributes_getTypeFromQName(
429 IVBSAXAttributes
* iface
,
434 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
435 return ISAXAttributes_getTypeFromQName(
436 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
437 (const WCHAR
*)QName
, SysStringLen(QName
),
438 (const WCHAR
**)type
, &len
);
441 static HRESULT WINAPI
ivbsaxattributes_getValue(
442 IVBSAXAttributes
* iface
,
447 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
448 return ISAXAttributes_getValue(
449 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
450 nIndex
, (const WCHAR
**)value
, &len
);
453 static HRESULT WINAPI
ivbsaxattributes_getValueFromName(
454 IVBSAXAttributes
* iface
,
460 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
461 return ISAXAttributes_getValueFromName(
462 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
463 (const WCHAR
*)uri
, SysStringLen(uri
),
464 (const WCHAR
*)localName
, SysStringLen(localName
),
465 (const WCHAR
**)value
, &len
);
468 static HRESULT WINAPI
ivbsaxattributes_getValueFromQName(
469 IVBSAXAttributes
* iface
,
474 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
475 return ISAXAttributes_getValueFromQName(
476 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
477 (const WCHAR
*)QName
, SysStringLen(QName
),
478 (const WCHAR
**)value
, &len
);
481 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl
=
483 ivbsaxattributes_QueryInterface
,
484 ivbsaxattributes_AddRef
,
485 ivbsaxattributes_Release
,
486 ivbsaxattributes_GetTypeInfoCount
,
487 ivbsaxattributes_GetTypeInfo
,
488 ivbsaxattributes_GetIDsOfNames
,
489 ivbsaxattributes_Invoke
,
490 ivbsaxattributes_get_length
,
491 ivbsaxattributes_getURI
,
492 ivbsaxattributes_getLocalName
,
493 ivbsaxattributes_getQName
,
494 ivbsaxattributes_getIndexFromName
,
495 ivbsaxattributes_getIndexFromQName
,
496 ivbsaxattributes_getType
,
497 ivbsaxattributes_getTypeFromName
,
498 ivbsaxattributes_getTypeFromQName
,
499 ivbsaxattributes_getValue
,
500 ivbsaxattributes_getValueFromName
,
501 ivbsaxattributes_getValueFromQName
504 /*** ISAXAttributes interface ***/
505 /*** IUnknown methods ***/
506 static HRESULT WINAPI
isaxattributes_QueryInterface(
507 ISAXAttributes
* iface
,
511 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
513 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
517 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
518 IsEqualGUID(riid
, &IID_ISAXAttributes
))
524 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
525 return E_NOINTERFACE
;
528 ISAXAttributes_AddRef(iface
);
533 static ULONG WINAPI
isaxattributes_AddRef(ISAXAttributes
* iface
)
535 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
537 return InterlockedIncrement(&This
->ref
);
540 static ULONG WINAPI
isaxattributes_Release(ISAXAttributes
* iface
)
542 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
547 ref
= InterlockedDecrement(&This
->ref
);
551 for(index
=0; index
<This
->nb_attributes
; index
++)
553 SysFreeString(This
->szLocalname
[index
]);
554 SysFreeString(This
->szPrefix
[index
]);
555 SysFreeString(This
->szURI
[index
]);
556 SysFreeString(This
->szValue
[index
]);
559 HeapFree(GetProcessHeap(), 0, This
->szLocalname
);
560 HeapFree(GetProcessHeap(), 0, This
->szPrefix
);
561 HeapFree(GetProcessHeap(), 0, This
->szURI
);
562 HeapFree(GetProcessHeap(), 0, This
->szValue
);
564 HeapFree(GetProcessHeap(), 0, This
);
570 /*** ISAXAttributes methods ***/
571 static HRESULT WINAPI
isaxattributes_getLength(
572 ISAXAttributes
* iface
,
575 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
577 *length
= This
->nb_attributes
;
578 TRACE("Length set to %d\n", *length
);
582 static HRESULT WINAPI
isaxattributes_getURI(
583 ISAXAttributes
* iface
,
588 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
590 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
594 static HRESULT WINAPI
isaxattributes_getLocalName(
595 ISAXAttributes
* iface
,
597 const WCHAR
**pLocalName
,
598 int *pLocalNameLength
)
600 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
601 TRACE("(%p)->(%d)\n", This
, nIndex
);
603 if(nIndex
>= This
->nb_attributes
) return E_INVALIDARG
;
605 *pLocalNameLength
= SysStringLen(This
->szLocalname
[nIndex
]);
606 *pLocalName
= This
->szLocalname
[nIndex
];
611 static HRESULT WINAPI
isaxattributes_getQName(
612 ISAXAttributes
* iface
,
614 const WCHAR
**pQName
,
617 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
618 TRACE("(%p)->(%d)\n", This
, nIndex
);
620 if(nIndex
>= This
->nb_attributes
) return E_INVALIDARG
;
622 *pQNameLength
= SysStringLen(This
->szQName
[nIndex
]);
623 *pQName
= This
->szQName
[nIndex
];
628 static HRESULT WINAPI
isaxattributes_getName(
629 ISAXAttributes
* iface
,
633 const WCHAR
**pLocalName
,
635 const WCHAR
**pQName
,
638 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
640 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
644 static HRESULT WINAPI
isaxattributes_getIndexFromName(
645 ISAXAttributes
* iface
,
648 const WCHAR
*pLocalName
,
652 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
654 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), cUriLength
,
655 debugstr_w(pLocalName
), cocalNameLength
);
659 static HRESULT WINAPI
isaxattributes_getIndexFromQName(
660 ISAXAttributes
* iface
,
665 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
667 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQNameLength
);
671 static HRESULT WINAPI
isaxattributes_getType(
672 ISAXAttributes
* iface
,
677 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
679 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
683 static HRESULT WINAPI
isaxattributes_getTypeFromName(
684 ISAXAttributes
* iface
,
687 const WCHAR
*pLocalName
,
692 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
694 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
695 debugstr_w(pLocalName
), nLocalName
);
699 static HRESULT WINAPI
isaxattributes_getTypeFromQName(
700 ISAXAttributes
* iface
,
706 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
708 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
712 static HRESULT WINAPI
isaxattributes_getValue(
713 ISAXAttributes
* iface
,
715 const WCHAR
**pValue
,
718 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
719 TRACE("(%p)->(%d)\n", This
, nIndex
);
721 if(nIndex
>= This
->nb_attributes
) return E_INVALIDARG
;
723 *nValue
= SysStringLen(This
->szValue
[nIndex
]);
724 *pValue
= This
->szValue
[nIndex
];
729 static HRESULT WINAPI
isaxattributes_getValueFromName(
730 ISAXAttributes
* iface
,
733 const WCHAR
*pLocalName
,
735 const WCHAR
**pValue
,
738 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
740 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
741 debugstr_w(pLocalName
), nLocalName
);
745 static HRESULT WINAPI
isaxattributes_getValueFromQName(
746 ISAXAttributes
* iface
,
749 const WCHAR
**pValue
,
752 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
754 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
758 static const struct ISAXAttributesVtbl isaxattributes_vtbl
=
760 isaxattributes_QueryInterface
,
761 isaxattributes_AddRef
,
762 isaxattributes_Release
,
763 isaxattributes_getLength
,
764 isaxattributes_getURI
,
765 isaxattributes_getLocalName
,
766 isaxattributes_getQName
,
767 isaxattributes_getName
,
768 isaxattributes_getIndexFromName
,
769 isaxattributes_getIndexFromQName
,
770 isaxattributes_getType
,
771 isaxattributes_getTypeFromName
,
772 isaxattributes_getTypeFromQName
,
773 isaxattributes_getValue
,
774 isaxattributes_getValueFromName
,
775 isaxattributes_getValueFromQName
778 static HRESULT
SAXAttributes_create(saxattributes
**attr
,
779 int nb_attributes
, const xmlChar
**xmlAttributes
)
781 saxattributes
*attributes
;
784 attributes
= HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes
));
786 return E_OUTOFMEMORY
;
788 attributes
->lpVBSAXAttributesVtbl
= &ivbsaxattributes_vtbl
;
789 attributes
->lpSAXAttributesVtbl
= &isaxattributes_vtbl
;
792 attributes
->nb_attributes
= nb_attributes
;
794 attributes
->szLocalname
=
795 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
796 attributes
->szPrefix
=
797 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
799 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
800 attributes
->szValue
=
801 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
802 attributes
->szQName
=
803 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*nb_attributes
);
805 if(!attributes
->szLocalname
|| !attributes
->szPrefix
806 || !attributes
->szURI
|| !attributes
->szValue
807 || !attributes
->szQName
)
809 if(attributes
->szLocalname
)
810 HeapFree(GetProcessHeap(), 0, attributes
->szLocalname
);
811 if(attributes
->szPrefix
)
812 HeapFree(GetProcessHeap(), 0, attributes
->szPrefix
);
813 if(attributes
->szURI
)
814 HeapFree(GetProcessHeap(), 0, attributes
->szURI
);
815 if(attributes
->szValue
)
816 HeapFree(GetProcessHeap(), 0, attributes
->szValue
);
817 if(attributes
->szQName
)
818 HeapFree(GetProcessHeap(), 0, attributes
->szQName
);
822 for(index
=0; index
<nb_attributes
; index
++)
826 attributes
->szLocalname
[index
] =
827 bstr_from_xmlChar(xmlAttributes
[index
*5]);
828 attributes
->szPrefix
[index
] =
829 bstr_from_xmlChar(xmlAttributes
[index
*5+1]);
830 attributes
->szURI
[index
] =
831 bstr_from_xmlChar(xmlAttributes
[index
*5+2]);
832 attributes
->szValue
[index
] =
833 bstr_from_xmlCharN(xmlAttributes
[index
*5+3],
834 xmlAttributes
[index
*5+4]-xmlAttributes
[index
*5+3]);
836 len1
= SysStringLen(attributes
->szPrefix
[index
]);
837 len2
= SysStringLen(attributes
->szLocalname
[index
]);
838 attributes
->szQName
[index
] = SysAllocStringLen(NULL
, len1
+len2
);
839 memcpy(attributes
->szQName
[index
], attributes
->szPrefix
[index
],
841 memcpy(attributes
->szQName
[index
]+len1
,
842 attributes
->szLocalname
[index
], len2
*sizeof(WCHAR
));
843 attributes
->szQName
[index
][len1
+len2
] = '\0';
848 TRACE("returning %p\n", *attr
);
853 /*** LibXML callbacks ***/
854 static void libxmlStartDocument(void *ctx
)
856 saxlocator
*This
= ctx
;
859 if(This
->saxreader
->contentHandler
)
861 if(This
->vbInterface
)
862 hr
= IVBSAXContentHandler_startDocument(This
->saxreader
->vbcontentHandler
);
864 hr
= ISAXContentHandler_startDocument(This
->saxreader
->contentHandler
);
867 format_error_message_from_id(This
, hr
);
870 update_position(This
, NULL
);
873 static void libxmlEndDocument(void *ctx
)
875 saxlocator
*This
= ctx
;
881 if(This
->ret
!= S_OK
) return;
883 if(This
->saxreader
->contentHandler
)
885 if(This
->vbInterface
)
886 hr
= IVBSAXContentHandler_endDocument(This
->saxreader
->vbcontentHandler
);
888 hr
= ISAXContentHandler_endDocument(This
->saxreader
->contentHandler
);
891 format_error_message_from_id(This
, hr
);
895 static void libxmlStartElementNS(
897 const xmlChar
*localname
,
898 const xmlChar
*prefix
,
901 const xmlChar
**namespaces
,
904 const xmlChar
**attributes
)
906 BSTR NamespaceUri
, LocalName
, QName
;
907 saxlocator
*This
= ctx
;
911 update_position(This
, (xmlChar
*)This
->pParserCtxt
->input
->cur
+1);
913 if(This
->saxreader
->contentHandler
)
915 NamespaceUri
= bstr_from_xmlChar(URI
);
916 LocalName
= bstr_from_xmlChar(localname
);
917 QName
= bstr_from_xmlChar(localname
);
919 hr
= SAXAttributes_create(&attr
, nb_attributes
, attributes
);
922 if(This
->vbInterface
)
923 hr
= IVBSAXContentHandler_startElement(
924 This
->saxreader
->vbcontentHandler
,
925 &NamespaceUri
, &LocalName
, &QName
,
926 (IVBSAXAttributes
*)&attr
->lpVBSAXAttributesVtbl
);
928 hr
= ISAXContentHandler_startElement(
929 This
->saxreader
->contentHandler
,
930 NamespaceUri
, SysStringLen(NamespaceUri
),
931 LocalName
, SysStringLen(LocalName
),
932 QName
, SysStringLen(QName
),
933 (ISAXAttributes
*)&attr
->lpSAXAttributesVtbl
);
935 ISAXAttributes_Release((ISAXAttributes
*)&attr
->lpSAXAttributesVtbl
);
938 SysFreeString(NamespaceUri
);
939 SysFreeString(LocalName
);
940 SysFreeString(QName
);
943 format_error_message_from_id(This
, hr
);
947 static void libxmlEndElementNS(
949 const xmlChar
*localname
,
950 const xmlChar
*prefix
,
953 BSTR NamespaceUri
, LocalName
, QName
;
954 saxlocator
*This
= ctx
;
959 while(*end
!= '<' && *(end
+1) != '/') end
++;
960 update_position(This
, end
+2);
962 if(This
->saxreader
->contentHandler
)
964 NamespaceUri
= bstr_from_xmlChar(URI
);
965 LocalName
= bstr_from_xmlChar(localname
);
966 QName
= bstr_from_xmlChar(localname
);
968 if(This
->vbInterface
)
969 hr
= IVBSAXContentHandler_endElement(
970 This
->saxreader
->vbcontentHandler
,
971 &NamespaceUri
, &LocalName
, &QName
);
973 hr
= ISAXContentHandler_endElement(
974 This
->saxreader
->contentHandler
,
975 NamespaceUri
, SysStringLen(NamespaceUri
),
976 LocalName
, SysStringLen(LocalName
),
977 QName
, SysStringLen(QName
));
979 SysFreeString(NamespaceUri
);
980 SysFreeString(LocalName
);
981 SysFreeString(QName
);
984 format_error_message_from_id(This
, hr
);
988 static void libxmlCharacters(
994 saxlocator
*This
= ctx
;
997 xmlChar
*lastCurCopy
;
1002 if(*(This
->lastCur
-1) != '>' && *(This
->lastCur
-1) != '/') return;
1004 if(*(This
->lastCur
-1) != '>')
1006 end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
-len
;
1007 while(*(end
-1) != '>') end
--;
1008 update_position(This
, end
);
1011 chEnd
= This
->lastCur
+len
;
1012 while(*chEnd
!= '<') chEnd
++;
1014 Chars
= bstr_from_xmlChar(ch
);
1016 lastCurCopy
= This
->lastCur
;
1017 columnCopy
= This
->column
;
1018 lineCopy
= This
->line
;
1019 end
= This
->lastCur
;
1021 if(This
->saxreader
->contentHandler
)
1023 while(This
->lastCur
< chEnd
)
1025 end
= This
->lastCur
;
1026 while(end
< chEnd
-1)
1028 if(*end
== '\r') break;
1032 Chars
= bstr_from_xmlChar(This
->lastCur
);
1034 if(*end
== '\r' && *(end
+1) == '\n')
1036 memmove((WCHAR
*)Chars
+(end
-This
->lastCur
),
1037 (WCHAR
*)Chars
+(end
-This
->lastCur
)+1,
1038 (SysStringLen(Chars
)-(end
-This
->lastCur
))*sizeof(WCHAR
));
1039 SysReAllocStringLen(&Chars
, Chars
, SysStringLen(Chars
)-1);
1041 else if(*end
== '\r') Chars
[end
-This
->lastCur
] = '\n';
1043 if(This
->vbInterface
)
1044 hr
= IVBSAXContentHandler_characters(
1045 This
->saxreader
->vbcontentHandler
, &Chars
);
1047 hr
= ISAXContentHandler_characters(
1048 This
->saxreader
->contentHandler
,
1049 Chars
, end
-This
->lastCur
+1);
1051 SysFreeString(Chars
);
1054 format_error_message_from_id(This
, hr
);
1058 if(*(end
+1) == '\n') end
++;
1059 if(end
< chEnd
) end
++;
1061 This
->column
+= end
-This
->lastCur
;
1062 This
->lastCur
= end
;
1065 This
->lastCur
= lastCurCopy
;
1066 This
->column
= columnCopy
;
1067 This
->line
= lineCopy
;
1068 update_position(This
, chEnd
);
1072 static void libxmlSetDocumentLocator(
1074 xmlSAXLocatorPtr loc
)
1076 saxlocator
*This
= ctx
;
1079 if(This
->vbInterface
)
1080 hr
= IVBSAXContentHandler_putref_documentLocator(
1081 This
->saxreader
->vbcontentHandler
,
1082 (IVBSAXLocator
*)&This
->lpVBSAXLocatorVtbl
);
1084 hr
= ISAXContentHandler_putDocumentLocator(
1085 This
->saxreader
->contentHandler
,
1086 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
);
1089 format_error_message_from_id(This
, hr
);
1092 void libxmlFatalError(void *ctx
, const char *msg
, ...)
1094 saxlocator
*This
= ctx
;
1100 if(!This
->saxreader
->errorHandler
)
1102 xmlStopParser(This
->pParserCtxt
);
1107 FIXME("Error handling is not compatible.\n");
1109 va_start(args
, msg
);
1110 vsprintf(message
, msg
, args
);
1113 len
= MultiByteToWideChar(CP_ACP
, 0, message
, -1, NULL
, 0);
1114 wszError
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*len
);
1115 MultiByteToWideChar(CP_ACP
, 0, message
, -1, (LPWSTR
)wszError
, len
);
1117 if(This
->vbInterface
)
1119 BSTR bstrError
= SysAllocString(wszError
);
1120 IVBSAXErrorHandler_fatalError(This
->saxreader
->vberrorHandler
,
1121 (IVBSAXLocator
*)&This
->lpVBSAXLocatorVtbl
, &bstrError
, E_FAIL
);
1124 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
1125 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, wszError
, E_FAIL
);
1127 HeapFree(GetProcessHeap(), 0, wszError
);
1129 xmlStopParser(This
->pParserCtxt
);
1133 /*** IVBSAXLocator interface ***/
1134 /*** IUnknown methods ***/
1135 static HRESULT WINAPI
ivbsaxlocator_QueryInterface(IVBSAXLocator
* iface
, REFIID riid
, void **ppvObject
)
1137 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1139 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
1143 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1144 IsEqualGUID( riid
, &IID_IDispatch
) ||
1145 IsEqualGUID( riid
, &IID_IVBSAXLocator
))
1151 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1152 return E_NOINTERFACE
;
1155 IVBSAXLocator_AddRef( iface
);
1160 static ULONG WINAPI
ivbsaxlocator_AddRef(IVBSAXLocator
* iface
)
1162 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1163 TRACE("%p\n", This
);
1164 return InterlockedIncrement( &This
->ref
);
1167 static ULONG WINAPI
ivbsaxlocator_Release(
1168 IVBSAXLocator
* iface
)
1170 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1171 return ISAXLocator_Release((ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
);
1174 /*** IDispatch methods ***/
1175 static HRESULT WINAPI
ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator
*iface
, UINT
* pctinfo
)
1177 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1179 TRACE("(%p)->(%p)\n", This
, pctinfo
);
1186 static HRESULT WINAPI
ivbsaxlocator_GetTypeInfo(
1187 IVBSAXLocator
*iface
,
1188 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
1190 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1193 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1195 hr
= get_typeinfo(IVBSAXLocator_tid
, ppTInfo
);
1200 static HRESULT WINAPI
ivbsaxlocator_GetIDsOfNames(
1201 IVBSAXLocator
*iface
,
1203 LPOLESTR
* rgszNames
,
1208 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1209 ITypeInfo
*typeinfo
;
1212 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
1215 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
1216 return E_INVALIDARG
;
1218 hr
= get_typeinfo(IVBSAXLocator_tid
, &typeinfo
);
1221 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1222 ITypeInfo_Release(typeinfo
);
1228 static HRESULT WINAPI
ivbsaxlocator_Invoke(
1229 IVBSAXLocator
*iface
,
1230 DISPID dispIdMember
,
1234 DISPPARAMS
* pDispParams
,
1235 VARIANT
* pVarResult
,
1236 EXCEPINFO
* pExcepInfo
,
1239 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1240 ITypeInfo
*typeinfo
;
1243 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1244 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1246 hr
= get_typeinfo(IVBSAXLocator_tid
, &typeinfo
);
1249 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXLocatorVtbl
), dispIdMember
, wFlags
, pDispParams
,
1250 pVarResult
, pExcepInfo
, puArgErr
);
1251 ITypeInfo_Release(typeinfo
);
1257 /*** IVBSAXLocator methods ***/
1258 static HRESULT WINAPI
ivbsaxlocator_get_columnNumber(
1259 IVBSAXLocator
* iface
,
1262 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1263 return ISAXLocator_getColumnNumber(
1264 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1268 static HRESULT WINAPI
ivbsaxlocator_get_lineNumber(
1269 IVBSAXLocator
* iface
,
1272 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1273 return ISAXLocator_getLineNumber(
1274 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1278 static HRESULT WINAPI
ivbsaxlocator_get_publicId(
1279 IVBSAXLocator
* iface
,
1282 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1283 return ISAXLocator_getPublicId(
1284 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1285 (const WCHAR
**)publicId
);
1288 static HRESULT WINAPI
ivbsaxlocator_get_systemId(
1289 IVBSAXLocator
* iface
,
1292 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1293 return ISAXLocator_getSystemId(
1294 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1295 (const WCHAR
**)systemId
);
1298 static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl
=
1300 ivbsaxlocator_QueryInterface
,
1301 ivbsaxlocator_AddRef
,
1302 ivbsaxlocator_Release
,
1303 ivbsaxlocator_GetTypeInfoCount
,
1304 ivbsaxlocator_GetTypeInfo
,
1305 ivbsaxlocator_GetIDsOfNames
,
1306 ivbsaxlocator_Invoke
,
1307 ivbsaxlocator_get_columnNumber
,
1308 ivbsaxlocator_get_lineNumber
,
1309 ivbsaxlocator_get_publicId
,
1310 ivbsaxlocator_get_systemId
1313 /*** ISAXLocator interface ***/
1314 /*** IUnknown methods ***/
1315 static HRESULT WINAPI
isaxlocator_QueryInterface(ISAXLocator
* iface
, REFIID riid
, void **ppvObject
)
1317 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1319 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
1323 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1324 IsEqualGUID( riid
, &IID_ISAXLocator
))
1330 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1331 return E_NOINTERFACE
;
1334 ISAXLocator_AddRef( iface
);
1339 static ULONG WINAPI
isaxlocator_AddRef(ISAXLocator
* iface
)
1341 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1342 TRACE("%p\n", This
);
1343 return InterlockedIncrement( &This
->ref
);
1346 static ULONG WINAPI
isaxlocator_Release(
1349 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1352 TRACE("%p\n", This
);
1354 ref
= InterlockedDecrement( &This
->ref
);
1358 SysFreeString(This
->publicId
);
1360 SysFreeString(This
->systemId
);
1362 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
1363 HeapFree( GetProcessHeap(), 0, This
);
1369 /*** ISAXLocator methods ***/
1370 static HRESULT WINAPI
isaxlocator_getColumnNumber(
1374 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1376 *pnColumn
= This
->column
;
1380 static HRESULT WINAPI
isaxlocator_getLineNumber(
1384 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1386 *pnLine
= This
->line
;
1390 static HRESULT WINAPI
isaxlocator_getPublicId(
1392 const WCHAR
** ppwchPublicId
)
1395 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1397 if(This
->publicId
) SysFreeString(This
->publicId
);
1399 publicId
= bstr_from_xmlChar(xmlSAX2GetPublicId(This
->pParserCtxt
));
1400 if(SysStringLen(publicId
))
1401 This
->publicId
= (WCHAR
*)&publicId
;
1404 SysFreeString(publicId
);
1405 This
->publicId
= NULL
;
1408 *ppwchPublicId
= This
->publicId
;
1412 static HRESULT WINAPI
isaxlocator_getSystemId(
1414 const WCHAR
** ppwchSystemId
)
1417 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1419 if(This
->systemId
) SysFreeString(This
->systemId
);
1421 systemId
= bstr_from_xmlChar(xmlSAX2GetSystemId(This
->pParserCtxt
));
1422 if(SysStringLen(systemId
))
1423 This
->systemId
= (WCHAR
*)&systemId
;
1426 SysFreeString(systemId
);
1427 This
->systemId
= NULL
;
1430 *ppwchSystemId
= This
->systemId
;
1434 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
1436 isaxlocator_QueryInterface
,
1438 isaxlocator_Release
,
1439 isaxlocator_getColumnNumber
,
1440 isaxlocator_getLineNumber
,
1441 isaxlocator_getPublicId
,
1442 isaxlocator_getSystemId
1445 static HRESULT
SAXLocator_create(saxreader
*reader
, saxlocator
**ppsaxlocator
, BOOL vbInterface
)
1447 saxlocator
*locator
;
1449 locator
= HeapAlloc( GetProcessHeap(), 0, sizeof (*locator
) );
1451 return E_OUTOFMEMORY
;
1453 locator
->lpVBSAXLocatorVtbl
= &ivbsaxlocator_vtbl
;
1454 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
1456 locator
->vbInterface
= vbInterface
;
1458 locator
->saxreader
= reader
;
1459 ISAXXMLReader_AddRef((ISAXXMLReader
*)&reader
->lpSAXXMLReaderVtbl
);
1461 locator
->pParserCtxt
= NULL
;
1462 locator
->publicId
= NULL
;
1463 locator
->systemId
= NULL
;
1464 locator
->lastCur
= NULL
;
1466 locator
->column
= 0;
1467 locator
->ret
= S_OK
;
1469 *ppsaxlocator
= locator
;
1471 TRACE("returning %p\n", *ppsaxlocator
);
1476 /*** SAXXMLReader internal functions ***/
1477 static HRESULT
internal_parseBuffer(saxreader
*This
, const char *buffer
, int size
, BOOL vbInterface
)
1479 saxlocator
*locator
;
1482 hr
= SAXLocator_create(This
, &locator
, vbInterface
);
1486 locator
->pParserCtxt
= xmlCreateMemoryParserCtxt(buffer
, size
);
1487 if(!locator
->pParserCtxt
)
1489 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1493 locator
->pParserCtxt
->sax
= &locator
->saxreader
->sax
;
1494 locator
->pParserCtxt
->userData
= locator
;
1496 if(xmlParseDocument(locator
->pParserCtxt
)) hr
= E_FAIL
;
1497 else hr
= locator
->ret
;
1499 if(locator
->pParserCtxt
)
1501 locator
->pParserCtxt
->sax
= NULL
;
1502 xmlFreeParserCtxt(locator
->pParserCtxt
);
1503 locator
->pParserCtxt
= NULL
;
1506 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1510 static HRESULT WINAPI
internal_getEntityResolver(
1512 void *pEntityResolver
,
1515 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1519 static HRESULT WINAPI
internal_putEntityResolver(
1521 void *pEntityResolver
,
1524 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1528 static HRESULT WINAPI
internal_getContentHandler(
1530 void *pContentHandler
,
1533 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
1534 if(pContentHandler
== NULL
)
1536 if(This
->contentHandler
)
1539 IVBSAXContentHandler_AddRef(This
->vbcontentHandler
);
1541 ISAXContentHandler_AddRef(This
->contentHandler
);
1543 if(vbInterface
) *(IVBSAXContentHandler
**)pContentHandler
=
1544 This
->vbcontentHandler
;
1545 else *(ISAXContentHandler
**)pContentHandler
= This
->contentHandler
;
1550 static HRESULT WINAPI
internal_putContentHandler(
1552 void *contentHandler
,
1555 TRACE("(%p)->(%p)\n", This
, contentHandler
);
1559 IVBSAXContentHandler_AddRef((IVBSAXContentHandler
*)contentHandler
);
1561 ISAXContentHandler_AddRef((ISAXContentHandler
*)contentHandler
);
1563 if(This
->contentHandler
)
1566 IVBSAXContentHandler_Release(This
->vbcontentHandler
);
1568 ISAXContentHandler_Release(This
->contentHandler
);
1571 This
->vbcontentHandler
= contentHandler
;
1573 This
->contentHandler
= contentHandler
;
1578 static HRESULT WINAPI
internal_getDTDHandler(
1583 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1587 static HRESULT WINAPI
internal_putDTDHandler(
1592 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1596 static HRESULT WINAPI
internal_getErrorHandler(
1598 void *pErrorHandler
,
1601 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
1602 if(pErrorHandler
== NULL
)
1604 if(This
->errorHandler
)
1607 IVBSAXErrorHandler_AddRef(This
->vberrorHandler
);
1609 ISAXErrorHandler_AddRef(This
->errorHandler
);
1612 *(IVBSAXErrorHandler
**)pErrorHandler
= This
->vberrorHandler
;
1614 *(ISAXErrorHandler
**)pErrorHandler
= This
->errorHandler
;
1620 static HRESULT WINAPI
internal_putErrorHandler(
1625 TRACE("(%p)->(%p)\n", This
, errorHandler
);
1629 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler
*)errorHandler
);
1631 ISAXErrorHandler_AddRef((ISAXErrorHandler
*)errorHandler
);
1633 if(This
->errorHandler
)
1636 IVBSAXErrorHandler_Release(This
->vberrorHandler
);
1638 ISAXErrorHandler_Release(This
->errorHandler
);
1641 This
->vberrorHandler
= errorHandler
;
1643 This
->errorHandler
= errorHandler
;
1649 static HRESULT WINAPI
internal_parse(
1656 TRACE("(%p)\n", This
);
1659 switch(V_VT(&varInput
))
1662 hr
= internal_parseBuffer(This
, (const char*)V_BSTR(&varInput
),
1663 SysStringByteLen(V_BSTR(&varInput
)), vbInterface
);
1665 case VT_ARRAY
|VT_UI1
: {
1667 LONG lBound
, uBound
;
1670 hr
= SafeArrayGetLBound(V_ARRAY(&varInput
), 1, &lBound
);
1671 if(hr
!= S_OK
) break;
1672 hr
= SafeArrayGetUBound(V_ARRAY(&varInput
), 1, &uBound
);
1673 if(hr
!= S_OK
) break;
1674 dataRead
= (uBound
-lBound
)*SafeArrayGetElemsize(V_ARRAY(&varInput
));
1675 hr
= SafeArrayAccessData(V_ARRAY(&varInput
), (void**)&pSAData
);
1676 if(hr
!= S_OK
) break;
1677 hr
= internal_parseBuffer(This
, pSAData
, dataRead
, vbInterface
);
1678 SafeArrayUnaccessData(V_ARRAY(&varInput
));
1683 IPersistStream
*persistStream
;
1684 IStream
*stream
= NULL
;
1685 IXMLDOMDocument
*xmlDoc
;
1687 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1688 &IID_IPersistStream
, (void**)&persistStream
) == S_OK
)
1690 hr
= IPersistStream_Save(persistStream
, stream
, TRUE
);
1691 IPersistStream_Release(persistStream
);
1692 if(hr
!= S_OK
) break;
1694 if(stream
|| IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1695 &IID_IStream
, (void**)&stream
) == S_OK
)
1703 hr
= IStream_Stat(stream
, &dataInfo
, STATFLAG_NONAME
);
1704 if(hr
== E_PENDING
) continue;
1707 data
= HeapAlloc(GetProcessHeap(), 0,
1708 dataInfo
.cbSize
.QuadPart
);
1711 hr
= IStream_Read(stream
, data
,
1712 dataInfo
.cbSize
.QuadPart
, &dataRead
);
1713 if(hr
== E_PENDING
) continue;
1716 hr
= internal_parseBuffer(This
, data
,
1717 dataInfo
.cbSize
.QuadPart
, vbInterface
);
1718 HeapFree(GetProcessHeap(), 0, data
);
1719 IStream_Release(stream
);
1722 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1723 &IID_IXMLDOMDocument
, (void**)&xmlDoc
) == S_OK
)
1727 IXMLDOMDocument_get_xml(xmlDoc
, &bstrData
);
1728 hr
= internal_parseBuffer(This
, (const char*)bstrData
,
1729 SysStringByteLen(bstrData
), vbInterface
);
1730 IXMLDOMDocument_Release(xmlDoc
);
1736 WARN("vt %d not implemented\n", V_VT(&varInput
));
1743 static HRESULT
internal_vbonDataAvailable(void *obj
, char *ptr
, DWORD len
)
1745 saxreader
*This
= obj
;
1747 return internal_parseBuffer(This
, ptr
, len
, TRUE
);
1750 static HRESULT
internal_onDataAvailable(void *obj
, char *ptr
, DWORD len
)
1752 saxreader
*This
= obj
;
1754 return internal_parseBuffer(This
, ptr
, len
, FALSE
);
1757 static HRESULT WINAPI
internal_parseURL(
1765 TRACE("(%p)->(%s)\n", This
, debugstr_w(url
));
1767 if(vbInterface
) hr
= bind_url(url
, internal_vbonDataAvailable
, This
, &bsc
);
1768 else hr
= bind_url(url
, internal_onDataAvailable
, This
, &bsc
);
1778 /*** IVBSAXXMLReader interface ***/
1779 /*** IUnknown methods ***/
1780 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
1782 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1784 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
1788 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1789 IsEqualGUID( riid
, &IID_IDispatch
) ||
1790 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
1794 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
1796 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
1800 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1801 return E_NOINTERFACE
;
1804 IVBSAXXMLReader_AddRef( iface
);
1809 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
1811 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1812 TRACE("%p\n", This
);
1813 return InterlockedIncrement( &This
->ref
);
1816 static ULONG WINAPI
saxxmlreader_Release(
1817 IVBSAXXMLReader
* iface
)
1819 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1822 TRACE("%p\n", This
);
1824 ref
= InterlockedDecrement( &This
->ref
);
1827 if(This
->contentHandler
)
1828 ISAXContentHandler_Release(This
->contentHandler
);
1830 if(This
->errorHandler
)
1831 ISAXErrorHandler_Release(This
->errorHandler
);
1833 HeapFree( GetProcessHeap(), 0, This
);
1839 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
1841 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1843 TRACE("(%p)->(%p)\n", This
, pctinfo
);
1850 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
1851 IVBSAXXMLReader
*iface
,
1852 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
1854 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1857 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1859 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
1864 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
1865 IVBSAXXMLReader
*iface
,
1867 LPOLESTR
* rgszNames
,
1872 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1873 ITypeInfo
*typeinfo
;
1876 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
1879 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
1880 return E_INVALIDARG
;
1882 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1885 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1886 ITypeInfo_Release(typeinfo
);
1892 static HRESULT WINAPI
saxxmlreader_Invoke(
1893 IVBSAXXMLReader
*iface
,
1894 DISPID dispIdMember
,
1898 DISPPARAMS
* pDispParams
,
1899 VARIANT
* pVarResult
,
1900 EXCEPINFO
* pExcepInfo
,
1903 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1904 ITypeInfo
*typeinfo
;
1907 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1908 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1910 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1913 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXXMLReaderVtbl
), dispIdMember
, wFlags
, pDispParams
,
1914 pVarResult
, pExcepInfo
, puArgErr
);
1915 ITypeInfo_Release(typeinfo
);
1921 /*** IVBSAXXMLReader methods ***/
1922 static HRESULT WINAPI
saxxmlreader_getFeature(
1923 IVBSAXXMLReader
* iface
,
1924 const WCHAR
*pFeature
,
1925 VARIANT_BOOL
*pValue
)
1927 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1929 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1933 static HRESULT WINAPI
saxxmlreader_putFeature(
1934 IVBSAXXMLReader
* iface
,
1935 const WCHAR
*pFeature
,
1936 VARIANT_BOOL vfValue
)
1938 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1940 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1944 static HRESULT WINAPI
saxxmlreader_getProperty(
1945 IVBSAXXMLReader
* iface
,
1949 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1951 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
1955 static HRESULT WINAPI
saxxmlreader_putProperty(
1956 IVBSAXXMLReader
* iface
,
1960 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1962 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1966 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
1967 IVBSAXXMLReader
* iface
,
1968 IVBSAXEntityResolver
**pEntityResolver
)
1970 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1971 return internal_getEntityResolver(This
, pEntityResolver
, TRUE
);
1974 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
1975 IVBSAXXMLReader
* iface
,
1976 IVBSAXEntityResolver
*pEntityResolver
)
1978 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1979 return internal_putEntityResolver(This
, pEntityResolver
, TRUE
);
1982 static HRESULT WINAPI
saxxmlreader_getContentHandler(
1983 IVBSAXXMLReader
* iface
,
1984 IVBSAXContentHandler
**ppContentHandler
)
1986 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1987 return internal_getContentHandler(This
, ppContentHandler
, TRUE
);
1990 static HRESULT WINAPI
saxxmlreader_putContentHandler(
1991 IVBSAXXMLReader
* iface
,
1992 IVBSAXContentHandler
*contentHandler
)
1994 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1995 return internal_putContentHandler(This
, contentHandler
, TRUE
);
1998 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
1999 IVBSAXXMLReader
* iface
,
2000 IVBSAXDTDHandler
**pDTDHandler
)
2002 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2003 return internal_getDTDHandler(This
, pDTDHandler
, TRUE
);
2006 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
2007 IVBSAXXMLReader
* iface
,
2008 IVBSAXDTDHandler
*pDTDHandler
)
2010 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2011 return internal_putDTDHandler(This
, pDTDHandler
, TRUE
);
2014 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
2015 IVBSAXXMLReader
* iface
,
2016 IVBSAXErrorHandler
**pErrorHandler
)
2018 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2019 return internal_getErrorHandler(This
, pErrorHandler
, TRUE
);
2022 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
2023 IVBSAXXMLReader
* iface
,
2024 IVBSAXErrorHandler
*errorHandler
)
2026 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2027 return internal_putErrorHandler(This
, errorHandler
, TRUE
);
2030 static HRESULT WINAPI
saxxmlreader_getBaseURL(
2031 IVBSAXXMLReader
* iface
,
2032 const WCHAR
**pBaseUrl
)
2034 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2036 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
2040 static HRESULT WINAPI
saxxmlreader_putBaseURL(
2041 IVBSAXXMLReader
* iface
,
2042 const WCHAR
*pBaseUrl
)
2044 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2046 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
2050 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
2051 IVBSAXXMLReader
* iface
,
2052 const WCHAR
**pSecureBaseUrl
)
2054 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2056 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
2061 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
2062 IVBSAXXMLReader
* iface
,
2063 const WCHAR
*secureBaseUrl
)
2065 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2067 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
2071 static HRESULT WINAPI
saxxmlreader_parse(
2072 IVBSAXXMLReader
* iface
,
2075 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2076 return internal_parse(This
, varInput
, TRUE
);
2079 static HRESULT WINAPI
saxxmlreader_parseURL(
2080 IVBSAXXMLReader
* iface
,
2083 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2084 return internal_parseURL(This
, url
, TRUE
);
2087 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
2089 saxxmlreader_QueryInterface
,
2090 saxxmlreader_AddRef
,
2091 saxxmlreader_Release
,
2092 saxxmlreader_GetTypeInfoCount
,
2093 saxxmlreader_GetTypeInfo
,
2094 saxxmlreader_GetIDsOfNames
,
2095 saxxmlreader_Invoke
,
2096 saxxmlreader_getFeature
,
2097 saxxmlreader_putFeature
,
2098 saxxmlreader_getProperty
,
2099 saxxmlreader_putProperty
,
2100 saxxmlreader_getEntityResolver
,
2101 saxxmlreader_putEntityResolver
,
2102 saxxmlreader_getContentHandler
,
2103 saxxmlreader_putContentHandler
,
2104 saxxmlreader_getDTDHandler
,
2105 saxxmlreader_putDTDHandler
,
2106 saxxmlreader_getErrorHandler
,
2107 saxxmlreader_putErrorHandler
,
2108 saxxmlreader_getBaseURL
,
2109 saxxmlreader_putBaseURL
,
2110 saxxmlreader_getSecureBaseURL
,
2111 saxxmlreader_putSecureBaseURL
,
2113 saxxmlreader_parseURL
2116 /*** ISAXXMLReader interface ***/
2117 /*** IUnknown methods ***/
2118 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
2120 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2121 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
, riid
, ppvObject
);
2124 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
2126 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2127 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
);
2130 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
2132 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2133 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
);
2136 /*** ISAXXMLReader methods ***/
2137 static HRESULT WINAPI
isaxxmlreader_getFeature(
2138 ISAXXMLReader
* iface
,
2139 const WCHAR
*pFeature
,
2140 VARIANT_BOOL
*pValue
)
2142 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2143 return IVBSAXXMLReader_getFeature(
2144 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2148 static HRESULT WINAPI
isaxxmlreader_putFeature(
2149 ISAXXMLReader
* iface
,
2150 const WCHAR
*pFeature
,
2151 VARIANT_BOOL vfValue
)
2153 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2154 return IVBSAXXMLReader_putFeature(
2155 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2159 static HRESULT WINAPI
isaxxmlreader_getProperty(
2160 ISAXXMLReader
* iface
,
2164 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2165 return IVBSAXXMLReader_getProperty(
2166 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2170 static HRESULT WINAPI
isaxxmlreader_putProperty(
2171 ISAXXMLReader
* iface
,
2175 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2176 return IVBSAXXMLReader_putProperty(
2177 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2181 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
2182 ISAXXMLReader
* iface
,
2183 ISAXEntityResolver
**ppEntityResolver
)
2185 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2186 return internal_getEntityResolver(This
, ppEntityResolver
, FALSE
);
2189 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
2190 ISAXXMLReader
* iface
,
2191 ISAXEntityResolver
*pEntityResolver
)
2193 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2194 return internal_putEntityResolver(This
, pEntityResolver
, FALSE
);
2197 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
2198 ISAXXMLReader
* iface
,
2199 ISAXContentHandler
**pContentHandler
)
2201 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2202 return internal_getContentHandler(This
, pContentHandler
, FALSE
);
2205 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
2206 ISAXXMLReader
* iface
,
2207 ISAXContentHandler
*contentHandler
)
2209 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2210 return internal_putContentHandler(This
, contentHandler
, FALSE
);
2213 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
2214 ISAXXMLReader
* iface
,
2215 ISAXDTDHandler
**pDTDHandler
)
2217 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2218 return internal_getDTDHandler(This
, pDTDHandler
, FALSE
);
2221 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
2222 ISAXXMLReader
* iface
,
2223 ISAXDTDHandler
*pDTDHandler
)
2225 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2226 return internal_putDTDHandler(This
, pDTDHandler
, FALSE
);
2229 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
2230 ISAXXMLReader
* iface
,
2231 ISAXErrorHandler
**pErrorHandler
)
2233 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2234 return internal_getErrorHandler(This
, pErrorHandler
, FALSE
);
2237 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
2238 ISAXXMLReader
* iface
,
2239 ISAXErrorHandler
*errorHandler
)
2241 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2242 return internal_putErrorHandler(This
, errorHandler
, FALSE
);
2245 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
2246 ISAXXMLReader
* iface
,
2247 const WCHAR
**pBaseUrl
)
2249 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2250 return IVBSAXXMLReader_get_getBaseURL(
2251 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2255 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
2256 ISAXXMLReader
* iface
,
2257 const WCHAR
*pBaseUrl
)
2259 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2260 return IVBSAXXMLReader_put_putBaseURL(
2261 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2265 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
2266 ISAXXMLReader
* iface
,
2267 const WCHAR
**pSecureBaseUrl
)
2269 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2270 return IVBSAXXMLReader_get_getSecureBaseURL(
2271 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2275 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
2276 ISAXXMLReader
* iface
,
2277 const WCHAR
*secureBaseUrl
)
2279 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2280 return IVBSAXXMLReader_put_putSecureBaseURL(
2281 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2285 static HRESULT WINAPI
isaxxmlreader_parse(
2286 ISAXXMLReader
* iface
,
2289 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2290 return internal_parse(This
, varInput
, FALSE
);
2293 static HRESULT WINAPI
isaxxmlreader_parseURL(
2294 ISAXXMLReader
* iface
,
2297 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2298 return internal_parseURL(This
, url
, FALSE
);
2301 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
2303 isaxxmlreader_QueryInterface
,
2304 isaxxmlreader_AddRef
,
2305 isaxxmlreader_Release
,
2306 isaxxmlreader_getFeature
,
2307 isaxxmlreader_putFeature
,
2308 isaxxmlreader_getProperty
,
2309 isaxxmlreader_putProperty
,
2310 isaxxmlreader_getEntityResolver
,
2311 isaxxmlreader_putEntityResolver
,
2312 isaxxmlreader_getContentHandler
,
2313 isaxxmlreader_putContentHandler
,
2314 isaxxmlreader_getDTDHandler
,
2315 isaxxmlreader_putDTDHandler
,
2316 isaxxmlreader_getErrorHandler
,
2317 isaxxmlreader_putErrorHandler
,
2318 isaxxmlreader_getBaseURL
,
2319 isaxxmlreader_putBaseURL
,
2320 isaxxmlreader_getSecureBaseURL
,
2321 isaxxmlreader_putSecureBaseURL
,
2322 isaxxmlreader_parse
,
2323 isaxxmlreader_parseURL
2326 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
2330 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
2332 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
2334 return E_OUTOFMEMORY
;
2336 reader
->lpVBSAXXMLReaderVtbl
= &saxreader_vtbl
;
2337 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
2339 reader
->contentHandler
= NULL
;
2340 reader
->errorHandler
= NULL
;
2342 memset(&reader
->sax
, 0, sizeof(xmlSAXHandler
));
2343 reader
->sax
.initialized
= XML_SAX2_MAGIC
;
2344 reader
->sax
.startDocument
= libxmlStartDocument
;
2345 reader
->sax
.endDocument
= libxmlEndDocument
;
2346 reader
->sax
.startElementNs
= libxmlStartElementNS
;
2347 reader
->sax
.endElementNs
= libxmlEndElementNS
;
2348 reader
->sax
.characters
= libxmlCharacters
;
2349 reader
->sax
.setDocumentLocator
= libxmlSetDocumentLocator
;
2350 reader
->sax
.error
= libxmlFatalError
;
2351 reader
->sax
.fatalError
= libxmlFatalError
;
2353 *ppObj
= &reader
->lpVBSAXXMLReaderVtbl
;
2355 TRACE("returning iface %p\n", *ppObj
);
2362 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
2364 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2365 "libxml2 support was not present at compile time.\n");