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 /*** ISAXLocator interface ***/
1134 /*** IUnknown methods ***/
1135 static HRESULT WINAPI
isaxlocator_QueryInterface(ISAXLocator
* iface
, REFIID riid
, void **ppvObject
)
1137 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1139 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
1143 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1144 IsEqualGUID( riid
, &IID_ISAXLocator
))
1150 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1151 return E_NOINTERFACE
;
1154 ISAXLocator_AddRef( iface
);
1159 static ULONG WINAPI
isaxlocator_AddRef(ISAXLocator
* iface
)
1161 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1162 TRACE("%p\n", This
);
1163 return InterlockedIncrement( &This
->ref
);
1166 static ULONG WINAPI
isaxlocator_Release(
1169 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1172 TRACE("%p\n", This
);
1174 ref
= InterlockedDecrement( &This
->ref
);
1178 SysFreeString(This
->publicId
);
1180 SysFreeString(This
->systemId
);
1182 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
1183 HeapFree( GetProcessHeap(), 0, This
);
1189 /*** ISAXLocator methods ***/
1190 static HRESULT WINAPI
isaxlocator_getColumnNumber(
1194 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1196 *pnColumn
= This
->column
;
1200 static HRESULT WINAPI
isaxlocator_getLineNumber(
1204 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1206 *pnLine
= This
->line
;
1210 static HRESULT WINAPI
isaxlocator_getPublicId(
1212 const WCHAR
** ppwchPublicId
)
1215 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1217 if(This
->publicId
) SysFreeString(This
->publicId
);
1219 publicId
= bstr_from_xmlChar(xmlSAX2GetPublicId(This
->pParserCtxt
));
1220 if(SysStringLen(publicId
))
1221 This
->publicId
= (WCHAR
*)&publicId
;
1224 SysFreeString(publicId
);
1225 This
->publicId
= NULL
;
1228 *ppwchPublicId
= This
->publicId
;
1232 static HRESULT WINAPI
isaxlocator_getSystemId(
1234 const WCHAR
** ppwchSystemId
)
1237 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1239 if(This
->systemId
) SysFreeString(This
->systemId
);
1241 systemId
= bstr_from_xmlChar(xmlSAX2GetSystemId(This
->pParserCtxt
));
1242 if(SysStringLen(systemId
))
1243 This
->systemId
= (WCHAR
*)&systemId
;
1246 SysFreeString(systemId
);
1247 This
->systemId
= NULL
;
1250 *ppwchSystemId
= This
->systemId
;
1254 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
1256 isaxlocator_QueryInterface
,
1258 isaxlocator_Release
,
1259 isaxlocator_getColumnNumber
,
1260 isaxlocator_getLineNumber
,
1261 isaxlocator_getPublicId
,
1262 isaxlocator_getSystemId
1265 static HRESULT
SAXLocator_create(saxreader
*reader
, saxlocator
**ppsaxlocator
, BOOL vbInterface
)
1267 saxlocator
*locator
;
1269 locator
= HeapAlloc( GetProcessHeap(), 0, sizeof (*locator
) );
1271 return E_OUTOFMEMORY
;
1273 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
1275 locator
->vbInterface
= vbInterface
;
1277 locator
->saxreader
= reader
;
1278 ISAXXMLReader_AddRef((ISAXXMLReader
*)&reader
->lpSAXXMLReaderVtbl
);
1280 locator
->pParserCtxt
= NULL
;
1281 locator
->publicId
= NULL
;
1282 locator
->systemId
= NULL
;
1283 locator
->lastCur
= NULL
;
1285 locator
->column
= 0;
1286 locator
->ret
= S_OK
;
1288 *ppsaxlocator
= locator
;
1290 TRACE("returning %p\n", *ppsaxlocator
);
1295 /*** IVBSAXXMLReader interface ***/
1296 /*** IUnknown methods ***/
1297 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
1299 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1301 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
1305 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1306 IsEqualGUID( riid
, &IID_IDispatch
) ||
1307 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
1311 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
1313 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
1317 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1318 return E_NOINTERFACE
;
1321 IVBSAXXMLReader_AddRef( iface
);
1326 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
1328 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1329 TRACE("%p\n", This
);
1330 return InterlockedIncrement( &This
->ref
);
1333 static ULONG WINAPI
saxxmlreader_Release(
1334 IVBSAXXMLReader
* iface
)
1336 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1339 TRACE("%p\n", This
);
1341 ref
= InterlockedDecrement( &This
->ref
);
1344 if(This
->contentHandler
)
1345 ISAXContentHandler_Release(This
->contentHandler
);
1347 if(This
->errorHandler
)
1348 ISAXErrorHandler_Release(This
->errorHandler
);
1350 HeapFree( GetProcessHeap(), 0, This
);
1356 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
1358 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1360 TRACE("(%p)->(%p)\n", This
, pctinfo
);
1367 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
1368 IVBSAXXMLReader
*iface
,
1369 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
1371 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1374 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1376 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
1381 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
1382 IVBSAXXMLReader
*iface
,
1384 LPOLESTR
* rgszNames
,
1389 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1390 ITypeInfo
*typeinfo
;
1393 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
1396 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
1397 return E_INVALIDARG
;
1399 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1402 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1403 ITypeInfo_Release(typeinfo
);
1409 static HRESULT WINAPI
saxxmlreader_Invoke(
1410 IVBSAXXMLReader
*iface
,
1411 DISPID dispIdMember
,
1415 DISPPARAMS
* pDispParams
,
1416 VARIANT
* pVarResult
,
1417 EXCEPINFO
* pExcepInfo
,
1420 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1421 ITypeInfo
*typeinfo
;
1424 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1425 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1427 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1430 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXXMLReaderVtbl
), dispIdMember
, wFlags
, pDispParams
,
1431 pVarResult
, pExcepInfo
, puArgErr
);
1432 ITypeInfo_Release(typeinfo
);
1438 /*** IVBSAXXMLReader methods ***/
1439 static HRESULT WINAPI
saxxmlreader_getFeature(
1440 IVBSAXXMLReader
* iface
,
1441 const WCHAR
*pFeature
,
1442 VARIANT_BOOL
*pValue
)
1444 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1446 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1450 static HRESULT WINAPI
saxxmlreader_putFeature(
1451 IVBSAXXMLReader
* iface
,
1452 const WCHAR
*pFeature
,
1453 VARIANT_BOOL vfValue
)
1455 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1457 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1461 static HRESULT WINAPI
saxxmlreader_getProperty(
1462 IVBSAXXMLReader
* iface
,
1466 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1468 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
1472 static HRESULT WINAPI
saxxmlreader_putProperty(
1473 IVBSAXXMLReader
* iface
,
1477 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1479 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1483 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
1484 IVBSAXXMLReader
* iface
,
1485 IVBSAXEntityResolver
**pEntityResolver
)
1487 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1489 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1493 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
1494 IVBSAXXMLReader
* iface
,
1495 IVBSAXEntityResolver
*pEntityResolver
)
1497 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1499 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1503 static HRESULT WINAPI
saxxmlreader_getContentHandler(
1504 IVBSAXXMLReader
* iface
,
1505 IVBSAXContentHandler
**ppContentHandler
)
1507 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1509 FIXME("(%p)->(%p) stub\n", This
, ppContentHandler
);
1513 static HRESULT WINAPI
saxxmlreader_putContentHandler(
1514 IVBSAXXMLReader
* iface
,
1515 IVBSAXContentHandler
*contentHandler
)
1517 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1519 FIXME("(%p)->(%p) stub\n", This
, contentHandler
);
1523 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
1524 IVBSAXXMLReader
* iface
,
1525 IVBSAXDTDHandler
**pDTDHandler
)
1527 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1529 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1533 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
1534 IVBSAXXMLReader
* iface
,
1535 IVBSAXDTDHandler
*pDTDHandler
)
1537 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1539 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1543 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
1544 IVBSAXXMLReader
* iface
,
1545 IVBSAXErrorHandler
**pErrorHandler
)
1547 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1549 FIXME("(%p)->(%p) stub\n", This
, pErrorHandler
);
1553 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
1554 IVBSAXXMLReader
* iface
,
1555 IVBSAXErrorHandler
*errorHandler
)
1557 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1559 FIXME("(%p)->(%p) stub\n", This
, errorHandler
);
1563 static HRESULT WINAPI
saxxmlreader_getBaseURL(
1564 IVBSAXXMLReader
* iface
,
1565 const WCHAR
**pBaseUrl
)
1567 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1569 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1573 static HRESULT WINAPI
saxxmlreader_putBaseURL(
1574 IVBSAXXMLReader
* iface
,
1575 const WCHAR
*pBaseUrl
)
1577 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1579 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1583 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
1584 IVBSAXXMLReader
* iface
,
1585 const WCHAR
**pSecureBaseUrl
)
1587 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1589 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1594 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
1595 IVBSAXXMLReader
* iface
,
1596 const WCHAR
*secureBaseUrl
)
1598 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1600 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1604 static HRESULT WINAPI
saxxmlreader_parse(
1605 IVBSAXXMLReader
* iface
,
1608 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1610 FIXME("(%p) stub\n", This
);
1614 static HRESULT WINAPI
saxxmlreader_parseURL(
1615 IVBSAXXMLReader
* iface
,
1618 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1620 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(url
));
1624 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
1626 saxxmlreader_QueryInterface
,
1627 saxxmlreader_AddRef
,
1628 saxxmlreader_Release
,
1629 saxxmlreader_GetTypeInfoCount
,
1630 saxxmlreader_GetTypeInfo
,
1631 saxxmlreader_GetIDsOfNames
,
1632 saxxmlreader_Invoke
,
1633 saxxmlreader_getFeature
,
1634 saxxmlreader_putFeature
,
1635 saxxmlreader_getProperty
,
1636 saxxmlreader_putProperty
,
1637 saxxmlreader_getEntityResolver
,
1638 saxxmlreader_putEntityResolver
,
1639 saxxmlreader_getContentHandler
,
1640 saxxmlreader_putContentHandler
,
1641 saxxmlreader_getDTDHandler
,
1642 saxxmlreader_putDTDHandler
,
1643 saxxmlreader_getErrorHandler
,
1644 saxxmlreader_putErrorHandler
,
1645 saxxmlreader_getBaseURL
,
1646 saxxmlreader_putBaseURL
,
1647 saxxmlreader_getSecureBaseURL
,
1648 saxxmlreader_putSecureBaseURL
,
1650 saxxmlreader_parseURL
1653 /*** ISAXXMLReader interface ***/
1654 /*** IUnknown methods ***/
1655 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
1657 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1658 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
, riid
, ppvObject
);
1661 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
1663 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1664 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
);
1667 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
1669 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1670 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
);
1673 /*** ISAXXMLReader methods ***/
1674 static HRESULT WINAPI
isaxxmlreader_getFeature(
1675 ISAXXMLReader
* iface
,
1676 const WCHAR
*pFeature
,
1677 VARIANT_BOOL
*pValue
)
1679 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1681 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1685 static HRESULT WINAPI
isaxxmlreader_putFeature(
1686 ISAXXMLReader
* iface
,
1687 const WCHAR
*pFeature
,
1688 VARIANT_BOOL vfValue
)
1690 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1692 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1696 static HRESULT WINAPI
isaxxmlreader_getProperty(
1697 ISAXXMLReader
* iface
,
1701 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1703 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
1707 static HRESULT WINAPI
isaxxmlreader_putProperty(
1708 ISAXXMLReader
* iface
,
1712 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1714 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
1718 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
1719 ISAXXMLReader
* iface
,
1720 ISAXEntityResolver
**ppEntityResolver
)
1722 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1724 FIXME("(%p)->(%p) stub\n", This
, ppEntityResolver
);
1728 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
1729 ISAXXMLReader
* iface
,
1730 ISAXEntityResolver
*pEntityResolver
)
1732 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1734 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1738 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
1739 ISAXXMLReader
* iface
,
1740 ISAXContentHandler
**pContentHandler
)
1742 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1744 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
1745 if(pContentHandler
== NULL
)
1747 if(This
->contentHandler
)
1748 ISAXContentHandler_AddRef(This
->contentHandler
);
1749 *pContentHandler
= This
->contentHandler
;
1754 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
1755 ISAXXMLReader
* iface
,
1756 ISAXContentHandler
*contentHandler
)
1758 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1760 TRACE("(%p)->(%p)\n", This
, contentHandler
);
1762 ISAXContentHandler_AddRef(contentHandler
);
1763 if(This
->contentHandler
)
1764 ISAXContentHandler_Release(This
->contentHandler
);
1765 This
->contentHandler
= contentHandler
;
1770 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
1771 ISAXXMLReader
* iface
,
1772 ISAXDTDHandler
**pDTDHandler
)
1774 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1776 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1780 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
1781 ISAXXMLReader
* iface
,
1782 ISAXDTDHandler
*pDTDHandler
)
1784 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1786 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1790 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
1791 ISAXXMLReader
* iface
,
1792 ISAXErrorHandler
**pErrorHandler
)
1794 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1796 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
1797 if(pErrorHandler
== NULL
)
1799 if(This
->errorHandler
)
1800 ISAXErrorHandler_AddRef(This
->errorHandler
);
1801 *pErrorHandler
= This
->errorHandler
;
1806 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
1807 ISAXXMLReader
* iface
,
1808 ISAXErrorHandler
*errorHandler
)
1810 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1812 TRACE("(%p)->(%p)\n", This
, errorHandler
);
1814 ISAXErrorHandler_AddRef(errorHandler
);
1815 if(This
->errorHandler
)
1816 ISAXErrorHandler_Release(This
->errorHandler
);
1817 This
->errorHandler
= errorHandler
;
1822 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
1823 ISAXXMLReader
* iface
,
1824 const WCHAR
**pBaseUrl
)
1826 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1828 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
1832 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
1833 ISAXXMLReader
* iface
,
1834 const WCHAR
*pBaseUrl
)
1836 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1838 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
1842 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
1843 ISAXXMLReader
* iface
,
1844 const WCHAR
**pSecureBaseUrl
)
1846 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1848 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
1852 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
1853 ISAXXMLReader
* iface
,
1854 const WCHAR
*secureBaseUrl
)
1856 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1858 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
1862 static HRESULT
parse_buffer(saxreader
*This
, const char *buffer
, int size
)
1864 saxlocator
*locator
;
1867 hr
= SAXLocator_create(This
, &locator
, FALSE
);
1871 locator
->pParserCtxt
= xmlCreateMemoryParserCtxt(buffer
, size
);
1872 if(!locator
->pParserCtxt
)
1874 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1878 locator
->pParserCtxt
->sax
= &locator
->saxreader
->sax
;
1879 locator
->pParserCtxt
->userData
= locator
;
1881 if(xmlParseDocument(locator
->pParserCtxt
)) hr
= E_FAIL
;
1882 else hr
= locator
->ret
;
1884 if(locator
->pParserCtxt
)
1886 locator
->pParserCtxt
->sax
= NULL
;
1887 xmlFreeParserCtxt(locator
->pParserCtxt
);
1888 locator
->pParserCtxt
= NULL
;
1891 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1895 static HRESULT WINAPI
isaxxmlreader_parse(
1896 ISAXXMLReader
* iface
,
1899 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
1902 TRACE("(%p)\n", This
);
1905 switch(V_VT(&varInput
))
1908 hr
= parse_buffer(This
, (const char*)V_BSTR(&varInput
),
1909 SysStringByteLen(V_BSTR(&varInput
)));
1911 case VT_ARRAY
|VT_UI1
: {
1913 LONG lBound
, uBound
;
1916 hr
= SafeArrayGetLBound(V_ARRAY(&varInput
), 1, &lBound
);
1917 if(hr
!= S_OK
) break;
1918 hr
= SafeArrayGetUBound(V_ARRAY(&varInput
), 1, &uBound
);
1919 if(hr
!= S_OK
) break;
1920 dataRead
= (uBound
-lBound
)*SafeArrayGetElemsize(V_ARRAY(&varInput
));
1921 hr
= SafeArrayAccessData(V_ARRAY(&varInput
), (void**)&pSAData
);
1922 if(hr
!= S_OK
) break;
1923 hr
= parse_buffer(This
, pSAData
, dataRead
);
1924 SafeArrayUnaccessData(V_ARRAY(&varInput
));
1929 IPersistStream
*persistStream
;
1930 IStream
*stream
= NULL
;
1931 IXMLDOMDocument
*xmlDoc
;
1933 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1934 &IID_IPersistStream
, (void**)&persistStream
) == S_OK
)
1936 hr
= IPersistStream_Save(persistStream
, stream
, TRUE
);
1937 IPersistStream_Release(persistStream
);
1938 if(hr
!= S_OK
) break;
1940 if(stream
|| IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1941 &IID_IStream
, (void**)&stream
) == S_OK
)
1949 hr
= IStream_Stat(stream
, &dataInfo
, STATFLAG_NONAME
);
1950 if(hr
== E_PENDING
) continue;
1953 data
= HeapAlloc(GetProcessHeap(), 0,
1954 dataInfo
.cbSize
.QuadPart
);
1957 hr
= IStream_Read(stream
, data
,
1958 dataInfo
.cbSize
.QuadPart
, &dataRead
);
1959 if(hr
== E_PENDING
) continue;
1962 hr
= parse_buffer(This
, data
, dataInfo
.cbSize
.QuadPart
);
1963 HeapFree(GetProcessHeap(), 0, data
);
1964 IStream_Release(stream
);
1967 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1968 &IID_IXMLDOMDocument
, (void**)&xmlDoc
) == S_OK
)
1972 IXMLDOMDocument_get_xml(xmlDoc
, &bstrData
);
1973 hr
= parse_buffer(This
, (const char*)bstrData
, SysStringByteLen(bstrData
));
1974 IXMLDOMDocument_Release(xmlDoc
);
1980 WARN("vt %d not implemented\n", V_VT(&varInput
));
1987 static HRESULT
saxreader_onDataAvailable(void *obj
, char *ptr
, DWORD len
)
1989 saxreader
*This
= obj
;
1992 hr
= parse_buffer(This
, ptr
, len
);
1997 static HRESULT WINAPI
isaxxmlreader_parseURL(
1998 ISAXXMLReader
* iface
,
2001 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2005 TRACE("(%p)->(%s) stub\n", This
, debugstr_w(url
));
2007 hr
= bind_url(url
, saxreader_onDataAvailable
, This
, &bsc
);
2016 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
2018 isaxxmlreader_QueryInterface
,
2019 isaxxmlreader_AddRef
,
2020 isaxxmlreader_Release
,
2021 isaxxmlreader_getFeature
,
2022 isaxxmlreader_putFeature
,
2023 isaxxmlreader_getProperty
,
2024 isaxxmlreader_putProperty
,
2025 isaxxmlreader_getEntityResolver
,
2026 isaxxmlreader_putEntityResolver
,
2027 isaxxmlreader_getContentHandler
,
2028 isaxxmlreader_putContentHandler
,
2029 isaxxmlreader_getDTDHandler
,
2030 isaxxmlreader_putDTDHandler
,
2031 isaxxmlreader_getErrorHandler
,
2032 isaxxmlreader_putErrorHandler
,
2033 isaxxmlreader_getBaseURL
,
2034 isaxxmlreader_putBaseURL
,
2035 isaxxmlreader_getSecureBaseURL
,
2036 isaxxmlreader_putSecureBaseURL
,
2037 isaxxmlreader_parse
,
2038 isaxxmlreader_parseURL
2041 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
2045 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
2047 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
2049 return E_OUTOFMEMORY
;
2051 reader
->lpVBSAXXMLReaderVtbl
= &saxreader_vtbl
;
2052 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
2054 reader
->contentHandler
= NULL
;
2055 reader
->errorHandler
= NULL
;
2057 memset(&reader
->sax
, 0, sizeof(xmlSAXHandler
));
2058 reader
->sax
.initialized
= XML_SAX2_MAGIC
;
2059 reader
->sax
.startDocument
= libxmlStartDocument
;
2060 reader
->sax
.endDocument
= libxmlEndDocument
;
2061 reader
->sax
.startElementNs
= libxmlStartElementNS
;
2062 reader
->sax
.endElementNs
= libxmlEndElementNS
;
2063 reader
->sax
.characters
= libxmlCharacters
;
2064 reader
->sax
.setDocumentLocator
= libxmlSetDocumentLocator
;
2065 reader
->sax
.error
= libxmlFatalError
;
2066 reader
->sax
.fatalError
= libxmlFatalError
;
2068 *ppObj
= &reader
->lpVBSAXXMLReaderVtbl
;
2070 TRACE("returning iface %p\n", *ppObj
);
2077 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
2079 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2080 "libxml2 support was not present at compile time.\n");