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);
221 SysFreeString(bstrMsg);
224 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
225 (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
229 static void update_position(saxlocator *This, xmlChar *end)
231 if(This->lastCur == NULL)
233 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
235 This->realColumn = 1;
237 else if(This->lastCur < This->pParserCtxt->input->base)
239 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
241 This->realColumn = 1;
244 if(This->pParserCtxt->input->cur<This->lastCur)
246 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
248 This->realColumn = 1;
251 if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
253 while(This->lastCur < end)
255 if(*(This->lastCur) == '\n')
258 This->realColumn = 1;
260 else if(*(This->lastCur) == '\r' &&
261 (This->lastCur==This->pParserCtxt->input->end ||
262 *(This->lastCur+1)!='\n'))
265 This->realColumn = 1;
267 else This->realColumn++;
271 /* Count multibyte UTF8 encoded characters once */
272 while((*(This->lastCur)&0xC0) == 0x80) This->lastCur++;
275 This->line = This->realLine;
276 This->column = This->realColumn;
279 /*** IVBSAXAttributes interface ***/
280 /*** IUnknown methods ***/
281 static HRESULT WINAPI ivbsaxattributes_QueryInterface(
282 IVBSAXAttributes* iface,
286 saxattributes *This = impl_from_IVBSAXAttributes(iface);
288 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
292 if (IsEqualGUID(riid, &IID_IUnknown) ||
293 IsEqualGUID(riid, &IID_IDispatch) ||
294 IsEqualGUID(riid, &IID_IVBSAXAttributes))
300 FIXME("interface %s not implemented\n", debugstr_guid(riid));
301 return E_NOINTERFACE;
304 IVBSAXAttributes_AddRef(iface);
309 static ULONG WINAPI ivbsaxattributes_AddRef(IVBSAXAttributes* iface)
311 saxattributes *This = impl_from_IVBSAXAttributes(iface);
312 return ISAXAttributes_AddRef((ISAXAttributes*)&This->lpSAXAttributesVtbl);
315 static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes* iface)
317 saxattributes *This = impl_from_IVBSAXAttributes(iface);
318 return ISAXAttributes_Release((ISAXAttributes*)&This->lpSAXAttributesVtbl);
321 /*** IDispatch methods ***/
322 static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes *iface, UINT* pctinfo )
324 saxattributes *This = impl_from_IVBSAXAttributes( iface );
326 TRACE("(%p)->(%p)\n", This, pctinfo);
333 static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(
334 IVBSAXAttributes *iface,
335 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
337 saxattributes *This = impl_from_IVBSAXAttributes( iface );
340 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
342 hr = get_typeinfo(IVBSAXAttributes_tid, ppTInfo);
347 static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(
348 IVBSAXAttributes *iface,
355 saxattributes *This = impl_from_IVBSAXAttributes( iface );
359 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
362 if(!rgszNames || cNames == 0 || !rgDispId)
365 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
368 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
369 ITypeInfo_Release(typeinfo);
375 static HRESULT WINAPI ivbsaxattributes_Invoke(
376 IVBSAXAttributes *iface,
381 DISPPARAMS* pDispParams,
383 EXCEPINFO* pExcepInfo,
386 saxattributes *This = impl_from_IVBSAXAttributes( iface );
390 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
391 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
393 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
396 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXAttributesVtbl), dispIdMember, wFlags, pDispParams,
397 pVarResult, pExcepInfo, puArgErr);
398 ITypeInfo_Release(typeinfo);
404 /*** IVBSAXAttributes methods ***/
405 static HRESULT WINAPI ivbsaxattributes_get_length(
406 IVBSAXAttributes* iface,
409 saxattributes *This = impl_from_IVBSAXAttributes( iface );
410 return ISAXAttributes_getLength(
411 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
415 static HRESULT WINAPI ivbsaxattributes_getURI(
416 IVBSAXAttributes* iface,
421 saxattributes *This = impl_from_IVBSAXAttributes( iface );
422 return ISAXAttributes_getURI(
423 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
424 nIndex, (const WCHAR**)uri, &len);
427 static HRESULT WINAPI ivbsaxattributes_getLocalName(
428 IVBSAXAttributes* iface,
433 saxattributes *This = impl_from_IVBSAXAttributes( iface );
434 return ISAXAttributes_getLocalName(
435 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
436 nIndex, (const WCHAR**)localName, &len);
439 static HRESULT WINAPI ivbsaxattributes_getQName(
440 IVBSAXAttributes* iface,
445 saxattributes *This = impl_from_IVBSAXAttributes( iface );
446 return ISAXAttributes_getQName(
447 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
448 nIndex, (const WCHAR**)QName, &len);
451 static HRESULT WINAPI ivbsaxattributes_getIndexFromName(
452 IVBSAXAttributes* iface,
457 saxattributes *This = impl_from_IVBSAXAttributes( iface );
458 return ISAXAttributes_getIndexFromName(
459 (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
460 localName, SysStringLen(localName), index);
463 static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(
464 IVBSAXAttributes* iface,
468 saxattributes *This = impl_from_IVBSAXAttributes( iface );
469 return ISAXAttributes_getIndexFromQName(
470 (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
471 SysStringLen(QName), index);
474 static HRESULT WINAPI ivbsaxattributes_getType(
475 IVBSAXAttributes* iface,
480 saxattributes *This = impl_from_IVBSAXAttributes( iface );
481 return ISAXAttributes_getType(
482 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
483 nIndex, (const WCHAR**)type, &len);
486 static HRESULT WINAPI ivbsaxattributes_getTypeFromName(
487 IVBSAXAttributes* iface,
493 saxattributes *This = impl_from_IVBSAXAttributes( iface );
494 return ISAXAttributes_getTypeFromName(
495 (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
496 localName, SysStringLen(localName), (const WCHAR**)type, &len);
499 static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(
500 IVBSAXAttributes* iface,
505 saxattributes *This = impl_from_IVBSAXAttributes( iface );
506 return ISAXAttributes_getTypeFromQName(
507 (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
508 SysStringLen(QName), (const WCHAR**)type, &len);
511 static HRESULT WINAPI ivbsaxattributes_getValue(
512 IVBSAXAttributes* iface,
517 saxattributes *This = impl_from_IVBSAXAttributes( iface );
518 return ISAXAttributes_getValue(
519 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
520 nIndex, (const WCHAR**)value, &len);
523 static HRESULT WINAPI ivbsaxattributes_getValueFromName(
524 IVBSAXAttributes* iface,
530 saxattributes *This = impl_from_IVBSAXAttributes( iface );
531 return ISAXAttributes_getValueFromName(
532 (ISAXAttributes*)&This->lpSAXAttributesVtbl, uri, SysStringLen(uri),
533 localName, SysStringLen(localName), (const WCHAR**)value, &len);
536 static HRESULT WINAPI ivbsaxattributes_getValueFromQName(
537 IVBSAXAttributes* iface,
542 saxattributes *This = impl_from_IVBSAXAttributes( iface );
543 return ISAXAttributes_getValueFromQName(
544 (ISAXAttributes*)&This->lpSAXAttributesVtbl, QName,
545 SysStringLen(QName), (const WCHAR**)value, &len);
548 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
550 ivbsaxattributes_QueryInterface,
551 ivbsaxattributes_AddRef,
552 ivbsaxattributes_Release,
553 ivbsaxattributes_GetTypeInfoCount,
554 ivbsaxattributes_GetTypeInfo,
555 ivbsaxattributes_GetIDsOfNames,
556 ivbsaxattributes_Invoke,
557 ivbsaxattributes_get_length,
558 ivbsaxattributes_getURI,
559 ivbsaxattributes_getLocalName,
560 ivbsaxattributes_getQName,
561 ivbsaxattributes_getIndexFromName,
562 ivbsaxattributes_getIndexFromQName,
563 ivbsaxattributes_getType,
564 ivbsaxattributes_getTypeFromName,
565 ivbsaxattributes_getTypeFromQName,
566 ivbsaxattributes_getValue,
567 ivbsaxattributes_getValueFromName,
568 ivbsaxattributes_getValueFromQName
571 /*** ISAXAttributes interface ***/
572 /*** IUnknown methods ***/
573 static HRESULT WINAPI isaxattributes_QueryInterface(
574 ISAXAttributes* iface,
578 saxattributes *This = impl_from_ISAXAttributes(iface);
580 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
584 if (IsEqualGUID(riid, &IID_IUnknown) ||
585 IsEqualGUID(riid, &IID_ISAXAttributes))
591 FIXME("interface %s not implemented\n", debugstr_guid(riid));
592 return E_NOINTERFACE;
595 ISAXAttributes_AddRef(iface);
600 static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
602 saxattributes *This = impl_from_ISAXAttributes(iface);
604 return InterlockedIncrement(&This->ref);
607 static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
609 saxattributes *This = impl_from_ISAXAttributes(iface);
614 ref = InterlockedDecrement(&This->ref);
618 for(index=0; index<This->nb_attributes; index++)
620 SysFreeString(This->szLocalname[index]);
621 SysFreeString(This->szURI[index]);
622 SysFreeString(This->szValue[index]);
623 SysFreeString(This->szQName[index]);
626 heap_free(This->szLocalname);
627 heap_free(This->szURI);
628 heap_free(This->szValue);
629 heap_free(This->szQName);
637 /*** ISAXAttributes methods ***/
638 static HRESULT WINAPI isaxattributes_getLength(
639 ISAXAttributes* iface,
642 saxattributes *This = impl_from_ISAXAttributes( iface );
644 *length = This->nb_attributes;
645 TRACE("Length set to %d\n", *length);
649 static HRESULT WINAPI isaxattributes_getURI(
650 ISAXAttributes* iface,
655 saxattributes *This = impl_from_ISAXAttributes( iface );
656 TRACE("(%p)->(%d)\n", This, nIndex);
658 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
659 if(!pUrl || !pUriSize) return E_POINTER;
661 *pUriSize = SysStringLen(This->szURI[nIndex]);
662 *pUrl = This->szURI[nIndex];
667 static HRESULT WINAPI isaxattributes_getLocalName(
668 ISAXAttributes* iface,
670 const WCHAR **pLocalName,
671 int *pLocalNameLength)
673 saxattributes *This = impl_from_ISAXAttributes( iface );
674 TRACE("(%p)->(%d)\n", This, nIndex);
676 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
677 if(!pLocalName || !pLocalNameLength) return E_POINTER;
679 *pLocalNameLength = SysStringLen(This->szLocalname[nIndex]);
680 *pLocalName = This->szLocalname[nIndex];
685 static HRESULT WINAPI isaxattributes_getQName(
686 ISAXAttributes* iface,
688 const WCHAR **pQName,
691 saxattributes *This = impl_from_ISAXAttributes( iface );
692 TRACE("(%p)->(%d)\n", This, nIndex);
694 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
695 if(!pQName || !pQNameLength) return E_POINTER;
697 *pQNameLength = SysStringLen(This->szQName[nIndex]);
698 *pQName = This->szQName[nIndex];
703 static HRESULT WINAPI isaxattributes_getName(
704 ISAXAttributes* iface,
708 const WCHAR **pLocalName,
710 const WCHAR **pQName,
713 saxattributes *This = impl_from_ISAXAttributes( iface );
714 TRACE("(%p)->(%d)\n", This, nIndex);
716 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
717 if(!pUri || !pUriLength || !pLocalName || !pLocalNameSize
718 || !pQName || !pQNameLength) return E_POINTER;
720 *pUriLength = SysStringLen(This->szURI[nIndex]);
721 *pUri = This->szURI[nIndex];
722 *pLocalNameSize = SysStringLen(This->szLocalname[nIndex]);
723 *pLocalName = This->szLocalname[nIndex];
724 *pQNameLength = SysStringLen(This->szQName[nIndex]);
725 *pQName = This->szQName[nIndex];
730 static HRESULT WINAPI isaxattributes_getIndexFromName(
731 ISAXAttributes* iface,
734 const WCHAR *pLocalName,
738 saxattributes *This = impl_from_ISAXAttributes( iface );
740 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), cUriLength,
741 debugstr_w(pLocalName), cocalNameLength);
743 if(!pUri || !pLocalName || !index) return E_POINTER;
745 for(i=0; i<This->nb_attributes; i++)
747 if(cUriLength!=SysStringLen(This->szURI[i])
748 || cocalNameLength!=SysStringLen(This->szLocalname[i]))
750 if(cUriLength && memcmp(pUri, This->szURI[i],
751 sizeof(WCHAR)*cUriLength))
753 if(cocalNameLength && memcmp(pLocalName, This->szLocalname[i],
754 sizeof(WCHAR)*cocalNameLength))
764 static HRESULT WINAPI isaxattributes_getIndexFromQName(
765 ISAXAttributes* iface,
770 saxattributes *This = impl_from_ISAXAttributes( iface );
772 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQNameLength);
774 if(!pQName || !index) return E_POINTER;
775 if(!nQNameLength) return E_INVALIDARG;
777 for(i=0; i<This->nb_attributes; i++)
779 if(nQNameLength!=SysStringLen(This->szQName[i])) continue;
780 if(memcmp(pQName, This->szQName, sizeof(WCHAR)*nQNameLength)) continue;
789 static HRESULT WINAPI isaxattributes_getType(
790 ISAXAttributes* iface,
795 saxattributes *This = impl_from_ISAXAttributes( iface );
797 FIXME("(%p)->(%d) stub\n", This, nIndex);
801 static HRESULT WINAPI isaxattributes_getTypeFromName(
802 ISAXAttributes* iface,
805 const WCHAR *pLocalName,
810 saxattributes *This = impl_from_ISAXAttributes( iface );
812 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
813 debugstr_w(pLocalName), nLocalName);
817 static HRESULT WINAPI isaxattributes_getTypeFromQName(
818 ISAXAttributes* iface,
824 saxattributes *This = impl_from_ISAXAttributes( iface );
826 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
830 static HRESULT WINAPI isaxattributes_getValue(
831 ISAXAttributes* iface,
833 const WCHAR **pValue,
836 saxattributes *This = impl_from_ISAXAttributes( iface );
837 TRACE("(%p)->(%d)\n", This, nIndex);
839 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
840 if(!pValue || !nValue) return E_POINTER;
842 *nValue = SysStringLen(This->szValue[nIndex]);
843 *pValue = This->szValue[nIndex];
848 static HRESULT WINAPI isaxattributes_getValueFromName(
849 ISAXAttributes* iface,
852 const WCHAR *pLocalName,
854 const WCHAR **pValue,
859 saxattributes *This = impl_from_ISAXAttributes( iface );
860 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), nUri,
861 debugstr_w(pLocalName), nLocalName);
863 hr = ISAXAttributes_getIndexFromName(iface,
864 pUri, nUri, pLocalName, nLocalName, &index);
865 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
870 static HRESULT WINAPI isaxattributes_getValueFromQName(
871 ISAXAttributes* iface,
874 const WCHAR **pValue,
879 saxattributes *This = impl_from_ISAXAttributes( iface );
880 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQName);
882 hr = ISAXAttributes_getIndexFromQName(iface, pQName, nQName, &index);
883 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
888 static const struct ISAXAttributesVtbl isaxattributes_vtbl =
890 isaxattributes_QueryInterface,
891 isaxattributes_AddRef,
892 isaxattributes_Release,
893 isaxattributes_getLength,
894 isaxattributes_getURI,
895 isaxattributes_getLocalName,
896 isaxattributes_getQName,
897 isaxattributes_getName,
898 isaxattributes_getIndexFromName,
899 isaxattributes_getIndexFromQName,
900 isaxattributes_getType,
901 isaxattributes_getTypeFromName,
902 isaxattributes_getTypeFromQName,
903 isaxattributes_getValue,
904 isaxattributes_getValueFromName,
905 isaxattributes_getValueFromQName
908 static HRESULT SAXAttributes_create(saxattributes **attr,
909 int nb_namespaces, const xmlChar **xmlNamespaces,
910 int nb_attributes, const xmlChar **xmlAttributes)
912 saxattributes *attributes;
914 static const xmlChar xmlns[] = "xmlns";
916 attributes = heap_alloc(sizeof(*attributes));
918 return E_OUTOFMEMORY;
920 attributes->lpVBSAXAttributesVtbl = &ivbsaxattributes_vtbl;
921 attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
924 attributes->nb_attributes = nb_namespaces+nb_attributes;
926 attributes->szLocalname = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
927 attributes->szURI = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
928 attributes->szValue = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
929 attributes->szQName = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
931 if(!attributes->szLocalname || !attributes->szURI
932 || !attributes->szValue || !attributes->szQName)
934 heap_free(attributes->szLocalname);
935 heap_free(attributes->szURI);
936 heap_free(attributes->szValue);
937 heap_free(attributes->szQName);
938 heap_free(attributes);
942 for(index=0; index<nb_namespaces; index++)
944 attributes->szLocalname[index] = SysAllocStringLen(NULL, 0);
945 attributes->szURI[index] = SysAllocStringLen(NULL, 0);
946 attributes->szValue[index] = bstr_from_xmlChar(xmlNamespaces[2*index+1]);
947 attributes->szQName[index] = QName_from_xmlChar(xmlns, xmlNamespaces[2*index]);
950 for(index=0; index<nb_attributes; index++)
952 attributes->szLocalname[nb_namespaces+index] =
953 bstr_from_xmlChar(xmlAttributes[index*5]);
954 attributes->szURI[nb_namespaces+index] =
955 bstr_from_xmlChar(xmlAttributes[index*5+2]);
956 attributes->szValue[nb_namespaces+index] =
957 bstr_from_xmlCharN(xmlAttributes[index*5+3],
958 xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
959 attributes->szQName[nb_namespaces+index] =
960 QName_from_xmlChar(xmlAttributes[index*5+1], xmlAttributes[index*5]);
965 TRACE("returning %p\n", *attr);
970 /*** LibXML callbacks ***/
971 static void libxmlStartDocument(void *ctx)
973 saxlocator *This = ctx;
976 if(has_content_handler(This))
978 if(This->vbInterface)
979 hr = IVBSAXContentHandler_startDocument(This->saxreader->vbcontentHandler);
981 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
984 format_error_message_from_id(This, hr);
987 update_position(This, NULL);
990 static void libxmlEndDocument(void *ctx)
992 saxlocator *This = ctx;
998 if(This->ret != S_OK) return;
1000 if(has_content_handler(This))
1002 if(This->vbInterface)
1003 hr = IVBSAXContentHandler_endDocument(This->saxreader->vbcontentHandler);
1005 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
1008 format_error_message_from_id(This, hr);
1012 static void libxmlStartElementNS(
1014 const xmlChar *localname,
1015 const xmlChar *prefix,
1018 const xmlChar **namespaces,
1021 const xmlChar **attributes)
1023 BSTR NamespaceUri, LocalName, QName, Prefix, Uri;
1024 saxlocator *This = ctx;
1026 saxattributes *attr;
1029 if(*(This->pParserCtxt->input->cur) == '/')
1030 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+2);
1032 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
1034 hr = namespacePush(This, nb_namespaces);
1035 if(hr==S_OK && has_content_handler(This))
1037 for(index=0; index<nb_namespaces; index++)
1039 Prefix = bstr_from_xmlChar(namespaces[2*index]);
1040 Uri = bstr_from_xmlChar(namespaces[2*index+1]);
1042 if(This->vbInterface)
1043 hr = IVBSAXContentHandler_startPrefixMapping(
1044 This->saxreader->vbcontentHandler,
1047 hr = ISAXContentHandler_startPrefixMapping(
1048 This->saxreader->contentHandler,
1049 Prefix, SysStringLen(Prefix),
1050 Uri, SysStringLen(Uri));
1052 SysFreeString(Prefix);
1057 format_error_message_from_id(This, hr);
1062 NamespaceUri = bstr_from_xmlChar(URI);
1063 LocalName = bstr_from_xmlChar(localname);
1064 QName = QName_from_xmlChar(prefix, localname);
1066 hr = SAXAttributes_create(&attr, nb_namespaces, namespaces, nb_attributes, attributes);
1069 if(This->vbInterface)
1070 hr = IVBSAXContentHandler_startElement(
1071 This->saxreader->vbcontentHandler,
1072 &NamespaceUri, &LocalName, &QName,
1073 (IVBSAXAttributes*)&attr->lpVBSAXAttributesVtbl);
1075 hr = ISAXContentHandler_startElement(
1076 This->saxreader->contentHandler,
1077 NamespaceUri, SysStringLen(NamespaceUri),
1078 LocalName, SysStringLen(LocalName),
1079 QName, SysStringLen(QName),
1080 (ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1082 ISAXAttributes_Release((ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1085 SysFreeString(NamespaceUri);
1086 SysFreeString(LocalName);
1087 SysFreeString(QName);
1091 format_error_message_from_id(This, hr);
1094 static void libxmlEndElementNS(
1096 const xmlChar *localname,
1097 const xmlChar *prefix,
1100 BSTR NamespaceUri, LocalName, QName, Prefix;
1101 saxlocator *This = ctx;
1106 end = (xmlChar*)This->pParserCtxt->input->cur;
1107 if(*(end-1) != '>' || *(end-2) != '/')
1108 while(end-2>=This->pParserCtxt->input->base
1109 && *(end-2)!='<' && *(end-1)!='/') end--;
1111 update_position(This, end);
1113 nsNr = namespacePop(This);
1115 if(has_content_handler(This))
1117 NamespaceUri = bstr_from_xmlChar(URI);
1118 LocalName = bstr_from_xmlChar(localname);
1119 QName = QName_from_xmlChar(prefix, localname);
1121 if(This->vbInterface)
1122 hr = IVBSAXContentHandler_endElement(
1123 This->saxreader->vbcontentHandler,
1124 &NamespaceUri, &LocalName, &QName);
1126 hr = ISAXContentHandler_endElement(
1127 This->saxreader->contentHandler,
1128 NamespaceUri, SysStringLen(NamespaceUri),
1129 LocalName, SysStringLen(LocalName),
1130 QName, SysStringLen(QName));
1132 SysFreeString(NamespaceUri);
1133 SysFreeString(LocalName);
1134 SysFreeString(QName);
1138 format_error_message_from_id(This, hr);
1142 for(index=This->pParserCtxt->nsNr-2;
1143 index>=This->pParserCtxt->nsNr-nsNr*2; index-=2)
1145 Prefix = bstr_from_xmlChar(This->pParserCtxt->nsTab[index]);
1147 if(This->vbInterface)
1148 hr = IVBSAXContentHandler_endPrefixMapping(
1149 This->saxreader->vbcontentHandler, &Prefix);
1151 hr = ISAXContentHandler_endPrefixMapping(
1152 This->saxreader->contentHandler,
1153 Prefix, SysStringLen(Prefix));
1155 SysFreeString(Prefix);
1159 format_error_message_from_id(This, hr);
1166 update_position(This, NULL);
1169 static void libxmlCharacters(
1174 saxlocator *This = ctx;
1179 BOOL lastEvent = FALSE;
1181 if(!(has_content_handler(This))) return;
1184 if(*(ch-1)=='\r') cur--;
1187 if(ch<This->pParserCtxt->input->base || ch>This->pParserCtxt->input->end)
1192 while(end-ch<len && *end!='\r') end++;
1199 if(!lastEvent) *end = '\n';
1201 Chars = bstr_from_xmlCharN(cur, end-cur+1);
1202 if(This->vbInterface)
1203 hr = IVBSAXContentHandler_characters(
1204 This->saxreader->vbcontentHandler, &Chars);
1206 hr = ISAXContentHandler_characters(
1207 This->saxreader->contentHandler,
1208 Chars, SysStringLen(Chars));
1209 SysFreeString(Chars);
1213 format_error_message_from_id(This, hr);
1217 This->column += end-cur+1;
1231 if(end-ch == len) break;
1234 if(ch<This->pParserCtxt->input->base || ch>This->pParserCtxt->input->end)
1235 This->column = This->realColumn
1236 +This->pParserCtxt->input->cur-This->lastCur;
1239 static void libxmlSetDocumentLocator(
1241 xmlSAXLocatorPtr loc)
1243 saxlocator *This = ctx;
1246 if(This->vbInterface)
1247 hr = IVBSAXContentHandler_putref_documentLocator(
1248 This->saxreader->vbcontentHandler,
1249 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
1251 hr = ISAXContentHandler_putDocumentLocator(
1252 This->saxreader->contentHandler,
1253 (ISAXLocator*)&This->lpSAXLocatorVtbl);
1256 format_error_message_from_id(This, hr);
1259 static void libxmlComment(void *ctx, const xmlChar *value)
1261 saxlocator *This = ctx;
1264 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur;
1266 while(beg-4>=This->pParserCtxt->input->base
1267 && memcmp(beg-4, "<!--", sizeof(char[4]))) beg--;
1268 update_position(This, beg);
1270 if(!This->vbInterface && !This->saxreader->lexicalHandler) return;
1271 if(This->vbInterface && !This->saxreader->vblexicalHandler) return;
1273 bValue = bstr_from_xmlChar(value);
1275 if(This->vbInterface)
1276 hr = IVBSAXLexicalHandler_comment(
1277 This->saxreader->vblexicalHandler, &bValue);
1279 hr = ISAXLexicalHandler_comment(
1280 This->saxreader->lexicalHandler,
1281 bValue, SysStringLen(bValue));
1283 SysFreeString(bValue);
1286 format_error_message_from_id(This, hr);
1288 update_position(This, NULL);
1291 static void libxmlFatalError(void *ctx, const char *msg, ...)
1293 saxlocator *This = ctx;
1299 if((This->vbInterface && !This->saxreader->vberrorHandler)
1300 || (!This->vbInterface && !This->saxreader->errorHandler))
1302 xmlStopParser(This->pParserCtxt);
1307 FIXME("Error handling is not compatible.\n");
1309 va_start(args, msg);
1310 vsprintf(message, msg, args);
1313 len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0);
1314 error = heap_alloc(sizeof(WCHAR)*len);
1317 MultiByteToWideChar(CP_UNIXCP, 0, message, -1, error, len);
1318 TRACE("fatal error for %p: %s\n", This, debugstr_w(error));
1321 if(This->vbInterface)
1323 BSTR bstrError = SysAllocString(error);
1324 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
1325 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrError, E_FAIL);
1326 SysFreeString(bstrError);
1329 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
1330 (ISAXLocator*)&This->lpSAXLocatorVtbl, error, E_FAIL);
1334 xmlStopParser(This->pParserCtxt);
1338 static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len)
1340 saxlocator *This = ctx;
1342 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur-len;
1346 BOOL lastEvent = FALSE, change;
1348 while(beg-9>=This->pParserCtxt->input->base
1349 && memcmp(beg-9, "<![CDATA[", sizeof(char[9]))) beg--;
1350 update_position(This, beg);
1352 if(This->vbInterface && This->saxreader->vblexicalHandler)
1353 hr = IVBSAXLexicalHandler_startCDATA(This->saxreader->vblexicalHandler);
1354 if(!This->vbInterface && This->saxreader->lexicalHandler)
1355 hr = ISAXLexicalHandler_startCDATA(This->saxreader->lexicalHandler);
1359 format_error_message_from_id(This, hr);
1363 realLen = This->pParserCtxt->input->cur-beg-3;
1369 while(end-beg<realLen && *end!='\r') end++;
1370 if(end-beg==realLen)
1375 else if(end-beg==realLen-1 && *end=='\r' && *(end+1)=='\n')
1378 if(*end == '\r') change = TRUE;
1379 else change = FALSE;
1381 if(change) *end = '\n';
1383 if(has_content_handler(This))
1385 Chars = bstr_from_xmlCharN(cur, end-cur+1);
1386 if(This->vbInterface)
1387 hr = IVBSAXContentHandler_characters(
1388 This->saxreader->vbcontentHandler, &Chars);
1390 hr = ISAXContentHandler_characters(
1391 This->saxreader->contentHandler,
1392 Chars, SysStringLen(Chars));
1393 SysFreeString(Chars);
1396 if(change) *end = '\r';
1401 This->column += end-cur+2;
1406 if(This->vbInterface && This->saxreader->vblexicalHandler)
1407 hr = IVBSAXLexicalHandler_endCDATA(This->saxreader->vblexicalHandler);
1408 if(!This->vbInterface && This->saxreader->lexicalHandler)
1409 hr = ISAXLexicalHandler_endCDATA(This->saxreader->lexicalHandler);
1412 format_error_message_from_id(This, hr);
1414 This->column += 4+end-cur;
1417 /*** IVBSAXLocator interface ***/
1418 /*** IUnknown methods ***/
1419 static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject)
1421 saxlocator *This = impl_from_IVBSAXLocator( iface );
1423 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject);
1427 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1428 IsEqualGUID( riid, &IID_IDispatch) ||
1429 IsEqualGUID( riid, &IID_IVBSAXLocator ))
1435 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1436 return E_NOINTERFACE;
1439 IVBSAXLocator_AddRef( iface );
1444 static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator* iface)
1446 saxlocator *This = impl_from_IVBSAXLocator( iface );
1447 TRACE("%p\n", This );
1448 return InterlockedIncrement( &This->ref );
1451 static ULONG WINAPI ivbsaxlocator_Release(
1452 IVBSAXLocator* iface)
1454 saxlocator *This = impl_from_IVBSAXLocator( iface );
1455 return ISAXLocator_Release((ISAXLocator*)&This->lpVBSAXLocatorVtbl);
1458 /*** IDispatch methods ***/
1459 static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator *iface, UINT* pctinfo )
1461 saxlocator *This = impl_from_IVBSAXLocator( iface );
1463 TRACE("(%p)->(%p)\n", This, pctinfo);
1470 static HRESULT WINAPI ivbsaxlocator_GetTypeInfo(
1471 IVBSAXLocator *iface,
1472 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
1474 saxlocator *This = impl_from_IVBSAXLocator( iface );
1477 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1479 hr = get_typeinfo(IVBSAXLocator_tid, ppTInfo);
1484 static HRESULT WINAPI ivbsaxlocator_GetIDsOfNames(
1485 IVBSAXLocator *iface,
1487 LPOLESTR* rgszNames,
1492 saxlocator *This = impl_from_IVBSAXLocator( iface );
1493 ITypeInfo *typeinfo;
1496 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1499 if(!rgszNames || cNames == 0 || !rgDispId)
1500 return E_INVALIDARG;
1502 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1505 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1506 ITypeInfo_Release(typeinfo);
1512 static HRESULT WINAPI ivbsaxlocator_Invoke(
1513 IVBSAXLocator *iface,
1514 DISPID dispIdMember,
1518 DISPPARAMS* pDispParams,
1519 VARIANT* pVarResult,
1520 EXCEPINFO* pExcepInfo,
1523 saxlocator *This = impl_from_IVBSAXLocator( iface );
1524 ITypeInfo *typeinfo;
1527 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1528 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1530 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1533 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXLocatorVtbl), dispIdMember, wFlags, pDispParams,
1534 pVarResult, pExcepInfo, puArgErr);
1535 ITypeInfo_Release(typeinfo);
1541 /*** IVBSAXLocator methods ***/
1542 static HRESULT WINAPI ivbsaxlocator_get_columnNumber(
1543 IVBSAXLocator* iface,
1546 saxlocator *This = impl_from_IVBSAXLocator( iface );
1547 return ISAXLocator_getColumnNumber(
1548 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1552 static HRESULT WINAPI ivbsaxlocator_get_lineNumber(
1553 IVBSAXLocator* iface,
1556 saxlocator *This = impl_from_IVBSAXLocator( iface );
1557 return ISAXLocator_getLineNumber(
1558 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1562 static HRESULT WINAPI ivbsaxlocator_get_publicId(
1563 IVBSAXLocator* iface,
1566 saxlocator *This = impl_from_IVBSAXLocator( iface );
1567 return ISAXLocator_getPublicId(
1568 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1569 (const WCHAR**)publicId);
1572 static HRESULT WINAPI ivbsaxlocator_get_systemId(
1573 IVBSAXLocator* iface,
1576 saxlocator *This = impl_from_IVBSAXLocator( iface );
1577 return ISAXLocator_getSystemId(
1578 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1579 (const WCHAR**)systemId);
1582 static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl =
1584 ivbsaxlocator_QueryInterface,
1585 ivbsaxlocator_AddRef,
1586 ivbsaxlocator_Release,
1587 ivbsaxlocator_GetTypeInfoCount,
1588 ivbsaxlocator_GetTypeInfo,
1589 ivbsaxlocator_GetIDsOfNames,
1590 ivbsaxlocator_Invoke,
1591 ivbsaxlocator_get_columnNumber,
1592 ivbsaxlocator_get_lineNumber,
1593 ivbsaxlocator_get_publicId,
1594 ivbsaxlocator_get_systemId
1597 /*** ISAXLocator interface ***/
1598 /*** IUnknown methods ***/
1599 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
1601 saxlocator *This = impl_from_ISAXLocator( iface );
1603 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1607 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1608 IsEqualGUID( riid, &IID_ISAXLocator ))
1614 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1615 return E_NOINTERFACE;
1618 ISAXLocator_AddRef( iface );
1623 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
1625 saxlocator *This = impl_from_ISAXLocator( iface );
1626 TRACE("%p\n", This );
1627 return InterlockedIncrement( &This->ref );
1630 static ULONG WINAPI isaxlocator_Release(
1633 saxlocator *This = impl_from_ISAXLocator( iface );
1636 TRACE("%p\n", This );
1638 ref = InterlockedDecrement( &This->ref );
1641 SysFreeString(This->publicId);
1642 SysFreeString(This->systemId);
1643 heap_free(This->nsStack);
1645 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
1652 /*** ISAXLocator methods ***/
1653 static HRESULT WINAPI isaxlocator_getColumnNumber(
1657 saxlocator *This = impl_from_ISAXLocator( iface );
1659 *pnColumn = This->column;
1663 static HRESULT WINAPI isaxlocator_getLineNumber(
1667 saxlocator *This = impl_from_ISAXLocator( iface );
1669 *pnLine = This->line;
1673 static HRESULT WINAPI isaxlocator_getPublicId(
1675 const WCHAR ** ppwchPublicId)
1678 saxlocator *This = impl_from_ISAXLocator( iface );
1680 SysFreeString(This->publicId);
1682 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
1683 if(SysStringLen(publicId))
1684 This->publicId = (WCHAR*)&publicId;
1687 SysFreeString(publicId);
1688 This->publicId = NULL;
1691 *ppwchPublicId = This->publicId;
1695 static HRESULT WINAPI isaxlocator_getSystemId(
1697 const WCHAR ** ppwchSystemId)
1700 saxlocator *This = impl_from_ISAXLocator( iface );
1702 SysFreeString(This->systemId);
1704 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
1705 if(SysStringLen(systemId))
1706 This->systemId = (WCHAR*)&systemId;
1709 SysFreeString(systemId);
1710 This->systemId = NULL;
1713 *ppwchSystemId = This->systemId;
1717 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
1719 isaxlocator_QueryInterface,
1721 isaxlocator_Release,
1722 isaxlocator_getColumnNumber,
1723 isaxlocator_getLineNumber,
1724 isaxlocator_getPublicId,
1725 isaxlocator_getSystemId
1728 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
1730 saxlocator *locator;
1732 locator = heap_alloc( sizeof (*locator) );
1734 return E_OUTOFMEMORY;
1736 locator->lpVBSAXLocatorVtbl = &ivbsaxlocator_vtbl;
1737 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
1739 locator->vbInterface = vbInterface;
1741 locator->saxreader = reader;
1742 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1744 locator->pParserCtxt = NULL;
1745 locator->publicId = NULL;
1746 locator->systemId = NULL;
1747 locator->lastCur = NULL;
1749 locator->column = 0;
1750 locator->ret = S_OK;
1751 locator->nsStackSize = 8;
1752 locator->nsStackLast = 0;
1753 locator->nsStack = heap_alloc(sizeof(int)*locator->nsStackSize);
1754 if(!locator->nsStack)
1756 ISAXXMLReader_Release((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1758 return E_OUTOFMEMORY;
1761 *ppsaxlocator = locator;
1763 TRACE("returning %p\n", *ppsaxlocator);
1768 /*** SAXXMLReader internal functions ***/
1769 static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
1771 saxlocator *locator;
1774 hr = SAXLocator_create(This, &locator, vbInterface);
1778 locator->pParserCtxt = xmlCreateMemoryParserCtxt(buffer, size);
1779 if(!locator->pParserCtxt)
1781 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1785 xmlFree(locator->pParserCtxt->sax);
1786 locator->pParserCtxt->sax = &locator->saxreader->sax;
1787 locator->pParserCtxt->userData = locator;
1789 This->isParsing = TRUE;
1790 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1791 else hr = locator->ret;
1792 This->isParsing = FALSE;
1794 if(locator->pParserCtxt)
1796 locator->pParserCtxt->sax = NULL;
1797 xmlFreeParserCtxt(locator->pParserCtxt);
1798 locator->pParserCtxt = NULL;
1801 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1805 static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
1807 saxlocator *locator;
1812 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1816 hr = SAXLocator_create(This, &locator, vbInterface);
1820 locator->pParserCtxt = xmlCreatePushParserCtxt(
1821 &locator->saxreader->sax, locator,
1822 data, dataRead, NULL);
1823 if(!locator->pParserCtxt)
1825 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1829 This->isParsing = TRUE;
1832 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1836 if(xmlParseChunk(locator->pParserCtxt, data, dataRead, 0)) hr = E_FAIL;
1837 else hr = locator->ret;
1839 if(hr != S_OK) break;
1841 if(dataRead != sizeof(data))
1843 if(xmlParseChunk(locator->pParserCtxt, data, 0, 1)) hr = E_FAIL;
1844 else hr = locator->ret;
1849 This->isParsing = FALSE;
1851 xmlFreeParserCtxt(locator->pParserCtxt);
1852 locator->pParserCtxt = NULL;
1853 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1857 static HRESULT internal_getEntityResolver(
1859 void *pEntityResolver,
1862 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1866 static HRESULT internal_putEntityResolver(
1868 void *pEntityResolver,
1871 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1875 static HRESULT internal_getContentHandler(
1877 void *pContentHandler,
1880 TRACE("(%p)->(%p)\n", This, pContentHandler);
1881 if(pContentHandler == NULL)
1883 if((vbInterface && This->vbcontentHandler)
1884 || (!vbInterface && This->contentHandler))
1887 IVBSAXContentHandler_AddRef(This->vbcontentHandler);
1889 ISAXContentHandler_AddRef(This->contentHandler);
1891 if(vbInterface) *(IVBSAXContentHandler**)pContentHandler =
1892 This->vbcontentHandler;
1893 else *(ISAXContentHandler**)pContentHandler = This->contentHandler;
1898 static HRESULT internal_putContentHandler(
1900 void *contentHandler,
1903 TRACE("(%p)->(%p)\n", This, contentHandler);
1907 IVBSAXContentHandler_AddRef((IVBSAXContentHandler*)contentHandler);
1909 ISAXContentHandler_AddRef((ISAXContentHandler*)contentHandler);
1911 if((vbInterface && This->vbcontentHandler)
1912 || (!vbInterface && This->contentHandler))
1915 IVBSAXContentHandler_Release(This->vbcontentHandler);
1917 ISAXContentHandler_Release(This->contentHandler);
1920 This->vbcontentHandler = contentHandler;
1922 This->contentHandler = contentHandler;
1927 static HRESULT internal_getDTDHandler(
1932 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1936 static HRESULT internal_putDTDHandler(
1941 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1945 static HRESULT internal_getErrorHandler(
1947 void *pErrorHandler,
1950 TRACE("(%p)->(%p)\n", This, pErrorHandler);
1951 if(pErrorHandler == NULL)
1954 if(vbInterface && This->vberrorHandler)
1955 IVBSAXErrorHandler_AddRef(This->vberrorHandler);
1956 else if(!vbInterface && This->errorHandler)
1957 ISAXErrorHandler_AddRef(This->errorHandler);
1960 *(IVBSAXErrorHandler**)pErrorHandler = This->vberrorHandler;
1962 *(ISAXErrorHandler**)pErrorHandler = This->errorHandler;
1968 static HRESULT internal_putErrorHandler(
1973 TRACE("(%p)->(%p)\n", This, errorHandler);
1977 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler*)errorHandler);
1979 ISAXErrorHandler_AddRef((ISAXErrorHandler*)errorHandler);
1982 if(vbInterface && This->vberrorHandler)
1983 IVBSAXErrorHandler_Release(This->vberrorHandler);
1984 else if(!vbInterface && This->errorHandler)
1985 ISAXErrorHandler_Release(This->errorHandler);
1988 This->vberrorHandler = errorHandler;
1990 This->errorHandler = errorHandler;
1996 static HRESULT internal_parse(
2003 TRACE("(%p)\n", This);
2006 switch(V_VT(&varInput))
2009 hr = internal_parseBuffer(This, (const char*)V_BSTR(&varInput),
2010 SysStringByteLen(V_BSTR(&varInput)), vbInterface);
2012 case VT_ARRAY|VT_UI1: {
2014 LONG lBound, uBound;
2017 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
2018 if(hr != S_OK) break;
2019 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
2020 if(hr != S_OK) break;
2021 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
2022 hr = SafeArrayAccessData(V_ARRAY(&varInput), &pSAData);
2023 if(hr != S_OK) break;
2024 hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
2025 SafeArrayUnaccessData(V_ARRAY(&varInput));
2030 IPersistStream *persistStream;
2031 IStream *stream = NULL;
2032 IXMLDOMDocument *xmlDoc;
2034 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2035 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
2039 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
2040 hr = internal_parseBuffer(This, (const char*)bstrData,
2041 SysStringByteLen(bstrData), vbInterface);
2042 IXMLDOMDocument_Release(xmlDoc);
2043 SysFreeString(bstrData);
2046 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2047 &IID_IPersistStream, (void**)&persistStream) == S_OK)
2049 hr = IPersistStream_Save(persistStream, stream, TRUE);
2050 IPersistStream_Release(persistStream);
2051 if(hr != S_OK) break;
2053 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2054 &IID_IStream, (void**)&stream) == S_OK)
2056 hr = internal_parseStream(This, stream, vbInterface);
2057 IStream_Release(stream);
2062 WARN("vt %d not implemented\n", V_VT(&varInput));
2069 static HRESULT internal_vbonDataAvailable(void *obj, char *ptr, DWORD len)
2071 saxreader *This = obj;
2073 return internal_parseBuffer(This, ptr, len, TRUE);
2076 static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len)
2078 saxreader *This = obj;
2080 return internal_parseBuffer(This, ptr, len, FALSE);
2083 static HRESULT internal_parseURL(
2091 TRACE("(%p)->(%s)\n", This, debugstr_w(url));
2093 if(vbInterface) hr = bind_url(url, internal_vbonDataAvailable, This, &bsc);
2094 else hr = bind_url(url, internal_onDataAvailable, This, &bsc);
2104 static HRESULT internal_putProperty(
2110 static const WCHAR wszCharset[] = {
2111 'c','h','a','r','s','e','t',0
2113 static const WCHAR wszDeclarationHandler[] = {
2114 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2115 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2116 'd','e','c','l','a','r','a','t','i','o','n',
2117 '-','h','a','n','d','l','e','r',0
2119 static const WCHAR wszDomNode[] = {
2120 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2121 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2122 'd','o','m','-','n','o','d','e',0
2124 static const WCHAR wszInputSource[] = {
2125 'i','n','p','u','t','-','s','o','u','r','c','e',0
2127 static const WCHAR wszLexicalHandler[] = {
2128 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2129 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2130 'l','e','x','i','c','a','l','-','h','a','n','d','l','e','r',0
2132 static const WCHAR wszMaxElementDepth[] = {
2133 'm','a','x','-','e','l','e','m','e','n','t','-','d','e','p','t','h',0
2135 static const WCHAR wszMaxXMLSize[] = {
2136 'm','a','x','-','x','m','l','-','s','i','z','e',0
2138 static const WCHAR wszSchemaDeclarationHandler[] = {
2139 's','c','h','e','m','a','-',
2140 'd','e','c','l','a','r','a','t','i','o','n','-',
2141 'h','a','n','d','l','e','r',0
2143 static const WCHAR wszXMLDeclEncoding[] = {
2144 'x','m','l','d','e','c','l','-','e','n','c','o','d','i','n','g',0
2146 static const WCHAR wszXMLDeclStandalone[] = {
2147 'x','m','l','d','e','c','l',
2148 '-','s','t','a','n','d','a','l','o','n','e',0
2150 static const WCHAR wszXMLDeclVersion[] = {
2151 'x','m','l','d','e','c','l','-','v','e','r','s','i','o','n',0
2154 TRACE("(%p)->(%s)\n", This, debugstr_w(pProp));
2156 if(!memcmp(pProp, wszDeclarationHandler, sizeof(wszDeclarationHandler)))
2158 if(This->isParsing) return E_FAIL;
2160 if(V_UNKNOWN(&value))
2163 IVBSAXDeclHandler_AddRef((IVBSAXDeclHandler*)V_UNKNOWN(&value));
2165 ISAXDeclHandler_AddRef((ISAXDeclHandler*)V_UNKNOWN(&value));
2167 if((vbInterface && This->vbdeclHandler)
2168 || (!vbInterface && This->declHandler))
2171 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2173 ISAXDeclHandler_Release(This->declHandler);
2176 This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
2178 This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
2182 if(!memcmp(pProp, wszLexicalHandler, sizeof(wszLexicalHandler)))
2184 if(This->isParsing) return E_FAIL;
2186 if(V_UNKNOWN(&value))
2189 IVBSAXLexicalHandler_AddRef(
2190 (IVBSAXLexicalHandler*)V_UNKNOWN(&value));
2192 ISAXLexicalHandler_AddRef(
2193 (ISAXLexicalHandler*)V_UNKNOWN(&value));
2195 if((vbInterface && This->vblexicalHandler)
2196 || (!vbInterface && This->lexicalHandler))
2199 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2201 ISAXLexicalHandler_Release(This->lexicalHandler);
2204 This->vblexicalHandler = (IVBSAXLexicalHandler*)V_UNKNOWN(&value);
2206 This->lexicalHandler = (ISAXLexicalHandler*)V_UNKNOWN(&value);
2210 FIXME("(%p)->(%s): unsupported property\n", This, debugstr_w(pProp));
2212 if(!memcmp(pProp, wszCharset, sizeof(wszCharset)))
2215 if(!memcmp(pProp, wszDomNode, sizeof(wszDomNode)))
2218 if(!memcmp(pProp, wszInputSource, sizeof(wszInputSource)))
2221 if(!memcmp(pProp, wszMaxElementDepth, sizeof(wszMaxElementDepth)))
2224 if(!memcmp(pProp, wszMaxXMLSize, sizeof(wszMaxXMLSize)))
2227 if(!memcmp(pProp, wszSchemaDeclarationHandler,
2228 sizeof(wszSchemaDeclarationHandler)))
2231 if(!memcmp(pProp, wszXMLDeclEncoding, sizeof(wszXMLDeclEncoding)))
2234 if(!memcmp(pProp, wszXMLDeclStandalone, sizeof(wszXMLDeclStandalone)))
2237 if(!memcmp(pProp, wszXMLDeclVersion, sizeof(wszXMLDeclVersion)))
2240 return E_INVALIDARG;
2243 /*** IVBSAXXMLReader interface ***/
2244 /*** IUnknown methods ***/
2245 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
2247 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2249 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
2253 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
2254 IsEqualGUID( riid, &IID_IDispatch ) ||
2255 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
2259 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
2261 *ppvObject = &This->lpSAXXMLReaderVtbl;
2265 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2266 return E_NOINTERFACE;
2269 IVBSAXXMLReader_AddRef( iface );
2274 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
2276 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2277 TRACE("%p\n", This );
2278 return InterlockedIncrement( &This->ref );
2281 static ULONG WINAPI saxxmlreader_Release(
2282 IVBSAXXMLReader* iface)
2284 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2287 TRACE("%p\n", This );
2289 ref = InterlockedDecrement( &This->ref );
2292 if(This->contentHandler)
2293 ISAXContentHandler_Release(This->contentHandler);
2295 if(This->vbcontentHandler)
2296 IVBSAXContentHandler_Release(This->vbcontentHandler);
2298 if(This->errorHandler)
2299 ISAXErrorHandler_Release(This->errorHandler);
2301 if(This->vberrorHandler)
2302 IVBSAXErrorHandler_Release(This->vberrorHandler);
2304 if(This->lexicalHandler)
2305 ISAXLexicalHandler_Release(This->lexicalHandler);
2307 if(This->vblexicalHandler)
2308 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2310 if(This->declHandler)
2311 ISAXDeclHandler_Release(This->declHandler);
2313 if(This->vbdeclHandler)
2314 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2322 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
2324 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2326 TRACE("(%p)->(%p)\n", This, pctinfo);
2333 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
2334 IVBSAXXMLReader *iface,
2335 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2337 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2340 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2342 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
2347 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
2348 IVBSAXXMLReader *iface,
2350 LPOLESTR* rgszNames,
2355 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2356 ITypeInfo *typeinfo;
2359 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2362 if(!rgszNames || cNames == 0 || !rgDispId)
2363 return E_INVALIDARG;
2365 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2368 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
2369 ITypeInfo_Release(typeinfo);
2375 static HRESULT WINAPI saxxmlreader_Invoke(
2376 IVBSAXXMLReader *iface,
2377 DISPID dispIdMember,
2381 DISPPARAMS* pDispParams,
2382 VARIANT* pVarResult,
2383 EXCEPINFO* pExcepInfo,
2386 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2387 ITypeInfo *typeinfo;
2390 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2391 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2393 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2396 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXXMLReaderVtbl), dispIdMember, wFlags, pDispParams,
2397 pVarResult, pExcepInfo, puArgErr);
2398 ITypeInfo_Release(typeinfo);
2404 /*** IVBSAXXMLReader methods ***/
2405 static HRESULT WINAPI saxxmlreader_getFeature(
2406 IVBSAXXMLReader* iface,
2407 const WCHAR *pFeature,
2408 VARIANT_BOOL *pValue)
2410 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2412 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
2416 static HRESULT WINAPI saxxmlreader_putFeature(
2417 IVBSAXXMLReader* iface,
2418 const WCHAR *pFeature,
2419 VARIANT_BOOL vfValue)
2421 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2423 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
2427 static HRESULT WINAPI saxxmlreader_getProperty(
2428 IVBSAXXMLReader* iface,
2432 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2434 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
2438 static HRESULT WINAPI saxxmlreader_putProperty(
2439 IVBSAXXMLReader* iface,
2443 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2444 return internal_putProperty(This, pProp, value, TRUE);
2447 static HRESULT WINAPI saxxmlreader_get_entityResolver(
2448 IVBSAXXMLReader* iface,
2449 IVBSAXEntityResolver **pEntityResolver)
2451 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2452 return internal_getEntityResolver(This, pEntityResolver, TRUE);
2455 static HRESULT WINAPI saxxmlreader_put_entityResolver(
2456 IVBSAXXMLReader* iface,
2457 IVBSAXEntityResolver *pEntityResolver)
2459 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2460 return internal_putEntityResolver(This, pEntityResolver, TRUE);
2463 static HRESULT WINAPI saxxmlreader_get_contentHandler(
2464 IVBSAXXMLReader* iface,
2465 IVBSAXContentHandler **ppContentHandler)
2467 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2468 return internal_getContentHandler(This, ppContentHandler, TRUE);
2471 static HRESULT WINAPI saxxmlreader_put_contentHandler(
2472 IVBSAXXMLReader* iface,
2473 IVBSAXContentHandler *contentHandler)
2475 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2476 return internal_putContentHandler(This, contentHandler, TRUE);
2479 static HRESULT WINAPI saxxmlreader_get_dtdHandler(
2480 IVBSAXXMLReader* iface,
2481 IVBSAXDTDHandler **pDTDHandler)
2483 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2484 return internal_getDTDHandler(This, pDTDHandler, TRUE);
2487 static HRESULT WINAPI saxxmlreader_put_dtdHandler(
2488 IVBSAXXMLReader* iface,
2489 IVBSAXDTDHandler *pDTDHandler)
2491 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2492 return internal_putDTDHandler(This, pDTDHandler, TRUE);
2495 static HRESULT WINAPI saxxmlreader_get_errorHandler(
2496 IVBSAXXMLReader* iface,
2497 IVBSAXErrorHandler **pErrorHandler)
2499 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2500 return internal_getErrorHandler(This, pErrorHandler, TRUE);
2503 static HRESULT WINAPI saxxmlreader_put_errorHandler(
2504 IVBSAXXMLReader* iface,
2505 IVBSAXErrorHandler *errorHandler)
2507 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2508 return internal_putErrorHandler(This, errorHandler, TRUE);
2511 static HRESULT WINAPI saxxmlreader_get_baseURL(
2512 IVBSAXXMLReader* iface,
2513 const WCHAR **pBaseUrl)
2515 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2517 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
2521 static HRESULT WINAPI saxxmlreader_put_baseURL(
2522 IVBSAXXMLReader* iface,
2523 const WCHAR *pBaseUrl)
2525 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2527 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
2531 static HRESULT WINAPI saxxmlreader_get_secureBaseURL(
2532 IVBSAXXMLReader* iface,
2533 const WCHAR **pSecureBaseUrl)
2535 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2537 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
2542 static HRESULT WINAPI saxxmlreader_put_secureBaseURL(
2543 IVBSAXXMLReader* iface,
2544 const WCHAR *secureBaseUrl)
2546 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2548 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
2552 static HRESULT WINAPI saxxmlreader_parse(
2553 IVBSAXXMLReader* iface,
2556 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2557 return internal_parse(This, varInput, TRUE);
2560 static HRESULT WINAPI saxxmlreader_parseURL(
2561 IVBSAXXMLReader* iface,
2564 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2565 return internal_parseURL(This, url, TRUE);
2568 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
2570 saxxmlreader_QueryInterface,
2571 saxxmlreader_AddRef,
2572 saxxmlreader_Release,
2573 saxxmlreader_GetTypeInfoCount,
2574 saxxmlreader_GetTypeInfo,
2575 saxxmlreader_GetIDsOfNames,
2576 saxxmlreader_Invoke,
2577 saxxmlreader_getFeature,
2578 saxxmlreader_putFeature,
2579 saxxmlreader_getProperty,
2580 saxxmlreader_putProperty,
2581 saxxmlreader_get_entityResolver,
2582 saxxmlreader_put_entityResolver,
2583 saxxmlreader_get_contentHandler,
2584 saxxmlreader_put_contentHandler,
2585 saxxmlreader_get_dtdHandler,
2586 saxxmlreader_put_dtdHandler,
2587 saxxmlreader_get_errorHandler,
2588 saxxmlreader_put_errorHandler,
2589 saxxmlreader_get_baseURL,
2590 saxxmlreader_put_baseURL,
2591 saxxmlreader_get_secureBaseURL,
2592 saxxmlreader_put_secureBaseURL,
2594 saxxmlreader_parseURL
2597 /*** ISAXXMLReader interface ***/
2598 /*** IUnknown methods ***/
2599 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
2601 saxreader *This = impl_from_ISAXXMLReader( iface );
2602 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl, riid, ppvObject);
2605 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
2607 saxreader *This = impl_from_ISAXXMLReader( iface );
2608 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2611 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
2613 saxreader *This = impl_from_ISAXXMLReader( iface );
2614 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2617 /*** ISAXXMLReader methods ***/
2618 static HRESULT WINAPI isaxxmlreader_getFeature(
2619 ISAXXMLReader* iface,
2620 const WCHAR *pFeature,
2621 VARIANT_BOOL *pValue)
2623 saxreader *This = impl_from_ISAXXMLReader( iface );
2624 return IVBSAXXMLReader_getFeature(
2625 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2629 static HRESULT WINAPI isaxxmlreader_putFeature(
2630 ISAXXMLReader* iface,
2631 const WCHAR *pFeature,
2632 VARIANT_BOOL vfValue)
2634 saxreader *This = impl_from_ISAXXMLReader( iface );
2635 return IVBSAXXMLReader_putFeature(
2636 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2640 static HRESULT WINAPI isaxxmlreader_getProperty(
2641 ISAXXMLReader* iface,
2645 saxreader *This = impl_from_ISAXXMLReader( iface );
2646 return IVBSAXXMLReader_getProperty(
2647 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2651 static HRESULT WINAPI isaxxmlreader_putProperty(
2652 ISAXXMLReader* iface,
2656 saxreader *This = impl_from_ISAXXMLReader( iface );
2657 return internal_putProperty(This, pProp, value, FALSE);
2660 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
2661 ISAXXMLReader* iface,
2662 ISAXEntityResolver **ppEntityResolver)
2664 saxreader *This = impl_from_ISAXXMLReader( iface );
2665 return internal_getEntityResolver(This, ppEntityResolver, FALSE);
2668 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
2669 ISAXXMLReader* iface,
2670 ISAXEntityResolver *pEntityResolver)
2672 saxreader *This = impl_from_ISAXXMLReader( iface );
2673 return internal_putEntityResolver(This, pEntityResolver, FALSE);
2676 static HRESULT WINAPI isaxxmlreader_getContentHandler(
2677 ISAXXMLReader* iface,
2678 ISAXContentHandler **pContentHandler)
2680 saxreader *This = impl_from_ISAXXMLReader( iface );
2681 return internal_getContentHandler(This, pContentHandler, FALSE);
2684 static HRESULT WINAPI isaxxmlreader_putContentHandler(
2685 ISAXXMLReader* iface,
2686 ISAXContentHandler *contentHandler)
2688 saxreader *This = impl_from_ISAXXMLReader( iface );
2689 return internal_putContentHandler(This, contentHandler, FALSE);
2692 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
2693 ISAXXMLReader* iface,
2694 ISAXDTDHandler **pDTDHandler)
2696 saxreader *This = impl_from_ISAXXMLReader( iface );
2697 return internal_getDTDHandler(This, pDTDHandler, FALSE);
2700 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
2701 ISAXXMLReader* iface,
2702 ISAXDTDHandler *pDTDHandler)
2704 saxreader *This = impl_from_ISAXXMLReader( iface );
2705 return internal_putDTDHandler(This, pDTDHandler, FALSE);
2708 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
2709 ISAXXMLReader* iface,
2710 ISAXErrorHandler **pErrorHandler)
2712 saxreader *This = impl_from_ISAXXMLReader( iface );
2713 return internal_getErrorHandler(This, pErrorHandler, FALSE);
2716 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
2717 ISAXXMLReader* iface,
2718 ISAXErrorHandler *errorHandler)
2720 saxreader *This = impl_from_ISAXXMLReader( iface );
2721 return internal_putErrorHandler(This, errorHandler, FALSE);
2724 static HRESULT WINAPI isaxxmlreader_getBaseURL(
2725 ISAXXMLReader* iface,
2726 const WCHAR **pBaseUrl)
2728 saxreader *This = impl_from_ISAXXMLReader( iface );
2729 return IVBSAXXMLReader_get_baseURL(
2730 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2734 static HRESULT WINAPI isaxxmlreader_putBaseURL(
2735 ISAXXMLReader* iface,
2736 const WCHAR *pBaseUrl)
2738 saxreader *This = impl_from_ISAXXMLReader( iface );
2739 return IVBSAXXMLReader_put_baseURL(
2740 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2744 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
2745 ISAXXMLReader* iface,
2746 const WCHAR **pSecureBaseUrl)
2748 saxreader *This = impl_from_ISAXXMLReader( iface );
2749 return IVBSAXXMLReader_get_secureBaseURL(
2750 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2754 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
2755 ISAXXMLReader* iface,
2756 const WCHAR *secureBaseUrl)
2758 saxreader *This = impl_from_ISAXXMLReader( iface );
2759 return IVBSAXXMLReader_put_secureBaseURL(
2760 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2764 static HRESULT WINAPI isaxxmlreader_parse(
2765 ISAXXMLReader* iface,
2768 saxreader *This = impl_from_ISAXXMLReader( iface );
2769 return internal_parse(This, varInput, FALSE);
2772 static HRESULT WINAPI isaxxmlreader_parseURL(
2773 ISAXXMLReader* iface,
2776 saxreader *This = impl_from_ISAXXMLReader( iface );
2777 return internal_parseURL(This, url, FALSE);
2780 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
2782 isaxxmlreader_QueryInterface,
2783 isaxxmlreader_AddRef,
2784 isaxxmlreader_Release,
2785 isaxxmlreader_getFeature,
2786 isaxxmlreader_putFeature,
2787 isaxxmlreader_getProperty,
2788 isaxxmlreader_putProperty,
2789 isaxxmlreader_getEntityResolver,
2790 isaxxmlreader_putEntityResolver,
2791 isaxxmlreader_getContentHandler,
2792 isaxxmlreader_putContentHandler,
2793 isaxxmlreader_getDTDHandler,
2794 isaxxmlreader_putDTDHandler,
2795 isaxxmlreader_getErrorHandler,
2796 isaxxmlreader_putErrorHandler,
2797 isaxxmlreader_getBaseURL,
2798 isaxxmlreader_putBaseURL,
2799 isaxxmlreader_getSecureBaseURL,
2800 isaxxmlreader_putSecureBaseURL,
2801 isaxxmlreader_parse,
2802 isaxxmlreader_parseURL
2805 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2809 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
2811 reader = heap_alloc( sizeof (*reader) );
2813 return E_OUTOFMEMORY;
2815 reader->lpVBSAXXMLReaderVtbl = &saxreader_vtbl;
2816 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
2818 reader->contentHandler = NULL;
2819 reader->vbcontentHandler = NULL;
2820 reader->errorHandler = NULL;
2821 reader->vberrorHandler = NULL;
2822 reader->lexicalHandler = NULL;
2823 reader->vblexicalHandler = NULL;
2824 reader->declHandler = NULL;
2825 reader->vbdeclHandler = NULL;
2826 reader->isParsing = FALSE;
2828 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
2829 reader->sax.initialized = XML_SAX2_MAGIC;
2830 reader->sax.startDocument = libxmlStartDocument;
2831 reader->sax.endDocument = libxmlEndDocument;
2832 reader->sax.startElementNs = libxmlStartElementNS;
2833 reader->sax.endElementNs = libxmlEndElementNS;
2834 reader->sax.characters = libxmlCharacters;
2835 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
2836 reader->sax.comment = libxmlComment;
2837 reader->sax.error = libxmlFatalError;
2838 reader->sax.fatalError = libxmlFatalError;
2839 reader->sax.cdataBlock = libxmlCDataBlock;
2841 *ppObj = &reader->lpVBSAXXMLReaderVtbl;
2843 TRACE("returning iface %p\n", *ppObj);
2850 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2852 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2853 "libxml2 support was not present at compile time.\n");