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
27 # include <libxml/parser.h>
28 # include <libxml/xmlerror.h>
29 # include <libxml/SAX2.h>
30 # include <libxml/parserInternals.h>
44 #include "wine/debug.h"
46 #include "msxml_private.h"
48 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
54 ExhaustiveErrors = 1 << 1,
55 ExternalGeneralEntities = 1 << 2,
56 ExternalParameterEntities = 1 << 3,
57 ForcedResync = 1 << 4,
58 NamespacePrefixes = 1 << 5,
60 ParameterEntities = 1 << 7,
61 PreserveSystemIndentifiers = 1 << 8,
63 SchemaValidation = 1 << 10,
64 ServerHttpRequest = 1 << 11,
65 SuppressValidationfatalError = 1 << 12,
66 UseInlineSchema = 1 << 13,
67 UseSchemaLocation = 1 << 14
77 typedef struct _saxreader
79 IVBSAXXMLReader IVBSAXXMLReader_iface;
80 ISAXXMLReader ISAXXMLReader_iface;
82 struct ISAXContentHandler *contentHandler;
83 struct IVBSAXContentHandler *vbcontentHandler;
84 struct ISAXErrorHandler *errorHandler;
85 struct IVBSAXErrorHandler *vberrorHandler;
86 struct ISAXLexicalHandler *lexicalHandler;
87 struct IVBSAXLexicalHandler *vblexicalHandler;
88 struct ISAXDeclHandler *declHandler;
89 struct IVBSAXDeclHandler *vbdeclHandler;
93 enum ReaderFeatures features;
96 typedef struct _saxlocator
98 IVBSAXLocator IVBSAXLocator_iface;
99 ISAXLocator ISAXLocator_iface;
101 saxreader *saxreader;
103 xmlParserCtxtPtr pParserCtxt;
117 typedef struct _saxattributes
119 IVBSAXAttributes IVBSAXAttributes_iface;
120 ISAXAttributes ISAXAttributes_iface;
129 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
131 return CONTAINING_RECORD(iface, saxreader, IVBSAXXMLReader_iface);
134 static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
136 return CONTAINING_RECORD(iface, saxreader, ISAXXMLReader_iface);
139 static inline saxlocator *impl_from_IVBSAXLocator( IVBSAXLocator *iface )
141 return CONTAINING_RECORD(iface, saxlocator, IVBSAXLocator_iface);
144 static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
146 return CONTAINING_RECORD(iface, saxlocator, ISAXLocator_iface);
149 static inline saxattributes *impl_from_IVBSAXAttributes( IVBSAXAttributes *iface )
151 return CONTAINING_RECORD(iface, saxattributes, IVBSAXAttributes_iface);
154 static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface )
156 return CONTAINING_RECORD(iface, saxattributes, ISAXAttributes_iface);
160 static const WCHAR PropertyCharsetW[] = {
161 'c','h','a','r','s','e','t',0
163 static const WCHAR PropertyDeclHandlerW[] = {
164 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
165 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
166 'd','e','c','l','a','r','a','t','i','o','n',
167 '-','h','a','n','d','l','e','r',0
169 static const WCHAR PropertyDomNodeW[] = {
170 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
171 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
172 'd','o','m','-','n','o','d','e',0
174 static const WCHAR PropertyInputSourceW[] = {
175 'i','n','p','u','t','-','s','o','u','r','c','e',0
177 static const WCHAR PropertyLexicalHandlerW[] = {
178 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
179 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
180 'l','e','x','i','c','a','l','-','h','a','n','d','l','e','r',0
182 static const WCHAR PropertyMaxElementDepthW[] = {
183 'm','a','x','-','e','l','e','m','e','n','t','-','d','e','p','t','h',0
185 static const WCHAR PropertyMaxXMLSizeW[] = {
186 'm','a','x','-','x','m','l','-','s','i','z','e',0
188 static const WCHAR PropertySchemaDeclHandlerW[] = {
189 's','c','h','e','m','a','-','d','e','c','l','a','r','a','t','i','o','n','-',
190 'h','a','n','d','l','e','r',0
192 static const WCHAR PropertyXMLDeclEncodingW[] = {
193 'x','m','l','d','e','c','l','-','e','n','c','o','d','i','n','g',0
195 static const WCHAR PropertyXMLDeclStandaloneW[] = {
196 'x','m','l','d','e','c','l','-','s','t','a','n','d','a','l','o','n','e',0
198 static const WCHAR PropertyXMLDeclVersionW[] = {
199 'x','m','l','d','e','c','l','-','v','e','r','s','i','o','n',0
203 static const WCHAR FeatureExternalGeneralEntitiesW[] = {
204 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/','s','a','x','/',
205 'f','e','a','t','u','r','e','s','/','e','x','t','e','r','n','a','l','-','g','e','n','e','r','a','l',
206 '-','e','n','t','i','t','i','e','s',0
209 static const WCHAR FeatureExternalParameterEntitiesW[] = {
210 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/','s','a','x','/','f','e','a','t','u','r','e','s',
211 '/','e','x','t','e','r','n','a','l','-','p','a','r','a','m','e','t','e','r','-','e','n','t','i','t','i','e','s',0
214 static inline HRESULT set_feature_value(saxreader *reader, enum ReaderFeatures feature, VARIANT_BOOL value)
216 if (value == VARIANT_TRUE)
217 reader->features |= feature;
219 reader->features &= ~feature;
224 static inline BOOL has_content_handler(const saxlocator *locator)
226 return (locator->vbInterface && locator->saxreader->vbcontentHandler) ||
227 (!locator->vbInterface && locator->saxreader->contentHandler);
230 static inline BOOL has_error_handler(const saxlocator *locator)
232 return (locator->vbInterface && locator->saxreader->vberrorHandler) ||
233 (!locator->vbInterface && locator->saxreader->errorHandler);
236 static HRESULT namespacePush(saxlocator *locator, int ns)
238 if(locator->nsStackLast>=locator->nsStackSize)
242 new_stack = HeapReAlloc(GetProcessHeap(), 0,
243 locator->nsStack, sizeof(int)*locator->nsStackSize*2);
244 if(!new_stack) return E_OUTOFMEMORY;
245 locator->nsStack = new_stack;
246 locator->nsStackSize *= 2;
248 locator->nsStack[locator->nsStackLast++] = ns;
253 static int namespacePop(saxlocator *locator)
255 if(locator->nsStackLast == 0) return 0;
256 return locator->nsStack[--locator->nsStackLast];
259 static BOOL bstr_pool_insert(struct bstrpool *pool, BSTR pool_entry)
263 pool->pool = HeapAlloc(GetProcessHeap(), 0, 16 * sizeof(*pool->pool));
270 else if (pool->index == pool->len)
272 BSTR *realloc = HeapReAlloc(GetProcessHeap(), 0, pool->pool, pool->len * 2 * sizeof(*realloc));
277 pool->pool = realloc;
281 pool->pool[pool->index++] = pool_entry;
285 static void free_bstr_pool(struct bstrpool *pool)
289 for (i = 0; i < pool->index; i++)
290 SysFreeString(pool->pool[i]);
292 HeapFree(GetProcessHeap(), 0, pool->pool);
295 pool->index = pool->len = 0;
298 static BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
306 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0);
307 if(len != -1) dLen++;
308 bstr = SysAllocStringLen(NULL, dLen-1);
311 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, bstr, dLen);
312 if(len != -1) bstr[dLen-1] = '\0';
317 static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name)
322 if(!name) return NULL;
324 if(!prefix || !*prefix)
325 return bstr_from_xmlChar(name);
327 qname = xmlBuildQName(name, prefix, NULL, 0);
328 bstr = bstr_from_xmlChar(qname);
334 static BSTR pooled_bstr_from_xmlChar(struct bstrpool *pool, const xmlChar *buf)
336 BSTR pool_entry = bstr_from_xmlChar(buf);
338 if (pool_entry && !bstr_pool_insert(pool, pool_entry))
340 SysFreeString(pool_entry);
347 static BSTR pooled_bstr_from_xmlCharN(struct bstrpool *pool, const xmlChar *buf, int len)
349 BSTR pool_entry = bstr_from_xmlCharN(buf, len);
351 if (pool_entry && !bstr_pool_insert(pool, pool_entry))
353 SysFreeString(pool_entry);
360 static BSTR pooled_QName_from_xmlChar(struct bstrpool *pool, const xmlChar *prefix, const xmlChar *name)
362 BSTR pool_entry = QName_from_xmlChar(prefix, name);
364 if (pool_entry && !bstr_pool_insert(pool, pool_entry))
366 SysFreeString(pool_entry);
373 static void format_error_message_from_id(saxlocator *This, HRESULT hr)
375 xmlStopParser(This->pParserCtxt);
378 if(has_error_handler(This))
381 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
382 NULL, hr, 0, msg, sizeof(msg), NULL))
384 FIXME("MSXML errors not yet supported.\n");
388 if(This->vbInterface)
390 BSTR bstrMsg = SysAllocString(msg);
391 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
392 &This->IVBSAXLocator_iface, &bstrMsg, hr);
393 SysFreeString(bstrMsg);
396 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
397 &This->ISAXLocator_iface, msg, hr);
401 static void update_position(saxlocator *This, xmlChar *end)
403 if(This->lastCur == NULL)
405 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
407 This->realColumn = 1;
409 else if(This->lastCur < This->pParserCtxt->input->base)
411 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
413 This->realColumn = 1;
416 if(This->pParserCtxt->input->cur<This->lastCur)
418 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
420 This->realColumn = 1;
423 if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
425 while(This->lastCur < end)
427 if(*(This->lastCur) == '\n')
430 This->realColumn = 1;
432 else if(*(This->lastCur) == '\r' &&
433 (This->lastCur==This->pParserCtxt->input->end ||
434 *(This->lastCur+1)!='\n'))
437 This->realColumn = 1;
439 else This->realColumn++;
443 /* Count multibyte UTF8 encoded characters once */
444 while((*(This->lastCur)&0xC0) == 0x80) This->lastCur++;
447 This->line = This->realLine;
448 This->column = This->realColumn;
451 /*** IVBSAXAttributes interface ***/
452 /*** IUnknown methods ***/
453 static HRESULT WINAPI ivbsaxattributes_QueryInterface(
454 IVBSAXAttributes* iface,
458 saxattributes *This = impl_from_IVBSAXAttributes(iface);
460 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
464 if (IsEqualGUID(riid, &IID_IUnknown) ||
465 IsEqualGUID(riid, &IID_IDispatch) ||
466 IsEqualGUID(riid, &IID_IVBSAXAttributes))
472 FIXME("interface %s not implemented\n", debugstr_guid(riid));
473 return E_NOINTERFACE;
476 IVBSAXAttributes_AddRef(iface);
481 static ULONG WINAPI ivbsaxattributes_AddRef(IVBSAXAttributes* iface)
483 saxattributes *This = impl_from_IVBSAXAttributes(iface);
484 return ISAXAttributes_AddRef(&This->ISAXAttributes_iface);
487 static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes* iface)
489 saxattributes *This = impl_from_IVBSAXAttributes(iface);
490 return ISAXAttributes_Release(&This->ISAXAttributes_iface);
493 /*** IDispatch methods ***/
494 static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes *iface, UINT* pctinfo )
496 saxattributes *This = impl_from_IVBSAXAttributes( iface );
498 TRACE("(%p)->(%p)\n", This, pctinfo);
505 static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(
506 IVBSAXAttributes *iface,
507 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
509 saxattributes *This = impl_from_IVBSAXAttributes( iface );
512 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
514 hr = get_typeinfo(IVBSAXAttributes_tid, ppTInfo);
519 static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(
520 IVBSAXAttributes *iface,
527 saxattributes *This = impl_from_IVBSAXAttributes( iface );
531 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
534 if(!rgszNames || cNames == 0 || !rgDispId)
537 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
540 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
541 ITypeInfo_Release(typeinfo);
547 static HRESULT WINAPI ivbsaxattributes_Invoke(
548 IVBSAXAttributes *iface,
553 DISPPARAMS* pDispParams,
555 EXCEPINFO* pExcepInfo,
558 saxattributes *This = impl_from_IVBSAXAttributes( iface );
562 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
563 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
565 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
568 hr = ITypeInfo_Invoke(typeinfo, &This->IVBSAXAttributes_iface, dispIdMember, wFlags,
569 pDispParams, pVarResult, pExcepInfo, puArgErr);
570 ITypeInfo_Release(typeinfo);
576 /*** IVBSAXAttributes methods ***/
577 static HRESULT WINAPI ivbsaxattributes_get_length(
578 IVBSAXAttributes* iface,
581 saxattributes *This = impl_from_IVBSAXAttributes( iface );
582 return ISAXAttributes_getLength(&This->ISAXAttributes_iface, nLength);
585 static HRESULT WINAPI ivbsaxattributes_getURI(
586 IVBSAXAttributes* iface,
591 saxattributes *This = impl_from_IVBSAXAttributes( iface );
592 return ISAXAttributes_getURI(&This->ISAXAttributes_iface, nIndex, (const WCHAR**)uri, &len);
595 static HRESULT WINAPI ivbsaxattributes_getLocalName(
596 IVBSAXAttributes* iface,
601 saxattributes *This = impl_from_IVBSAXAttributes( iface );
602 return ISAXAttributes_getLocalName(&This->ISAXAttributes_iface, nIndex,
603 (const WCHAR**)localName, &len);
606 static HRESULT WINAPI ivbsaxattributes_getQName(
607 IVBSAXAttributes* iface,
612 saxattributes *This = impl_from_IVBSAXAttributes( iface );
613 return ISAXAttributes_getQName(&This->ISAXAttributes_iface, nIndex, (const WCHAR**)QName, &len);
616 static HRESULT WINAPI ivbsaxattributes_getIndexFromName(
617 IVBSAXAttributes* iface,
622 saxattributes *This = impl_from_IVBSAXAttributes( iface );
623 return ISAXAttributes_getIndexFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
624 localName, SysStringLen(localName), index);
627 static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(
628 IVBSAXAttributes* iface,
632 saxattributes *This = impl_from_IVBSAXAttributes( iface );
633 return ISAXAttributes_getIndexFromQName(&This->ISAXAttributes_iface, QName,
634 SysStringLen(QName), index);
637 static HRESULT WINAPI ivbsaxattributes_getType(
638 IVBSAXAttributes* iface,
643 saxattributes *This = impl_from_IVBSAXAttributes( iface );
644 return ISAXAttributes_getType(&This->ISAXAttributes_iface, nIndex, (const WCHAR**)type, &len);
647 static HRESULT WINAPI ivbsaxattributes_getTypeFromName(
648 IVBSAXAttributes* iface,
654 saxattributes *This = impl_from_IVBSAXAttributes( iface );
655 return ISAXAttributes_getTypeFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
656 localName, SysStringLen(localName), (const WCHAR**)type, &len);
659 static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(
660 IVBSAXAttributes* iface,
665 saxattributes *This = impl_from_IVBSAXAttributes( iface );
666 return ISAXAttributes_getTypeFromQName(&This->ISAXAttributes_iface, QName, SysStringLen(QName),
667 (const WCHAR**)type, &len);
670 static HRESULT WINAPI ivbsaxattributes_getValue(
671 IVBSAXAttributes* iface,
676 saxattributes *This = impl_from_IVBSAXAttributes( iface );
677 return ISAXAttributes_getValue(&This->ISAXAttributes_iface, nIndex, (const WCHAR**)value, &len);
680 static HRESULT WINAPI ivbsaxattributes_getValueFromName(
681 IVBSAXAttributes* iface,
687 saxattributes *This = impl_from_IVBSAXAttributes( iface );
688 return ISAXAttributes_getValueFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
689 localName, SysStringLen(localName), (const WCHAR**)value, &len);
692 static HRESULT WINAPI ivbsaxattributes_getValueFromQName(
693 IVBSAXAttributes* iface,
698 saxattributes *This = impl_from_IVBSAXAttributes( iface );
699 return ISAXAttributes_getValueFromQName(&This->ISAXAttributes_iface, QName,
700 SysStringLen(QName), (const WCHAR**)value, &len);
703 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
705 ivbsaxattributes_QueryInterface,
706 ivbsaxattributes_AddRef,
707 ivbsaxattributes_Release,
708 ivbsaxattributes_GetTypeInfoCount,
709 ivbsaxattributes_GetTypeInfo,
710 ivbsaxattributes_GetIDsOfNames,
711 ivbsaxattributes_Invoke,
712 ivbsaxattributes_get_length,
713 ivbsaxattributes_getURI,
714 ivbsaxattributes_getLocalName,
715 ivbsaxattributes_getQName,
716 ivbsaxattributes_getIndexFromName,
717 ivbsaxattributes_getIndexFromQName,
718 ivbsaxattributes_getType,
719 ivbsaxattributes_getTypeFromName,
720 ivbsaxattributes_getTypeFromQName,
721 ivbsaxattributes_getValue,
722 ivbsaxattributes_getValueFromName,
723 ivbsaxattributes_getValueFromQName
726 /*** ISAXAttributes interface ***/
727 /*** IUnknown methods ***/
728 static HRESULT WINAPI isaxattributes_QueryInterface(
729 ISAXAttributes* iface,
733 saxattributes *This = impl_from_ISAXAttributes(iface);
735 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
739 if (IsEqualGUID(riid, &IID_IUnknown) ||
740 IsEqualGUID(riid, &IID_ISAXAttributes))
746 FIXME("interface %s not implemented\n", debugstr_guid(riid));
747 return E_NOINTERFACE;
750 ISAXAttributes_AddRef(iface);
755 static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
757 saxattributes *This = impl_from_ISAXAttributes(iface);
759 return InterlockedIncrement(&This->ref);
762 static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
764 saxattributes *This = impl_from_ISAXAttributes(iface);
769 ref = InterlockedDecrement(&This->ref);
773 for(index=0; index<This->nb_attributes; index++)
775 SysFreeString(This->szLocalname[index]);
776 SysFreeString(This->szURI[index]);
777 SysFreeString(This->szValue[index]);
778 SysFreeString(This->szQName[index]);
781 heap_free(This->szLocalname);
782 heap_free(This->szURI);
783 heap_free(This->szValue);
784 heap_free(This->szQName);
792 /*** ISAXAttributes methods ***/
793 static HRESULT WINAPI isaxattributes_getLength(
794 ISAXAttributes* iface,
797 saxattributes *This = impl_from_ISAXAttributes( iface );
799 *length = This->nb_attributes;
800 TRACE("Length set to %d\n", *length);
804 static HRESULT WINAPI isaxattributes_getURI(
805 ISAXAttributes* iface,
810 saxattributes *This = impl_from_ISAXAttributes( iface );
811 TRACE("(%p)->(%d)\n", This, nIndex);
813 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
814 if(!pUrl || !pUriSize) return E_POINTER;
816 *pUriSize = SysStringLen(This->szURI[nIndex]);
817 *pUrl = This->szURI[nIndex];
822 static HRESULT WINAPI isaxattributes_getLocalName(
823 ISAXAttributes* iface,
825 const WCHAR **pLocalName,
826 int *pLocalNameLength)
828 saxattributes *This = impl_from_ISAXAttributes( iface );
829 TRACE("(%p)->(%d)\n", This, nIndex);
831 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
832 if(!pLocalName || !pLocalNameLength) return E_POINTER;
834 *pLocalNameLength = SysStringLen(This->szLocalname[nIndex]);
835 *pLocalName = This->szLocalname[nIndex];
840 static HRESULT WINAPI isaxattributes_getQName(
841 ISAXAttributes* iface,
843 const WCHAR **pQName,
846 saxattributes *This = impl_from_ISAXAttributes( iface );
847 TRACE("(%p)->(%d)\n", This, nIndex);
849 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
850 if(!pQName || !pQNameLength) return E_POINTER;
852 *pQNameLength = SysStringLen(This->szQName[nIndex]);
853 *pQName = This->szQName[nIndex];
858 static HRESULT WINAPI isaxattributes_getName(
859 ISAXAttributes* iface,
863 const WCHAR **pLocalName,
865 const WCHAR **pQName,
868 saxattributes *This = impl_from_ISAXAttributes( iface );
869 TRACE("(%p)->(%d)\n", This, nIndex);
871 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
872 if(!pUri || !pUriLength || !pLocalName || !pLocalNameSize
873 || !pQName || !pQNameLength) return E_POINTER;
875 *pUriLength = SysStringLen(This->szURI[nIndex]);
876 *pUri = This->szURI[nIndex];
877 *pLocalNameSize = SysStringLen(This->szLocalname[nIndex]);
878 *pLocalName = This->szLocalname[nIndex];
879 *pQNameLength = SysStringLen(This->szQName[nIndex]);
880 *pQName = This->szQName[nIndex];
885 static HRESULT WINAPI isaxattributes_getIndexFromName(
886 ISAXAttributes* iface,
889 const WCHAR *pLocalName,
893 saxattributes *This = impl_from_ISAXAttributes( iface );
895 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), cUriLength,
896 debugstr_w(pLocalName), cocalNameLength);
898 if(!pUri || !pLocalName || !index) return E_POINTER;
900 for(i=0; i<This->nb_attributes; i++)
902 if(cUriLength!=SysStringLen(This->szURI[i])
903 || cocalNameLength!=SysStringLen(This->szLocalname[i]))
905 if(cUriLength && memcmp(pUri, This->szURI[i],
906 sizeof(WCHAR)*cUriLength))
908 if(cocalNameLength && memcmp(pLocalName, This->szLocalname[i],
909 sizeof(WCHAR)*cocalNameLength))
919 static HRESULT WINAPI isaxattributes_getIndexFromQName(
920 ISAXAttributes* iface,
925 saxattributes *This = impl_from_ISAXAttributes( iface );
927 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQNameLength);
929 if(!pQName || !index) return E_POINTER;
930 if(!nQNameLength) return E_INVALIDARG;
932 for(i=0; i<This->nb_attributes; i++)
934 if(nQNameLength!=SysStringLen(This->szQName[i])) continue;
935 if(memcmp(pQName, This->szQName, sizeof(WCHAR)*nQNameLength)) continue;
944 static HRESULT WINAPI isaxattributes_getType(
945 ISAXAttributes* iface,
950 saxattributes *This = impl_from_ISAXAttributes( iface );
952 FIXME("(%p)->(%d) stub\n", This, nIndex);
956 static HRESULT WINAPI isaxattributes_getTypeFromName(
957 ISAXAttributes* iface,
960 const WCHAR *pLocalName,
965 saxattributes *This = impl_from_ISAXAttributes( iface );
967 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
968 debugstr_w(pLocalName), nLocalName);
972 static HRESULT WINAPI isaxattributes_getTypeFromQName(
973 ISAXAttributes* iface,
979 saxattributes *This = impl_from_ISAXAttributes( iface );
981 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
985 static HRESULT WINAPI isaxattributes_getValue(
986 ISAXAttributes* iface,
988 const WCHAR **pValue,
991 saxattributes *This = impl_from_ISAXAttributes( iface );
992 TRACE("(%p)->(%d)\n", This, nIndex);
994 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
995 if(!pValue || !nValue) return E_POINTER;
997 *nValue = SysStringLen(This->szValue[nIndex]);
998 *pValue = This->szValue[nIndex];
1003 static HRESULT WINAPI isaxattributes_getValueFromName(
1004 ISAXAttributes* iface,
1007 const WCHAR *pLocalName,
1009 const WCHAR **pValue,
1014 saxattributes *This = impl_from_ISAXAttributes( iface );
1015 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), nUri,
1016 debugstr_w(pLocalName), nLocalName);
1018 hr = ISAXAttributes_getIndexFromName(iface,
1019 pUri, nUri, pLocalName, nLocalName, &index);
1020 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
1025 static HRESULT WINAPI isaxattributes_getValueFromQName(
1026 ISAXAttributes* iface,
1027 const WCHAR *pQName,
1029 const WCHAR **pValue,
1034 saxattributes *This = impl_from_ISAXAttributes( iface );
1035 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQName);
1037 hr = ISAXAttributes_getIndexFromQName(iface, pQName, nQName, &index);
1038 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
1043 static const struct ISAXAttributesVtbl isaxattributes_vtbl =
1045 isaxattributes_QueryInterface,
1046 isaxattributes_AddRef,
1047 isaxattributes_Release,
1048 isaxattributes_getLength,
1049 isaxattributes_getURI,
1050 isaxattributes_getLocalName,
1051 isaxattributes_getQName,
1052 isaxattributes_getName,
1053 isaxattributes_getIndexFromName,
1054 isaxattributes_getIndexFromQName,
1055 isaxattributes_getType,
1056 isaxattributes_getTypeFromName,
1057 isaxattributes_getTypeFromQName,
1058 isaxattributes_getValue,
1059 isaxattributes_getValueFromName,
1060 isaxattributes_getValueFromQName
1063 static HRESULT SAXAttributes_create(saxattributes **attr,
1064 int nb_namespaces, const xmlChar **xmlNamespaces,
1065 int nb_attributes, const xmlChar **xmlAttributes)
1067 saxattributes *attributes;
1069 static const xmlChar xmlns[] = "xmlns";
1071 attributes = heap_alloc(sizeof(*attributes));
1073 return E_OUTOFMEMORY;
1075 attributes->IVBSAXAttributes_iface.lpVtbl = &ivbsaxattributes_vtbl;
1076 attributes->ISAXAttributes_iface.lpVtbl = &isaxattributes_vtbl;
1077 attributes->ref = 1;
1079 attributes->nb_attributes = nb_namespaces+nb_attributes;
1081 attributes->szLocalname = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
1082 attributes->szURI = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
1083 attributes->szValue = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
1084 attributes->szQName = heap_alloc(sizeof(BSTR)*attributes->nb_attributes);
1086 if(!attributes->szLocalname || !attributes->szURI
1087 || !attributes->szValue || !attributes->szQName)
1089 heap_free(attributes->szLocalname);
1090 heap_free(attributes->szURI);
1091 heap_free(attributes->szValue);
1092 heap_free(attributes->szQName);
1093 heap_free(attributes);
1097 for(index=0; index<nb_namespaces; index++)
1099 attributes->szLocalname[index] = SysAllocStringLen(NULL, 0);
1100 attributes->szURI[index] = SysAllocStringLen(NULL, 0);
1101 attributes->szValue[index] = bstr_from_xmlChar(xmlNamespaces[2*index+1]);
1102 attributes->szQName[index] = QName_from_xmlChar(xmlns, xmlNamespaces[2*index]);
1105 for(index=0; index<nb_attributes; index++)
1107 attributes->szLocalname[nb_namespaces+index] =
1108 bstr_from_xmlChar(xmlAttributes[index*5]);
1109 attributes->szURI[nb_namespaces+index] =
1110 bstr_from_xmlChar(xmlAttributes[index*5+2]);
1111 attributes->szValue[nb_namespaces+index] =
1112 bstr_from_xmlCharN(xmlAttributes[index*5+3],
1113 xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
1114 attributes->szQName[nb_namespaces+index] =
1115 QName_from_xmlChar(xmlAttributes[index*5+1], xmlAttributes[index*5]);
1120 TRACE("returning %p\n", *attr);
1125 /*** LibXML callbacks ***/
1126 static void libxmlStartDocument(void *ctx)
1128 saxlocator *This = ctx;
1131 if(has_content_handler(This))
1133 if(This->vbInterface)
1134 hr = IVBSAXContentHandler_startDocument(This->saxreader->vbcontentHandler);
1136 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
1139 format_error_message_from_id(This, hr);
1142 update_position(This, NULL);
1145 static void libxmlEndDocument(void *ctx)
1147 saxlocator *This = ctx;
1153 if(This->ret != S_OK) return;
1155 if(has_content_handler(This))
1157 if(This->vbInterface)
1158 hr = IVBSAXContentHandler_endDocument(This->saxreader->vbcontentHandler);
1160 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
1163 format_error_message_from_id(This, hr);
1167 static void libxmlStartElementNS(
1169 const xmlChar *localname,
1170 const xmlChar *prefix,
1173 const xmlChar **namespaces,
1176 const xmlChar **attributes)
1178 BSTR NamespaceUri, LocalName, QName, Prefix, Uri;
1179 saxlocator *This = ctx;
1181 saxattributes *attr;
1184 if(*(This->pParserCtxt->input->cur) == '/')
1185 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+2);
1187 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
1189 hr = namespacePush(This, nb_namespaces);
1190 if(hr==S_OK && has_content_handler(This))
1192 for(index=0; index<nb_namespaces; index++)
1194 Prefix = pooled_bstr_from_xmlChar(&This->saxreader->pool, namespaces[2*index]);
1195 Uri = pooled_bstr_from_xmlChar(&This->saxreader->pool, namespaces[2*index+1]);
1197 if(This->vbInterface)
1198 hr = IVBSAXContentHandler_startPrefixMapping(
1199 This->saxreader->vbcontentHandler,
1202 hr = ISAXContentHandler_startPrefixMapping(
1203 This->saxreader->contentHandler,
1204 Prefix, SysStringLen(Prefix),
1205 Uri, SysStringLen(Uri));
1209 format_error_message_from_id(This, hr);
1214 NamespaceUri = pooled_bstr_from_xmlChar(&This->saxreader->pool, URI);
1215 LocalName = pooled_bstr_from_xmlChar(&This->saxreader->pool, localname);
1216 QName = pooled_QName_from_xmlChar(&This->saxreader->pool, prefix, localname);
1218 hr = SAXAttributes_create(&attr, nb_namespaces, namespaces, nb_attributes, attributes);
1221 if(This->vbInterface)
1222 hr = IVBSAXContentHandler_startElement(This->saxreader->vbcontentHandler,
1223 &NamespaceUri, &LocalName, &QName, &attr->IVBSAXAttributes_iface);
1225 hr = ISAXContentHandler_startElement(This->saxreader->contentHandler, NamespaceUri,
1226 SysStringLen(NamespaceUri), LocalName, SysStringLen(LocalName), QName,
1227 SysStringLen(QName), &attr->ISAXAttributes_iface);
1229 ISAXAttributes_Release(&attr->ISAXAttributes_iface);
1234 format_error_message_from_id(This, hr);
1237 static void libxmlEndElementNS(
1239 const xmlChar *localname,
1240 const xmlChar *prefix,
1243 BSTR NamespaceUri, LocalName, QName, Prefix;
1244 saxlocator *This = ctx;
1249 end = (xmlChar*)This->pParserCtxt->input->cur;
1250 if(*(end-1) != '>' || *(end-2) != '/')
1251 while(end-2>=This->pParserCtxt->input->base
1252 && *(end-2)!='<' && *(end-1)!='/') end--;
1254 update_position(This, end);
1256 nsNr = namespacePop(This);
1258 if(has_content_handler(This))
1260 NamespaceUri = pooled_bstr_from_xmlChar(&This->saxreader->pool, URI);
1261 LocalName = pooled_bstr_from_xmlChar(&This->saxreader->pool, localname);
1262 QName = pooled_QName_from_xmlChar(&This->saxreader->pool, prefix, localname);
1264 if(This->vbInterface)
1265 hr = IVBSAXContentHandler_endElement(
1266 This->saxreader->vbcontentHandler,
1267 &NamespaceUri, &LocalName, &QName);
1269 hr = ISAXContentHandler_endElement(
1270 This->saxreader->contentHandler,
1271 NamespaceUri, SysStringLen(NamespaceUri),
1272 LocalName, SysStringLen(LocalName),
1273 QName, SysStringLen(QName));
1277 format_error_message_from_id(This, hr);
1281 for(index=This->pParserCtxt->nsNr-2;
1282 index>=This->pParserCtxt->nsNr-nsNr*2; index-=2)
1284 Prefix = pooled_bstr_from_xmlChar(&This->saxreader->pool, This->pParserCtxt->nsTab[index]);
1286 if(This->vbInterface)
1287 hr = IVBSAXContentHandler_endPrefixMapping(
1288 This->saxreader->vbcontentHandler, &Prefix);
1290 hr = ISAXContentHandler_endPrefixMapping(
1291 This->saxreader->contentHandler,
1292 Prefix, SysStringLen(Prefix));
1296 format_error_message_from_id(This, hr);
1303 update_position(This, NULL);
1306 static void libxmlCharacters(
1311 saxlocator *This = ctx;
1316 BOOL lastEvent = FALSE;
1318 if(!(has_content_handler(This))) return;
1321 if(*(ch-1)=='\r') cur--;
1324 if(ch<This->pParserCtxt->input->base || ch>This->pParserCtxt->input->end)
1329 while(end-ch<len && *end!='\r') end++;
1336 if(!lastEvent) *end = '\n';
1338 Chars = pooled_bstr_from_xmlCharN(&This->saxreader->pool, cur, end-cur+1);
1339 if(This->vbInterface)
1340 hr = IVBSAXContentHandler_characters(
1341 This->saxreader->vbcontentHandler, &Chars);
1343 hr = ISAXContentHandler_characters(
1344 This->saxreader->contentHandler,
1345 Chars, SysStringLen(Chars));
1349 format_error_message_from_id(This, hr);
1353 This->column += end-cur+1;
1367 if(end-ch == len) break;
1370 if(ch<This->pParserCtxt->input->base || ch>This->pParserCtxt->input->end)
1371 This->column = This->realColumn
1372 +This->pParserCtxt->input->cur-This->lastCur;
1375 static void libxmlSetDocumentLocator(
1377 xmlSAXLocatorPtr loc)
1379 saxlocator *This = ctx;
1382 if(has_content_handler(This))
1384 if(This->vbInterface)
1385 hr = IVBSAXContentHandler_putref_documentLocator(This->saxreader->vbcontentHandler,
1386 &This->IVBSAXLocator_iface);
1388 hr = ISAXContentHandler_putDocumentLocator(This->saxreader->contentHandler,
1389 &This->ISAXLocator_iface);
1393 format_error_message_from_id(This, hr);
1396 static void libxmlComment(void *ctx, const xmlChar *value)
1398 saxlocator *This = ctx;
1401 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur;
1403 while(beg-4>=This->pParserCtxt->input->base
1404 && memcmp(beg-4, "<!--", sizeof(char[4]))) beg--;
1405 update_position(This, beg);
1407 if(!This->vbInterface && !This->saxreader->lexicalHandler) return;
1408 if(This->vbInterface && !This->saxreader->vblexicalHandler) return;
1410 bValue = pooled_bstr_from_xmlChar(&This->saxreader->pool, value);
1412 if(This->vbInterface)
1413 hr = IVBSAXLexicalHandler_comment(
1414 This->saxreader->vblexicalHandler, &bValue);
1416 hr = ISAXLexicalHandler_comment(
1417 This->saxreader->lexicalHandler,
1418 bValue, SysStringLen(bValue));
1421 format_error_message_from_id(This, hr);
1423 update_position(This, NULL);
1426 static void libxmlFatalError(void *ctx, const char *msg, ...)
1428 saxlocator *This = ctx;
1434 va_start(args, msg);
1435 vsprintf(message, msg, args);
1438 len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0);
1439 error = heap_alloc(sizeof(WCHAR)*len);
1442 MultiByteToWideChar(CP_UNIXCP, 0, message, -1, error, len);
1443 TRACE("fatal error for %p: %s\n", This, debugstr_w(error));
1446 if(!has_error_handler(This))
1448 xmlStopParser(This->pParserCtxt);
1454 FIXME("Error handling is not compatible.\n");
1456 if(This->vbInterface)
1458 BSTR bstrError = SysAllocString(error);
1459 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler, &This->IVBSAXLocator_iface,
1460 &bstrError, E_FAIL);
1461 SysFreeString(bstrError);
1464 ISAXErrorHandler_fatalError(This->saxreader->errorHandler, &This->ISAXLocator_iface,
1469 xmlStopParser(This->pParserCtxt);
1473 static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len)
1475 saxlocator *This = ctx;
1477 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur-len;
1481 BOOL lastEvent = FALSE, change;
1483 while(beg-9>=This->pParserCtxt->input->base
1484 && memcmp(beg-9, "<![CDATA[", sizeof(char[9]))) beg--;
1485 update_position(This, beg);
1487 if(This->vbInterface && This->saxreader->vblexicalHandler)
1488 hr = IVBSAXLexicalHandler_startCDATA(This->saxreader->vblexicalHandler);
1489 if(!This->vbInterface && This->saxreader->lexicalHandler)
1490 hr = ISAXLexicalHandler_startCDATA(This->saxreader->lexicalHandler);
1494 format_error_message_from_id(This, hr);
1498 realLen = This->pParserCtxt->input->cur-beg-3;
1504 while(end-beg<realLen && *end!='\r') end++;
1505 if(end-beg==realLen)
1510 else if(end-beg==realLen-1 && *end=='\r' && *(end+1)=='\n')
1513 if(*end == '\r') change = TRUE;
1514 else change = FALSE;
1516 if(change) *end = '\n';
1518 if(has_content_handler(This))
1520 Chars = pooled_bstr_from_xmlCharN(&This->saxreader->pool, cur, end-cur+1);
1521 if(This->vbInterface)
1522 hr = IVBSAXContentHandler_characters(
1523 This->saxreader->vbcontentHandler, &Chars);
1525 hr = ISAXContentHandler_characters(
1526 This->saxreader->contentHandler,
1527 Chars, SysStringLen(Chars));
1530 if(change) *end = '\r';
1535 This->column += end-cur+2;
1540 if(This->vbInterface && This->saxreader->vblexicalHandler)
1541 hr = IVBSAXLexicalHandler_endCDATA(This->saxreader->vblexicalHandler);
1542 if(!This->vbInterface && This->saxreader->lexicalHandler)
1543 hr = ISAXLexicalHandler_endCDATA(This->saxreader->lexicalHandler);
1546 format_error_message_from_id(This, hr);
1548 This->column += 4+end-cur;
1551 /*** IVBSAXLocator interface ***/
1552 /*** IUnknown methods ***/
1553 static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject)
1555 saxlocator *This = impl_from_IVBSAXLocator( iface );
1557 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject);
1561 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1562 IsEqualGUID( riid, &IID_IDispatch) ||
1563 IsEqualGUID( riid, &IID_IVBSAXLocator ))
1569 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1570 return E_NOINTERFACE;
1573 IVBSAXLocator_AddRef( iface );
1578 static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator* iface)
1580 saxlocator *This = impl_from_IVBSAXLocator( iface );
1581 TRACE("%p\n", This );
1582 return InterlockedIncrement( &This->ref );
1585 static ULONG WINAPI ivbsaxlocator_Release(
1586 IVBSAXLocator* iface)
1588 saxlocator *This = impl_from_IVBSAXLocator( iface );
1589 return ISAXLocator_Release((ISAXLocator*)&This->IVBSAXLocator_iface);
1592 /*** IDispatch methods ***/
1593 static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator *iface, UINT* pctinfo )
1595 saxlocator *This = impl_from_IVBSAXLocator( iface );
1597 TRACE("(%p)->(%p)\n", This, pctinfo);
1604 static HRESULT WINAPI ivbsaxlocator_GetTypeInfo(
1605 IVBSAXLocator *iface,
1606 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
1608 saxlocator *This = impl_from_IVBSAXLocator( iface );
1611 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1613 hr = get_typeinfo(IVBSAXLocator_tid, ppTInfo);
1618 static HRESULT WINAPI ivbsaxlocator_GetIDsOfNames(
1619 IVBSAXLocator *iface,
1621 LPOLESTR* rgszNames,
1626 saxlocator *This = impl_from_IVBSAXLocator( iface );
1627 ITypeInfo *typeinfo;
1630 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1633 if(!rgszNames || cNames == 0 || !rgDispId)
1634 return E_INVALIDARG;
1636 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1639 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1640 ITypeInfo_Release(typeinfo);
1646 static HRESULT WINAPI ivbsaxlocator_Invoke(
1647 IVBSAXLocator *iface,
1648 DISPID dispIdMember,
1652 DISPPARAMS* pDispParams,
1653 VARIANT* pVarResult,
1654 EXCEPINFO* pExcepInfo,
1657 saxlocator *This = impl_from_IVBSAXLocator( iface );
1658 ITypeInfo *typeinfo;
1661 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1662 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1664 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1667 hr = ITypeInfo_Invoke(typeinfo, &This->IVBSAXLocator_iface, dispIdMember, wFlags,
1668 pDispParams, pVarResult, pExcepInfo, puArgErr);
1669 ITypeInfo_Release(typeinfo);
1675 /*** IVBSAXLocator methods ***/
1676 static HRESULT WINAPI ivbsaxlocator_get_columnNumber(
1677 IVBSAXLocator* iface,
1680 saxlocator *This = impl_from_IVBSAXLocator( iface );
1681 return ISAXLocator_getColumnNumber((ISAXLocator*)&This->IVBSAXLocator_iface, pnColumn);
1684 static HRESULT WINAPI ivbsaxlocator_get_lineNumber(
1685 IVBSAXLocator* iface,
1688 saxlocator *This = impl_from_IVBSAXLocator( iface );
1689 return ISAXLocator_getLineNumber((ISAXLocator*)&This->IVBSAXLocator_iface, pnLine);
1692 static HRESULT WINAPI ivbsaxlocator_get_publicId(
1693 IVBSAXLocator* iface,
1696 saxlocator *This = impl_from_IVBSAXLocator( iface );
1697 return ISAXLocator_getPublicId((ISAXLocator*)&This->IVBSAXLocator_iface,
1698 (const WCHAR**)publicId);
1701 static HRESULT WINAPI ivbsaxlocator_get_systemId(
1702 IVBSAXLocator* iface,
1705 saxlocator *This = impl_from_IVBSAXLocator( iface );
1706 return ISAXLocator_getSystemId((ISAXLocator*)&This->IVBSAXLocator_iface,
1707 (const WCHAR**)systemId);
1710 static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl =
1712 ivbsaxlocator_QueryInterface,
1713 ivbsaxlocator_AddRef,
1714 ivbsaxlocator_Release,
1715 ivbsaxlocator_GetTypeInfoCount,
1716 ivbsaxlocator_GetTypeInfo,
1717 ivbsaxlocator_GetIDsOfNames,
1718 ivbsaxlocator_Invoke,
1719 ivbsaxlocator_get_columnNumber,
1720 ivbsaxlocator_get_lineNumber,
1721 ivbsaxlocator_get_publicId,
1722 ivbsaxlocator_get_systemId
1725 /*** ISAXLocator interface ***/
1726 /*** IUnknown methods ***/
1727 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
1729 saxlocator *This = impl_from_ISAXLocator( iface );
1731 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1735 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1736 IsEqualGUID( riid, &IID_ISAXLocator ))
1742 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1743 return E_NOINTERFACE;
1746 ISAXLocator_AddRef( iface );
1751 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
1753 saxlocator *This = impl_from_ISAXLocator( iface );
1754 TRACE("%p\n", This );
1755 return InterlockedIncrement( &This->ref );
1758 static ULONG WINAPI isaxlocator_Release(
1761 saxlocator *This = impl_from_ISAXLocator( iface );
1764 TRACE("%p\n", This );
1766 ref = InterlockedDecrement( &This->ref );
1769 SysFreeString(This->publicId);
1770 SysFreeString(This->systemId);
1771 heap_free(This->nsStack);
1773 ISAXXMLReader_Release(&This->saxreader->ISAXXMLReader_iface);
1780 /*** ISAXLocator methods ***/
1781 static HRESULT WINAPI isaxlocator_getColumnNumber(
1785 saxlocator *This = impl_from_ISAXLocator( iface );
1787 *pnColumn = This->column;
1791 static HRESULT WINAPI isaxlocator_getLineNumber(
1795 saxlocator *This = impl_from_ISAXLocator( iface );
1797 *pnLine = This->line;
1801 static HRESULT WINAPI isaxlocator_getPublicId(
1803 const WCHAR ** ppwchPublicId)
1806 saxlocator *This = impl_from_ISAXLocator( iface );
1808 SysFreeString(This->publicId);
1810 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
1811 if(SysStringLen(publicId))
1812 This->publicId = (WCHAR*)&publicId;
1815 SysFreeString(publicId);
1816 This->publicId = NULL;
1819 *ppwchPublicId = This->publicId;
1823 static HRESULT WINAPI isaxlocator_getSystemId(
1825 const WCHAR ** ppwchSystemId)
1828 saxlocator *This = impl_from_ISAXLocator( iface );
1830 SysFreeString(This->systemId);
1832 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
1833 if(SysStringLen(systemId))
1834 This->systemId = (WCHAR*)&systemId;
1837 SysFreeString(systemId);
1838 This->systemId = NULL;
1841 *ppwchSystemId = This->systemId;
1845 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
1847 isaxlocator_QueryInterface,
1849 isaxlocator_Release,
1850 isaxlocator_getColumnNumber,
1851 isaxlocator_getLineNumber,
1852 isaxlocator_getPublicId,
1853 isaxlocator_getSystemId
1856 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
1858 saxlocator *locator;
1860 locator = heap_alloc( sizeof (*locator) );
1862 return E_OUTOFMEMORY;
1864 locator->IVBSAXLocator_iface.lpVtbl = &ivbsaxlocator_vtbl;
1865 locator->ISAXLocator_iface.lpVtbl = &isaxlocator_vtbl;
1867 locator->vbInterface = vbInterface;
1869 locator->saxreader = reader;
1870 ISAXXMLReader_AddRef(&reader->ISAXXMLReader_iface);
1872 locator->pParserCtxt = NULL;
1873 locator->publicId = NULL;
1874 locator->systemId = NULL;
1875 locator->lastCur = NULL;
1877 locator->column = 0;
1878 locator->ret = S_OK;
1879 locator->nsStackSize = 8;
1880 locator->nsStackLast = 0;
1881 locator->nsStack = heap_alloc(sizeof(int)*locator->nsStackSize);
1882 if(!locator->nsStack)
1884 ISAXXMLReader_Release(&reader->ISAXXMLReader_iface);
1886 return E_OUTOFMEMORY;
1889 *ppsaxlocator = locator;
1891 TRACE("returning %p\n", *ppsaxlocator);
1896 /*** SAXXMLReader internal functions ***/
1897 static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
1899 xmlCharEncoding encoding = XML_CHAR_ENCODING_NONE;
1900 xmlChar *enc_name = NULL;
1901 saxlocator *locator;
1904 hr = SAXLocator_create(This, &locator, vbInterface);
1910 const unsigned char *buff = (unsigned char*)buffer;
1912 encoding = xmlDetectCharEncoding((xmlChar*)buffer, 4);
1913 enc_name = (xmlChar*)xmlGetCharEncodingName(encoding);
1914 TRACE("detected encoding: %s\n", enc_name);
1915 /* skip BOM, parser won't switch encodings and so won't skip it on its own */
1916 if ((encoding == XML_CHAR_ENCODING_UTF8) &&
1917 buff[0] == 0xEF && buff[1] == 0xBB && buff[2] == 0xBF)
1924 locator->pParserCtxt = xmlCreateMemoryParserCtxt(buffer, size);
1925 if(!locator->pParserCtxt)
1927 ISAXLocator_Release(&locator->ISAXLocator_iface);
1931 if (encoding == XML_CHAR_ENCODING_UTF8)
1932 locator->pParserCtxt->encoding = xmlStrdup(enc_name);
1934 xmlFree(locator->pParserCtxt->sax);
1935 locator->pParserCtxt->sax = &locator->saxreader->sax;
1936 locator->pParserCtxt->userData = locator;
1938 This->isParsing = TRUE;
1939 if(xmlParseDocument(locator->pParserCtxt) == -1) hr = E_FAIL;
1940 else hr = locator->ret;
1941 This->isParsing = FALSE;
1943 if(locator->pParserCtxt)
1945 locator->pParserCtxt->sax = NULL;
1946 xmlFreeParserCtxt(locator->pParserCtxt);
1947 locator->pParserCtxt = NULL;
1950 ISAXLocator_Release(&locator->ISAXLocator_iface);
1954 static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
1956 saxlocator *locator;
1963 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1964 if(FAILED(hr)) return hr;
1966 hr = SAXLocator_create(This, &locator, vbInterface);
1967 if(FAILED(hr)) return hr;
1969 locator->pParserCtxt = xmlCreatePushParserCtxt(
1970 &locator->saxreader->sax, locator,
1971 data, dataRead, NULL);
1972 if(!locator->pParserCtxt)
1974 ISAXLocator_Release(&locator->ISAXLocator_iface);
1978 This->isParsing = TRUE;
1980 if(dataRead != sizeof(data))
1982 ret = xmlParseChunk(locator->pParserCtxt, data, 0, 1);
1983 hr = ret != XML_ERR_OK ? E_FAIL : locator->ret;
1990 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1991 if (FAILED(hr)) break;
1993 ret = xmlParseChunk(locator->pParserCtxt, data, dataRead, 0);
1994 hr = ret != XML_ERR_OK ? E_FAIL : locator->ret;
1996 if (hr != S_OK) break;
1998 if (dataRead != sizeof(data))
2000 ret = xmlParseChunk(locator->pParserCtxt, data, 0, 1);
2001 hr = ret != XML_ERR_OK ? E_FAIL : locator->ret;
2007 This->isParsing = FALSE;
2009 xmlFreeParserCtxt(locator->pParserCtxt);
2010 locator->pParserCtxt = NULL;
2011 ISAXLocator_Release(&locator->ISAXLocator_iface);
2015 static HRESULT internal_getEntityResolver(
2017 void *pEntityResolver,
2020 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
2024 static HRESULT internal_putEntityResolver(
2026 void *pEntityResolver,
2029 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
2033 static HRESULT internal_getContentHandler(
2035 void *pContentHandler,
2038 TRACE("(%p)->(%p)\n", This, pContentHandler);
2039 if(pContentHandler == NULL)
2041 if((vbInterface && This->vbcontentHandler)
2042 || (!vbInterface && This->contentHandler))
2045 IVBSAXContentHandler_AddRef(This->vbcontentHandler);
2047 ISAXContentHandler_AddRef(This->contentHandler);
2049 if(vbInterface) *(IVBSAXContentHandler**)pContentHandler =
2050 This->vbcontentHandler;
2051 else *(ISAXContentHandler**)pContentHandler = This->contentHandler;
2056 static HRESULT internal_putContentHandler(
2058 void *contentHandler,
2061 TRACE("(%p)->(%p)\n", This, contentHandler);
2065 IVBSAXContentHandler_AddRef((IVBSAXContentHandler*)contentHandler);
2067 ISAXContentHandler_AddRef((ISAXContentHandler*)contentHandler);
2069 if((vbInterface && This->vbcontentHandler)
2070 || (!vbInterface && This->contentHandler))
2073 IVBSAXContentHandler_Release(This->vbcontentHandler);
2075 ISAXContentHandler_Release(This->contentHandler);
2078 This->vbcontentHandler = contentHandler;
2080 This->contentHandler = contentHandler;
2085 static HRESULT internal_getDTDHandler(
2090 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
2094 static HRESULT internal_putDTDHandler(
2099 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
2103 static HRESULT internal_getErrorHandler(
2105 void *pErrorHandler,
2108 TRACE("(%p)->(%p)\n", This, pErrorHandler);
2109 if(pErrorHandler == NULL)
2112 if(vbInterface && This->vberrorHandler)
2113 IVBSAXErrorHandler_AddRef(This->vberrorHandler);
2114 else if(!vbInterface && This->errorHandler)
2115 ISAXErrorHandler_AddRef(This->errorHandler);
2118 *(IVBSAXErrorHandler**)pErrorHandler = This->vberrorHandler;
2120 *(ISAXErrorHandler**)pErrorHandler = This->errorHandler;
2126 static HRESULT internal_putErrorHandler(
2131 TRACE("(%p)->(%p)\n", This, errorHandler);
2135 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler*)errorHandler);
2137 ISAXErrorHandler_AddRef((ISAXErrorHandler*)errorHandler);
2140 if(vbInterface && This->vberrorHandler)
2141 IVBSAXErrorHandler_Release(This->vberrorHandler);
2142 else if(!vbInterface && This->errorHandler)
2143 ISAXErrorHandler_Release(This->errorHandler);
2146 This->vberrorHandler = errorHandler;
2148 This->errorHandler = errorHandler;
2154 static HRESULT internal_parse(
2161 TRACE("(%p)->(%s)\n", This, debugstr_variant(&varInput));
2163 /* Dispose of the BSTRs in the pool from a prior run, if any. */
2164 free_bstr_pool(&This->pool);
2166 switch(V_VT(&varInput))
2169 hr = internal_parseBuffer(This, (const char*)V_BSTR(&varInput),
2170 SysStringByteLen(V_BSTR(&varInput)), vbInterface);
2172 case VT_ARRAY|VT_UI1: {
2174 LONG lBound, uBound;
2177 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
2178 if(hr != S_OK) break;
2179 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
2180 if(hr != S_OK) break;
2181 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
2182 hr = SafeArrayAccessData(V_ARRAY(&varInput), &pSAData);
2183 if(hr != S_OK) break;
2184 hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
2185 SafeArrayUnaccessData(V_ARRAY(&varInput));
2190 IPersistStream *persistStream;
2191 IStream *stream = NULL;
2192 IXMLDOMDocument *xmlDoc;
2194 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2195 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
2199 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
2200 hr = internal_parseBuffer(This, (const char*)bstrData,
2201 SysStringByteLen(bstrData), vbInterface);
2202 IXMLDOMDocument_Release(xmlDoc);
2203 SysFreeString(bstrData);
2207 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2208 &IID_IPersistStream, (void**)&persistStream) == S_OK)
2210 hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
2213 IPersistStream_Release(persistStream);
2217 hr = IPersistStream_Save(persistStream, stream, TRUE);
2218 IPersistStream_Release(persistStream);
2221 IStream_Release(stream);
2225 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2226 &IID_IStream, (void**)&stream) == S_OK)
2228 hr = internal_parseStream(This, stream, vbInterface);
2229 IStream_Release(stream);
2234 WARN("vt %d not implemented\n", V_VT(&varInput));
2241 static HRESULT internal_vbonDataAvailable(void *obj, char *ptr, DWORD len)
2243 saxreader *This = obj;
2245 return internal_parseBuffer(This, ptr, len, TRUE);
2248 static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len)
2250 saxreader *This = obj;
2252 return internal_parseBuffer(This, ptr, len, FALSE);
2255 static HRESULT internal_parseURL(
2263 TRACE("(%p)->(%s)\n", This, debugstr_w(url));
2265 if(vbInterface) hr = bind_url(url, internal_vbonDataAvailable, This, &bsc);
2266 else hr = bind_url(url, internal_onDataAvailable, This, &bsc);
2276 static HRESULT internal_putProperty(
2282 TRACE("(%p)->(%s %s)\n", This, debugstr_w(prop), debugstr_variant(&value));
2284 if(!memcmp(prop, PropertyDeclHandlerW, sizeof(PropertyDeclHandlerW)))
2286 if(This->isParsing) return E_FAIL;
2288 switch (V_VT(&value))
2293 if (This->vbdeclHandler)
2295 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2296 This->vbdeclHandler = NULL;
2300 if (This->declHandler)
2302 ISAXDeclHandler_Release(This->declHandler);
2303 This->declHandler = NULL;
2307 if (V_UNKNOWN(&value)) IUnknown_AddRef(V_UNKNOWN(&value));
2309 if ((vbInterface && This->vbdeclHandler) ||
2310 (!vbInterface && This->declHandler))
2313 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2315 ISAXDeclHandler_Release(This->declHandler);
2319 This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
2321 This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
2324 return E_INVALIDARG;
2330 if(!memcmp(prop, PropertyLexicalHandlerW, sizeof(PropertyLexicalHandlerW)))
2332 if(This->isParsing) return E_FAIL;
2334 switch (V_VT(&value))
2339 if (This->vblexicalHandler)
2341 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2342 This->vblexicalHandler = NULL;
2346 if (This->lexicalHandler)
2348 ISAXLexicalHandler_Release(This->lexicalHandler);
2349 This->lexicalHandler = NULL;
2353 if (V_UNKNOWN(&value)) IUnknown_AddRef(V_UNKNOWN(&value));
2355 if ((vbInterface && This->vblexicalHandler) ||
2356 (!vbInterface && This->lexicalHandler))
2359 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2361 ISAXLexicalHandler_Release(This->lexicalHandler);
2365 This->vblexicalHandler = (IVBSAXLexicalHandler*)V_UNKNOWN(&value);
2367 This->lexicalHandler = (ISAXLexicalHandler*)V_UNKNOWN(&value);
2370 return E_INVALIDARG;
2376 FIXME("(%p)->(%s): unsupported property\n", This, debugstr_w(prop));
2378 if(!memcmp(prop, PropertyCharsetW, sizeof(PropertyCharsetW)))
2381 if(!memcmp(prop, PropertyDomNodeW, sizeof(PropertyDomNodeW)))
2384 if(!memcmp(prop, PropertyInputSourceW, sizeof(PropertyInputSourceW)))
2387 if(!memcmp(prop, PropertyMaxElementDepthW, sizeof(PropertyMaxElementDepthW)))
2390 if(!memcmp(prop, PropertyMaxXMLSizeW, sizeof(PropertyMaxXMLSizeW)))
2393 if(!memcmp(prop, PropertySchemaDeclHandlerW, sizeof(PropertySchemaDeclHandlerW)))
2396 if(!memcmp(prop, PropertyXMLDeclEncodingW, sizeof(PropertyXMLDeclEncodingW)))
2399 if(!memcmp(prop, PropertyXMLDeclStandaloneW, sizeof(PropertyXMLDeclStandaloneW)))
2402 if(!memcmp(prop, PropertyXMLDeclVersionW, sizeof(PropertyXMLDeclVersionW)))
2405 return E_INVALIDARG;
2408 static HRESULT internal_getProperty(const saxreader* This, const WCHAR *prop, VARIANT *value, BOOL vb)
2410 TRACE("(%p)->(%s)\n", This, debugstr_w(prop));
2412 if (!value) return E_POINTER;
2414 if (!memcmp(PropertyLexicalHandlerW, prop, sizeof(PropertyLexicalHandlerW)))
2416 V_VT(value) = VT_UNKNOWN;
2417 V_UNKNOWN(value) = vb ? (IUnknown*)This->vblexicalHandler : (IUnknown*)This->lexicalHandler;
2418 if (V_UNKNOWN(value)) IUnknown_AddRef(V_UNKNOWN(value));
2422 if (!memcmp(PropertyDeclHandlerW, prop, sizeof(PropertyDeclHandlerW)))
2424 V_VT(value) = VT_UNKNOWN;
2425 V_UNKNOWN(value) = vb ? (IUnknown*)This->vbdeclHandler : (IUnknown*)This->declHandler;
2426 if (V_UNKNOWN(value)) IUnknown_AddRef(V_UNKNOWN(value));
2430 FIXME("(%p)->(%s) unsupported property\n", This, debugstr_w(prop));
2435 /*** IVBSAXXMLReader interface ***/
2436 /*** IUnknown methods ***/
2437 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
2439 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2441 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
2445 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
2446 IsEqualGUID( riid, &IID_IDispatch ) ||
2447 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
2451 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
2453 *ppvObject = &This->ISAXXMLReader_iface;
2457 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2458 return E_NOINTERFACE;
2461 IVBSAXXMLReader_AddRef( iface );
2466 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
2468 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2469 TRACE("%p\n", This );
2470 return InterlockedIncrement( &This->ref );
2473 static ULONG WINAPI saxxmlreader_Release(
2474 IVBSAXXMLReader* iface)
2476 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2479 TRACE("%p\n", This );
2481 ref = InterlockedDecrement( &This->ref );
2484 if(This->contentHandler)
2485 ISAXContentHandler_Release(This->contentHandler);
2487 if(This->vbcontentHandler)
2488 IVBSAXContentHandler_Release(This->vbcontentHandler);
2490 if(This->errorHandler)
2491 ISAXErrorHandler_Release(This->errorHandler);
2493 if(This->vberrorHandler)
2494 IVBSAXErrorHandler_Release(This->vberrorHandler);
2496 if(This->lexicalHandler)
2497 ISAXLexicalHandler_Release(This->lexicalHandler);
2499 if(This->vblexicalHandler)
2500 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2502 if(This->declHandler)
2503 ISAXDeclHandler_Release(This->declHandler);
2505 if(This->vbdeclHandler)
2506 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2508 free_bstr_pool(&This->pool);
2516 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
2518 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2520 TRACE("(%p)->(%p)\n", This, pctinfo);
2527 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
2528 IVBSAXXMLReader *iface,
2529 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2531 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2534 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2536 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
2541 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
2542 IVBSAXXMLReader *iface,
2544 LPOLESTR* rgszNames,
2549 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2550 ITypeInfo *typeinfo;
2553 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2556 if(!rgszNames || cNames == 0 || !rgDispId)
2557 return E_INVALIDARG;
2559 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2562 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
2563 ITypeInfo_Release(typeinfo);
2569 static HRESULT WINAPI saxxmlreader_Invoke(
2570 IVBSAXXMLReader *iface,
2571 DISPID dispIdMember,
2575 DISPPARAMS* pDispParams,
2576 VARIANT* pVarResult,
2577 EXCEPINFO* pExcepInfo,
2580 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2581 ITypeInfo *typeinfo;
2584 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2585 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2587 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2590 hr = ITypeInfo_Invoke(typeinfo, &This->IVBSAXXMLReader_iface, dispIdMember, wFlags,
2591 pDispParams, pVarResult, pExcepInfo, puArgErr);
2592 ITypeInfo_Release(typeinfo);
2598 /*** IVBSAXXMLReader methods ***/
2599 static HRESULT WINAPI saxxmlreader_getFeature(
2600 IVBSAXXMLReader* iface,
2601 const WCHAR *pFeature,
2602 VARIANT_BOOL *pValue)
2604 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2606 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
2610 static HRESULT WINAPI saxxmlreader_putFeature(
2611 IVBSAXXMLReader* iface,
2612 const WCHAR *feature,
2615 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2617 TRACE("(%p)->(%s %x)\n", This, debugstr_w(feature), value);
2619 if (!strcmpW(FeatureExternalGeneralEntitiesW, feature) && value == VARIANT_FALSE)
2620 return set_feature_value(This, ExternalGeneralEntities, value);
2622 if (!strcmpW(FeatureExternalParameterEntitiesW, feature) && value == VARIANT_FALSE)
2623 return set_feature_value(This, ExternalParameterEntities, value);
2625 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(feature), value);
2629 static HRESULT WINAPI saxxmlreader_getProperty(
2630 IVBSAXXMLReader* iface,
2634 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2635 return internal_getProperty(This, prop, value, TRUE);
2638 static HRESULT WINAPI saxxmlreader_putProperty(
2639 IVBSAXXMLReader* iface,
2643 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2644 return internal_putProperty(This, pProp, value, TRUE);
2647 static HRESULT WINAPI saxxmlreader_get_entityResolver(
2648 IVBSAXXMLReader* iface,
2649 IVBSAXEntityResolver **pEntityResolver)
2651 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2652 return internal_getEntityResolver(This, pEntityResolver, TRUE);
2655 static HRESULT WINAPI saxxmlreader_put_entityResolver(
2656 IVBSAXXMLReader* iface,
2657 IVBSAXEntityResolver *pEntityResolver)
2659 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2660 return internal_putEntityResolver(This, pEntityResolver, TRUE);
2663 static HRESULT WINAPI saxxmlreader_get_contentHandler(
2664 IVBSAXXMLReader* iface,
2665 IVBSAXContentHandler **ppContentHandler)
2667 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2668 return internal_getContentHandler(This, ppContentHandler, TRUE);
2671 static HRESULT WINAPI saxxmlreader_put_contentHandler(
2672 IVBSAXXMLReader* iface,
2673 IVBSAXContentHandler *contentHandler)
2675 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2676 return internal_putContentHandler(This, contentHandler, TRUE);
2679 static HRESULT WINAPI saxxmlreader_get_dtdHandler(
2680 IVBSAXXMLReader* iface,
2681 IVBSAXDTDHandler **pDTDHandler)
2683 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2684 return internal_getDTDHandler(This, pDTDHandler, TRUE);
2687 static HRESULT WINAPI saxxmlreader_put_dtdHandler(
2688 IVBSAXXMLReader* iface,
2689 IVBSAXDTDHandler *pDTDHandler)
2691 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2692 return internal_putDTDHandler(This, pDTDHandler, TRUE);
2695 static HRESULT WINAPI saxxmlreader_get_errorHandler(
2696 IVBSAXXMLReader* iface,
2697 IVBSAXErrorHandler **pErrorHandler)
2699 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2700 return internal_getErrorHandler(This, pErrorHandler, TRUE);
2703 static HRESULT WINAPI saxxmlreader_put_errorHandler(
2704 IVBSAXXMLReader* iface,
2705 IVBSAXErrorHandler *errorHandler)
2707 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2708 return internal_putErrorHandler(This, errorHandler, TRUE);
2711 static HRESULT WINAPI saxxmlreader_get_baseURL(
2712 IVBSAXXMLReader* iface,
2713 const WCHAR **pBaseUrl)
2715 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2717 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
2721 static HRESULT WINAPI saxxmlreader_put_baseURL(
2722 IVBSAXXMLReader* iface,
2723 const WCHAR *pBaseUrl)
2725 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2727 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
2731 static HRESULT WINAPI saxxmlreader_get_secureBaseURL(
2732 IVBSAXXMLReader* iface,
2733 const WCHAR **pSecureBaseUrl)
2735 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2737 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
2742 static HRESULT WINAPI saxxmlreader_put_secureBaseURL(
2743 IVBSAXXMLReader* iface,
2744 const WCHAR *secureBaseUrl)
2746 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2748 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
2752 static HRESULT WINAPI saxxmlreader_parse(
2753 IVBSAXXMLReader* iface,
2756 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2757 return internal_parse(This, varInput, TRUE);
2760 static HRESULT WINAPI saxxmlreader_parseURL(
2761 IVBSAXXMLReader* iface,
2764 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2765 return internal_parseURL(This, url, TRUE);
2768 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
2770 saxxmlreader_QueryInterface,
2771 saxxmlreader_AddRef,
2772 saxxmlreader_Release,
2773 saxxmlreader_GetTypeInfoCount,
2774 saxxmlreader_GetTypeInfo,
2775 saxxmlreader_GetIDsOfNames,
2776 saxxmlreader_Invoke,
2777 saxxmlreader_getFeature,
2778 saxxmlreader_putFeature,
2779 saxxmlreader_getProperty,
2780 saxxmlreader_putProperty,
2781 saxxmlreader_get_entityResolver,
2782 saxxmlreader_put_entityResolver,
2783 saxxmlreader_get_contentHandler,
2784 saxxmlreader_put_contentHandler,
2785 saxxmlreader_get_dtdHandler,
2786 saxxmlreader_put_dtdHandler,
2787 saxxmlreader_get_errorHandler,
2788 saxxmlreader_put_errorHandler,
2789 saxxmlreader_get_baseURL,
2790 saxxmlreader_put_baseURL,
2791 saxxmlreader_get_secureBaseURL,
2792 saxxmlreader_put_secureBaseURL,
2794 saxxmlreader_parseURL
2797 /*** ISAXXMLReader interface ***/
2798 /*** IUnknown methods ***/
2799 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
2801 saxreader *This = impl_from_ISAXXMLReader( iface );
2802 return saxxmlreader_QueryInterface(&This->IVBSAXXMLReader_iface, riid, ppvObject);
2805 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
2807 saxreader *This = impl_from_ISAXXMLReader( iface );
2808 return saxxmlreader_AddRef(&This->IVBSAXXMLReader_iface);
2811 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
2813 saxreader *This = impl_from_ISAXXMLReader( iface );
2814 return saxxmlreader_Release(&This->IVBSAXXMLReader_iface);
2817 /*** ISAXXMLReader methods ***/
2818 static HRESULT WINAPI isaxxmlreader_getFeature(
2819 ISAXXMLReader* iface,
2820 const WCHAR *pFeature,
2821 VARIANT_BOOL *pValue)
2823 saxreader *This = impl_from_ISAXXMLReader( iface );
2824 return IVBSAXXMLReader_getFeature(&This->IVBSAXXMLReader_iface, pFeature, pValue);
2827 static HRESULT WINAPI isaxxmlreader_putFeature(
2828 ISAXXMLReader* iface,
2829 const WCHAR *pFeature,
2830 VARIANT_BOOL vfValue)
2832 saxreader *This = impl_from_ISAXXMLReader( iface );
2833 return IVBSAXXMLReader_putFeature(&This->IVBSAXXMLReader_iface, pFeature, vfValue);
2836 static HRESULT WINAPI isaxxmlreader_getProperty(
2837 ISAXXMLReader* iface,
2841 saxreader *This = impl_from_ISAXXMLReader( iface );
2842 return internal_getProperty(This, prop, value, FALSE);
2845 static HRESULT WINAPI isaxxmlreader_putProperty(
2846 ISAXXMLReader* iface,
2850 saxreader *This = impl_from_ISAXXMLReader( iface );
2851 return internal_putProperty(This, pProp, value, FALSE);
2854 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
2855 ISAXXMLReader* iface,
2856 ISAXEntityResolver **ppEntityResolver)
2858 saxreader *This = impl_from_ISAXXMLReader( iface );
2859 return internal_getEntityResolver(This, ppEntityResolver, FALSE);
2862 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
2863 ISAXXMLReader* iface,
2864 ISAXEntityResolver *pEntityResolver)
2866 saxreader *This = impl_from_ISAXXMLReader( iface );
2867 return internal_putEntityResolver(This, pEntityResolver, FALSE);
2870 static HRESULT WINAPI isaxxmlreader_getContentHandler(
2871 ISAXXMLReader* iface,
2872 ISAXContentHandler **pContentHandler)
2874 saxreader *This = impl_from_ISAXXMLReader( iface );
2875 return internal_getContentHandler(This, pContentHandler, FALSE);
2878 static HRESULT WINAPI isaxxmlreader_putContentHandler(
2879 ISAXXMLReader* iface,
2880 ISAXContentHandler *contentHandler)
2882 saxreader *This = impl_from_ISAXXMLReader( iface );
2883 return internal_putContentHandler(This, contentHandler, FALSE);
2886 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
2887 ISAXXMLReader* iface,
2888 ISAXDTDHandler **pDTDHandler)
2890 saxreader *This = impl_from_ISAXXMLReader( iface );
2891 return internal_getDTDHandler(This, pDTDHandler, FALSE);
2894 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
2895 ISAXXMLReader* iface,
2896 ISAXDTDHandler *pDTDHandler)
2898 saxreader *This = impl_from_ISAXXMLReader( iface );
2899 return internal_putDTDHandler(This, pDTDHandler, FALSE);
2902 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
2903 ISAXXMLReader* iface,
2904 ISAXErrorHandler **pErrorHandler)
2906 saxreader *This = impl_from_ISAXXMLReader( iface );
2907 return internal_getErrorHandler(This, pErrorHandler, FALSE);
2910 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
2911 ISAXXMLReader* iface,
2912 ISAXErrorHandler *errorHandler)
2914 saxreader *This = impl_from_ISAXXMLReader( iface );
2915 return internal_putErrorHandler(This, errorHandler, FALSE);
2918 static HRESULT WINAPI isaxxmlreader_getBaseURL(
2919 ISAXXMLReader* iface,
2920 const WCHAR **pBaseUrl)
2922 saxreader *This = impl_from_ISAXXMLReader( iface );
2923 return IVBSAXXMLReader_get_baseURL(&This->IVBSAXXMLReader_iface, pBaseUrl);
2926 static HRESULT WINAPI isaxxmlreader_putBaseURL(
2927 ISAXXMLReader* iface,
2928 const WCHAR *pBaseUrl)
2930 saxreader *This = impl_from_ISAXXMLReader( iface );
2931 return IVBSAXXMLReader_put_baseURL(&This->IVBSAXXMLReader_iface, pBaseUrl);
2934 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
2935 ISAXXMLReader* iface,
2936 const WCHAR **pSecureBaseUrl)
2938 saxreader *This = impl_from_ISAXXMLReader( iface );
2939 return IVBSAXXMLReader_get_secureBaseURL(&This->IVBSAXXMLReader_iface, pSecureBaseUrl);
2942 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
2943 ISAXXMLReader* iface,
2944 const WCHAR *secureBaseUrl)
2946 saxreader *This = impl_from_ISAXXMLReader( iface );
2947 return IVBSAXXMLReader_put_secureBaseURL(&This->IVBSAXXMLReader_iface, secureBaseUrl);
2950 static HRESULT WINAPI isaxxmlreader_parse(
2951 ISAXXMLReader* iface,
2954 saxreader *This = impl_from_ISAXXMLReader( iface );
2955 return internal_parse(This, varInput, FALSE);
2958 static HRESULT WINAPI isaxxmlreader_parseURL(
2959 ISAXXMLReader* iface,
2962 saxreader *This = impl_from_ISAXXMLReader( iface );
2963 return internal_parseURL(This, url, FALSE);
2966 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
2968 isaxxmlreader_QueryInterface,
2969 isaxxmlreader_AddRef,
2970 isaxxmlreader_Release,
2971 isaxxmlreader_getFeature,
2972 isaxxmlreader_putFeature,
2973 isaxxmlreader_getProperty,
2974 isaxxmlreader_putProperty,
2975 isaxxmlreader_getEntityResolver,
2976 isaxxmlreader_putEntityResolver,
2977 isaxxmlreader_getContentHandler,
2978 isaxxmlreader_putContentHandler,
2979 isaxxmlreader_getDTDHandler,
2980 isaxxmlreader_putDTDHandler,
2981 isaxxmlreader_getErrorHandler,
2982 isaxxmlreader_putErrorHandler,
2983 isaxxmlreader_getBaseURL,
2984 isaxxmlreader_putBaseURL,
2985 isaxxmlreader_getSecureBaseURL,
2986 isaxxmlreader_putSecureBaseURL,
2987 isaxxmlreader_parse,
2988 isaxxmlreader_parseURL
2991 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2995 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
2997 reader = heap_alloc( sizeof (*reader) );
2999 return E_OUTOFMEMORY;
3001 reader->IVBSAXXMLReader_iface.lpVtbl = &saxreader_vtbl;
3002 reader->ISAXXMLReader_iface.lpVtbl = &isaxreader_vtbl;
3004 reader->contentHandler = NULL;
3005 reader->vbcontentHandler = NULL;
3006 reader->errorHandler = NULL;
3007 reader->vberrorHandler = NULL;
3008 reader->lexicalHandler = NULL;
3009 reader->vblexicalHandler = NULL;
3010 reader->declHandler = NULL;
3011 reader->vbdeclHandler = NULL;
3012 reader->isParsing = FALSE;
3013 reader->pool.pool = NULL;
3014 reader->pool.index = 0;
3015 reader->pool.len = 0;
3016 reader->features = 0;
3018 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
3019 reader->sax.initialized = XML_SAX2_MAGIC;
3020 reader->sax.startDocument = libxmlStartDocument;
3021 reader->sax.endDocument = libxmlEndDocument;
3022 reader->sax.startElementNs = libxmlStartElementNS;
3023 reader->sax.endElementNs = libxmlEndElementNS;
3024 reader->sax.characters = libxmlCharacters;
3025 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
3026 reader->sax.comment = libxmlComment;
3027 reader->sax.error = libxmlFatalError;
3028 reader->sax.fatalError = libxmlFatalError;
3029 reader->sax.cdataBlock = libxmlCDataBlock;
3031 *ppObj = &reader->IVBSAXXMLReader_iface;
3033 TRACE("returning iface %p\n", *ppObj);
3040 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
3042 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
3043 "libxml2 support was not present at compile time.\n");