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;
58 struct ISAXLexicalHandler *lexicalHandler;
59 struct IVBSAXLexicalHandler *vblexicalHandler;
60 struct ISAXDeclHandler *declHandler;
61 struct IVBSAXDeclHandler *vbdeclHandler;
66 typedef struct _saxlocator
68 const struct IVBSAXLocatorVtbl *lpVBSAXLocatorVtbl;
69 const struct ISAXLocatorVtbl *lpSAXLocatorVtbl;
73 xmlParserCtxtPtr pParserCtxt;
87 typedef struct _saxattributes
89 const struct IVBSAXAttributesVtbl *lpVBSAXAttributesVtbl;
90 const struct ISAXAttributesVtbl *lpSAXAttributesVtbl;
99 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
101 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpVBSAXXMLReaderVtbl));
104 static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
106 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpSAXXMLReaderVtbl));
109 static inline saxlocator *impl_from_IVBSAXLocator( IVBSAXLocator *iface )
111 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpVBSAXLocatorVtbl));
114 static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
116 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl));
119 static inline saxattributes *impl_from_IVBSAXAttributes( IVBSAXAttributes *iface )
121 return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpVBSAXAttributesVtbl));
124 static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface )
126 return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpSAXAttributesVtbl));
129 static inline BOOL has_content_handler(const saxlocator *locator)
131 return (locator->vbInterface && locator->saxreader->vbcontentHandler) ||
132 (!locator->vbInterface && locator->saxreader->contentHandler);
135 static inline BOOL has_error_handler(const saxlocator *locator)
137 return (locator->vbInterface && locator->saxreader->vberrorHandler) ||
138 (!locator->vbInterface && locator->saxreader->errorHandler);
141 static HRESULT namespacePush(saxlocator *locator, int ns)
143 if(locator->nsStackLast>=locator->nsStackSize)
147 new_stack = HeapReAlloc(GetProcessHeap(), 0,
148 locator->nsStack, sizeof(int)*locator->nsStackSize*2);
149 if(!new_stack) return E_OUTOFMEMORY;
150 locator->nsStack = new_stack;
151 locator->nsStackSize *= 2;
153 locator->nsStack[locator->nsStackLast++] = ns;
158 static int namespacePop(saxlocator *locator)
160 if(locator->nsStackLast == 0) return 0;
161 return locator->nsStack[--locator->nsStackLast];
164 static BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
172 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0);
173 if(len != -1) dLen++;
174 bstr = SysAllocStringLen(NULL, dLen-1);
177 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, bstr, dLen);
178 if(len != -1) bstr[dLen-1] = '\0';
183 static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name)
188 if(!name) return NULL;
190 if(!prefix || !*prefix)
191 return bstr_from_xmlChar(name);
193 qname = xmlBuildQName(name, prefix, NULL, 0);
194 bstr = bstr_from_xmlChar(qname);
200 static void format_error_message_from_id(saxlocator *This, HRESULT hr)
202 xmlStopParser(This->pParserCtxt);
205 if(has_error_handler(This))
208 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
209 NULL, hr, 0, msg, sizeof(msg), NULL))
211 FIXME("MSXML errors not yet supported.\n");
215 if(This->vbInterface)
217 BSTR bstrMsg = SysAllocString(msg);
218 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
219 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrMsg, hr);
220 SysFreeString(bstrMsg);
223 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
224 (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
228 static void update_position(saxlocator *This, xmlChar *end)
230 if(This->lastCur == NULL)
232 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
234 This->realColumn = 1;
236 else if(This->lastCur < This->pParserCtxt->input->base)
238 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
240 This->realColumn = 1;
243 if(This->pParserCtxt->input->cur<This->lastCur)
245 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
247 This->realColumn = 1;
250 if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
252 while(This->lastCur < end)
254 if(*(This->lastCur) == '\n')
257 This->realColumn = 1;
259 else if(*(This->lastCur) == '\r' &&
260 (This->lastCur==This->pParserCtxt->input->end ||
261 *(This->lastCur+1)!='\n'))
264 This->realColumn = 1;
266 else This->realColumn++;
270 /* Count multibyte UTF8 encoded characters once */
271 while((*(This->lastCur)&0xC0) == 0x80) This->lastCur++;
274 This->line = This->realLine;
275 This->column = This->realColumn;
278 /*** IVBSAXAttributes interface ***/
279 /*** IUnknown methods ***/
280 static HRESULT WINAPI ivbsaxattributes_QueryInterface(
281 IVBSAXAttributes* iface,
285 saxattributes *This = impl_from_IVBSAXAttributes(iface);
287 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
291 if (IsEqualGUID(riid, &IID_IUnknown) ||
292 IsEqualGUID(riid, &IID_IDispatch) ||
293 IsEqualGUID(riid, &IID_IVBSAXAttributes))
299 FIXME("interface %s not implemented\n", debugstr_guid(riid));
300 return E_NOINTERFACE;
303 IVBSAXAttributes_AddRef(iface);
308 static ULONG WINAPI ivbsaxattributes_AddRef(IVBSAXAttributes* iface)
310 saxattributes *This = impl_from_IVBSAXAttributes(iface);
311 return ISAXAttributes_AddRef((ISAXAttributes*)&This->lpSAXAttributesVtbl);
314 static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes* iface)
316 saxattributes *This = impl_from_IVBSAXAttributes(iface);
317 return ISAXAttributes_Release((ISAXAttributes*)&This->lpSAXAttributesVtbl);
320 /*** IDispatch methods ***/
321 static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes *iface, UINT* pctinfo )
323 saxattributes *This = impl_from_IVBSAXAttributes( iface );
325 TRACE("(%p)->(%p)\n", This, pctinfo);
332 static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(
333 IVBSAXAttributes *iface,
334 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
336 saxattributes *This = impl_from_IVBSAXAttributes( iface );
339 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
341 hr = get_typeinfo(IVBSAXAttributes_tid, ppTInfo);
346 static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(
347 IVBSAXAttributes *iface,
354 saxattributes *This = impl_from_IVBSAXAttributes( iface );
358 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
361 if(!rgszNames || cNames == 0 || !rgDispId)
364 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
367 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
368 ITypeInfo_Release(typeinfo);
374 static HRESULT WINAPI ivbsaxattributes_Invoke(
375 IVBSAXAttributes *iface,
380 DISPPARAMS* pDispParams,
382 EXCEPINFO* pExcepInfo,
385 saxattributes *This = impl_from_IVBSAXAttributes( iface );
389 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
390 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
392 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
395 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXAttributesVtbl), dispIdMember, wFlags, pDispParams,
396 pVarResult, pExcepInfo, puArgErr);
397 ITypeInfo_Release(typeinfo);
403 /*** IVBSAXAttributes methods ***/
404 static HRESULT WINAPI ivbsaxattributes_get_length(
405 IVBSAXAttributes* iface,
408 saxattributes *This = impl_from_IVBSAXAttributes( iface );
409 return ISAXAttributes_getLength(
410 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
414 static HRESULT WINAPI ivbsaxattributes_getURI(
415 IVBSAXAttributes* iface,
420 saxattributes *This = impl_from_IVBSAXAttributes( iface );
421 return ISAXAttributes_getURI(
422 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
423 nIndex, (const WCHAR**)uri, &len);
426 static HRESULT WINAPI ivbsaxattributes_getLocalName(
427 IVBSAXAttributes* iface,
432 saxattributes *This = impl_from_IVBSAXAttributes( iface );
433 return ISAXAttributes_getLocalName(
434 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
435 nIndex, (const WCHAR**)localName, &len);
438 static HRESULT WINAPI ivbsaxattributes_getQName(
439 IVBSAXAttributes* iface,
444 saxattributes *This = impl_from_IVBSAXAttributes( iface );
445 return ISAXAttributes_getQName(
446 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
447 nIndex, (const WCHAR**)QName, &len);
450 static HRESULT WINAPI ivbsaxattributes_getIndexFromName(
451 IVBSAXAttributes* iface,
456 saxattributes *This = impl_from_IVBSAXAttributes( iface );
457 return ISAXAttributes_getIndexFromName(
458 (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
459 localName, SysStringLen(localName), index);
462 static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(
463 IVBSAXAttributes* iface,
467 saxattributes *This = impl_from_IVBSAXAttributes( iface );
468 return ISAXAttributes_getIndexFromQName(
469 (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
470 SysStringLen(QName), index);
473 static HRESULT WINAPI ivbsaxattributes_getType(
474 IVBSAXAttributes* iface,
479 saxattributes *This = impl_from_IVBSAXAttributes( iface );
480 return ISAXAttributes_getType(
481 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
482 nIndex, (const WCHAR**)type, &len);
485 static HRESULT WINAPI ivbsaxattributes_getTypeFromName(
486 IVBSAXAttributes* iface,
492 saxattributes *This = impl_from_IVBSAXAttributes( iface );
493 return ISAXAttributes_getTypeFromName(
494 (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
495 localName, SysStringLen(localName), (const WCHAR**)type, &len);
498 static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(
499 IVBSAXAttributes* iface,
504 saxattributes *This = impl_from_IVBSAXAttributes( iface );
505 return ISAXAttributes_getTypeFromQName(
506 (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
507 SysStringLen(QName), (const WCHAR**)type, &len);
510 static HRESULT WINAPI ivbsaxattributes_getValue(
511 IVBSAXAttributes* iface,
516 saxattributes *This = impl_from_IVBSAXAttributes( iface );
517 return ISAXAttributes_getValue(
518 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
519 nIndex, (const WCHAR**)value, &len);
522 static HRESULT WINAPI ivbsaxattributes_getValueFromName(
523 IVBSAXAttributes* iface,
529 saxattributes *This = impl_from_IVBSAXAttributes( iface );
530 return ISAXAttributes_getValueFromName(
531 (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
532 localName, SysStringLen(localName), (const WCHAR**)value, &len);
535 static HRESULT WINAPI ivbsaxattributes_getValueFromQName(
536 IVBSAXAttributes* iface,
541 saxattributes *This = impl_from_IVBSAXAttributes( iface );
542 return ISAXAttributes_getValueFromQName(
543 (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
544 SysStringLen(QName), (const WCHAR**)value, &len);
547 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
549 ivbsaxattributes_QueryInterface,
550 ivbsaxattributes_AddRef,
551 ivbsaxattributes_Release,
552 ivbsaxattributes_GetTypeInfoCount,
553 ivbsaxattributes_GetTypeInfo,
554 ivbsaxattributes_GetIDsOfNames,
555 ivbsaxattributes_Invoke,
556 ivbsaxattributes_get_length,
557 ivbsaxattributes_getURI,
558 ivbsaxattributes_getLocalName,
559 ivbsaxattributes_getQName,
560 ivbsaxattributes_getIndexFromName,
561 ivbsaxattributes_getIndexFromQName,
562 ivbsaxattributes_getType,
563 ivbsaxattributes_getTypeFromName,
564 ivbsaxattributes_getTypeFromQName,
565 ivbsaxattributes_getValue,
566 ivbsaxattributes_getValueFromName,
567 ivbsaxattributes_getValueFromQName
570 /*** ISAXAttributes interface ***/
571 /*** IUnknown methods ***/
572 static HRESULT WINAPI isaxattributes_QueryInterface(
573 ISAXAttributes* iface,
577 saxattributes *This = impl_from_ISAXAttributes(iface);
579 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
583 if (IsEqualGUID(riid, &IID_IUnknown) ||
584 IsEqualGUID(riid, &IID_ISAXAttributes))
590 FIXME("interface %s not implemented\n", debugstr_guid(riid));
591 return E_NOINTERFACE;
594 ISAXAttributes_AddRef(iface);
599 static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
601 saxattributes *This = impl_from_ISAXAttributes(iface);
603 return InterlockedIncrement(&This->ref);
606 static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
608 saxattributes *This = impl_from_ISAXAttributes(iface);
613 ref = InterlockedDecrement(&This->ref);
617 for(index=0; index<This->nb_attributes; index++)
619 SysFreeString(This->szLocalname[index]);
620 SysFreeString(This->szURI[index]);
621 SysFreeString(This->szValue[index]);
622 SysFreeString(This->szQName[index]);
625 heap_free(This->szLocalname);
626 heap_free(This->szURI);
627 heap_free(This->szValue);
628 heap_free(This->szQName);
636 /*** ISAXAttributes methods ***/
637 static HRESULT WINAPI isaxattributes_getLength(
638 ISAXAttributes* iface,
641 saxattributes *This = impl_from_ISAXAttributes( iface );
643 *length = This->nb_attributes;
644 TRACE("Length set to %d\n", *length);
648 static HRESULT WINAPI isaxattributes_getURI(
649 ISAXAttributes* iface,
654 saxattributes *This = impl_from_ISAXAttributes( iface );
655 TRACE("(%p)->(%d)\n", This, nIndex);
657 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
658 if(!pUrl || !pUriSize) return E_POINTER;
660 *pUriSize = SysStringLen(This->szURI[nIndex]);
661 *pUrl = This->szURI[nIndex];
666 static HRESULT WINAPI isaxattributes_getLocalName(
667 ISAXAttributes* iface,
669 const WCHAR **pLocalName,
670 int *pLocalNameLength)
672 saxattributes *This = impl_from_ISAXAttributes( iface );
673 TRACE("(%p)->(%d)\n", This, nIndex);
675 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
676 if(!pLocalName || !pLocalNameLength) return E_POINTER;
678 *pLocalNameLength = SysStringLen(This->szLocalname[nIndex]);
679 *pLocalName = This->szLocalname[nIndex];
684 static HRESULT WINAPI isaxattributes_getQName(
685 ISAXAttributes* iface,
687 const WCHAR **pQName,
690 saxattributes *This = impl_from_ISAXAttributes( iface );
691 TRACE("(%p)->(%d)\n", This, nIndex);
693 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
694 if(!pQName || !pQNameLength) return E_POINTER;
696 *pQNameLength = SysStringLen(This->szQName[nIndex]);
697 *pQName = This->szQName[nIndex];
702 static HRESULT WINAPI isaxattributes_getName(
703 ISAXAttributes* iface,
707 const WCHAR **pLocalName,
709 const WCHAR **pQName,
712 saxattributes *This = impl_from_ISAXAttributes( iface );
713 TRACE("(%p)->(%d)\n", This, nIndex);
715 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
716 if(!pUri || !pUriLength || !pLocalName || !pLocalNameSize
717 || !pQName || !pQNameLength) return E_POINTER;
719 *pUriLength = SysStringLen(This->szURI[nIndex]);
720 *pUri = This->szURI[nIndex];
721 *pLocalNameSize = SysStringLen(This->szLocalname[nIndex]);
722 *pLocalName = This->szLocalname[nIndex];
723 *pQNameLength = SysStringLen(This->szQName[nIndex]);
724 *pQName = This->szQName[nIndex];
729 static HRESULT WINAPI isaxattributes_getIndexFromName(
730 ISAXAttributes* iface,
733 const WCHAR *pLocalName,
737 saxattributes *This = impl_from_ISAXAttributes( iface );
739 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), cUriLength,
740 debugstr_w(pLocalName), cocalNameLength);
742 if(!pUri || !pLocalName || !index) return E_POINTER;
744 for(i=0; i<This->nb_attributes; i++)
746 if(cUriLength!=SysStringLen(This->szURI[i])
747 || cocalNameLength!=SysStringLen(This->szLocalname[i]))
749 if(cUriLength && memcmp(pUri, This->szURI[i],
750 sizeof(WCHAR)*cUriLength))
752 if(cocalNameLength && memcmp(pLocalName, This->szLocalname[i],
753 sizeof(WCHAR)*cocalNameLength))
763 static HRESULT WINAPI isaxattributes_getIndexFromQName(
764 ISAXAttributes* iface,
769 saxattributes *This = impl_from_ISAXAttributes( iface );
771 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQNameLength);
773 if(!pQName || !index) return E_POINTER;
774 if(!nQNameLength) return E_INVALIDARG;
776 for(i=0; i<This->nb_attributes; i++)
778 if(nQNameLength!=SysStringLen(This->szQName[i])) continue;
779 if(memcmp(pQName, This->szQName, sizeof(WCHAR)*nQNameLength)) continue;
788 static HRESULT WINAPI isaxattributes_getType(
789 ISAXAttributes* iface,
794 saxattributes *This = impl_from_ISAXAttributes( iface );
796 FIXME("(%p)->(%d) stub\n", This, nIndex);
800 static HRESULT WINAPI isaxattributes_getTypeFromName(
801 ISAXAttributes* iface,
804 const WCHAR *pLocalName,
809 saxattributes *This = impl_from_ISAXAttributes( iface );
811 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
812 debugstr_w(pLocalName), nLocalName);
816 static HRESULT WINAPI isaxattributes_getTypeFromQName(
817 ISAXAttributes* iface,
823 saxattributes *This = impl_from_ISAXAttributes( iface );
825 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
829 static HRESULT WINAPI isaxattributes_getValue(
830 ISAXAttributes* iface,
832 const WCHAR **pValue,
835 saxattributes *This = impl_from_ISAXAttributes( iface );
836 TRACE("(%p)->(%d)\n", This, nIndex);
838 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
839 if(!pValue || !nValue) return E_POINTER;
841 *nValue = SysStringLen(This->szValue[nIndex]);
842 *pValue = This->szValue[nIndex];
847 static HRESULT WINAPI isaxattributes_getValueFromName(
848 ISAXAttributes* iface,
851 const WCHAR *pLocalName,
853 const WCHAR **pValue,
858 saxattributes *This = impl_from_ISAXAttributes( iface );
859 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), nUri,
860 debugstr_w(pLocalName), nLocalName);
862 hr = ISAXAttributes_getIndexFromName(iface,
863 pUri, nUri, pLocalName, nLocalName, &index);
864 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
869 static HRESULT WINAPI isaxattributes_getValueFromQName(
870 ISAXAttributes* iface,
873 const WCHAR **pValue,
878 saxattributes *This = impl_from_ISAXAttributes( iface );
879 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQName);
881 hr = ISAXAttributes_getIndexFromQName(iface, pQName, nQName, &index);
882 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
887 static const struct ISAXAttributesVtbl isaxattributes_vtbl =
889 isaxattributes_QueryInterface,
890 isaxattributes_AddRef,
891 isaxattributes_Release,
892 isaxattributes_getLength,
893 isaxattributes_getURI,
894 isaxattributes_getLocalName,
895 isaxattributes_getQName,
896 isaxattributes_getName,
897 isaxattributes_getIndexFromName,
898 isaxattributes_getIndexFromQName,
899 isaxattributes_getType,
900 isaxattributes_getTypeFromName,
901 isaxattributes_getTypeFromQName,
902 isaxattributes_getValue,
903 isaxattributes_getValueFromName,
904 isaxattributes_getValueFromQName
907 static HRESULT SAXAttributes_create(saxattributes **attr,
908 int nb_namespaces, const xmlChar **xmlNamespaces,
909 int nb_attributes, const xmlChar **xmlAttributes)
911 saxattributes *attributes;
913 static const xmlChar xmlns[] = "xmlns";
915 attributes = heap_alloc(sizeof(*attributes));
917 return E_OUTOFMEMORY;
919 attributes->lpVBSAXAttributesVtbl = &ivbsaxattributes_vtbl;
920 attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
923 attributes->nb_attributes = nb_namespaces+nb_attributes;
925 attributes->szLocalname = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
926 attributes->szURI = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
927 attributes->szValue = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
928 attributes->szQName = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
930 if(!attributes->szLocalname || !attributes->szURI
931 || !attributes->szValue || !attributes->szQName)
933 heap_free(attributes->szLocalname);
934 heap_free(attributes->szURI);
935 heap_free(attributes->szValue);
936 heap_free(attributes->szQName);
937 heap_free(attributes);
941 for(index=0; index<nb_namespaces; index++)
943 attributes->szLocalname[index] = SysAllocStringLen(NULL, 0);
944 attributes->szURI[index] = SysAllocStringLen(NULL, 0);
945 attributes->szValue[index] = bstr_from_xmlChar(xmlNamespaces[2*index+1]);
946 attributes->szQName[index] = QName_from_xmlChar(xmlns, xmlNamespaces[2*index]);
949 for(index=0; index<nb_attributes; index++)
951 attributes->szLocalname[nb_namespaces+index] =
952 bstr_from_xmlChar(xmlAttributes[index*5]);
953 attributes->szURI[nb_namespaces+index] =
954 bstr_from_xmlChar(xmlAttributes[index*5+2]);
955 attributes->szValue[nb_namespaces+index] =
956 bstr_from_xmlCharN(xmlAttributes[index*5+3],
957 xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
958 attributes->szQName[nb_namespaces+index] =
959 QName_from_xmlChar(xmlAttributes[index*5+1], xmlAttributes[index*5]);
964 TRACE("returning %p\n", *attr);
969 /*** LibXML callbacks ***/
970 static void libxmlStartDocument(void *ctx)
972 saxlocator *This = ctx;
975 if(has_content_handler(This))
977 if(This->vbInterface)
978 hr = IVBSAXContentHandler_startDocument(This->saxreader->vbcontentHandler);
980 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
983 format_error_message_from_id(This, hr);
986 update_position(This, NULL);
989 static void libxmlEndDocument(void *ctx)
991 saxlocator *This = ctx;
997 if(This->ret != S_OK) return;
999 if(has_content_handler(This))
1001 if(This->vbInterface)
1002 hr = IVBSAXContentHandler_endDocument(This->saxreader->vbcontentHandler);
1004 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
1007 format_error_message_from_id(This, hr);
1011 static void libxmlStartElementNS(
1013 const xmlChar *localname,
1014 const xmlChar *prefix,
1017 const xmlChar **namespaces,
1020 const xmlChar **attributes)
1022 BSTR NamespaceUri, LocalName, QName, Prefix, Uri;
1023 saxlocator *This = ctx;
1025 saxattributes *attr;
1028 if(*(This->pParserCtxt->input->cur) == '/')
1029 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+2);
1031 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
1033 hr = namespacePush(This, nb_namespaces);
1034 if(hr==S_OK && has_content_handler(This))
1036 for(index=0; index<nb_namespaces; index++)
1038 Prefix = bstr_from_xmlChar(namespaces[2*index]);
1039 Uri = bstr_from_xmlChar(namespaces[2*index+1]);
1041 if(This->vbInterface)
1042 hr = IVBSAXContentHandler_startPrefixMapping(
1043 This->saxreader->vbcontentHandler,
1046 hr = ISAXContentHandler_startPrefixMapping(
1047 This->saxreader->contentHandler,
1048 Prefix, SysStringLen(Prefix),
1049 Uri, SysStringLen(Uri));
1051 SysFreeString(Prefix);
1056 format_error_message_from_id(This, hr);
1061 NamespaceUri = bstr_from_xmlChar(URI);
1062 LocalName = bstr_from_xmlChar(localname);
1063 QName = QName_from_xmlChar(prefix, localname);
1065 hr = SAXAttributes_create(&attr, nb_namespaces, namespaces, nb_attributes, attributes);
1068 if(This->vbInterface)
1069 hr = IVBSAXContentHandler_startElement(
1070 This->saxreader->vbcontentHandler,
1071 &NamespaceUri, &LocalName, &QName,
1072 (IVBSAXAttributes*)&attr->lpVBSAXAttributesVtbl);
1074 hr = ISAXContentHandler_startElement(
1075 This->saxreader->contentHandler,
1076 NamespaceUri, SysStringLen(NamespaceUri),
1077 LocalName, SysStringLen(LocalName),
1078 QName, SysStringLen(QName),
1079 (ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1081 ISAXAttributes_Release((ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1084 SysFreeString(NamespaceUri);
1085 SysFreeString(LocalName);
1086 SysFreeString(QName);
1090 format_error_message_from_id(This, hr);
1093 static void libxmlEndElementNS(
1095 const xmlChar *localname,
1096 const xmlChar *prefix,
1099 BSTR NamespaceUri, LocalName, QName, Prefix;
1100 saxlocator *This = ctx;
1105 end = (xmlChar*)This->pParserCtxt->input->cur;
1106 if(*(end-1) != '>' || *(end-2) != '/')
1107 while(end-2>=This->pParserCtxt->input->base
1108 && *(end-2)!='<' && *(end-1)!='/') end--;
1110 update_position(This, end);
1112 nsNr = namespacePop(This);
1114 if(has_content_handler(This))
1116 NamespaceUri = bstr_from_xmlChar(URI);
1117 LocalName = bstr_from_xmlChar(localname);
1118 QName = QName_from_xmlChar(prefix, localname);
1120 if(This->vbInterface)
1121 hr = IVBSAXContentHandler_endElement(
1122 This->saxreader->vbcontentHandler,
1123 &NamespaceUri, &LocalName, &QName);
1125 hr = ISAXContentHandler_endElement(
1126 This->saxreader->contentHandler,
1127 NamespaceUri, SysStringLen(NamespaceUri),
1128 LocalName, SysStringLen(LocalName),
1129 QName, SysStringLen(QName));
1131 SysFreeString(NamespaceUri);
1132 SysFreeString(LocalName);
1133 SysFreeString(QName);
1137 format_error_message_from_id(This, hr);
1141 for(index=This->pParserCtxt->nsNr-2;
1142 index>=This->pParserCtxt->nsNr-nsNr*2; index-=2)
1144 Prefix = bstr_from_xmlChar(This->pParserCtxt->nsTab[index]);
1146 if(This->vbInterface)
1147 hr = IVBSAXContentHandler_endPrefixMapping(
1148 This->saxreader->vbcontentHandler, &Prefix);
1150 hr = ISAXContentHandler_endPrefixMapping(
1151 This->saxreader->contentHandler,
1152 Prefix, SysStringLen(Prefix));
1154 SysFreeString(Prefix);
1158 format_error_message_from_id(This, hr);
1165 update_position(This, NULL);
1168 static void libxmlCharacters(
1173 saxlocator *This = ctx;
1178 BOOL lastEvent = FALSE;
1180 if(!(has_content_handler(This))) return;
1183 if(*(ch-1)=='\r') cur--;
1186 if(ch<This->pParserCtxt->input->base || ch>This->pParserCtxt->input->end)
1191 while(end-ch<len && *end!='\r') end++;
1198 if(!lastEvent) *end = '\n';
1200 Chars = bstr_from_xmlCharN(cur, end-cur+1);
1201 if(This->vbInterface)
1202 hr = IVBSAXContentHandler_characters(
1203 This->saxreader->vbcontentHandler, &Chars);
1205 hr = ISAXContentHandler_characters(
1206 This->saxreader->contentHandler,
1207 Chars, SysStringLen(Chars));
1208 SysFreeString(Chars);
1212 format_error_message_from_id(This, hr);
1216 This->column += end-cur+1;
1230 if(end-ch == len) break;
1233 if(ch<This->pParserCtxt->input->base || ch>This->pParserCtxt->input->end)
1234 This->column = This->realColumn
1235 +This->pParserCtxt->input->cur-This->lastCur;
1238 static void libxmlSetDocumentLocator(
1240 xmlSAXLocatorPtr loc)
1242 saxlocator *This = ctx;
1245 if(has_content_handler(This))
1247 if(This->vbInterface)
1248 hr = IVBSAXContentHandler_putref_documentLocator(
1249 This->saxreader->vbcontentHandler,
1250 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
1252 hr = ISAXContentHandler_putDocumentLocator(
1253 This->saxreader->contentHandler,
1254 (ISAXLocator*)&This->lpSAXLocatorVtbl);
1258 format_error_message_from_id(This, hr);
1261 static void libxmlComment(void *ctx, const xmlChar *value)
1263 saxlocator *This = ctx;
1266 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur;
1268 while(beg-4>=This->pParserCtxt->input->base
1269 && memcmp(beg-4, "<!--", sizeof(char[4]))) beg--;
1270 update_position(This, beg);
1272 if(!This->vbInterface && !This->saxreader->lexicalHandler) return;
1273 if(This->vbInterface && !This->saxreader->vblexicalHandler) return;
1275 bValue = bstr_from_xmlChar(value);
1277 if(This->vbInterface)
1278 hr = IVBSAXLexicalHandler_comment(
1279 This->saxreader->vblexicalHandler, &bValue);
1281 hr = ISAXLexicalHandler_comment(
1282 This->saxreader->lexicalHandler,
1283 bValue, SysStringLen(bValue));
1285 SysFreeString(bValue);
1288 format_error_message_from_id(This, hr);
1290 update_position(This, NULL);
1293 static void libxmlFatalError(void *ctx, const char *msg, ...)
1295 saxlocator *This = ctx;
1301 if(!has_error_handler(This))
1303 xmlStopParser(This->pParserCtxt);
1308 FIXME("Error handling is not compatible.\n");
1310 va_start(args, msg);
1311 vsprintf(message, msg, args);
1314 len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0);
1315 error = heap_alloc(sizeof(WCHAR)*len);
1318 MultiByteToWideChar(CP_UNIXCP, 0, message, -1, error, len);
1319 TRACE("fatal error for %p: %s\n", This, debugstr_w(error));
1322 if(This->vbInterface)
1324 BSTR bstrError = SysAllocString(error);
1325 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
1326 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrError, E_FAIL);
1327 SysFreeString(bstrError);
1330 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
1331 (ISAXLocator*)&This->lpSAXLocatorVtbl, error, E_FAIL);
1335 xmlStopParser(This->pParserCtxt);
1339 static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len)
1341 saxlocator *This = ctx;
1343 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur-len;
1347 BOOL lastEvent = FALSE, change;
1349 while(beg-9>=This->pParserCtxt->input->base
1350 && memcmp(beg-9, "<![CDATA[", sizeof(char[9]))) beg--;
1351 update_position(This, beg);
1353 if(This->vbInterface && This->saxreader->vblexicalHandler)
1354 hr = IVBSAXLexicalHandler_startCDATA(This->saxreader->vblexicalHandler);
1355 if(!This->vbInterface && This->saxreader->lexicalHandler)
1356 hr = ISAXLexicalHandler_startCDATA(This->saxreader->lexicalHandler);
1360 format_error_message_from_id(This, hr);
1364 realLen = This->pParserCtxt->input->cur-beg-3;
1370 while(end-beg<realLen && *end!='\r') end++;
1371 if(end-beg==realLen)
1376 else if(end-beg==realLen-1 && *end=='\r' && *(end+1)=='\n')
1379 if(*end == '\r') change = TRUE;
1380 else change = FALSE;
1382 if(change) *end = '\n';
1384 if(has_content_handler(This))
1386 Chars = bstr_from_xmlCharN(cur, end-cur+1);
1387 if(This->vbInterface)
1388 hr = IVBSAXContentHandler_characters(
1389 This->saxreader->vbcontentHandler, &Chars);
1391 hr = ISAXContentHandler_characters(
1392 This->saxreader->contentHandler,
1393 Chars, SysStringLen(Chars));
1394 SysFreeString(Chars);
1397 if(change) *end = '\r';
1402 This->column += end-cur+2;
1407 if(This->vbInterface && This->saxreader->vblexicalHandler)
1408 hr = IVBSAXLexicalHandler_endCDATA(This->saxreader->vblexicalHandler);
1409 if(!This->vbInterface && This->saxreader->lexicalHandler)
1410 hr = ISAXLexicalHandler_endCDATA(This->saxreader->lexicalHandler);
1413 format_error_message_from_id(This, hr);
1415 This->column += 4+end-cur;
1418 /*** IVBSAXLocator interface ***/
1419 /*** IUnknown methods ***/
1420 static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject)
1422 saxlocator *This = impl_from_IVBSAXLocator( iface );
1424 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject);
1428 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1429 IsEqualGUID( riid, &IID_IDispatch) ||
1430 IsEqualGUID( riid, &IID_IVBSAXLocator ))
1436 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1437 return E_NOINTERFACE;
1440 IVBSAXLocator_AddRef( iface );
1445 static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator* iface)
1447 saxlocator *This = impl_from_IVBSAXLocator( iface );
1448 TRACE("%p\n", This );
1449 return InterlockedIncrement( &This->ref );
1452 static ULONG WINAPI ivbsaxlocator_Release(
1453 IVBSAXLocator* iface)
1455 saxlocator *This = impl_from_IVBSAXLocator( iface );
1456 return ISAXLocator_Release((ISAXLocator*)&This->lpVBSAXLocatorVtbl);
1459 /*** IDispatch methods ***/
1460 static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator *iface, UINT* pctinfo )
1462 saxlocator *This = impl_from_IVBSAXLocator( iface );
1464 TRACE("(%p)->(%p)\n", This, pctinfo);
1471 static HRESULT WINAPI ivbsaxlocator_GetTypeInfo(
1472 IVBSAXLocator *iface,
1473 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
1475 saxlocator *This = impl_from_IVBSAXLocator( iface );
1478 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1480 hr = get_typeinfo(IVBSAXLocator_tid, ppTInfo);
1485 static HRESULT WINAPI ivbsaxlocator_GetIDsOfNames(
1486 IVBSAXLocator *iface,
1488 LPOLESTR* rgszNames,
1493 saxlocator *This = impl_from_IVBSAXLocator( iface );
1494 ITypeInfo *typeinfo;
1497 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1500 if(!rgszNames || cNames == 0 || !rgDispId)
1501 return E_INVALIDARG;
1503 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1506 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1507 ITypeInfo_Release(typeinfo);
1513 static HRESULT WINAPI ivbsaxlocator_Invoke(
1514 IVBSAXLocator *iface,
1515 DISPID dispIdMember,
1519 DISPPARAMS* pDispParams,
1520 VARIANT* pVarResult,
1521 EXCEPINFO* pExcepInfo,
1524 saxlocator *This = impl_from_IVBSAXLocator( iface );
1525 ITypeInfo *typeinfo;
1528 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1529 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1531 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1534 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXLocatorVtbl), dispIdMember, wFlags, pDispParams,
1535 pVarResult, pExcepInfo, puArgErr);
1536 ITypeInfo_Release(typeinfo);
1542 /*** IVBSAXLocator methods ***/
1543 static HRESULT WINAPI ivbsaxlocator_get_columnNumber(
1544 IVBSAXLocator* iface,
1547 saxlocator *This = impl_from_IVBSAXLocator( iface );
1548 return ISAXLocator_getColumnNumber(
1549 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1553 static HRESULT WINAPI ivbsaxlocator_get_lineNumber(
1554 IVBSAXLocator* iface,
1557 saxlocator *This = impl_from_IVBSAXLocator( iface );
1558 return ISAXLocator_getLineNumber(
1559 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1563 static HRESULT WINAPI ivbsaxlocator_get_publicId(
1564 IVBSAXLocator* iface,
1567 saxlocator *This = impl_from_IVBSAXLocator( iface );
1568 return ISAXLocator_getPublicId(
1569 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1570 (const WCHAR**)publicId);
1573 static HRESULT WINAPI ivbsaxlocator_get_systemId(
1574 IVBSAXLocator* iface,
1577 saxlocator *This = impl_from_IVBSAXLocator( iface );
1578 return ISAXLocator_getSystemId(
1579 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1580 (const WCHAR**)systemId);
1583 static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl =
1585 ivbsaxlocator_QueryInterface,
1586 ivbsaxlocator_AddRef,
1587 ivbsaxlocator_Release,
1588 ivbsaxlocator_GetTypeInfoCount,
1589 ivbsaxlocator_GetTypeInfo,
1590 ivbsaxlocator_GetIDsOfNames,
1591 ivbsaxlocator_Invoke,
1592 ivbsaxlocator_get_columnNumber,
1593 ivbsaxlocator_get_lineNumber,
1594 ivbsaxlocator_get_publicId,
1595 ivbsaxlocator_get_systemId
1598 /*** ISAXLocator interface ***/
1599 /*** IUnknown methods ***/
1600 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
1602 saxlocator *This = impl_from_ISAXLocator( iface );
1604 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1608 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1609 IsEqualGUID( riid, &IID_ISAXLocator ))
1615 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1616 return E_NOINTERFACE;
1619 ISAXLocator_AddRef( iface );
1624 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
1626 saxlocator *This = impl_from_ISAXLocator( iface );
1627 TRACE("%p\n", This );
1628 return InterlockedIncrement( &This->ref );
1631 static ULONG WINAPI isaxlocator_Release(
1634 saxlocator *This = impl_from_ISAXLocator( iface );
1637 TRACE("%p\n", This );
1639 ref = InterlockedDecrement( &This->ref );
1642 SysFreeString(This->publicId);
1643 SysFreeString(This->systemId);
1644 heap_free(This->nsStack);
1646 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
1653 /*** ISAXLocator methods ***/
1654 static HRESULT WINAPI isaxlocator_getColumnNumber(
1658 saxlocator *This = impl_from_ISAXLocator( iface );
1660 *pnColumn = This->column;
1664 static HRESULT WINAPI isaxlocator_getLineNumber(
1668 saxlocator *This = impl_from_ISAXLocator( iface );
1670 *pnLine = This->line;
1674 static HRESULT WINAPI isaxlocator_getPublicId(
1676 const WCHAR ** ppwchPublicId)
1679 saxlocator *This = impl_from_ISAXLocator( iface );
1681 SysFreeString(This->publicId);
1683 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
1684 if(SysStringLen(publicId))
1685 This->publicId = (WCHAR*)&publicId;
1688 SysFreeString(publicId);
1689 This->publicId = NULL;
1692 *ppwchPublicId = This->publicId;
1696 static HRESULT WINAPI isaxlocator_getSystemId(
1698 const WCHAR ** ppwchSystemId)
1701 saxlocator *This = impl_from_ISAXLocator( iface );
1703 SysFreeString(This->systemId);
1705 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
1706 if(SysStringLen(systemId))
1707 This->systemId = (WCHAR*)&systemId;
1710 SysFreeString(systemId);
1711 This->systemId = NULL;
1714 *ppwchSystemId = This->systemId;
1718 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
1720 isaxlocator_QueryInterface,
1722 isaxlocator_Release,
1723 isaxlocator_getColumnNumber,
1724 isaxlocator_getLineNumber,
1725 isaxlocator_getPublicId,
1726 isaxlocator_getSystemId
1729 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
1731 saxlocator *locator;
1733 locator = heap_alloc( sizeof (*locator) );
1735 return E_OUTOFMEMORY;
1737 locator->lpVBSAXLocatorVtbl = &ivbsaxlocator_vtbl;
1738 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
1740 locator->vbInterface = vbInterface;
1742 locator->saxreader = reader;
1743 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1745 locator->pParserCtxt = NULL;
1746 locator->publicId = NULL;
1747 locator->systemId = NULL;
1748 locator->lastCur = NULL;
1750 locator->column = 0;
1751 locator->ret = S_OK;
1752 locator->nsStackSize = 8;
1753 locator->nsStackLast = 0;
1754 locator->nsStack = heap_alloc(sizeof(int)*locator->nsStackSize);
1755 if(!locator->nsStack)
1757 ISAXXMLReader_Release((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1759 return E_OUTOFMEMORY;
1762 *ppsaxlocator = locator;
1764 TRACE("returning %p\n", *ppsaxlocator);
1769 /*** SAXXMLReader internal functions ***/
1770 static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
1772 saxlocator *locator;
1775 hr = SAXLocator_create(This, &locator, vbInterface);
1779 locator->pParserCtxt = xmlCreateMemoryParserCtxt(buffer, size);
1780 if(!locator->pParserCtxt)
1782 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1786 xmlFree(locator->pParserCtxt->sax);
1787 locator->pParserCtxt->sax = &locator->saxreader->sax;
1788 locator->pParserCtxt->userData = locator;
1790 This->isParsing = TRUE;
1791 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1792 else hr = locator->ret;
1793 This->isParsing = FALSE;
1795 if(locator->pParserCtxt)
1797 locator->pParserCtxt->sax = NULL;
1798 xmlFreeParserCtxt(locator->pParserCtxt);
1799 locator->pParserCtxt = NULL;
1802 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1806 static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
1808 saxlocator *locator;
1813 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1817 hr = SAXLocator_create(This, &locator, vbInterface);
1821 locator->pParserCtxt = xmlCreatePushParserCtxt(
1822 &locator->saxreader->sax, locator,
1823 data, dataRead, NULL);
1824 if(!locator->pParserCtxt)
1826 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1830 This->isParsing = TRUE;
1833 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1837 if(xmlParseChunk(locator->pParserCtxt, data, dataRead, 0)) hr = E_FAIL;
1838 else hr = locator->ret;
1840 if(hr != S_OK) break;
1842 if(dataRead != sizeof(data))
1844 if(xmlParseChunk(locator->pParserCtxt, data, 0, 1)) hr = E_FAIL;
1845 else hr = locator->ret;
1850 This->isParsing = FALSE;
1852 xmlFreeParserCtxt(locator->pParserCtxt);
1853 locator->pParserCtxt = NULL;
1854 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1858 static HRESULT internal_getEntityResolver(
1860 void *pEntityResolver,
1863 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1867 static HRESULT internal_putEntityResolver(
1869 void *pEntityResolver,
1872 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1876 static HRESULT internal_getContentHandler(
1878 void *pContentHandler,
1881 TRACE("(%p)->(%p)\n", This, pContentHandler);
1882 if(pContentHandler == NULL)
1884 if((vbInterface && This->vbcontentHandler)
1885 || (!vbInterface && This->contentHandler))
1888 IVBSAXContentHandler_AddRef(This->vbcontentHandler);
1890 ISAXContentHandler_AddRef(This->contentHandler);
1892 if(vbInterface) *(IVBSAXContentHandler**)pContentHandler =
1893 This->vbcontentHandler;
1894 else *(ISAXContentHandler**)pContentHandler = This->contentHandler;
1899 static HRESULT internal_putContentHandler(
1901 void *contentHandler,
1904 TRACE("(%p)->(%p)\n", This, contentHandler);
1908 IVBSAXContentHandler_AddRef((IVBSAXContentHandler*)contentHandler);
1910 ISAXContentHandler_AddRef((ISAXContentHandler*)contentHandler);
1912 if((vbInterface && This->vbcontentHandler)
1913 || (!vbInterface && This->contentHandler))
1916 IVBSAXContentHandler_Release(This->vbcontentHandler);
1918 ISAXContentHandler_Release(This->contentHandler);
1921 This->vbcontentHandler = contentHandler;
1923 This->contentHandler = contentHandler;
1928 static HRESULT internal_getDTDHandler(
1933 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1937 static HRESULT internal_putDTDHandler(
1942 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1946 static HRESULT internal_getErrorHandler(
1948 void *pErrorHandler,
1951 TRACE("(%p)->(%p)\n", This, pErrorHandler);
1952 if(pErrorHandler == NULL)
1955 if(vbInterface && This->vberrorHandler)
1956 IVBSAXErrorHandler_AddRef(This->vberrorHandler);
1957 else if(!vbInterface && This->errorHandler)
1958 ISAXErrorHandler_AddRef(This->errorHandler);
1961 *(IVBSAXErrorHandler**)pErrorHandler = This->vberrorHandler;
1963 *(ISAXErrorHandler**)pErrorHandler = This->errorHandler;
1969 static HRESULT internal_putErrorHandler(
1974 TRACE("(%p)->(%p)\n", This, errorHandler);
1978 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler*)errorHandler);
1980 ISAXErrorHandler_AddRef((ISAXErrorHandler*)errorHandler);
1983 if(vbInterface && This->vberrorHandler)
1984 IVBSAXErrorHandler_Release(This->vberrorHandler);
1985 else if(!vbInterface && This->errorHandler)
1986 ISAXErrorHandler_Release(This->errorHandler);
1989 This->vberrorHandler = errorHandler;
1991 This->errorHandler = errorHandler;
1997 static HRESULT internal_parse(
2004 TRACE("(%p)\n", This);
2007 switch(V_VT(&varInput))
2010 hr = internal_parseBuffer(This, (const char*)V_BSTR(&varInput),
2011 SysStringByteLen(V_BSTR(&varInput)), vbInterface);
2013 case VT_ARRAY|VT_UI1: {
2015 LONG lBound, uBound;
2018 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
2019 if(hr != S_OK) break;
2020 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
2021 if(hr != S_OK) break;
2022 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
2023 hr = SafeArrayAccessData(V_ARRAY(&varInput), &pSAData);
2024 if(hr != S_OK) break;
2025 hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
2026 SafeArrayUnaccessData(V_ARRAY(&varInput));
2031 IPersistStream *persistStream;
2032 IStream *stream = NULL;
2033 IXMLDOMDocument *xmlDoc;
2035 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2036 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
2040 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
2041 hr = internal_parseBuffer(This, (const char*)bstrData,
2042 SysStringByteLen(bstrData), vbInterface);
2043 IXMLDOMDocument_Release(xmlDoc);
2044 SysFreeString(bstrData);
2048 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2049 &IID_IPersistStream, (void**)&persistStream) == S_OK)
2051 hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
2054 IPersistStream_Release(persistStream);
2058 hr = IPersistStream_Save(persistStream, stream, TRUE);
2059 IPersistStream_Release(persistStream);
2062 IStream_Release(stream);
2066 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2067 &IID_IStream, (void**)&stream) == S_OK)
2069 hr = internal_parseStream(This, stream, vbInterface);
2070 IStream_Release(stream);
2075 WARN("vt %d not implemented\n", V_VT(&varInput));
2082 static HRESULT internal_vbonDataAvailable(void *obj, char *ptr, DWORD len)
2084 saxreader *This = obj;
2086 return internal_parseBuffer(This, ptr, len, TRUE);
2089 static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len)
2091 saxreader *This = obj;
2093 return internal_parseBuffer(This, ptr, len, FALSE);
2096 static HRESULT internal_parseURL(
2104 TRACE("(%p)->(%s)\n", This, debugstr_w(url));
2106 if(vbInterface) hr = bind_url(url, internal_vbonDataAvailable, This, &bsc);
2107 else hr = bind_url(url, internal_onDataAvailable, This, &bsc);
2117 static HRESULT internal_putProperty(
2123 static const WCHAR wszCharset[] = {
2124 'c','h','a','r','s','e','t',0
2126 static const WCHAR wszDeclarationHandler[] = {
2127 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2128 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2129 'd','e','c','l','a','r','a','t','i','o','n',
2130 '-','h','a','n','d','l','e','r',0
2132 static const WCHAR wszDomNode[] = {
2133 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2134 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2135 'd','o','m','-','n','o','d','e',0
2137 static const WCHAR wszInputSource[] = {
2138 'i','n','p','u','t','-','s','o','u','r','c','e',0
2140 static const WCHAR wszLexicalHandler[] = {
2141 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2142 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2143 'l','e','x','i','c','a','l','-','h','a','n','d','l','e','r',0
2145 static const WCHAR wszMaxElementDepth[] = {
2146 'm','a','x','-','e','l','e','m','e','n','t','-','d','e','p','t','h',0
2148 static const WCHAR wszMaxXMLSize[] = {
2149 'm','a','x','-','x','m','l','-','s','i','z','e',0
2151 static const WCHAR wszSchemaDeclarationHandler[] = {
2152 's','c','h','e','m','a','-',
2153 'd','e','c','l','a','r','a','t','i','o','n','-',
2154 'h','a','n','d','l','e','r',0
2156 static const WCHAR wszXMLDeclEncoding[] = {
2157 'x','m','l','d','e','c','l','-','e','n','c','o','d','i','n','g',0
2159 static const WCHAR wszXMLDeclStandalone[] = {
2160 'x','m','l','d','e','c','l',
2161 '-','s','t','a','n','d','a','l','o','n','e',0
2163 static const WCHAR wszXMLDeclVersion[] = {
2164 'x','m','l','d','e','c','l','-','v','e','r','s','i','o','n',0
2167 TRACE("(%p)->(%s)\n", This, debugstr_w(pProp));
2169 if(!memcmp(pProp, wszDeclarationHandler, sizeof(wszDeclarationHandler)))
2171 if(This->isParsing) return E_FAIL;
2173 if(V_UNKNOWN(&value))
2176 IVBSAXDeclHandler_AddRef((IVBSAXDeclHandler*)V_UNKNOWN(&value));
2178 ISAXDeclHandler_AddRef((ISAXDeclHandler*)V_UNKNOWN(&value));
2180 if((vbInterface && This->vbdeclHandler)
2181 || (!vbInterface && This->declHandler))
2184 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2186 ISAXDeclHandler_Release(This->declHandler);
2189 This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
2191 This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
2195 if(!memcmp(pProp, wszLexicalHandler, sizeof(wszLexicalHandler)))
2197 if(This->isParsing) return E_FAIL;
2199 if(V_UNKNOWN(&value))
2202 IVBSAXLexicalHandler_AddRef(
2203 (IVBSAXLexicalHandler*)V_UNKNOWN(&value));
2205 ISAXLexicalHandler_AddRef(
2206 (ISAXLexicalHandler*)V_UNKNOWN(&value));
2208 if((vbInterface && This->vblexicalHandler)
2209 || (!vbInterface && This->lexicalHandler))
2212 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2214 ISAXLexicalHandler_Release(This->lexicalHandler);
2217 This->vblexicalHandler = (IVBSAXLexicalHandler*)V_UNKNOWN(&value);
2219 This->lexicalHandler = (ISAXLexicalHandler*)V_UNKNOWN(&value);
2223 FIXME("(%p)->(%s): unsupported property\n", This, debugstr_w(pProp));
2225 if(!memcmp(pProp, wszCharset, sizeof(wszCharset)))
2228 if(!memcmp(pProp, wszDomNode, sizeof(wszDomNode)))
2231 if(!memcmp(pProp, wszInputSource, sizeof(wszInputSource)))
2234 if(!memcmp(pProp, wszMaxElementDepth, sizeof(wszMaxElementDepth)))
2237 if(!memcmp(pProp, wszMaxXMLSize, sizeof(wszMaxXMLSize)))
2240 if(!memcmp(pProp, wszSchemaDeclarationHandler,
2241 sizeof(wszSchemaDeclarationHandler)))
2244 if(!memcmp(pProp, wszXMLDeclEncoding, sizeof(wszXMLDeclEncoding)))
2247 if(!memcmp(pProp, wszXMLDeclStandalone, sizeof(wszXMLDeclStandalone)))
2250 if(!memcmp(pProp, wszXMLDeclVersion, sizeof(wszXMLDeclVersion)))
2253 return E_INVALIDARG;
2256 /*** IVBSAXXMLReader interface ***/
2257 /*** IUnknown methods ***/
2258 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
2260 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2262 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
2266 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
2267 IsEqualGUID( riid, &IID_IDispatch ) ||
2268 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
2272 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
2274 *ppvObject = &This->lpSAXXMLReaderVtbl;
2278 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2279 return E_NOINTERFACE;
2282 IVBSAXXMLReader_AddRef( iface );
2287 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
2289 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2290 TRACE("%p\n", This );
2291 return InterlockedIncrement( &This->ref );
2294 static ULONG WINAPI saxxmlreader_Release(
2295 IVBSAXXMLReader* iface)
2297 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2300 TRACE("%p\n", This );
2302 ref = InterlockedDecrement( &This->ref );
2305 if(This->contentHandler)
2306 ISAXContentHandler_Release(This->contentHandler);
2308 if(This->vbcontentHandler)
2309 IVBSAXContentHandler_Release(This->vbcontentHandler);
2311 if(This->errorHandler)
2312 ISAXErrorHandler_Release(This->errorHandler);
2314 if(This->vberrorHandler)
2315 IVBSAXErrorHandler_Release(This->vberrorHandler);
2317 if(This->lexicalHandler)
2318 ISAXLexicalHandler_Release(This->lexicalHandler);
2320 if(This->vblexicalHandler)
2321 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2323 if(This->declHandler)
2324 ISAXDeclHandler_Release(This->declHandler);
2326 if(This->vbdeclHandler)
2327 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2335 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
2337 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2339 TRACE("(%p)->(%p)\n", This, pctinfo);
2346 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
2347 IVBSAXXMLReader *iface,
2348 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2350 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2353 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2355 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
2360 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
2361 IVBSAXXMLReader *iface,
2363 LPOLESTR* rgszNames,
2368 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2369 ITypeInfo *typeinfo;
2372 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2375 if(!rgszNames || cNames == 0 || !rgDispId)
2376 return E_INVALIDARG;
2378 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2381 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
2382 ITypeInfo_Release(typeinfo);
2388 static HRESULT WINAPI saxxmlreader_Invoke(
2389 IVBSAXXMLReader *iface,
2390 DISPID dispIdMember,
2394 DISPPARAMS* pDispParams,
2395 VARIANT* pVarResult,
2396 EXCEPINFO* pExcepInfo,
2399 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2400 ITypeInfo *typeinfo;
2403 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2404 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2406 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2409 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXXMLReaderVtbl), dispIdMember, wFlags, pDispParams,
2410 pVarResult, pExcepInfo, puArgErr);
2411 ITypeInfo_Release(typeinfo);
2417 /*** IVBSAXXMLReader methods ***/
2418 static HRESULT WINAPI saxxmlreader_getFeature(
2419 IVBSAXXMLReader* iface,
2420 const WCHAR *pFeature,
2421 VARIANT_BOOL *pValue)
2423 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2425 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
2429 static HRESULT WINAPI saxxmlreader_putFeature(
2430 IVBSAXXMLReader* iface,
2431 const WCHAR *pFeature,
2432 VARIANT_BOOL vfValue)
2434 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2436 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
2440 static HRESULT WINAPI saxxmlreader_getProperty(
2441 IVBSAXXMLReader* iface,
2445 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2447 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
2451 static HRESULT WINAPI saxxmlreader_putProperty(
2452 IVBSAXXMLReader* iface,
2456 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2457 return internal_putProperty(This, pProp, value, TRUE);
2460 static HRESULT WINAPI saxxmlreader_get_entityResolver(
2461 IVBSAXXMLReader* iface,
2462 IVBSAXEntityResolver **pEntityResolver)
2464 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2465 return internal_getEntityResolver(This, pEntityResolver, TRUE);
2468 static HRESULT WINAPI saxxmlreader_put_entityResolver(
2469 IVBSAXXMLReader* iface,
2470 IVBSAXEntityResolver *pEntityResolver)
2472 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2473 return internal_putEntityResolver(This, pEntityResolver, TRUE);
2476 static HRESULT WINAPI saxxmlreader_get_contentHandler(
2477 IVBSAXXMLReader* iface,
2478 IVBSAXContentHandler **ppContentHandler)
2480 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2481 return internal_getContentHandler(This, ppContentHandler, TRUE);
2484 static HRESULT WINAPI saxxmlreader_put_contentHandler(
2485 IVBSAXXMLReader* iface,
2486 IVBSAXContentHandler *contentHandler)
2488 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2489 return internal_putContentHandler(This, contentHandler, TRUE);
2492 static HRESULT WINAPI saxxmlreader_get_dtdHandler(
2493 IVBSAXXMLReader* iface,
2494 IVBSAXDTDHandler **pDTDHandler)
2496 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2497 return internal_getDTDHandler(This, pDTDHandler, TRUE);
2500 static HRESULT WINAPI saxxmlreader_put_dtdHandler(
2501 IVBSAXXMLReader* iface,
2502 IVBSAXDTDHandler *pDTDHandler)
2504 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2505 return internal_putDTDHandler(This, pDTDHandler, TRUE);
2508 static HRESULT WINAPI saxxmlreader_get_errorHandler(
2509 IVBSAXXMLReader* iface,
2510 IVBSAXErrorHandler **pErrorHandler)
2512 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2513 return internal_getErrorHandler(This, pErrorHandler, TRUE);
2516 static HRESULT WINAPI saxxmlreader_put_errorHandler(
2517 IVBSAXXMLReader* iface,
2518 IVBSAXErrorHandler *errorHandler)
2520 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2521 return internal_putErrorHandler(This, errorHandler, TRUE);
2524 static HRESULT WINAPI saxxmlreader_get_baseURL(
2525 IVBSAXXMLReader* iface,
2526 const WCHAR **pBaseUrl)
2528 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2530 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
2534 static HRESULT WINAPI saxxmlreader_put_baseURL(
2535 IVBSAXXMLReader* iface,
2536 const WCHAR *pBaseUrl)
2538 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2540 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
2544 static HRESULT WINAPI saxxmlreader_get_secureBaseURL(
2545 IVBSAXXMLReader* iface,
2546 const WCHAR **pSecureBaseUrl)
2548 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2550 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
2555 static HRESULT WINAPI saxxmlreader_put_secureBaseURL(
2556 IVBSAXXMLReader* iface,
2557 const WCHAR *secureBaseUrl)
2559 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2561 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
2565 static HRESULT WINAPI saxxmlreader_parse(
2566 IVBSAXXMLReader* iface,
2569 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2570 return internal_parse(This, varInput, TRUE);
2573 static HRESULT WINAPI saxxmlreader_parseURL(
2574 IVBSAXXMLReader* iface,
2577 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2578 return internal_parseURL(This, url, TRUE);
2581 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
2583 saxxmlreader_QueryInterface,
2584 saxxmlreader_AddRef,
2585 saxxmlreader_Release,
2586 saxxmlreader_GetTypeInfoCount,
2587 saxxmlreader_GetTypeInfo,
2588 saxxmlreader_GetIDsOfNames,
2589 saxxmlreader_Invoke,
2590 saxxmlreader_getFeature,
2591 saxxmlreader_putFeature,
2592 saxxmlreader_getProperty,
2593 saxxmlreader_putProperty,
2594 saxxmlreader_get_entityResolver,
2595 saxxmlreader_put_entityResolver,
2596 saxxmlreader_get_contentHandler,
2597 saxxmlreader_put_contentHandler,
2598 saxxmlreader_get_dtdHandler,
2599 saxxmlreader_put_dtdHandler,
2600 saxxmlreader_get_errorHandler,
2601 saxxmlreader_put_errorHandler,
2602 saxxmlreader_get_baseURL,
2603 saxxmlreader_put_baseURL,
2604 saxxmlreader_get_secureBaseURL,
2605 saxxmlreader_put_secureBaseURL,
2607 saxxmlreader_parseURL
2610 /*** ISAXXMLReader interface ***/
2611 /*** IUnknown methods ***/
2612 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
2614 saxreader *This = impl_from_ISAXXMLReader( iface );
2615 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl, riid, ppvObject);
2618 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
2620 saxreader *This = impl_from_ISAXXMLReader( iface );
2621 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2624 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
2626 saxreader *This = impl_from_ISAXXMLReader( iface );
2627 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2630 /*** ISAXXMLReader methods ***/
2631 static HRESULT WINAPI isaxxmlreader_getFeature(
2632 ISAXXMLReader* iface,
2633 const WCHAR *pFeature,
2634 VARIANT_BOOL *pValue)
2636 saxreader *This = impl_from_ISAXXMLReader( iface );
2637 return IVBSAXXMLReader_getFeature(
2638 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2642 static HRESULT WINAPI isaxxmlreader_putFeature(
2643 ISAXXMLReader* iface,
2644 const WCHAR *pFeature,
2645 VARIANT_BOOL vfValue)
2647 saxreader *This = impl_from_ISAXXMLReader( iface );
2648 return IVBSAXXMLReader_putFeature(
2649 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2653 static HRESULT WINAPI isaxxmlreader_getProperty(
2654 ISAXXMLReader* iface,
2658 saxreader *This = impl_from_ISAXXMLReader( iface );
2659 return IVBSAXXMLReader_getProperty(
2660 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2664 static HRESULT WINAPI isaxxmlreader_putProperty(
2665 ISAXXMLReader* iface,
2669 saxreader *This = impl_from_ISAXXMLReader( iface );
2670 return internal_putProperty(This, pProp, value, FALSE);
2673 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
2674 ISAXXMLReader* iface,
2675 ISAXEntityResolver **ppEntityResolver)
2677 saxreader *This = impl_from_ISAXXMLReader( iface );
2678 return internal_getEntityResolver(This, ppEntityResolver, FALSE);
2681 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
2682 ISAXXMLReader* iface,
2683 ISAXEntityResolver *pEntityResolver)
2685 saxreader *This = impl_from_ISAXXMLReader( iface );
2686 return internal_putEntityResolver(This, pEntityResolver, FALSE);
2689 static HRESULT WINAPI isaxxmlreader_getContentHandler(
2690 ISAXXMLReader* iface,
2691 ISAXContentHandler **pContentHandler)
2693 saxreader *This = impl_from_ISAXXMLReader( iface );
2694 return internal_getContentHandler(This, pContentHandler, FALSE);
2697 static HRESULT WINAPI isaxxmlreader_putContentHandler(
2698 ISAXXMLReader* iface,
2699 ISAXContentHandler *contentHandler)
2701 saxreader *This = impl_from_ISAXXMLReader( iface );
2702 return internal_putContentHandler(This, contentHandler, FALSE);
2705 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
2706 ISAXXMLReader* iface,
2707 ISAXDTDHandler **pDTDHandler)
2709 saxreader *This = impl_from_ISAXXMLReader( iface );
2710 return internal_getDTDHandler(This, pDTDHandler, FALSE);
2713 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
2714 ISAXXMLReader* iface,
2715 ISAXDTDHandler *pDTDHandler)
2717 saxreader *This = impl_from_ISAXXMLReader( iface );
2718 return internal_putDTDHandler(This, pDTDHandler, FALSE);
2721 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
2722 ISAXXMLReader* iface,
2723 ISAXErrorHandler **pErrorHandler)
2725 saxreader *This = impl_from_ISAXXMLReader( iface );
2726 return internal_getErrorHandler(This, pErrorHandler, FALSE);
2729 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
2730 ISAXXMLReader* iface,
2731 ISAXErrorHandler *errorHandler)
2733 saxreader *This = impl_from_ISAXXMLReader( iface );
2734 return internal_putErrorHandler(This, errorHandler, FALSE);
2737 static HRESULT WINAPI isaxxmlreader_getBaseURL(
2738 ISAXXMLReader* iface,
2739 const WCHAR **pBaseUrl)
2741 saxreader *This = impl_from_ISAXXMLReader( iface );
2742 return IVBSAXXMLReader_get_baseURL(
2743 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2747 static HRESULT WINAPI isaxxmlreader_putBaseURL(
2748 ISAXXMLReader* iface,
2749 const WCHAR *pBaseUrl)
2751 saxreader *This = impl_from_ISAXXMLReader( iface );
2752 return IVBSAXXMLReader_put_baseURL(
2753 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2757 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
2758 ISAXXMLReader* iface,
2759 const WCHAR **pSecureBaseUrl)
2761 saxreader *This = impl_from_ISAXXMLReader( iface );
2762 return IVBSAXXMLReader_get_secureBaseURL(
2763 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2767 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
2768 ISAXXMLReader* iface,
2769 const WCHAR *secureBaseUrl)
2771 saxreader *This = impl_from_ISAXXMLReader( iface );
2772 return IVBSAXXMLReader_put_secureBaseURL(
2773 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2777 static HRESULT WINAPI isaxxmlreader_parse(
2778 ISAXXMLReader* iface,
2781 saxreader *This = impl_from_ISAXXMLReader( iface );
2782 return internal_parse(This, varInput, FALSE);
2785 static HRESULT WINAPI isaxxmlreader_parseURL(
2786 ISAXXMLReader* iface,
2789 saxreader *This = impl_from_ISAXXMLReader( iface );
2790 return internal_parseURL(This, url, FALSE);
2793 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
2795 isaxxmlreader_QueryInterface,
2796 isaxxmlreader_AddRef,
2797 isaxxmlreader_Release,
2798 isaxxmlreader_getFeature,
2799 isaxxmlreader_putFeature,
2800 isaxxmlreader_getProperty,
2801 isaxxmlreader_putProperty,
2802 isaxxmlreader_getEntityResolver,
2803 isaxxmlreader_putEntityResolver,
2804 isaxxmlreader_getContentHandler,
2805 isaxxmlreader_putContentHandler,
2806 isaxxmlreader_getDTDHandler,
2807 isaxxmlreader_putDTDHandler,
2808 isaxxmlreader_getErrorHandler,
2809 isaxxmlreader_putErrorHandler,
2810 isaxxmlreader_getBaseURL,
2811 isaxxmlreader_putBaseURL,
2812 isaxxmlreader_getSecureBaseURL,
2813 isaxxmlreader_putSecureBaseURL,
2814 isaxxmlreader_parse,
2815 isaxxmlreader_parseURL
2818 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2822 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
2824 reader = heap_alloc( sizeof (*reader) );
2826 return E_OUTOFMEMORY;
2828 reader->lpVBSAXXMLReaderVtbl = &saxreader_vtbl;
2829 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
2831 reader->contentHandler = NULL;
2832 reader->vbcontentHandler = NULL;
2833 reader->errorHandler = NULL;
2834 reader->vberrorHandler = NULL;
2835 reader->lexicalHandler = NULL;
2836 reader->vblexicalHandler = NULL;
2837 reader->declHandler = NULL;
2838 reader->vbdeclHandler = NULL;
2839 reader->isParsing = FALSE;
2841 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
2842 reader->sax.initialized = XML_SAX2_MAGIC;
2843 reader->sax.startDocument = libxmlStartDocument;
2844 reader->sax.endDocument = libxmlEndDocument;
2845 reader->sax.startElementNs = libxmlStartElementNS;
2846 reader->sax.endElementNs = libxmlEndElementNS;
2847 reader->sax.characters = libxmlCharacters;
2848 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
2849 reader->sax.comment = libxmlComment;
2850 reader->sax.error = libxmlFatalError;
2851 reader->sax.fatalError = libxmlFatalError;
2852 reader->sax.cdataBlock = libxmlCDataBlock;
2854 *ppObj = &reader->lpVBSAXXMLReaderVtbl;
2856 TRACE("returning iface %p\n", *ppObj);
2863 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2865 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2866 "libxml2 support was not present at compile time.\n");