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 HRESULT namespacePush(saxlocator *locator, int ns)
137 if(locator->nsStackLast>=locator->nsStackSize)
141 new_stack = HeapReAlloc(GetProcessHeap(), 0,
142 locator->nsStack, sizeof(int)*locator->nsStackSize*2);
143 if(!new_stack) return E_OUTOFMEMORY;
144 locator->nsStack = new_stack;
145 locator->nsStackSize *= 2;
147 locator->nsStack[locator->nsStackLast++] = ns;
152 static int namespacePop(saxlocator *locator)
154 if(locator->nsStackLast == 0) return 0;
155 return locator->nsStack[--locator->nsStackLast];
158 static BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
166 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0);
167 if(len != -1) dLen++;
168 bstr = SysAllocStringLen(NULL, dLen-1);
171 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, bstr, dLen);
172 if(len != -1) bstr[dLen-1] = '\0';
177 static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name)
182 if(!name) return NULL;
184 if(!prefix || *prefix=='\0')
185 return bstr_from_xmlChar(name);
187 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, NULL, 0)
188 + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0);
189 bstr = SysAllocStringLen(NULL, dLen-1);
193 dLast = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, bstr, dLen);
195 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, &bstr[dLast], dLen-dLast);
200 static void format_error_message_from_id(saxlocator *This, HRESULT hr)
202 xmlStopParser(This->pParserCtxt);
205 if((This->vbInterface && This->saxreader->vberrorHandler)
206 || (!This->vbInterface && This->saxreader->errorHandler))
209 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
210 NULL, hr, 0, msg, sizeof(msg), NULL))
212 FIXME("MSXML errors not yet supported.\n");
216 if(This->vbInterface)
218 BSTR bstrMsg = SysAllocString(msg);
219 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
220 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrMsg, hr);
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(This->vbInterface)
1246 hr = IVBSAXContentHandler_putref_documentLocator(
1247 This->saxreader->vbcontentHandler,
1248 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
1250 hr = ISAXContentHandler_putDocumentLocator(
1251 This->saxreader->contentHandler,
1252 (ISAXLocator*)&This->lpSAXLocatorVtbl);
1255 format_error_message_from_id(This, hr);
1258 static void libxmlComment(void *ctx, const xmlChar *value)
1260 saxlocator *This = ctx;
1263 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur;
1265 while(beg-4>=This->pParserCtxt->input->base
1266 && memcmp(beg-4, "<!--", sizeof(char[4]))) beg--;
1267 update_position(This, beg);
1269 if(!This->vbInterface && !This->saxreader->lexicalHandler) return;
1270 if(This->vbInterface && !This->saxreader->vblexicalHandler) return;
1272 bValue = bstr_from_xmlChar(value);
1274 if(This->vbInterface)
1275 hr = IVBSAXLexicalHandler_comment(
1276 This->saxreader->vblexicalHandler, &bValue);
1278 hr = ISAXLexicalHandler_comment(
1279 This->saxreader->lexicalHandler,
1280 bValue, SysStringLen(bValue));
1282 SysFreeString(bValue);
1285 format_error_message_from_id(This, hr);
1287 update_position(This, NULL);
1290 static void libxmlFatalError(void *ctx, const char *msg, ...)
1292 saxlocator *This = ctx;
1298 if((This->vbInterface && !This->saxreader->vberrorHandler)
1299 || (!This->vbInterface && !This->saxreader->errorHandler))
1301 xmlStopParser(This->pParserCtxt);
1306 FIXME("Error handling is not compatible.\n");
1308 va_start(args, msg);
1309 vsprintf(message, msg, args);
1312 len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0);
1313 wszError = heap_alloc(sizeof(WCHAR)*len);
1315 MultiByteToWideChar(CP_UNIXCP, 0, message, -1, wszError, len);
1317 if(This->vbInterface)
1319 BSTR bstrError = SysAllocString(wszError);
1320 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
1321 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrError, E_FAIL);
1324 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
1325 (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
1327 heap_free(wszError);
1329 xmlStopParser(This->pParserCtxt);
1333 static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len)
1335 saxlocator *This = ctx;
1337 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur-len;
1341 BOOL lastEvent = FALSE, change;
1343 while(beg-9>=This->pParserCtxt->input->base
1344 && memcmp(beg-9, "<![CDATA[", sizeof(char[9]))) beg--;
1345 update_position(This, beg);
1347 if(This->vbInterface && This->saxreader->vblexicalHandler)
1348 hr = IVBSAXLexicalHandler_startCDATA(This->saxreader->vblexicalHandler);
1349 if(!This->vbInterface && This->saxreader->lexicalHandler)
1350 hr = ISAXLexicalHandler_startCDATA(This->saxreader->lexicalHandler);
1354 format_error_message_from_id(This, hr);
1358 realLen = This->pParserCtxt->input->cur-beg-3;
1364 while(end-beg<realLen && *end!='\r') end++;
1365 if(end-beg==realLen)
1370 else if(end-beg==realLen-1 && *end=='\r' && *(end+1)=='\n')
1373 if(*end == '\r') change = TRUE;
1374 else change = FALSE;
1376 if(change) *end = '\n';
1378 if(has_content_handler(This))
1380 Chars = bstr_from_xmlCharN(cur, end-cur+1);
1381 if(This->vbInterface)
1382 hr = IVBSAXContentHandler_characters(
1383 This->saxreader->vbcontentHandler, &Chars);
1385 hr = ISAXContentHandler_characters(
1386 This->saxreader->contentHandler,
1387 Chars, SysStringLen(Chars));
1388 SysFreeString(Chars);
1391 if(change) *end = '\r';
1396 This->column += end-cur+2;
1401 if(This->vbInterface && This->saxreader->vblexicalHandler)
1402 hr = IVBSAXLexicalHandler_endCDATA(This->saxreader->vblexicalHandler);
1403 if(!This->vbInterface && This->saxreader->lexicalHandler)
1404 hr = ISAXLexicalHandler_endCDATA(This->saxreader->lexicalHandler);
1407 format_error_message_from_id(This, hr);
1409 This->column += 4+end-cur;
1412 /*** IVBSAXLocator interface ***/
1413 /*** IUnknown methods ***/
1414 static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject)
1416 saxlocator *This = impl_from_IVBSAXLocator( iface );
1418 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject);
1422 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1423 IsEqualGUID( riid, &IID_IDispatch) ||
1424 IsEqualGUID( riid, &IID_IVBSAXLocator ))
1430 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1431 return E_NOINTERFACE;
1434 IVBSAXLocator_AddRef( iface );
1439 static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator* iface)
1441 saxlocator *This = impl_from_IVBSAXLocator( iface );
1442 TRACE("%p\n", This );
1443 return InterlockedIncrement( &This->ref );
1446 static ULONG WINAPI ivbsaxlocator_Release(
1447 IVBSAXLocator* iface)
1449 saxlocator *This = impl_from_IVBSAXLocator( iface );
1450 return ISAXLocator_Release((ISAXLocator*)&This->lpVBSAXLocatorVtbl);
1453 /*** IDispatch methods ***/
1454 static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator *iface, UINT* pctinfo )
1456 saxlocator *This = impl_from_IVBSAXLocator( iface );
1458 TRACE("(%p)->(%p)\n", This, pctinfo);
1465 static HRESULT WINAPI ivbsaxlocator_GetTypeInfo(
1466 IVBSAXLocator *iface,
1467 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
1469 saxlocator *This = impl_from_IVBSAXLocator( iface );
1472 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1474 hr = get_typeinfo(IVBSAXLocator_tid, ppTInfo);
1479 static HRESULT WINAPI ivbsaxlocator_GetIDsOfNames(
1480 IVBSAXLocator *iface,
1482 LPOLESTR* rgszNames,
1487 saxlocator *This = impl_from_IVBSAXLocator( iface );
1488 ITypeInfo *typeinfo;
1491 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1494 if(!rgszNames || cNames == 0 || !rgDispId)
1495 return E_INVALIDARG;
1497 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1500 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1501 ITypeInfo_Release(typeinfo);
1507 static HRESULT WINAPI ivbsaxlocator_Invoke(
1508 IVBSAXLocator *iface,
1509 DISPID dispIdMember,
1513 DISPPARAMS* pDispParams,
1514 VARIANT* pVarResult,
1515 EXCEPINFO* pExcepInfo,
1518 saxlocator *This = impl_from_IVBSAXLocator( iface );
1519 ITypeInfo *typeinfo;
1522 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1523 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1525 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1528 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXLocatorVtbl), dispIdMember, wFlags, pDispParams,
1529 pVarResult, pExcepInfo, puArgErr);
1530 ITypeInfo_Release(typeinfo);
1536 /*** IVBSAXLocator methods ***/
1537 static HRESULT WINAPI ivbsaxlocator_get_columnNumber(
1538 IVBSAXLocator* iface,
1541 saxlocator *This = impl_from_IVBSAXLocator( iface );
1542 return ISAXLocator_getColumnNumber(
1543 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1547 static HRESULT WINAPI ivbsaxlocator_get_lineNumber(
1548 IVBSAXLocator* iface,
1551 saxlocator *This = impl_from_IVBSAXLocator( iface );
1552 return ISAXLocator_getLineNumber(
1553 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1557 static HRESULT WINAPI ivbsaxlocator_get_publicId(
1558 IVBSAXLocator* iface,
1561 saxlocator *This = impl_from_IVBSAXLocator( iface );
1562 return ISAXLocator_getPublicId(
1563 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1564 (const WCHAR**)publicId);
1567 static HRESULT WINAPI ivbsaxlocator_get_systemId(
1568 IVBSAXLocator* iface,
1571 saxlocator *This = impl_from_IVBSAXLocator( iface );
1572 return ISAXLocator_getSystemId(
1573 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1574 (const WCHAR**)systemId);
1577 static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl =
1579 ivbsaxlocator_QueryInterface,
1580 ivbsaxlocator_AddRef,
1581 ivbsaxlocator_Release,
1582 ivbsaxlocator_GetTypeInfoCount,
1583 ivbsaxlocator_GetTypeInfo,
1584 ivbsaxlocator_GetIDsOfNames,
1585 ivbsaxlocator_Invoke,
1586 ivbsaxlocator_get_columnNumber,
1587 ivbsaxlocator_get_lineNumber,
1588 ivbsaxlocator_get_publicId,
1589 ivbsaxlocator_get_systemId
1592 /*** ISAXLocator interface ***/
1593 /*** IUnknown methods ***/
1594 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
1596 saxlocator *This = impl_from_ISAXLocator( iface );
1598 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1602 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1603 IsEqualGUID( riid, &IID_ISAXLocator ))
1609 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1610 return E_NOINTERFACE;
1613 ISAXLocator_AddRef( iface );
1618 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
1620 saxlocator *This = impl_from_ISAXLocator( iface );
1621 TRACE("%p\n", This );
1622 return InterlockedIncrement( &This->ref );
1625 static ULONG WINAPI isaxlocator_Release(
1628 saxlocator *This = impl_from_ISAXLocator( iface );
1631 TRACE("%p\n", This );
1633 ref = InterlockedDecrement( &This->ref );
1636 SysFreeString(This->publicId);
1637 SysFreeString(This->systemId);
1638 heap_free(This->nsStack);
1640 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
1647 /*** ISAXLocator methods ***/
1648 static HRESULT WINAPI isaxlocator_getColumnNumber(
1652 saxlocator *This = impl_from_ISAXLocator( iface );
1654 *pnColumn = This->column;
1658 static HRESULT WINAPI isaxlocator_getLineNumber(
1662 saxlocator *This = impl_from_ISAXLocator( iface );
1664 *pnLine = This->line;
1668 static HRESULT WINAPI isaxlocator_getPublicId(
1670 const WCHAR ** ppwchPublicId)
1673 saxlocator *This = impl_from_ISAXLocator( iface );
1675 SysFreeString(This->publicId);
1677 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
1678 if(SysStringLen(publicId))
1679 This->publicId = (WCHAR*)&publicId;
1682 SysFreeString(publicId);
1683 This->publicId = NULL;
1686 *ppwchPublicId = This->publicId;
1690 static HRESULT WINAPI isaxlocator_getSystemId(
1692 const WCHAR ** ppwchSystemId)
1695 saxlocator *This = impl_from_ISAXLocator( iface );
1697 SysFreeString(This->systemId);
1699 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
1700 if(SysStringLen(systemId))
1701 This->systemId = (WCHAR*)&systemId;
1704 SysFreeString(systemId);
1705 This->systemId = NULL;
1708 *ppwchSystemId = This->systemId;
1712 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
1714 isaxlocator_QueryInterface,
1716 isaxlocator_Release,
1717 isaxlocator_getColumnNumber,
1718 isaxlocator_getLineNumber,
1719 isaxlocator_getPublicId,
1720 isaxlocator_getSystemId
1723 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
1725 saxlocator *locator;
1727 locator = heap_alloc( sizeof (*locator) );
1729 return E_OUTOFMEMORY;
1731 locator->lpVBSAXLocatorVtbl = &ivbsaxlocator_vtbl;
1732 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
1734 locator->vbInterface = vbInterface;
1736 locator->saxreader = reader;
1737 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1739 locator->pParserCtxt = NULL;
1740 locator->publicId = NULL;
1741 locator->systemId = NULL;
1742 locator->lastCur = NULL;
1744 locator->column = 0;
1745 locator->ret = S_OK;
1746 locator->nsStackSize = 8;
1747 locator->nsStackLast = 0;
1748 locator->nsStack = heap_alloc(sizeof(int)*locator->nsStackSize);
1749 if(!locator->nsStack)
1751 ISAXXMLReader_Release((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1753 return E_OUTOFMEMORY;
1756 *ppsaxlocator = locator;
1758 TRACE("returning %p\n", *ppsaxlocator);
1763 /*** SAXXMLReader internal functions ***/
1764 static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
1766 saxlocator *locator;
1769 hr = SAXLocator_create(This, &locator, vbInterface);
1773 locator->pParserCtxt = xmlCreateMemoryParserCtxt(buffer, size);
1774 if(!locator->pParserCtxt)
1776 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1780 xmlFree(locator->pParserCtxt->sax);
1781 locator->pParserCtxt->sax = &locator->saxreader->sax;
1782 locator->pParserCtxt->userData = locator;
1784 This->isParsing = TRUE;
1785 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1786 else hr = locator->ret;
1787 This->isParsing = FALSE;
1789 if(locator->pParserCtxt)
1791 locator->pParserCtxt->sax = NULL;
1792 xmlFreeParserCtxt(locator->pParserCtxt);
1793 locator->pParserCtxt = NULL;
1796 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1800 static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
1802 saxlocator *locator;
1807 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1811 hr = SAXLocator_create(This, &locator, vbInterface);
1815 locator->pParserCtxt = xmlCreatePushParserCtxt(
1816 &locator->saxreader->sax, locator,
1817 data, dataRead, NULL);
1818 if(!locator->pParserCtxt)
1820 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1824 This->isParsing = TRUE;
1827 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1831 if(xmlParseChunk(locator->pParserCtxt, data, dataRead, 0)) hr = E_FAIL;
1832 else hr = locator->ret;
1834 if(hr != S_OK) break;
1836 if(dataRead != sizeof(data))
1838 if(xmlParseChunk(locator->pParserCtxt, data, 0, 1)) hr = E_FAIL;
1839 else hr = locator->ret;
1844 This->isParsing = FALSE;
1846 xmlFreeParserCtxt(locator->pParserCtxt);
1847 locator->pParserCtxt = NULL;
1848 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1852 static HRESULT internal_getEntityResolver(
1854 void *pEntityResolver,
1857 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1861 static HRESULT internal_putEntityResolver(
1863 void *pEntityResolver,
1866 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1870 static HRESULT internal_getContentHandler(
1872 void *pContentHandler,
1875 TRACE("(%p)->(%p)\n", This, pContentHandler);
1876 if(pContentHandler == NULL)
1878 if((vbInterface && This->vbcontentHandler)
1879 || (!vbInterface && This->contentHandler))
1882 IVBSAXContentHandler_AddRef(This->vbcontentHandler);
1884 ISAXContentHandler_AddRef(This->contentHandler);
1886 if(vbInterface) *(IVBSAXContentHandler**)pContentHandler =
1887 This->vbcontentHandler;
1888 else *(ISAXContentHandler**)pContentHandler = This->contentHandler;
1893 static HRESULT internal_putContentHandler(
1895 void *contentHandler,
1898 TRACE("(%p)->(%p)\n", This, contentHandler);
1902 IVBSAXContentHandler_AddRef((IVBSAXContentHandler*)contentHandler);
1904 ISAXContentHandler_AddRef((ISAXContentHandler*)contentHandler);
1906 if((vbInterface && This->vbcontentHandler)
1907 || (!vbInterface && This->contentHandler))
1910 IVBSAXContentHandler_Release(This->vbcontentHandler);
1912 ISAXContentHandler_Release(This->contentHandler);
1915 This->vbcontentHandler = contentHandler;
1917 This->contentHandler = contentHandler;
1922 static HRESULT internal_getDTDHandler(
1927 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1931 static HRESULT internal_putDTDHandler(
1936 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1940 static HRESULT internal_getErrorHandler(
1942 void *pErrorHandler,
1945 TRACE("(%p)->(%p)\n", This, pErrorHandler);
1946 if(pErrorHandler == NULL)
1949 if(vbInterface && This->vberrorHandler)
1950 IVBSAXErrorHandler_AddRef(This->vberrorHandler);
1951 else if(!vbInterface && This->errorHandler)
1952 ISAXErrorHandler_AddRef(This->errorHandler);
1955 *(IVBSAXErrorHandler**)pErrorHandler = This->vberrorHandler;
1957 *(ISAXErrorHandler**)pErrorHandler = This->errorHandler;
1963 static HRESULT internal_putErrorHandler(
1968 TRACE("(%p)->(%p)\n", This, errorHandler);
1972 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler*)errorHandler);
1974 ISAXErrorHandler_AddRef((ISAXErrorHandler*)errorHandler);
1977 if(vbInterface && This->vberrorHandler)
1978 IVBSAXErrorHandler_Release(This->vberrorHandler);
1979 else if(!vbInterface && This->errorHandler)
1980 ISAXErrorHandler_Release(This->errorHandler);
1983 This->vberrorHandler = errorHandler;
1985 This->errorHandler = errorHandler;
1991 static HRESULT internal_parse(
1998 TRACE("(%p)\n", This);
2001 switch(V_VT(&varInput))
2004 hr = internal_parseBuffer(This, (const char*)V_BSTR(&varInput),
2005 SysStringByteLen(V_BSTR(&varInput)), vbInterface);
2007 case VT_ARRAY|VT_UI1: {
2009 LONG lBound, uBound;
2012 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
2013 if(hr != S_OK) break;
2014 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
2015 if(hr != S_OK) break;
2016 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
2017 hr = SafeArrayAccessData(V_ARRAY(&varInput), &pSAData);
2018 if(hr != S_OK) break;
2019 hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
2020 SafeArrayUnaccessData(V_ARRAY(&varInput));
2025 IPersistStream *persistStream;
2026 IStream *stream = NULL;
2027 IXMLDOMDocument *xmlDoc;
2029 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2030 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
2034 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
2035 hr = internal_parseBuffer(This, (const char*)bstrData,
2036 SysStringByteLen(bstrData), vbInterface);
2037 IXMLDOMDocument_Release(xmlDoc);
2038 SysFreeString(bstrData);
2041 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2042 &IID_IPersistStream, (void**)&persistStream) == S_OK)
2044 hr = IPersistStream_Save(persistStream, stream, TRUE);
2045 IPersistStream_Release(persistStream);
2046 if(hr != S_OK) break;
2048 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2049 &IID_IStream, (void**)&stream) == S_OK)
2051 hr = internal_parseStream(This, stream, vbInterface);
2052 IStream_Release(stream);
2057 WARN("vt %d not implemented\n", V_VT(&varInput));
2064 static HRESULT internal_vbonDataAvailable(void *obj, char *ptr, DWORD len)
2066 saxreader *This = obj;
2068 return internal_parseBuffer(This, ptr, len, TRUE);
2071 static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len)
2073 saxreader *This = obj;
2075 return internal_parseBuffer(This, ptr, len, FALSE);
2078 static HRESULT internal_parseURL(
2086 TRACE("(%p)->(%s)\n", This, debugstr_w(url));
2088 if(vbInterface) hr = bind_url(url, internal_vbonDataAvailable, This, &bsc);
2089 else hr = bind_url(url, internal_onDataAvailable, This, &bsc);
2099 static HRESULT internal_putProperty(
2105 static const WCHAR wszCharset[] = {
2106 'c','h','a','r','s','e','t',0
2108 static const WCHAR wszDeclarationHandler[] = {
2109 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2110 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2111 'd','e','c','l','a','r','a','t','i','o','n',
2112 '-','h','a','n','d','l','e','r',0
2114 static const WCHAR wszDomNode[] = {
2115 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2116 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2117 'd','o','m','-','n','o','d','e',0
2119 static const WCHAR wszInputSource[] = {
2120 'i','n','p','u','t','-','s','o','u','r','c','e',0
2122 static const WCHAR wszLexicalHandler[] = {
2123 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2124 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2125 'l','e','x','i','c','a','l','-','h','a','n','d','l','e','r',0
2127 static const WCHAR wszMaxElementDepth[] = {
2128 'm','a','x','-','e','l','e','m','e','n','t','-','d','e','p','t','h',0
2130 static const WCHAR wszMaxXMLSize[] = {
2131 'm','a','x','-','x','m','l','-','s','i','z','e',0
2133 static const WCHAR wszSchemaDeclarationHandler[] = {
2134 's','c','h','e','m','a','-',
2135 'd','e','c','l','a','r','a','t','i','o','n','-',
2136 'h','a','n','d','l','e','r',0
2138 static const WCHAR wszXMLDeclEncoding[] = {
2139 'x','m','l','d','e','c','l','-','e','n','c','o','d','i','n','g',0
2141 static const WCHAR wszXMLDeclStandalone[] = {
2142 'x','m','l','d','e','c','l',
2143 '-','s','t','a','n','d','a','l','o','n','e',0
2145 static const WCHAR wszXMLDeclVersion[] = {
2146 'x','m','l','d','e','c','l','-','v','e','r','s','i','o','n',0
2149 TRACE("(%p)->(%s)\n", This, debugstr_w(pProp));
2151 if(!memcmp(pProp, wszDeclarationHandler, sizeof(wszDeclarationHandler)))
2153 if(This->isParsing) return E_FAIL;
2155 if(V_UNKNOWN(&value))
2158 IVBSAXDeclHandler_AddRef((IVBSAXDeclHandler*)V_UNKNOWN(&value));
2160 ISAXDeclHandler_AddRef((ISAXDeclHandler*)V_UNKNOWN(&value));
2162 if((vbInterface && This->vbdeclHandler)
2163 || (!vbInterface && This->declHandler))
2166 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2168 ISAXDeclHandler_Release(This->declHandler);
2171 This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
2173 This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
2177 if(!memcmp(pProp, wszLexicalHandler, sizeof(wszLexicalHandler)))
2179 if(This->isParsing) return E_FAIL;
2181 if(V_UNKNOWN(&value))
2184 IVBSAXLexicalHandler_AddRef(
2185 (IVBSAXLexicalHandler*)V_UNKNOWN(&value));
2187 ISAXLexicalHandler_AddRef(
2188 (ISAXLexicalHandler*)V_UNKNOWN(&value));
2190 if((vbInterface && This->vblexicalHandler)
2191 || (!vbInterface && This->lexicalHandler))
2194 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2196 ISAXLexicalHandler_Release(This->lexicalHandler);
2199 This->vblexicalHandler = (IVBSAXLexicalHandler*)V_UNKNOWN(&value);
2201 This->lexicalHandler = (ISAXLexicalHandler*)V_UNKNOWN(&value);
2205 FIXME("(%p)->(%s): unsupported property\n", This, debugstr_w(pProp));
2207 if(!memcmp(pProp, wszCharset, sizeof(wszCharset)))
2210 if(!memcmp(pProp, wszDomNode, sizeof(wszDomNode)))
2213 if(!memcmp(pProp, wszInputSource, sizeof(wszInputSource)))
2216 if(!memcmp(pProp, wszMaxElementDepth, sizeof(wszMaxElementDepth)))
2219 if(!memcmp(pProp, wszMaxXMLSize, sizeof(wszMaxXMLSize)))
2222 if(!memcmp(pProp, wszSchemaDeclarationHandler,
2223 sizeof(wszSchemaDeclarationHandler)))
2226 if(!memcmp(pProp, wszXMLDeclEncoding, sizeof(wszXMLDeclEncoding)))
2229 if(!memcmp(pProp, wszXMLDeclStandalone, sizeof(wszXMLDeclStandalone)))
2232 if(!memcmp(pProp, wszXMLDeclVersion, sizeof(wszXMLDeclVersion)))
2235 return E_INVALIDARG;
2238 /*** IVBSAXXMLReader interface ***/
2239 /*** IUnknown methods ***/
2240 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
2242 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2244 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
2248 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
2249 IsEqualGUID( riid, &IID_IDispatch ) ||
2250 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
2254 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
2256 *ppvObject = &This->lpSAXXMLReaderVtbl;
2260 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2261 return E_NOINTERFACE;
2264 IVBSAXXMLReader_AddRef( iface );
2269 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
2271 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2272 TRACE("%p\n", This );
2273 return InterlockedIncrement( &This->ref );
2276 static ULONG WINAPI saxxmlreader_Release(
2277 IVBSAXXMLReader* iface)
2279 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2282 TRACE("%p\n", This );
2284 ref = InterlockedDecrement( &This->ref );
2287 if(This->contentHandler)
2288 ISAXContentHandler_Release(This->contentHandler);
2290 if(This->vbcontentHandler)
2291 IVBSAXContentHandler_Release(This->vbcontentHandler);
2293 if(This->errorHandler)
2294 ISAXErrorHandler_Release(This->errorHandler);
2296 if(This->vberrorHandler)
2297 IVBSAXErrorHandler_Release(This->vberrorHandler);
2299 if(This->lexicalHandler)
2300 ISAXLexicalHandler_Release(This->lexicalHandler);
2302 if(This->vblexicalHandler)
2303 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2305 if(This->declHandler)
2306 ISAXDeclHandler_Release(This->declHandler);
2308 if(This->vbdeclHandler)
2309 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2317 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
2319 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2321 TRACE("(%p)->(%p)\n", This, pctinfo);
2328 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
2329 IVBSAXXMLReader *iface,
2330 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2332 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2335 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2337 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
2342 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
2343 IVBSAXXMLReader *iface,
2345 LPOLESTR* rgszNames,
2350 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2351 ITypeInfo *typeinfo;
2354 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2357 if(!rgszNames || cNames == 0 || !rgDispId)
2358 return E_INVALIDARG;
2360 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2363 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
2364 ITypeInfo_Release(typeinfo);
2370 static HRESULT WINAPI saxxmlreader_Invoke(
2371 IVBSAXXMLReader *iface,
2372 DISPID dispIdMember,
2376 DISPPARAMS* pDispParams,
2377 VARIANT* pVarResult,
2378 EXCEPINFO* pExcepInfo,
2381 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2382 ITypeInfo *typeinfo;
2385 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2386 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2388 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2391 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXXMLReaderVtbl), dispIdMember, wFlags, pDispParams,
2392 pVarResult, pExcepInfo, puArgErr);
2393 ITypeInfo_Release(typeinfo);
2399 /*** IVBSAXXMLReader methods ***/
2400 static HRESULT WINAPI saxxmlreader_getFeature(
2401 IVBSAXXMLReader* iface,
2402 const WCHAR *pFeature,
2403 VARIANT_BOOL *pValue)
2405 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2407 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
2411 static HRESULT WINAPI saxxmlreader_putFeature(
2412 IVBSAXXMLReader* iface,
2413 const WCHAR *pFeature,
2414 VARIANT_BOOL vfValue)
2416 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2418 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
2422 static HRESULT WINAPI saxxmlreader_getProperty(
2423 IVBSAXXMLReader* iface,
2427 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2429 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
2433 static HRESULT WINAPI saxxmlreader_putProperty(
2434 IVBSAXXMLReader* iface,
2438 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2439 return internal_putProperty(This, pProp, value, TRUE);
2442 static HRESULT WINAPI saxxmlreader_get_entityResolver(
2443 IVBSAXXMLReader* iface,
2444 IVBSAXEntityResolver **pEntityResolver)
2446 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2447 return internal_getEntityResolver(This, pEntityResolver, TRUE);
2450 static HRESULT WINAPI saxxmlreader_put_entityResolver(
2451 IVBSAXXMLReader* iface,
2452 IVBSAXEntityResolver *pEntityResolver)
2454 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2455 return internal_putEntityResolver(This, pEntityResolver, TRUE);
2458 static HRESULT WINAPI saxxmlreader_get_contentHandler(
2459 IVBSAXXMLReader* iface,
2460 IVBSAXContentHandler **ppContentHandler)
2462 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2463 return internal_getContentHandler(This, ppContentHandler, TRUE);
2466 static HRESULT WINAPI saxxmlreader_put_contentHandler(
2467 IVBSAXXMLReader* iface,
2468 IVBSAXContentHandler *contentHandler)
2470 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2471 return internal_putContentHandler(This, contentHandler, TRUE);
2474 static HRESULT WINAPI saxxmlreader_get_dtdHandler(
2475 IVBSAXXMLReader* iface,
2476 IVBSAXDTDHandler **pDTDHandler)
2478 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2479 return internal_getDTDHandler(This, pDTDHandler, TRUE);
2482 static HRESULT WINAPI saxxmlreader_put_dtdHandler(
2483 IVBSAXXMLReader* iface,
2484 IVBSAXDTDHandler *pDTDHandler)
2486 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2487 return internal_putDTDHandler(This, pDTDHandler, TRUE);
2490 static HRESULT WINAPI saxxmlreader_get_errorHandler(
2491 IVBSAXXMLReader* iface,
2492 IVBSAXErrorHandler **pErrorHandler)
2494 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2495 return internal_getErrorHandler(This, pErrorHandler, TRUE);
2498 static HRESULT WINAPI saxxmlreader_put_errorHandler(
2499 IVBSAXXMLReader* iface,
2500 IVBSAXErrorHandler *errorHandler)
2502 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2503 return internal_putErrorHandler(This, errorHandler, TRUE);
2506 static HRESULT WINAPI saxxmlreader_get_baseURL(
2507 IVBSAXXMLReader* iface,
2508 const WCHAR **pBaseUrl)
2510 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2512 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
2516 static HRESULT WINAPI saxxmlreader_put_baseURL(
2517 IVBSAXXMLReader* iface,
2518 const WCHAR *pBaseUrl)
2520 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2522 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
2526 static HRESULT WINAPI saxxmlreader_get_secureBaseURL(
2527 IVBSAXXMLReader* iface,
2528 const WCHAR **pSecureBaseUrl)
2530 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2532 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
2537 static HRESULT WINAPI saxxmlreader_put_secureBaseURL(
2538 IVBSAXXMLReader* iface,
2539 const WCHAR *secureBaseUrl)
2541 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2543 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
2547 static HRESULT WINAPI saxxmlreader_parse(
2548 IVBSAXXMLReader* iface,
2551 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2552 return internal_parse(This, varInput, TRUE);
2555 static HRESULT WINAPI saxxmlreader_parseURL(
2556 IVBSAXXMLReader* iface,
2559 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2560 return internal_parseURL(This, url, TRUE);
2563 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
2565 saxxmlreader_QueryInterface,
2566 saxxmlreader_AddRef,
2567 saxxmlreader_Release,
2568 saxxmlreader_GetTypeInfoCount,
2569 saxxmlreader_GetTypeInfo,
2570 saxxmlreader_GetIDsOfNames,
2571 saxxmlreader_Invoke,
2572 saxxmlreader_getFeature,
2573 saxxmlreader_putFeature,
2574 saxxmlreader_getProperty,
2575 saxxmlreader_putProperty,
2576 saxxmlreader_get_entityResolver,
2577 saxxmlreader_put_entityResolver,
2578 saxxmlreader_get_contentHandler,
2579 saxxmlreader_put_contentHandler,
2580 saxxmlreader_get_dtdHandler,
2581 saxxmlreader_put_dtdHandler,
2582 saxxmlreader_get_errorHandler,
2583 saxxmlreader_put_errorHandler,
2584 saxxmlreader_get_baseURL,
2585 saxxmlreader_put_baseURL,
2586 saxxmlreader_get_secureBaseURL,
2587 saxxmlreader_put_secureBaseURL,
2589 saxxmlreader_parseURL
2592 /*** ISAXXMLReader interface ***/
2593 /*** IUnknown methods ***/
2594 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
2596 saxreader *This = impl_from_ISAXXMLReader( iface );
2597 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl, riid, ppvObject);
2600 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
2602 saxreader *This = impl_from_ISAXXMLReader( iface );
2603 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2606 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
2608 saxreader *This = impl_from_ISAXXMLReader( iface );
2609 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2612 /*** ISAXXMLReader methods ***/
2613 static HRESULT WINAPI isaxxmlreader_getFeature(
2614 ISAXXMLReader* iface,
2615 const WCHAR *pFeature,
2616 VARIANT_BOOL *pValue)
2618 saxreader *This = impl_from_ISAXXMLReader( iface );
2619 return IVBSAXXMLReader_getFeature(
2620 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2624 static HRESULT WINAPI isaxxmlreader_putFeature(
2625 ISAXXMLReader* iface,
2626 const WCHAR *pFeature,
2627 VARIANT_BOOL vfValue)
2629 saxreader *This = impl_from_ISAXXMLReader( iface );
2630 return IVBSAXXMLReader_putFeature(
2631 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2635 static HRESULT WINAPI isaxxmlreader_getProperty(
2636 ISAXXMLReader* iface,
2640 saxreader *This = impl_from_ISAXXMLReader( iface );
2641 return IVBSAXXMLReader_getProperty(
2642 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2646 static HRESULT WINAPI isaxxmlreader_putProperty(
2647 ISAXXMLReader* iface,
2651 saxreader *This = impl_from_ISAXXMLReader( iface );
2652 return internal_putProperty(This, pProp, value, FALSE);
2655 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
2656 ISAXXMLReader* iface,
2657 ISAXEntityResolver **ppEntityResolver)
2659 saxreader *This = impl_from_ISAXXMLReader( iface );
2660 return internal_getEntityResolver(This, ppEntityResolver, FALSE);
2663 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
2664 ISAXXMLReader* iface,
2665 ISAXEntityResolver *pEntityResolver)
2667 saxreader *This = impl_from_ISAXXMLReader( iface );
2668 return internal_putEntityResolver(This, pEntityResolver, FALSE);
2671 static HRESULT WINAPI isaxxmlreader_getContentHandler(
2672 ISAXXMLReader* iface,
2673 ISAXContentHandler **pContentHandler)
2675 saxreader *This = impl_from_ISAXXMLReader( iface );
2676 return internal_getContentHandler(This, pContentHandler, FALSE);
2679 static HRESULT WINAPI isaxxmlreader_putContentHandler(
2680 ISAXXMLReader* iface,
2681 ISAXContentHandler *contentHandler)
2683 saxreader *This = impl_from_ISAXXMLReader( iface );
2684 return internal_putContentHandler(This, contentHandler, FALSE);
2687 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
2688 ISAXXMLReader* iface,
2689 ISAXDTDHandler **pDTDHandler)
2691 saxreader *This = impl_from_ISAXXMLReader( iface );
2692 return internal_getDTDHandler(This, pDTDHandler, FALSE);
2695 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
2696 ISAXXMLReader* iface,
2697 ISAXDTDHandler *pDTDHandler)
2699 saxreader *This = impl_from_ISAXXMLReader( iface );
2700 return internal_putDTDHandler(This, pDTDHandler, FALSE);
2703 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
2704 ISAXXMLReader* iface,
2705 ISAXErrorHandler **pErrorHandler)
2707 saxreader *This = impl_from_ISAXXMLReader( iface );
2708 return internal_getErrorHandler(This, pErrorHandler, FALSE);
2711 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
2712 ISAXXMLReader* iface,
2713 ISAXErrorHandler *errorHandler)
2715 saxreader *This = impl_from_ISAXXMLReader( iface );
2716 return internal_putErrorHandler(This, errorHandler, FALSE);
2719 static HRESULT WINAPI isaxxmlreader_getBaseURL(
2720 ISAXXMLReader* iface,
2721 const WCHAR **pBaseUrl)
2723 saxreader *This = impl_from_ISAXXMLReader( iface );
2724 return IVBSAXXMLReader_get_baseURL(
2725 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2729 static HRESULT WINAPI isaxxmlreader_putBaseURL(
2730 ISAXXMLReader* iface,
2731 const WCHAR *pBaseUrl)
2733 saxreader *This = impl_from_ISAXXMLReader( iface );
2734 return IVBSAXXMLReader_put_baseURL(
2735 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2739 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
2740 ISAXXMLReader* iface,
2741 const WCHAR **pSecureBaseUrl)
2743 saxreader *This = impl_from_ISAXXMLReader( iface );
2744 return IVBSAXXMLReader_get_secureBaseURL(
2745 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2749 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
2750 ISAXXMLReader* iface,
2751 const WCHAR *secureBaseUrl)
2753 saxreader *This = impl_from_ISAXXMLReader( iface );
2754 return IVBSAXXMLReader_put_secureBaseURL(
2755 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2759 static HRESULT WINAPI isaxxmlreader_parse(
2760 ISAXXMLReader* iface,
2763 saxreader *This = impl_from_ISAXXMLReader( iface );
2764 return internal_parse(This, varInput, FALSE);
2767 static HRESULT WINAPI isaxxmlreader_parseURL(
2768 ISAXXMLReader* iface,
2771 saxreader *This = impl_from_ISAXXMLReader( iface );
2772 return internal_parseURL(This, url, FALSE);
2775 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
2777 isaxxmlreader_QueryInterface,
2778 isaxxmlreader_AddRef,
2779 isaxxmlreader_Release,
2780 isaxxmlreader_getFeature,
2781 isaxxmlreader_putFeature,
2782 isaxxmlreader_getProperty,
2783 isaxxmlreader_putProperty,
2784 isaxxmlreader_getEntityResolver,
2785 isaxxmlreader_putEntityResolver,
2786 isaxxmlreader_getContentHandler,
2787 isaxxmlreader_putContentHandler,
2788 isaxxmlreader_getDTDHandler,
2789 isaxxmlreader_putDTDHandler,
2790 isaxxmlreader_getErrorHandler,
2791 isaxxmlreader_putErrorHandler,
2792 isaxxmlreader_getBaseURL,
2793 isaxxmlreader_putBaseURL,
2794 isaxxmlreader_getSecureBaseURL,
2795 isaxxmlreader_putSecureBaseURL,
2796 isaxxmlreader_parse,
2797 isaxxmlreader_parseURL
2800 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2804 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
2806 reader = heap_alloc( sizeof (*reader) );
2808 return E_OUTOFMEMORY;
2810 reader->lpVBSAXXMLReaderVtbl = &saxreader_vtbl;
2811 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
2813 reader->contentHandler = NULL;
2814 reader->vbcontentHandler = NULL;
2815 reader->errorHandler = NULL;
2816 reader->vberrorHandler = NULL;
2817 reader->lexicalHandler = NULL;
2818 reader->vblexicalHandler = NULL;
2819 reader->declHandler = NULL;
2820 reader->vbdeclHandler = NULL;
2821 reader->isParsing = FALSE;
2823 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
2824 reader->sax.initialized = XML_SAX2_MAGIC;
2825 reader->sax.startDocument = libxmlStartDocument;
2826 reader->sax.endDocument = libxmlEndDocument;
2827 reader->sax.startElementNs = libxmlStartElementNS;
2828 reader->sax.endElementNs = libxmlEndElementNS;
2829 reader->sax.characters = libxmlCharacters;
2830 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
2831 reader->sax.comment = libxmlComment;
2832 reader->sax.error = libxmlFatalError;
2833 reader->sax.fatalError = libxmlFatalError;
2834 reader->sax.cdataBlock = libxmlCDataBlock;
2836 *ppObj = &reader->lpVBSAXXMLReaderVtbl;
2838 TRACE("returning iface %p\n", *ppObj);
2845 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2847 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2848 "libxml2 support was not present at compile time.\n");