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
;
89 static inline saxreader
*impl_from_IVBSAXXMLReader( IVBSAXXMLReader
*iface
)
91 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpVBSAXXMLReaderVtbl
));
94 static inline saxreader
*impl_from_ISAXXMLReader( ISAXXMLReader
*iface
)
96 return (saxreader
*)((char*)iface
- FIELD_OFFSET(saxreader
, lpSAXXMLReaderVtbl
));
99 static inline saxlocator
*impl_from_IVBSAXLocator( IVBSAXLocator
*iface
)
101 return (saxlocator
*)((char*)iface
- FIELD_OFFSET(saxlocator
, lpVBSAXLocatorVtbl
));
104 static inline saxlocator
*impl_from_ISAXLocator( ISAXLocator
*iface
)
106 return (saxlocator
*)((char*)iface
- FIELD_OFFSET(saxlocator
, lpSAXLocatorVtbl
));
109 static inline saxattributes
*impl_from_IVBSAXAttributes( IVBSAXAttributes
*iface
)
111 return (saxattributes
*)((char*)iface
- FIELD_OFFSET(saxattributes
, lpVBSAXAttributesVtbl
));
114 static inline saxattributes
*impl_from_ISAXAttributes( ISAXAttributes
*iface
)
116 return (saxattributes
*)((char*)iface
- FIELD_OFFSET(saxattributes
, lpSAXAttributesVtbl
));
120 static BSTR
bstr_from_xmlCharN(const xmlChar
*buf
, int len
)
129 dLen
= MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)buf
, len
, NULL
, 0);
130 if(len
!= -1) dLen
++;
131 str
= (LPWSTR
)HeapAlloc(GetProcessHeap(), 0, dLen
* sizeof (WCHAR
));
134 MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)buf
, len
, str
, dLen
);
135 if(len
!= -1) str
[dLen
-1] = '\0';
136 bstr
= SysAllocString(str
);
137 HeapFree(GetProcessHeap(), 0, str
);
142 static BSTR
QName_from_xmlChar(const xmlChar
*prefix
, const xmlChar
*name
)
148 if(!name
) return NULL
;
150 if(!prefix
|| *prefix
=='\0')
151 return bstr_from_xmlChar(name
);
153 dLen
= MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)prefix
, -1, NULL
, 0)
154 + MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)name
, -1, NULL
, 0);
155 str
= HeapAlloc(GetProcessHeap(), 0, dLen
* sizeof(WCHAR
));
159 dLast
= MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)prefix
, -1, str
, dLen
);
161 MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)name
, -1, &str
[dLast
], dLen
-dLast
);
162 bstr
= SysAllocString(str
);
164 HeapFree(GetProcessHeap(), 0, str
);
169 static void format_error_message_from_id(saxlocator
*This
, HRESULT hr
)
171 xmlStopParser(This
->pParserCtxt
);
174 if(This
->saxreader
->errorHandler
)
177 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
,
178 NULL
, hr
, 0, msg
, sizeof(msg
), NULL
))
180 FIXME("MSXML errors not yet supported.\n");
184 if(This
->vbInterface
)
186 BSTR bstrMsg
= SysAllocString(msg
);
187 IVBSAXErrorHandler_fatalError(This
->saxreader
->vberrorHandler
,
188 (IVBSAXLocator
*)&This
->lpVBSAXLocatorVtbl
, &bstrMsg
, hr
);
191 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
192 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, msg
, hr
);
196 static void update_position(saxlocator
*This
, xmlChar
*end
)
198 if(This
->lastCur
== NULL
)
200 This
->lastCur
= (xmlChar
*)This
->pParserCtxt
->input
->base
;
204 else if(This
->lastCur
< This
->pParserCtxt
->input
->base
)
206 This
->lastCur
= (xmlChar
*)This
->pParserCtxt
->input
->base
;
211 if(!end
) end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
;
213 while(This
->lastCur
< end
)
215 if(*(This
->lastCur
) == '\n')
220 else if(*(This
->lastCur
) == '\r' && (This
->lastCur
==This
->pParserCtxt
->input
->end
|| *(This
->lastCur
+1)!='\n'))
231 /*** IVBSAXAttributes interface ***/
232 /*** IUnknown methods ***/
233 static HRESULT WINAPI
ivbsaxattributes_QueryInterface(
234 IVBSAXAttributes
* iface
,
238 saxattributes
*This
= impl_from_IVBSAXAttributes(iface
);
240 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
244 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
245 IsEqualGUID(riid
, &IID_IDispatch
) ||
246 IsEqualGUID(riid
, &IID_IVBSAXAttributes
))
252 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
253 return E_NOINTERFACE
;
256 IVBSAXAttributes_AddRef(iface
);
261 static ULONG WINAPI
ivbsaxattributes_AddRef(IVBSAXAttributes
* iface
)
263 saxattributes
*This
= impl_from_IVBSAXAttributes(iface
);
264 return ISAXAttributes_AddRef((ISAXAttributes
*)&This
->lpSAXAttributesVtbl
);
267 static ULONG WINAPI
ivbsaxattributes_Release(IVBSAXAttributes
* iface
)
269 saxattributes
*This
= impl_from_IVBSAXAttributes(iface
);
270 return ISAXAttributes_Release((ISAXAttributes
*)&This
->lpSAXAttributesVtbl
);
273 /*** IDispatch methods ***/
274 static HRESULT WINAPI
ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes
*iface
, UINT
* pctinfo
)
276 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
278 TRACE("(%p)->(%p)\n", This
, pctinfo
);
285 static HRESULT WINAPI
ivbsaxattributes_GetTypeInfo(
286 IVBSAXAttributes
*iface
,
287 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
289 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
292 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
294 hr
= get_typeinfo(IVBSAXAttributes_tid
, ppTInfo
);
299 static HRESULT WINAPI
ivbsaxattributes_GetIDsOfNames(
300 IVBSAXAttributes
*iface
,
307 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
311 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
314 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
317 hr
= get_typeinfo(IVBSAXAttributes_tid
, &typeinfo
);
320 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
321 ITypeInfo_Release(typeinfo
);
327 static HRESULT WINAPI
ivbsaxattributes_Invoke(
328 IVBSAXAttributes
*iface
,
333 DISPPARAMS
* pDispParams
,
335 EXCEPINFO
* pExcepInfo
,
338 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
342 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
343 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
345 hr
= get_typeinfo(IVBSAXAttributes_tid
, &typeinfo
);
348 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXAttributesVtbl
), dispIdMember
, wFlags
, pDispParams
,
349 pVarResult
, pExcepInfo
, puArgErr
);
350 ITypeInfo_Release(typeinfo
);
356 /*** IVBSAXAttributes methods ***/
357 static HRESULT WINAPI
ivbsaxattributes_get_length(
358 IVBSAXAttributes
* iface
,
361 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
362 return ISAXAttributes_getLength(
363 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
367 static HRESULT WINAPI
ivbsaxattributes_getURI(
368 IVBSAXAttributes
* iface
,
373 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
374 return ISAXAttributes_getURI(
375 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
376 nIndex
, (const WCHAR
**)uri
, &len
);
379 static HRESULT WINAPI
ivbsaxattributes_getLocalName(
380 IVBSAXAttributes
* iface
,
385 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
386 return ISAXAttributes_getLocalName(
387 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
388 nIndex
, (const WCHAR
**)localName
, &len
);
391 static HRESULT WINAPI
ivbsaxattributes_getQName(
392 IVBSAXAttributes
* iface
,
397 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
398 return ISAXAttributes_getQName(
399 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
400 nIndex
, (const WCHAR
**)QName
, &len
);
403 static HRESULT WINAPI
ivbsaxattributes_getIndexFromName(
404 IVBSAXAttributes
* iface
,
409 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
410 return ISAXAttributes_getIndexFromName(
411 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
412 (const WCHAR
*)uri
, SysStringLen(uri
),
413 (const WCHAR
*)localName
, SysStringLen(localName
), index
);
416 static HRESULT WINAPI
ivbsaxattributes_getIndexFromQName(
417 IVBSAXAttributes
* iface
,
421 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
422 return ISAXAttributes_getIndexFromQName(
423 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
424 (const WCHAR
*)QName
, SysStringLen(QName
), index
);
427 static HRESULT WINAPI
ivbsaxattributes_getType(
428 IVBSAXAttributes
* iface
,
433 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
434 return ISAXAttributes_getType(
435 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
436 nIndex
, (const WCHAR
**)type
, &len
);
439 static HRESULT WINAPI
ivbsaxattributes_getTypeFromName(
440 IVBSAXAttributes
* iface
,
446 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
447 return ISAXAttributes_getTypeFromName(
448 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
449 (const WCHAR
*)uri
, SysStringLen(uri
),
450 (const WCHAR
*)localName
, SysStringLen(localName
),
451 (const WCHAR
**)type
, &len
);
454 static HRESULT WINAPI
ivbsaxattributes_getTypeFromQName(
455 IVBSAXAttributes
* iface
,
460 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
461 return ISAXAttributes_getTypeFromQName(
462 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
463 (const WCHAR
*)QName
, SysStringLen(QName
),
464 (const WCHAR
**)type
, &len
);
467 static HRESULT WINAPI
ivbsaxattributes_getValue(
468 IVBSAXAttributes
* iface
,
473 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
474 return ISAXAttributes_getValue(
475 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
476 nIndex
, (const WCHAR
**)value
, &len
);
479 static HRESULT WINAPI
ivbsaxattributes_getValueFromName(
480 IVBSAXAttributes
* iface
,
486 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
487 return ISAXAttributes_getValueFromName(
488 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
489 (const WCHAR
*)uri
, SysStringLen(uri
),
490 (const WCHAR
*)localName
, SysStringLen(localName
),
491 (const WCHAR
**)value
, &len
);
494 static HRESULT WINAPI
ivbsaxattributes_getValueFromQName(
495 IVBSAXAttributes
* iface
,
500 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
501 return ISAXAttributes_getValueFromQName(
502 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
503 (const WCHAR
*)QName
, SysStringLen(QName
),
504 (const WCHAR
**)value
, &len
);
507 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl
=
509 ivbsaxattributes_QueryInterface
,
510 ivbsaxattributes_AddRef
,
511 ivbsaxattributes_Release
,
512 ivbsaxattributes_GetTypeInfoCount
,
513 ivbsaxattributes_GetTypeInfo
,
514 ivbsaxattributes_GetIDsOfNames
,
515 ivbsaxattributes_Invoke
,
516 ivbsaxattributes_get_length
,
517 ivbsaxattributes_getURI
,
518 ivbsaxattributes_getLocalName
,
519 ivbsaxattributes_getQName
,
520 ivbsaxattributes_getIndexFromName
,
521 ivbsaxattributes_getIndexFromQName
,
522 ivbsaxattributes_getType
,
523 ivbsaxattributes_getTypeFromName
,
524 ivbsaxattributes_getTypeFromQName
,
525 ivbsaxattributes_getValue
,
526 ivbsaxattributes_getValueFromName
,
527 ivbsaxattributes_getValueFromQName
530 /*** ISAXAttributes interface ***/
531 /*** IUnknown methods ***/
532 static HRESULT WINAPI
isaxattributes_QueryInterface(
533 ISAXAttributes
* iface
,
537 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
539 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
543 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
544 IsEqualGUID(riid
, &IID_ISAXAttributes
))
550 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
551 return E_NOINTERFACE
;
554 ISAXAttributes_AddRef(iface
);
559 static ULONG WINAPI
isaxattributes_AddRef(ISAXAttributes
* iface
)
561 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
563 return InterlockedIncrement(&This
->ref
);
566 static ULONG WINAPI
isaxattributes_Release(ISAXAttributes
* iface
)
568 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
573 ref
= InterlockedDecrement(&This
->ref
);
577 for(index
=0; index
<This
->nb_attributes
; index
++)
579 SysFreeString(This
->szLocalname
[index
]);
580 SysFreeString(This
->szURI
[index
]);
581 SysFreeString(This
->szValue
[index
]);
582 SysFreeString(This
->szQName
[index
]);
585 HeapFree(GetProcessHeap(), 0, This
->szLocalname
);
586 HeapFree(GetProcessHeap(), 0, This
->szURI
);
587 HeapFree(GetProcessHeap(), 0, This
->szValue
);
588 HeapFree(GetProcessHeap(), 0, This
->szQName
);
590 HeapFree(GetProcessHeap(), 0, This
);
596 /*** ISAXAttributes methods ***/
597 static HRESULT WINAPI
isaxattributes_getLength(
598 ISAXAttributes
* iface
,
601 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
603 *length
= This
->nb_attributes
;
604 TRACE("Length set to %d\n", *length
);
608 static HRESULT WINAPI
isaxattributes_getURI(
609 ISAXAttributes
* iface
,
614 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
615 TRACE("(%p)->(%d)\n", This
, nIndex
);
617 if(nIndex
>=This
->nb_attributes
|| nIndex
<0) return E_INVALIDARG
;
618 if(!pUrl
|| !pUriSize
) return E_POINTER
;
620 *pUriSize
= SysStringLen(This
->szURI
[nIndex
]);
621 *pUrl
= This
->szURI
[nIndex
];
626 static HRESULT WINAPI
isaxattributes_getLocalName(
627 ISAXAttributes
* iface
,
629 const WCHAR
**pLocalName
,
630 int *pLocalNameLength
)
632 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
633 TRACE("(%p)->(%d)\n", This
, nIndex
);
635 if(nIndex
>=This
->nb_attributes
|| nIndex
<0) return E_INVALIDARG
;
636 if(!pLocalName
|| !pLocalNameLength
) return E_POINTER
;
638 *pLocalNameLength
= SysStringLen(This
->szLocalname
[nIndex
]);
639 *pLocalName
= This
->szLocalname
[nIndex
];
644 static HRESULT WINAPI
isaxattributes_getQName(
645 ISAXAttributes
* iface
,
647 const WCHAR
**pQName
,
650 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
651 TRACE("(%p)->(%d)\n", This
, nIndex
);
653 if(nIndex
>=This
->nb_attributes
|| nIndex
<0) return E_INVALIDARG
;
654 if(!pQName
|| !pQNameLength
) return E_POINTER
;
656 *pQNameLength
= SysStringLen(This
->szQName
[nIndex
]);
657 *pQName
= This
->szQName
[nIndex
];
662 static HRESULT WINAPI
isaxattributes_getName(
663 ISAXAttributes
* iface
,
667 const WCHAR
**pLocalName
,
669 const WCHAR
**pQName
,
672 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
674 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
678 static HRESULT WINAPI
isaxattributes_getIndexFromName(
679 ISAXAttributes
* iface
,
682 const WCHAR
*pLocalName
,
686 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
688 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), cUriLength
,
689 debugstr_w(pLocalName
), cocalNameLength
);
693 static HRESULT WINAPI
isaxattributes_getIndexFromQName(
694 ISAXAttributes
* iface
,
699 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
701 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQNameLength
);
705 static HRESULT WINAPI
isaxattributes_getType(
706 ISAXAttributes
* iface
,
711 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
713 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
717 static HRESULT WINAPI
isaxattributes_getTypeFromName(
718 ISAXAttributes
* iface
,
721 const WCHAR
*pLocalName
,
726 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
728 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
729 debugstr_w(pLocalName
), nLocalName
);
733 static HRESULT WINAPI
isaxattributes_getTypeFromQName(
734 ISAXAttributes
* iface
,
740 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
742 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
746 static HRESULT WINAPI
isaxattributes_getValue(
747 ISAXAttributes
* iface
,
749 const WCHAR
**pValue
,
752 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
753 TRACE("(%p)->(%d)\n", This
, nIndex
);
755 if(nIndex
>=This
->nb_attributes
|| nIndex
<0) return E_INVALIDARG
;
756 if(!pValue
|| !nValue
) return E_POINTER
;
758 *nValue
= SysStringLen(This
->szValue
[nIndex
]);
759 *pValue
= This
->szValue
[nIndex
];
764 static HRESULT WINAPI
isaxattributes_getValueFromName(
765 ISAXAttributes
* iface
,
768 const WCHAR
*pLocalName
,
770 const WCHAR
**pValue
,
773 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
775 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This
, debugstr_w(pUri
), nUri
,
776 debugstr_w(pLocalName
), nLocalName
);
780 static HRESULT WINAPI
isaxattributes_getValueFromQName(
781 ISAXAttributes
* iface
,
784 const WCHAR
**pValue
,
787 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
789 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
793 static const struct ISAXAttributesVtbl isaxattributes_vtbl
=
795 isaxattributes_QueryInterface
,
796 isaxattributes_AddRef
,
797 isaxattributes_Release
,
798 isaxattributes_getLength
,
799 isaxattributes_getURI
,
800 isaxattributes_getLocalName
,
801 isaxattributes_getQName
,
802 isaxattributes_getName
,
803 isaxattributes_getIndexFromName
,
804 isaxattributes_getIndexFromQName
,
805 isaxattributes_getType
,
806 isaxattributes_getTypeFromName
,
807 isaxattributes_getTypeFromQName
,
808 isaxattributes_getValue
,
809 isaxattributes_getValueFromName
,
810 isaxattributes_getValueFromQName
813 static HRESULT
SAXAttributes_create(saxattributes
**attr
,
814 int nb_namespaces
, const xmlChar
**xmlNamespaces
,
815 int nb_attributes
, const xmlChar
**xmlAttributes
)
817 saxattributes
*attributes
;
819 static const xmlChar xmlns
[] = "xmlns";
821 attributes
= HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes
));
823 return E_OUTOFMEMORY
;
825 attributes
->lpVBSAXAttributesVtbl
= &ivbsaxattributes_vtbl
;
826 attributes
->lpSAXAttributesVtbl
= &isaxattributes_vtbl
;
829 attributes
->nb_attributes
= nb_namespaces
+nb_attributes
;
831 attributes
->szLocalname
=
832 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*attributes
->nb_attributes
);
834 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*attributes
->nb_attributes
);
835 attributes
->szValue
=
836 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*attributes
->nb_attributes
);
837 attributes
->szQName
=
838 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*attributes
->nb_attributes
);
840 if(!attributes
->szLocalname
|| !attributes
->szURI
841 || !attributes
->szValue
|| !attributes
->szQName
)
843 HeapFree(GetProcessHeap(), 0, attributes
->szLocalname
);
844 HeapFree(GetProcessHeap(), 0, attributes
->szURI
);
845 HeapFree(GetProcessHeap(), 0, attributes
->szValue
);
846 HeapFree(GetProcessHeap(), 0, attributes
->szQName
);
847 HeapFree(GetProcessHeap(), 0, attributes
);
851 for(index
=0; index
<nb_namespaces
; index
++)
853 attributes
->szLocalname
[index
] = SysAllocStringLen(NULL
, 0);
854 attributes
->szURI
[index
] = SysAllocStringLen(NULL
, 0);
855 attributes
->szValue
[index
] = bstr_from_xmlChar(xmlNamespaces
[2*index
+1]);
856 attributes
->szQName
[index
] = QName_from_xmlChar(xmlns
, xmlNamespaces
[2*index
]);
859 for(index
=0; index
<nb_attributes
; index
++)
861 attributes
->szLocalname
[nb_namespaces
+index
] =
862 bstr_from_xmlChar(xmlAttributes
[index
*5]);
863 attributes
->szURI
[nb_namespaces
+index
] =
864 bstr_from_xmlChar(xmlAttributes
[index
*5+2]);
865 attributes
->szValue
[nb_namespaces
+index
] =
866 bstr_from_xmlCharN(xmlAttributes
[index
*5+3],
867 xmlAttributes
[index
*5+4]-xmlAttributes
[index
*5+3]);
868 attributes
->szQName
[nb_namespaces
+index
] =
869 QName_from_xmlChar(xmlAttributes
[index
*5+1], xmlAttributes
[index
*5]);
874 TRACE("returning %p\n", *attr
);
879 /*** LibXML callbacks ***/
880 static void libxmlStartDocument(void *ctx
)
882 saxlocator
*This
= ctx
;
885 if(This
->saxreader
->contentHandler
)
887 if(This
->vbInterface
)
888 hr
= IVBSAXContentHandler_startDocument(This
->saxreader
->vbcontentHandler
);
890 hr
= ISAXContentHandler_startDocument(This
->saxreader
->contentHandler
);
893 format_error_message_from_id(This
, hr
);
896 update_position(This
, NULL
);
899 static void libxmlEndDocument(void *ctx
)
901 saxlocator
*This
= ctx
;
907 if(This
->ret
!= S_OK
) return;
909 if(This
->saxreader
->contentHandler
)
911 if(This
->vbInterface
)
912 hr
= IVBSAXContentHandler_endDocument(This
->saxreader
->vbcontentHandler
);
914 hr
= ISAXContentHandler_endDocument(This
->saxreader
->contentHandler
);
917 format_error_message_from_id(This
, hr
);
921 static void libxmlStartElementNS(
923 const xmlChar
*localname
,
924 const xmlChar
*prefix
,
927 const xmlChar
**namespaces
,
930 const xmlChar
**attributes
)
932 BSTR NamespaceUri
, LocalName
, QName
, Prefix
, Uri
;
933 saxlocator
*This
= ctx
;
938 update_position(This
, (xmlChar
*)This
->pParserCtxt
->input
->cur
+1);
940 if(This
->saxreader
->contentHandler
)
942 for(index
=0; index
<nb_namespaces
; index
++)
944 Prefix
= bstr_from_xmlChar(namespaces
[2*index
]);
945 Uri
= bstr_from_xmlChar(namespaces
[2*index
+1]);
947 if(This
->vbInterface
)
948 hr
= IVBSAXContentHandler_startPrefixMapping(
949 This
->saxreader
->vbcontentHandler
,
952 hr
= ISAXContentHandler_startPrefixMapping(
953 This
->saxreader
->contentHandler
,
954 Prefix
, SysStringLen(Prefix
),
955 Uri
, SysStringLen(Uri
));
957 SysFreeString(Prefix
);
962 format_error_message_from_id(This
, hr
);
967 NamespaceUri
= bstr_from_xmlChar(URI
);
968 LocalName
= bstr_from_xmlChar(localname
);
969 QName
= QName_from_xmlChar(prefix
, localname
);
971 hr
= SAXAttributes_create(&attr
, nb_namespaces
, namespaces
, nb_attributes
, attributes
);
974 if(This
->vbInterface
)
975 hr
= IVBSAXContentHandler_startElement(
976 This
->saxreader
->vbcontentHandler
,
977 &NamespaceUri
, &LocalName
, &QName
,
978 (IVBSAXAttributes
*)&attr
->lpVBSAXAttributesVtbl
);
980 hr
= ISAXContentHandler_startElement(
981 This
->saxreader
->contentHandler
,
982 NamespaceUri
, SysStringLen(NamespaceUri
),
983 LocalName
, SysStringLen(LocalName
),
984 QName
, SysStringLen(QName
),
985 (ISAXAttributes
*)&attr
->lpSAXAttributesVtbl
);
987 ISAXAttributes_Release((ISAXAttributes
*)&attr
->lpSAXAttributesVtbl
);
990 SysFreeString(NamespaceUri
);
991 SysFreeString(LocalName
);
992 SysFreeString(QName
);
995 format_error_message_from_id(This
, hr
);
999 static void libxmlEndElementNS(
1001 const xmlChar
*localname
,
1002 const xmlChar
*prefix
,
1005 BSTR NamespaceUri
, LocalName
, QName
;
1006 saxlocator
*This
= ctx
;
1010 end
= This
->lastCur
;
1011 while(*end
!= '<' && *(end
+1) != '/') end
++;
1012 update_position(This
, end
+2);
1014 if(This
->saxreader
->contentHandler
)
1016 NamespaceUri
= bstr_from_xmlChar(URI
);
1017 LocalName
= bstr_from_xmlChar(localname
);
1018 QName
= QName_from_xmlChar(prefix
, localname
);
1020 if(This
->vbInterface
)
1021 hr
= IVBSAXContentHandler_endElement(
1022 This
->saxreader
->vbcontentHandler
,
1023 &NamespaceUri
, &LocalName
, &QName
);
1025 hr
= ISAXContentHandler_endElement(
1026 This
->saxreader
->contentHandler
,
1027 NamespaceUri
, SysStringLen(NamespaceUri
),
1028 LocalName
, SysStringLen(LocalName
),
1029 QName
, SysStringLen(QName
));
1031 SysFreeString(NamespaceUri
);
1032 SysFreeString(LocalName
);
1033 SysFreeString(QName
);
1036 format_error_message_from_id(This
, hr
);
1040 static void libxmlCharacters(
1046 saxlocator
*This
= ctx
;
1049 xmlChar
*lastCurCopy
;
1054 if(*(This
->lastCur
-1) != '>' && *(This
->lastCur
-1) != '/') return;
1056 if(*(This
->lastCur
-1) != '>')
1058 end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
-len
;
1059 while(*(end
-1) != '>') end
--;
1060 update_position(This
, end
);
1063 chEnd
= This
->lastCur
+len
;
1064 while(*chEnd
!= '<') chEnd
++;
1066 Chars
= bstr_from_xmlChar(ch
);
1068 lastCurCopy
= This
->lastCur
;
1069 columnCopy
= This
->column
;
1070 lineCopy
= This
->line
;
1071 end
= This
->lastCur
;
1073 if(This
->saxreader
->contentHandler
)
1075 while(This
->lastCur
< chEnd
)
1077 end
= This
->lastCur
;
1078 while(end
< chEnd
-1)
1080 if(*end
== '\r') break;
1084 Chars
= bstr_from_xmlChar(This
->lastCur
);
1086 if(*end
== '\r' && *(end
+1) == '\n')
1088 memmove((WCHAR
*)Chars
+(end
-This
->lastCur
),
1089 (WCHAR
*)Chars
+(end
-This
->lastCur
)+1,
1090 (SysStringLen(Chars
)-(end
-This
->lastCur
))*sizeof(WCHAR
));
1091 SysReAllocStringLen(&Chars
, Chars
, SysStringLen(Chars
)-1);
1093 else if(*end
== '\r') Chars
[end
-This
->lastCur
] = '\n';
1095 if(This
->vbInterface
)
1096 hr
= IVBSAXContentHandler_characters(
1097 This
->saxreader
->vbcontentHandler
, &Chars
);
1099 hr
= ISAXContentHandler_characters(
1100 This
->saxreader
->contentHandler
,
1101 Chars
, end
-This
->lastCur
+1);
1103 SysFreeString(Chars
);
1106 format_error_message_from_id(This
, hr
);
1110 if(*(end
+1) == '\n') end
++;
1111 if(end
< chEnd
) end
++;
1113 This
->column
+= end
-This
->lastCur
;
1114 This
->lastCur
= end
;
1117 This
->lastCur
= lastCurCopy
;
1118 This
->column
= columnCopy
;
1119 This
->line
= lineCopy
;
1120 update_position(This
, chEnd
);
1124 static void libxmlSetDocumentLocator(
1126 xmlSAXLocatorPtr loc
)
1128 saxlocator
*This
= ctx
;
1131 if(This
->vbInterface
)
1132 hr
= IVBSAXContentHandler_putref_documentLocator(
1133 This
->saxreader
->vbcontentHandler
,
1134 (IVBSAXLocator
*)&This
->lpVBSAXLocatorVtbl
);
1136 hr
= ISAXContentHandler_putDocumentLocator(
1137 This
->saxreader
->contentHandler
,
1138 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
);
1141 format_error_message_from_id(This
, hr
);
1144 void libxmlFatalError(void *ctx
, const char *msg
, ...)
1146 saxlocator
*This
= ctx
;
1152 if(!This
->saxreader
->errorHandler
)
1154 xmlStopParser(This
->pParserCtxt
);
1159 FIXME("Error handling is not compatible.\n");
1161 va_start(args
, msg
);
1162 vsprintf(message
, msg
, args
);
1165 len
= MultiByteToWideChar(CP_ACP
, 0, message
, -1, NULL
, 0);
1166 wszError
= HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR
)*len
);
1167 MultiByteToWideChar(CP_ACP
, 0, message
, -1, (LPWSTR
)wszError
, len
);
1169 if(This
->vbInterface
)
1171 BSTR bstrError
= SysAllocString(wszError
);
1172 IVBSAXErrorHandler_fatalError(This
->saxreader
->vberrorHandler
,
1173 (IVBSAXLocator
*)&This
->lpVBSAXLocatorVtbl
, &bstrError
, E_FAIL
);
1176 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
1177 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, wszError
, E_FAIL
);
1179 HeapFree(GetProcessHeap(), 0, wszError
);
1181 xmlStopParser(This
->pParserCtxt
);
1185 /*** IVBSAXLocator interface ***/
1186 /*** IUnknown methods ***/
1187 static HRESULT WINAPI
ivbsaxlocator_QueryInterface(IVBSAXLocator
* iface
, REFIID riid
, void **ppvObject
)
1189 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1191 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
1195 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1196 IsEqualGUID( riid
, &IID_IDispatch
) ||
1197 IsEqualGUID( riid
, &IID_IVBSAXLocator
))
1203 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1204 return E_NOINTERFACE
;
1207 IVBSAXLocator_AddRef( iface
);
1212 static ULONG WINAPI
ivbsaxlocator_AddRef(IVBSAXLocator
* iface
)
1214 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1215 TRACE("%p\n", This
);
1216 return InterlockedIncrement( &This
->ref
);
1219 static ULONG WINAPI
ivbsaxlocator_Release(
1220 IVBSAXLocator
* iface
)
1222 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1223 return ISAXLocator_Release((ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
);
1226 /*** IDispatch methods ***/
1227 static HRESULT WINAPI
ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator
*iface
, UINT
* pctinfo
)
1229 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1231 TRACE("(%p)->(%p)\n", This
, pctinfo
);
1238 static HRESULT WINAPI
ivbsaxlocator_GetTypeInfo(
1239 IVBSAXLocator
*iface
,
1240 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
1242 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1245 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1247 hr
= get_typeinfo(IVBSAXLocator_tid
, ppTInfo
);
1252 static HRESULT WINAPI
ivbsaxlocator_GetIDsOfNames(
1253 IVBSAXLocator
*iface
,
1255 LPOLESTR
* rgszNames
,
1260 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1261 ITypeInfo
*typeinfo
;
1264 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
1267 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
1268 return E_INVALIDARG
;
1270 hr
= get_typeinfo(IVBSAXLocator_tid
, &typeinfo
);
1273 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1274 ITypeInfo_Release(typeinfo
);
1280 static HRESULT WINAPI
ivbsaxlocator_Invoke(
1281 IVBSAXLocator
*iface
,
1282 DISPID dispIdMember
,
1286 DISPPARAMS
* pDispParams
,
1287 VARIANT
* pVarResult
,
1288 EXCEPINFO
* pExcepInfo
,
1291 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1292 ITypeInfo
*typeinfo
;
1295 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1296 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1298 hr
= get_typeinfo(IVBSAXLocator_tid
, &typeinfo
);
1301 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXLocatorVtbl
), dispIdMember
, wFlags
, pDispParams
,
1302 pVarResult
, pExcepInfo
, puArgErr
);
1303 ITypeInfo_Release(typeinfo
);
1309 /*** IVBSAXLocator methods ***/
1310 static HRESULT WINAPI
ivbsaxlocator_get_columnNumber(
1311 IVBSAXLocator
* iface
,
1314 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1315 return ISAXLocator_getColumnNumber(
1316 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1320 static HRESULT WINAPI
ivbsaxlocator_get_lineNumber(
1321 IVBSAXLocator
* iface
,
1324 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1325 return ISAXLocator_getLineNumber(
1326 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1330 static HRESULT WINAPI
ivbsaxlocator_get_publicId(
1331 IVBSAXLocator
* iface
,
1334 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1335 return ISAXLocator_getPublicId(
1336 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1337 (const WCHAR
**)publicId
);
1340 static HRESULT WINAPI
ivbsaxlocator_get_systemId(
1341 IVBSAXLocator
* iface
,
1344 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1345 return ISAXLocator_getSystemId(
1346 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1347 (const WCHAR
**)systemId
);
1350 static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl
=
1352 ivbsaxlocator_QueryInterface
,
1353 ivbsaxlocator_AddRef
,
1354 ivbsaxlocator_Release
,
1355 ivbsaxlocator_GetTypeInfoCount
,
1356 ivbsaxlocator_GetTypeInfo
,
1357 ivbsaxlocator_GetIDsOfNames
,
1358 ivbsaxlocator_Invoke
,
1359 ivbsaxlocator_get_columnNumber
,
1360 ivbsaxlocator_get_lineNumber
,
1361 ivbsaxlocator_get_publicId
,
1362 ivbsaxlocator_get_systemId
1365 /*** ISAXLocator interface ***/
1366 /*** IUnknown methods ***/
1367 static HRESULT WINAPI
isaxlocator_QueryInterface(ISAXLocator
* iface
, REFIID riid
, void **ppvObject
)
1369 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1371 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
1375 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1376 IsEqualGUID( riid
, &IID_ISAXLocator
))
1382 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1383 return E_NOINTERFACE
;
1386 ISAXLocator_AddRef( iface
);
1391 static ULONG WINAPI
isaxlocator_AddRef(ISAXLocator
* iface
)
1393 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1394 TRACE("%p\n", This
);
1395 return InterlockedIncrement( &This
->ref
);
1398 static ULONG WINAPI
isaxlocator_Release(
1401 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1404 TRACE("%p\n", This
);
1406 ref
= InterlockedDecrement( &This
->ref
);
1410 SysFreeString(This
->publicId
);
1412 SysFreeString(This
->systemId
);
1414 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
1415 HeapFree( GetProcessHeap(), 0, This
);
1421 /*** ISAXLocator methods ***/
1422 static HRESULT WINAPI
isaxlocator_getColumnNumber(
1426 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1428 *pnColumn
= This
->column
;
1432 static HRESULT WINAPI
isaxlocator_getLineNumber(
1436 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1438 *pnLine
= This
->line
;
1442 static HRESULT WINAPI
isaxlocator_getPublicId(
1444 const WCHAR
** ppwchPublicId
)
1447 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1449 if(This
->publicId
) SysFreeString(This
->publicId
);
1451 publicId
= bstr_from_xmlChar(xmlSAX2GetPublicId(This
->pParserCtxt
));
1452 if(SysStringLen(publicId
))
1453 This
->publicId
= (WCHAR
*)&publicId
;
1456 SysFreeString(publicId
);
1457 This
->publicId
= NULL
;
1460 *ppwchPublicId
= This
->publicId
;
1464 static HRESULT WINAPI
isaxlocator_getSystemId(
1466 const WCHAR
** ppwchSystemId
)
1469 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1471 if(This
->systemId
) SysFreeString(This
->systemId
);
1473 systemId
= bstr_from_xmlChar(xmlSAX2GetSystemId(This
->pParserCtxt
));
1474 if(SysStringLen(systemId
))
1475 This
->systemId
= (WCHAR
*)&systemId
;
1478 SysFreeString(systemId
);
1479 This
->systemId
= NULL
;
1482 *ppwchSystemId
= This
->systemId
;
1486 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
1488 isaxlocator_QueryInterface
,
1490 isaxlocator_Release
,
1491 isaxlocator_getColumnNumber
,
1492 isaxlocator_getLineNumber
,
1493 isaxlocator_getPublicId
,
1494 isaxlocator_getSystemId
1497 static HRESULT
SAXLocator_create(saxreader
*reader
, saxlocator
**ppsaxlocator
, BOOL vbInterface
)
1499 saxlocator
*locator
;
1501 locator
= HeapAlloc( GetProcessHeap(), 0, sizeof (*locator
) );
1503 return E_OUTOFMEMORY
;
1505 locator
->lpVBSAXLocatorVtbl
= &ivbsaxlocator_vtbl
;
1506 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
1508 locator
->vbInterface
= vbInterface
;
1510 locator
->saxreader
= reader
;
1511 ISAXXMLReader_AddRef((ISAXXMLReader
*)&reader
->lpSAXXMLReaderVtbl
);
1513 locator
->pParserCtxt
= NULL
;
1514 locator
->publicId
= NULL
;
1515 locator
->systemId
= NULL
;
1516 locator
->lastCur
= NULL
;
1518 locator
->column
= 0;
1519 locator
->ret
= S_OK
;
1521 *ppsaxlocator
= locator
;
1523 TRACE("returning %p\n", *ppsaxlocator
);
1528 /*** SAXXMLReader internal functions ***/
1529 static HRESULT
internal_parseBuffer(saxreader
*This
, const char *buffer
, int size
, BOOL vbInterface
)
1531 saxlocator
*locator
;
1534 hr
= SAXLocator_create(This
, &locator
, vbInterface
);
1538 locator
->pParserCtxt
= xmlCreateMemoryParserCtxt(buffer
, size
);
1539 if(!locator
->pParserCtxt
)
1541 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1545 locator
->pParserCtxt
->sax
= &locator
->saxreader
->sax
;
1546 locator
->pParserCtxt
->userData
= locator
;
1548 if(xmlParseDocument(locator
->pParserCtxt
)) hr
= E_FAIL
;
1549 else hr
= locator
->ret
;
1551 if(locator
->pParserCtxt
)
1553 locator
->pParserCtxt
->sax
= NULL
;
1554 xmlFreeParserCtxt(locator
->pParserCtxt
);
1555 locator
->pParserCtxt
= NULL
;
1558 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
1562 static HRESULT WINAPI
internal_getEntityResolver(
1564 void *pEntityResolver
,
1567 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1571 static HRESULT WINAPI
internal_putEntityResolver(
1573 void *pEntityResolver
,
1576 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1580 static HRESULT WINAPI
internal_getContentHandler(
1582 void *pContentHandler
,
1585 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
1586 if(pContentHandler
== NULL
)
1588 if(This
->contentHandler
)
1591 IVBSAXContentHandler_AddRef(This
->vbcontentHandler
);
1593 ISAXContentHandler_AddRef(This
->contentHandler
);
1595 if(vbInterface
) *(IVBSAXContentHandler
**)pContentHandler
=
1596 This
->vbcontentHandler
;
1597 else *(ISAXContentHandler
**)pContentHandler
= This
->contentHandler
;
1602 static HRESULT WINAPI
internal_putContentHandler(
1604 void *contentHandler
,
1607 TRACE("(%p)->(%p)\n", This
, contentHandler
);
1611 IVBSAXContentHandler_AddRef((IVBSAXContentHandler
*)contentHandler
);
1613 ISAXContentHandler_AddRef((ISAXContentHandler
*)contentHandler
);
1615 if(This
->contentHandler
)
1618 IVBSAXContentHandler_Release(This
->vbcontentHandler
);
1620 ISAXContentHandler_Release(This
->contentHandler
);
1623 This
->vbcontentHandler
= contentHandler
;
1625 This
->contentHandler
= contentHandler
;
1630 static HRESULT WINAPI
internal_getDTDHandler(
1635 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1639 static HRESULT WINAPI
internal_putDTDHandler(
1644 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1648 static HRESULT WINAPI
internal_getErrorHandler(
1650 void *pErrorHandler
,
1653 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
1654 if(pErrorHandler
== NULL
)
1656 if(This
->errorHandler
)
1659 IVBSAXErrorHandler_AddRef(This
->vberrorHandler
);
1661 ISAXErrorHandler_AddRef(This
->errorHandler
);
1664 *(IVBSAXErrorHandler
**)pErrorHandler
= This
->vberrorHandler
;
1666 *(ISAXErrorHandler
**)pErrorHandler
= This
->errorHandler
;
1672 static HRESULT WINAPI
internal_putErrorHandler(
1677 TRACE("(%p)->(%p)\n", This
, errorHandler
);
1681 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler
*)errorHandler
);
1683 ISAXErrorHandler_AddRef((ISAXErrorHandler
*)errorHandler
);
1685 if(This
->errorHandler
)
1688 IVBSAXErrorHandler_Release(This
->vberrorHandler
);
1690 ISAXErrorHandler_Release(This
->errorHandler
);
1693 This
->vberrorHandler
= errorHandler
;
1695 This
->errorHandler
= errorHandler
;
1701 static HRESULT WINAPI
internal_parse(
1708 TRACE("(%p)\n", This
);
1711 switch(V_VT(&varInput
))
1714 hr
= internal_parseBuffer(This
, (const char*)V_BSTR(&varInput
),
1715 SysStringByteLen(V_BSTR(&varInput
)), vbInterface
);
1717 case VT_ARRAY
|VT_UI1
: {
1719 LONG lBound
, uBound
;
1722 hr
= SafeArrayGetLBound(V_ARRAY(&varInput
), 1, &lBound
);
1723 if(hr
!= S_OK
) break;
1724 hr
= SafeArrayGetUBound(V_ARRAY(&varInput
), 1, &uBound
);
1725 if(hr
!= S_OK
) break;
1726 dataRead
= (uBound
-lBound
)*SafeArrayGetElemsize(V_ARRAY(&varInput
));
1727 hr
= SafeArrayAccessData(V_ARRAY(&varInput
), (void**)&pSAData
);
1728 if(hr
!= S_OK
) break;
1729 hr
= internal_parseBuffer(This
, pSAData
, dataRead
, vbInterface
);
1730 SafeArrayUnaccessData(V_ARRAY(&varInput
));
1735 IPersistStream
*persistStream
;
1736 IStream
*stream
= NULL
;
1737 IXMLDOMDocument
*xmlDoc
;
1739 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1740 &IID_IPersistStream
, (void**)&persistStream
) == S_OK
)
1742 hr
= IPersistStream_Save(persistStream
, stream
, TRUE
);
1743 IPersistStream_Release(persistStream
);
1744 if(hr
!= S_OK
) break;
1746 if(stream
|| IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1747 &IID_IStream
, (void**)&stream
) == S_OK
)
1755 hr
= IStream_Stat(stream
, &dataInfo
, STATFLAG_NONAME
);
1756 if(hr
== E_PENDING
) continue;
1759 data
= HeapAlloc(GetProcessHeap(), 0,
1760 dataInfo
.cbSize
.QuadPart
);
1763 hr
= IStream_Read(stream
, data
,
1764 dataInfo
.cbSize
.QuadPart
, &dataRead
);
1765 if(hr
== E_PENDING
) continue;
1768 hr
= internal_parseBuffer(This
, data
,
1769 dataInfo
.cbSize
.QuadPart
, vbInterface
);
1770 HeapFree(GetProcessHeap(), 0, data
);
1771 IStream_Release(stream
);
1774 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1775 &IID_IXMLDOMDocument
, (void**)&xmlDoc
) == S_OK
)
1779 IXMLDOMDocument_get_xml(xmlDoc
, &bstrData
);
1780 hr
= internal_parseBuffer(This
, (const char*)bstrData
,
1781 SysStringByteLen(bstrData
), vbInterface
);
1782 IXMLDOMDocument_Release(xmlDoc
);
1788 WARN("vt %d not implemented\n", V_VT(&varInput
));
1795 static HRESULT
internal_vbonDataAvailable(void *obj
, char *ptr
, DWORD len
)
1797 saxreader
*This
= obj
;
1799 return internal_parseBuffer(This
, ptr
, len
, TRUE
);
1802 static HRESULT
internal_onDataAvailable(void *obj
, char *ptr
, DWORD len
)
1804 saxreader
*This
= obj
;
1806 return internal_parseBuffer(This
, ptr
, len
, FALSE
);
1809 static HRESULT WINAPI
internal_parseURL(
1817 TRACE("(%p)->(%s)\n", This
, debugstr_w(url
));
1819 if(vbInterface
) hr
= bind_url(url
, internal_vbonDataAvailable
, This
, &bsc
);
1820 else hr
= bind_url(url
, internal_onDataAvailable
, This
, &bsc
);
1830 /*** IVBSAXXMLReader interface ***/
1831 /*** IUnknown methods ***/
1832 static HRESULT WINAPI
saxxmlreader_QueryInterface(IVBSAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
1834 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1836 TRACE("%p %s %p\n", This
, debugstr_guid( riid
), ppvObject
);
1840 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1841 IsEqualGUID( riid
, &IID_IDispatch
) ||
1842 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
1846 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
1848 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
1852 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1853 return E_NOINTERFACE
;
1856 IVBSAXXMLReader_AddRef( iface
);
1861 static ULONG WINAPI
saxxmlreader_AddRef(IVBSAXXMLReader
* iface
)
1863 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1864 TRACE("%p\n", This
);
1865 return InterlockedIncrement( &This
->ref
);
1868 static ULONG WINAPI
saxxmlreader_Release(
1869 IVBSAXXMLReader
* iface
)
1871 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1874 TRACE("%p\n", This
);
1876 ref
= InterlockedDecrement( &This
->ref
);
1879 if(This
->contentHandler
)
1880 ISAXContentHandler_Release(This
->contentHandler
);
1882 if(This
->errorHandler
)
1883 ISAXErrorHandler_Release(This
->errorHandler
);
1885 HeapFree( GetProcessHeap(), 0, This
);
1891 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
1893 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1895 TRACE("(%p)->(%p)\n", This
, pctinfo
);
1902 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
1903 IVBSAXXMLReader
*iface
,
1904 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
1906 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1909 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1911 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
1916 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
1917 IVBSAXXMLReader
*iface
,
1919 LPOLESTR
* rgszNames
,
1924 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1925 ITypeInfo
*typeinfo
;
1928 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
1931 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
1932 return E_INVALIDARG
;
1934 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1937 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1938 ITypeInfo_Release(typeinfo
);
1944 static HRESULT WINAPI
saxxmlreader_Invoke(
1945 IVBSAXXMLReader
*iface
,
1946 DISPID dispIdMember
,
1950 DISPPARAMS
* pDispParams
,
1951 VARIANT
* pVarResult
,
1952 EXCEPINFO
* pExcepInfo
,
1955 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1956 ITypeInfo
*typeinfo
;
1959 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
1960 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1962 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
1965 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXXMLReaderVtbl
), dispIdMember
, wFlags
, pDispParams
,
1966 pVarResult
, pExcepInfo
, puArgErr
);
1967 ITypeInfo_Release(typeinfo
);
1973 /*** IVBSAXXMLReader methods ***/
1974 static HRESULT WINAPI
saxxmlreader_getFeature(
1975 IVBSAXXMLReader
* iface
,
1976 const WCHAR
*pFeature
,
1977 VARIANT_BOOL
*pValue
)
1979 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1981 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pFeature
), pValue
);
1985 static HRESULT WINAPI
saxxmlreader_putFeature(
1986 IVBSAXXMLReader
* iface
,
1987 const WCHAR
*pFeature
,
1988 VARIANT_BOOL vfValue
)
1990 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
1992 FIXME("(%p)->(%s %x) stub\n", This
, debugstr_w(pFeature
), vfValue
);
1996 static HRESULT WINAPI
saxxmlreader_getProperty(
1997 IVBSAXXMLReader
* iface
,
2001 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2003 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
2007 static HRESULT WINAPI
saxxmlreader_putProperty(
2008 IVBSAXXMLReader
* iface
,
2012 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2014 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
2018 static HRESULT WINAPI
saxxmlreader_getEntityResolver(
2019 IVBSAXXMLReader
* iface
,
2020 IVBSAXEntityResolver
**pEntityResolver
)
2022 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2023 return internal_getEntityResolver(This
, pEntityResolver
, TRUE
);
2026 static HRESULT WINAPI
saxxmlreader_putEntityResolver(
2027 IVBSAXXMLReader
* iface
,
2028 IVBSAXEntityResolver
*pEntityResolver
)
2030 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2031 return internal_putEntityResolver(This
, pEntityResolver
, TRUE
);
2034 static HRESULT WINAPI
saxxmlreader_getContentHandler(
2035 IVBSAXXMLReader
* iface
,
2036 IVBSAXContentHandler
**ppContentHandler
)
2038 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2039 return internal_getContentHandler(This
, ppContentHandler
, TRUE
);
2042 static HRESULT WINAPI
saxxmlreader_putContentHandler(
2043 IVBSAXXMLReader
* iface
,
2044 IVBSAXContentHandler
*contentHandler
)
2046 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2047 return internal_putContentHandler(This
, contentHandler
, TRUE
);
2050 static HRESULT WINAPI
saxxmlreader_getDTDHandler(
2051 IVBSAXXMLReader
* iface
,
2052 IVBSAXDTDHandler
**pDTDHandler
)
2054 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2055 return internal_getDTDHandler(This
, pDTDHandler
, TRUE
);
2058 static HRESULT WINAPI
saxxmlreader_putDTDHandler(
2059 IVBSAXXMLReader
* iface
,
2060 IVBSAXDTDHandler
*pDTDHandler
)
2062 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2063 return internal_putDTDHandler(This
, pDTDHandler
, TRUE
);
2066 static HRESULT WINAPI
saxxmlreader_getErrorHandler(
2067 IVBSAXXMLReader
* iface
,
2068 IVBSAXErrorHandler
**pErrorHandler
)
2070 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2071 return internal_getErrorHandler(This
, pErrorHandler
, TRUE
);
2074 static HRESULT WINAPI
saxxmlreader_putErrorHandler(
2075 IVBSAXXMLReader
* iface
,
2076 IVBSAXErrorHandler
*errorHandler
)
2078 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2079 return internal_putErrorHandler(This
, errorHandler
, TRUE
);
2082 static HRESULT WINAPI
saxxmlreader_getBaseURL(
2083 IVBSAXXMLReader
* iface
,
2084 const WCHAR
**pBaseUrl
)
2086 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2088 FIXME("(%p)->(%p) stub\n", This
, pBaseUrl
);
2092 static HRESULT WINAPI
saxxmlreader_putBaseURL(
2093 IVBSAXXMLReader
* iface
,
2094 const WCHAR
*pBaseUrl
)
2096 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2098 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pBaseUrl
));
2102 static HRESULT WINAPI
saxxmlreader_getSecureBaseURL(
2103 IVBSAXXMLReader
* iface
,
2104 const WCHAR
**pSecureBaseUrl
)
2106 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2108 FIXME("(%p)->(%p) stub\n", This
, pSecureBaseUrl
);
2113 static HRESULT WINAPI
saxxmlreader_putSecureBaseURL(
2114 IVBSAXXMLReader
* iface
,
2115 const WCHAR
*secureBaseUrl
)
2117 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2119 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(secureBaseUrl
));
2123 static HRESULT WINAPI
saxxmlreader_parse(
2124 IVBSAXXMLReader
* iface
,
2127 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2128 return internal_parse(This
, varInput
, TRUE
);
2131 static HRESULT WINAPI
saxxmlreader_parseURL(
2132 IVBSAXXMLReader
* iface
,
2135 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2136 return internal_parseURL(This
, url
, TRUE
);
2139 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl
=
2141 saxxmlreader_QueryInterface
,
2142 saxxmlreader_AddRef
,
2143 saxxmlreader_Release
,
2144 saxxmlreader_GetTypeInfoCount
,
2145 saxxmlreader_GetTypeInfo
,
2146 saxxmlreader_GetIDsOfNames
,
2147 saxxmlreader_Invoke
,
2148 saxxmlreader_getFeature
,
2149 saxxmlreader_putFeature
,
2150 saxxmlreader_getProperty
,
2151 saxxmlreader_putProperty
,
2152 saxxmlreader_getEntityResolver
,
2153 saxxmlreader_putEntityResolver
,
2154 saxxmlreader_getContentHandler
,
2155 saxxmlreader_putContentHandler
,
2156 saxxmlreader_getDTDHandler
,
2157 saxxmlreader_putDTDHandler
,
2158 saxxmlreader_getErrorHandler
,
2159 saxxmlreader_putErrorHandler
,
2160 saxxmlreader_getBaseURL
,
2161 saxxmlreader_putBaseURL
,
2162 saxxmlreader_getSecureBaseURL
,
2163 saxxmlreader_putSecureBaseURL
,
2165 saxxmlreader_parseURL
2168 /*** ISAXXMLReader interface ***/
2169 /*** IUnknown methods ***/
2170 static HRESULT WINAPI
isaxxmlreader_QueryInterface(ISAXXMLReader
* iface
, REFIID riid
, void **ppvObject
)
2172 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2173 return saxxmlreader_QueryInterface((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
, riid
, ppvObject
);
2176 static ULONG WINAPI
isaxxmlreader_AddRef(ISAXXMLReader
* iface
)
2178 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2179 return saxxmlreader_AddRef((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
);
2182 static ULONG WINAPI
isaxxmlreader_Release(ISAXXMLReader
* iface
)
2184 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2185 return saxxmlreader_Release((IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
);
2188 /*** ISAXXMLReader methods ***/
2189 static HRESULT WINAPI
isaxxmlreader_getFeature(
2190 ISAXXMLReader
* iface
,
2191 const WCHAR
*pFeature
,
2192 VARIANT_BOOL
*pValue
)
2194 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2195 return IVBSAXXMLReader_getFeature(
2196 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2200 static HRESULT WINAPI
isaxxmlreader_putFeature(
2201 ISAXXMLReader
* iface
,
2202 const WCHAR
*pFeature
,
2203 VARIANT_BOOL vfValue
)
2205 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2206 return IVBSAXXMLReader_putFeature(
2207 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2211 static HRESULT WINAPI
isaxxmlreader_getProperty(
2212 ISAXXMLReader
* iface
,
2216 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2217 return IVBSAXXMLReader_getProperty(
2218 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2222 static HRESULT WINAPI
isaxxmlreader_putProperty(
2223 ISAXXMLReader
* iface
,
2227 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2228 return IVBSAXXMLReader_putProperty(
2229 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2233 static HRESULT WINAPI
isaxxmlreader_getEntityResolver(
2234 ISAXXMLReader
* iface
,
2235 ISAXEntityResolver
**ppEntityResolver
)
2237 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2238 return internal_getEntityResolver(This
, ppEntityResolver
, FALSE
);
2241 static HRESULT WINAPI
isaxxmlreader_putEntityResolver(
2242 ISAXXMLReader
* iface
,
2243 ISAXEntityResolver
*pEntityResolver
)
2245 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2246 return internal_putEntityResolver(This
, pEntityResolver
, FALSE
);
2249 static HRESULT WINAPI
isaxxmlreader_getContentHandler(
2250 ISAXXMLReader
* iface
,
2251 ISAXContentHandler
**pContentHandler
)
2253 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2254 return internal_getContentHandler(This
, pContentHandler
, FALSE
);
2257 static HRESULT WINAPI
isaxxmlreader_putContentHandler(
2258 ISAXXMLReader
* iface
,
2259 ISAXContentHandler
*contentHandler
)
2261 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2262 return internal_putContentHandler(This
, contentHandler
, FALSE
);
2265 static HRESULT WINAPI
isaxxmlreader_getDTDHandler(
2266 ISAXXMLReader
* iface
,
2267 ISAXDTDHandler
**pDTDHandler
)
2269 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2270 return internal_getDTDHandler(This
, pDTDHandler
, FALSE
);
2273 static HRESULT WINAPI
isaxxmlreader_putDTDHandler(
2274 ISAXXMLReader
* iface
,
2275 ISAXDTDHandler
*pDTDHandler
)
2277 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2278 return internal_putDTDHandler(This
, pDTDHandler
, FALSE
);
2281 static HRESULT WINAPI
isaxxmlreader_getErrorHandler(
2282 ISAXXMLReader
* iface
,
2283 ISAXErrorHandler
**pErrorHandler
)
2285 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2286 return internal_getErrorHandler(This
, pErrorHandler
, FALSE
);
2289 static HRESULT WINAPI
isaxxmlreader_putErrorHandler(
2290 ISAXXMLReader
* iface
,
2291 ISAXErrorHandler
*errorHandler
)
2293 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2294 return internal_putErrorHandler(This
, errorHandler
, FALSE
);
2297 static HRESULT WINAPI
isaxxmlreader_getBaseURL(
2298 ISAXXMLReader
* iface
,
2299 const WCHAR
**pBaseUrl
)
2301 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2302 return IVBSAXXMLReader_get_getBaseURL(
2303 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2307 static HRESULT WINAPI
isaxxmlreader_putBaseURL(
2308 ISAXXMLReader
* iface
,
2309 const WCHAR
*pBaseUrl
)
2311 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2312 return IVBSAXXMLReader_put_putBaseURL(
2313 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2317 static HRESULT WINAPI
isaxxmlreader_getSecureBaseURL(
2318 ISAXXMLReader
* iface
,
2319 const WCHAR
**pSecureBaseUrl
)
2321 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2322 return IVBSAXXMLReader_get_getSecureBaseURL(
2323 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2327 static HRESULT WINAPI
isaxxmlreader_putSecureBaseURL(
2328 ISAXXMLReader
* iface
,
2329 const WCHAR
*secureBaseUrl
)
2331 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2332 return IVBSAXXMLReader_put_putSecureBaseURL(
2333 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2337 static HRESULT WINAPI
isaxxmlreader_parse(
2338 ISAXXMLReader
* iface
,
2341 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2342 return internal_parse(This
, varInput
, FALSE
);
2345 static HRESULT WINAPI
isaxxmlreader_parseURL(
2346 ISAXXMLReader
* iface
,
2349 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2350 return internal_parseURL(This
, url
, FALSE
);
2353 static const struct ISAXXMLReaderVtbl isaxreader_vtbl
=
2355 isaxxmlreader_QueryInterface
,
2356 isaxxmlreader_AddRef
,
2357 isaxxmlreader_Release
,
2358 isaxxmlreader_getFeature
,
2359 isaxxmlreader_putFeature
,
2360 isaxxmlreader_getProperty
,
2361 isaxxmlreader_putProperty
,
2362 isaxxmlreader_getEntityResolver
,
2363 isaxxmlreader_putEntityResolver
,
2364 isaxxmlreader_getContentHandler
,
2365 isaxxmlreader_putContentHandler
,
2366 isaxxmlreader_getDTDHandler
,
2367 isaxxmlreader_putDTDHandler
,
2368 isaxxmlreader_getErrorHandler
,
2369 isaxxmlreader_putErrorHandler
,
2370 isaxxmlreader_getBaseURL
,
2371 isaxxmlreader_putBaseURL
,
2372 isaxxmlreader_getSecureBaseURL
,
2373 isaxxmlreader_putSecureBaseURL
,
2374 isaxxmlreader_parse
,
2375 isaxxmlreader_parseURL
2378 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
2382 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
2384 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
2386 return E_OUTOFMEMORY
;
2388 reader
->lpVBSAXXMLReaderVtbl
= &saxreader_vtbl
;
2389 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
2391 reader
->contentHandler
= NULL
;
2392 reader
->errorHandler
= NULL
;
2394 memset(&reader
->sax
, 0, sizeof(xmlSAXHandler
));
2395 reader
->sax
.initialized
= XML_SAX2_MAGIC
;
2396 reader
->sax
.startDocument
= libxmlStartDocument
;
2397 reader
->sax
.endDocument
= libxmlEndDocument
;
2398 reader
->sax
.startElementNs
= libxmlStartElementNS
;
2399 reader
->sax
.endElementNs
= libxmlEndElementNS
;
2400 reader
->sax
.characters
= libxmlCharacters
;
2401 reader
->sax
.setDocumentLocator
= libxmlSetDocumentLocator
;
2402 reader
->sax
.error
= libxmlFatalError
;
2403 reader
->sax
.fatalError
= libxmlFatalError
;
2405 *ppObj
= &reader
->lpVBSAXXMLReaderVtbl
;
2407 TRACE("returning iface %p\n", *ppObj
);
2414 HRESULT
SAXXMLReader_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
2416 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2417 "libxml2 support was not present at compile time.\n");