msxml3: Added stub implementation of ISAXAttributes.
[wine/gsoc_dplay.git] / dlls / msxml3 / saxreader.c
blob8ec1e46790c4d8a0f59d63aa959a7f5c27aa0bfc
1 /*
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
21 #define COBJMACROS
23 #include "config.h"
25 #include <stdarg.h>
26 #include <assert.h>
27 #include "windef.h"
28 #include "winbase.h"
29 #include "winuser.h"
30 #include "winnls.h"
31 #include "ole2.h"
32 #include "msxml2.h"
33 #include "wininet.h"
34 #include "urlmon.h"
35 #include "winreg.h"
36 #include "shlwapi.h"
38 #include "wine/debug.h"
40 #include "msxml_private.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
44 #ifdef HAVE_LIBXML2
46 #include <libxml/SAX2.h>
48 typedef struct _saxreader
50 const struct IVBSAXXMLReaderVtbl *lpVtbl;
51 const struct ISAXXMLReaderVtbl *lpSAXXMLReaderVtbl;
52 LONG ref;
53 struct ISAXContentHandler *contentHandler;
54 struct ISAXErrorHandler *errorHandler;
55 xmlSAXHandler sax;
56 } saxreader;
58 typedef struct _saxlocator
60 const struct ISAXLocatorVtbl *lpSAXLocatorVtbl;
61 LONG ref;
62 saxreader *saxreader;
63 HRESULT ret;
64 xmlParserCtxtPtr pParserCtxt;
65 WCHAR *publicId;
66 WCHAR *systemId;
67 xmlChar *lastCur;
68 int line;
69 int column;
70 } saxlocator;
72 typedef struct _saxattributes
74 const struct ISAXAttributesVtbl *lpSAXAttributesVtbl;
75 LONG ref;
76 } saxattributes;
78 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
80 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpVtbl));
83 static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
85 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpSAXXMLReaderVtbl));
88 static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
90 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl));
93 static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface )
95 return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpSAXAttributesVtbl));
99 static void format_error_message_from_id(saxlocator *This, HRESULT hr)
101 xmlStopParser(This->pParserCtxt);
102 This->ret = hr;
104 if(This->saxreader->errorHandler)
106 WCHAR msg[1024];
107 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
108 NULL, hr, 0, msg, sizeof(msg), NULL))
110 FIXME("MSXML errors not yet supported.\n");
111 msg[0] = '\0';
114 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
115 (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
119 static void update_position(saxlocator *This, xmlChar *end)
121 if(This->lastCur == NULL)
123 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
124 This->line = 1;
125 This->column = 1;
128 if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
130 while(This->lastCur < end)
132 if(*(This->lastCur) == '\n')
134 This->line++;
135 This->column = 1;
137 else if(*(This->lastCur) == '\r' && (This->lastCur==This->pParserCtxt->input->end || *(This->lastCur+1)!='\n'))
139 This->line++;
140 This->column = 1;
142 else This->column++;
144 This->lastCur++;
148 /*** ISAXAttributes interface ***/
149 /*** IUnknown methods ***/
150 static HRESULT WINAPI isaxattributes_QueryInterface(
151 ISAXAttributes* iface,
152 REFIID riid,
153 void **ppvObject)
155 saxattributes *This = impl_from_ISAXAttributes(iface);
157 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
159 *ppvObject = NULL;
161 if (IsEqualGUID(riid, &IID_IUnknown) ||
162 IsEqualGUID(riid, &IID_ISAXAttributes))
164 *ppvObject = iface;
166 else
168 FIXME("interface %s not implemented\n", debugstr_guid(riid));
169 return E_NOINTERFACE;
172 ISAXAttributes_AddRef(iface);
174 return S_OK;
177 static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
179 saxattributes *This = impl_from_ISAXAttributes(iface);
180 TRACE("%p\n", This);
181 return InterlockedIncrement(&This->ref);
184 static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
186 saxattributes *This = impl_from_ISAXAttributes(iface);
187 LONG ref;
189 TRACE("%p\n", This);
191 ref = InterlockedDecrement(&This->ref);
192 if (ref==0)
194 HeapFree(GetProcessHeap(), 0, This);
197 return ref;
200 /*** ISAXAttributes methods ***/
201 static HRESULT WINAPI isaxattributes_getLength(
202 ISAXAttributes* iface,
203 int *length)
205 saxattributes *This = impl_from_ISAXAttributes( iface );
207 FIXME("(%p) stub\n", This);
208 return E_NOTIMPL;
211 static HRESULT WINAPI isaxattributes_getURI(
212 ISAXAttributes* iface,
213 int nIndex,
214 const WCHAR **pUrl,
215 int *pUriSize)
217 saxattributes *This = impl_from_ISAXAttributes( iface );
219 FIXME("(%p)->(%d) stub\n", This, nIndex);
220 return E_NOTIMPL;
223 static HRESULT WINAPI isaxattributes_getLocalName(
224 ISAXAttributes* iface,
225 int nIndex,
226 const WCHAR **pLocalName,
227 int *pLocalNameLength)
229 saxattributes *This = impl_from_ISAXAttributes( iface );
231 FIXME("(%p)->(%d) stub\n", This, nIndex);
232 return E_NOTIMPL;
235 static HRESULT WINAPI isaxattributes_getQName(
236 ISAXAttributes* iface,
237 int nIndex,
238 const WCHAR **pQName,
239 int *pQNameLength)
241 saxattributes *This = impl_from_ISAXAttributes( iface );
243 FIXME("(%p)->(%d) stub\n", This, nIndex);
244 return E_NOTIMPL;
247 static HRESULT WINAPI isaxattributes_getName(
248 ISAXAttributes* iface,
249 int nIndex,
250 const WCHAR **pUri,
251 int *pUriLength,
252 const WCHAR **pLocalName,
253 int *pLocalNameSize,
254 const WCHAR **pQName,
255 int *pQNameLength)
257 saxattributes *This = impl_from_ISAXAttributes( iface );
259 FIXME("(%p)->(%d) stub\n", This, nIndex);
260 return E_NOTIMPL;
263 static HRESULT WINAPI isaxattributes_getIndexFromName(
264 ISAXAttributes* iface,
265 const WCHAR *pUri,
266 int cUriLength,
267 const WCHAR *pLocalName,
268 int cocalNameLength,
269 int *index)
271 saxattributes *This = impl_from_ISAXAttributes( iface );
273 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), cUriLength,
274 debugstr_w(pLocalName), cocalNameLength);
275 return E_NOTIMPL;
278 static HRESULT WINAPI isaxattributes_getIndexFromQName(
279 ISAXAttributes* iface,
280 const WCHAR *pQName,
281 int nQNameLength,
282 int *index)
284 saxattributes *This = impl_from_ISAXAttributes( iface );
286 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQNameLength);
287 return E_NOTIMPL;
290 static HRESULT WINAPI isaxattributes_getType(
291 ISAXAttributes* iface,
292 int nIndex,
293 const WCHAR **pType,
294 int *pTypeLength)
296 saxattributes *This = impl_from_ISAXAttributes( iface );
298 FIXME("(%p)->(%d) stub\n", This, nIndex);
299 return E_NOTIMPL;
302 static HRESULT WINAPI isaxattributes_getTypeFromName(
303 ISAXAttributes* iface,
304 const WCHAR *pUri,
305 int nUri,
306 const WCHAR *pLocalName,
307 int nLocalName,
308 const WCHAR **pType,
309 int *nType)
311 saxattributes *This = impl_from_ISAXAttributes( iface );
313 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
314 debugstr_w(pLocalName), nLocalName);
315 return E_NOTIMPL;
318 static HRESULT WINAPI isaxattributes_getTypeFromQName(
319 ISAXAttributes* iface,
320 const WCHAR *pQName,
321 int nQName,
322 const WCHAR **pType,
323 int *nType)
325 saxattributes *This = impl_from_ISAXAttributes( iface );
327 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
328 return E_NOTIMPL;
331 static HRESULT WINAPI isaxattributes_getValue(
332 ISAXAttributes* iface,
333 int nIndex,
334 const WCHAR **pValue,
335 int *nValue)
337 saxattributes *This = impl_from_ISAXAttributes( iface );
339 FIXME("(%p)->(%d) stub\n", This, nIndex);
340 return E_NOTIMPL;
343 static HRESULT WINAPI isaxattributes_getValueFromName(
344 ISAXAttributes* iface,
345 const WCHAR *pUri,
346 int nUri,
347 const WCHAR *pLocalName,
348 int nLocalName,
349 const WCHAR **pValue,
350 int *nValue)
352 saxattributes *This = impl_from_ISAXAttributes( iface );
354 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
355 debugstr_w(pLocalName), nLocalName);
356 return E_NOTIMPL;
359 static HRESULT WINAPI isaxattributes_getValueFromQName(
360 ISAXAttributes* iface,
361 const WCHAR *pQName,
362 int nQName,
363 const WCHAR **pValue,
364 int *nValue)
366 saxattributes *This = impl_from_ISAXAttributes( iface );
368 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
369 return E_NOTIMPL;
372 static const struct ISAXAttributesVtbl isaxattributes_vtbl =
374 isaxattributes_QueryInterface,
375 isaxattributes_AddRef,
376 isaxattributes_Release,
377 isaxattributes_getLength,
378 isaxattributes_getURI,
379 isaxattributes_getLocalName,
380 isaxattributes_getQName,
381 isaxattributes_getName,
382 isaxattributes_getIndexFromName,
383 isaxattributes_getIndexFromQName,
384 isaxattributes_getType,
385 isaxattributes_getTypeFromName,
386 isaxattributes_getTypeFromQName,
387 isaxattributes_getValue,
388 isaxattributes_getValueFromName,
389 isaxattributes_getValueFromQName
392 static HRESULT SAXAttributes_create(IUnknown *pUnkOuter, LPVOID *ppObj)
394 saxattributes *attributes;
396 attributes = HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes));
397 if(!attributes)
398 return E_OUTOFMEMORY;
400 attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
401 attributes->ref = 1;
403 *ppObj = attributes;
405 TRACE("returning %p\n", *ppObj);
407 return S_OK;
410 /*** LibXML callbacks ***/
411 static void libxmlStartDocument(void *ctx)
413 saxlocator *This = ctx;
414 HRESULT hr;
416 if(This->saxreader->contentHandler)
418 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
419 if(hr != S_OK)
420 format_error_message_from_id(This, hr);
423 update_position(This, NULL);
426 static void libxmlEndDocument(void *ctx)
428 saxlocator *This = ctx;
429 HRESULT hr;
431 This->column = 0;
432 This->line = 0;
434 if(This->ret != S_OK) return;
436 if(This->saxreader->contentHandler)
438 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
439 if(hr != S_OK)
440 format_error_message_from_id(This, hr);
444 static void libxmlStartElementNS(
445 void *ctx,
446 const xmlChar *localname,
447 const xmlChar *prefix,
448 const xmlChar *URI,
449 int nb_namespaces,
450 const xmlChar **namespaces,
451 int nb_attributes,
452 int nb_defaulted,
453 const xmlChar **attributes)
455 BSTR NamespaceUri, LocalName, QName;
456 saxlocator *This = ctx;
457 HRESULT hr;
458 ISAXAttributes *attr;
460 FIXME("Arguments processing not yet implemented.\n");
462 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
464 if(This->saxreader->contentHandler)
466 NamespaceUri = bstr_from_xmlChar(URI);
467 LocalName = bstr_from_xmlChar(localname);
468 QName = bstr_from_xmlChar(localname);
470 SAXAttributes_create(NULL, (void*)&attr);
472 hr = ISAXContentHandler_startElement(
473 This->saxreader->contentHandler,
474 NamespaceUri, SysStringLen(NamespaceUri),
475 LocalName, SysStringLen(LocalName),
476 QName, SysStringLen(QName),
477 attr);
479 SysFreeString(NamespaceUri);
480 SysFreeString(LocalName);
481 SysFreeString(QName);
483 ISAXAttributes_Release(attr);
485 if(hr != S_OK)
486 format_error_message_from_id(This, hr);
490 static void libxmlEndElementNS(
491 void *ctx,
492 const xmlChar *localname,
493 const xmlChar *prefix,
494 const xmlChar *URI)
496 BSTR NamespaceUri, LocalName, QName;
497 saxlocator *This = ctx;
498 HRESULT hr;
499 xmlChar *end;
501 end = This->lastCur;
502 while(*end != '<' && *(end+1) != '/') end++;
503 update_position(This, end+2);
505 if(This->saxreader->contentHandler)
507 NamespaceUri = bstr_from_xmlChar(URI);
508 LocalName = bstr_from_xmlChar(localname);
509 QName = bstr_from_xmlChar(localname);
511 hr = ISAXContentHandler_endElement(
512 This->saxreader->contentHandler,
513 NamespaceUri, SysStringLen(NamespaceUri),
514 LocalName, SysStringLen(LocalName),
515 QName, SysStringLen(QName));
517 SysFreeString(NamespaceUri);
518 SysFreeString(LocalName);
519 SysFreeString(QName);
521 if(hr != S_OK)
522 format_error_message_from_id(This, hr);
526 static void libxmlCharacters(
527 void *ctx,
528 const xmlChar *ch,
529 int len)
531 BSTR Chars;
532 saxlocator *This = ctx;
533 HRESULT hr;
534 xmlChar *end;
535 xmlChar *lastCurCopy;
536 xmlChar *chEnd;
537 int columnCopy;
538 int lineCopy;
540 if(*(This->lastCur-1) != '>' && *(This->lastCur-1) != '/') return;
542 if(*(This->lastCur-1) != '>')
544 end = (xmlChar*)This->pParserCtxt->input->cur-len;
545 while(*(end-1) != '>') end--;
546 update_position(This, end);
549 chEnd = This->lastCur+len;
550 while(*chEnd != '<') chEnd++;
552 Chars = bstr_from_xmlChar(ch);
554 lastCurCopy = This->lastCur;
555 columnCopy = This->column;
556 lineCopy = This->line;
557 end = This->lastCur;
559 if(This->saxreader->contentHandler)
561 while(This->lastCur < chEnd)
563 end = This->lastCur;
564 while(end < chEnd-1)
566 if(*end == '\r') break;
567 end++;
570 Chars = bstr_from_xmlChar(This->lastCur);
572 if(*end == '\r' && *(end+1) == '\n')
574 memmove((WCHAR*)Chars+(end-This->lastCur),
575 (WCHAR*)Chars+(end-This->lastCur)+1,
576 (SysStringLen(Chars)-(end-This->lastCur))*sizeof(WCHAR));
577 SysReAllocStringLen(&Chars, Chars, SysStringLen(Chars)-1);
579 else if(*end == '\r') Chars[end-This->lastCur] = '\n';
581 hr = ISAXContentHandler_characters(This->saxreader->contentHandler, Chars, end-This->lastCur+1);
582 SysFreeString(Chars);
583 if(hr != S_OK)
585 format_error_message_from_id(This, hr);
586 return;
589 if(*(end+1) == '\n') end++;
590 if(end < chEnd) end++;
592 This->column += end-This->lastCur;
593 This->lastCur = end;
596 This->lastCur = lastCurCopy;
597 This->column = columnCopy;
598 This->line = lineCopy;
599 update_position(This, chEnd);
603 static void libxmlSetDocumentLocator(
604 void *ctx,
605 xmlSAXLocatorPtr loc)
607 saxlocator *This = ctx;
608 HRESULT hr;
610 hr = ISAXContentHandler_putDocumentLocator(This->saxreader->contentHandler,
611 (ISAXLocator*)&This->lpSAXLocatorVtbl);
613 if(FAILED(hr))
614 format_error_message_from_id(This, hr);
617 void libxmlFatalError(void *ctx, const char *msg, ...)
619 saxlocator *This = ctx;
620 char message[1024];
621 WCHAR *wszError;
622 DWORD len;
623 va_list args;
625 if(!This->saxreader->errorHandler)
627 xmlStopParser(This->pParserCtxt);
628 This->ret = E_FAIL;
629 return;
632 FIXME("Error handling is not compatible.\n");
634 va_start(args, msg);
635 vsprintf(message, msg, args);
636 va_end(args);
638 len = MultiByteToWideChar(CP_ACP, 0, message, -1, NULL, 0);
639 wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
640 MultiByteToWideChar(CP_ACP, 0, message, -1, (LPWSTR)wszError, len);
642 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
643 (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
645 HeapFree(GetProcessHeap(), 0, wszError);
647 xmlStopParser(This->pParserCtxt);
648 This->ret = E_FAIL;
651 /*** ISAXLocator interface ***/
652 /*** IUnknown methods ***/
653 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
655 saxlocator *This = impl_from_ISAXLocator( iface );
657 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
659 *ppvObject = NULL;
661 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
662 IsEqualGUID( riid, &IID_ISAXLocator ))
664 *ppvObject = iface;
666 else
668 FIXME("interface %s not implemented\n", debugstr_guid(riid));
669 return E_NOINTERFACE;
672 ISAXLocator_AddRef( iface );
674 return S_OK;
677 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
679 saxlocator *This = impl_from_ISAXLocator( iface );
680 TRACE("%p\n", This );
681 return InterlockedIncrement( &This->ref );
684 static ULONG WINAPI isaxlocator_Release(
685 ISAXLocator* iface)
687 saxlocator *This = impl_from_ISAXLocator( iface );
688 LONG ref;
690 TRACE("%p\n", This );
692 ref = InterlockedDecrement( &This->ref );
693 if ( ref == 0 )
695 if(This->publicId)
696 SysFreeString(This->publicId);
697 if(This->systemId)
698 SysFreeString(This->systemId);
700 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
701 HeapFree( GetProcessHeap(), 0, This );
704 return ref;
707 /*** ISAXLocator methods ***/
708 static HRESULT WINAPI isaxlocator_getColumnNumber(
709 ISAXLocator* iface,
710 int *pnColumn)
712 saxlocator *This = impl_from_ISAXLocator( iface );
714 *pnColumn = This->column;
715 return S_OK;
718 static HRESULT WINAPI isaxlocator_getLineNumber(
719 ISAXLocator* iface,
720 int *pnLine)
722 saxlocator *This = impl_from_ISAXLocator( iface );
724 *pnLine = This->line;
725 return S_OK;
728 static HRESULT WINAPI isaxlocator_getPublicId(
729 ISAXLocator* iface,
730 const WCHAR ** ppwchPublicId)
732 BSTR publicId;
733 saxlocator *This = impl_from_ISAXLocator( iface );
735 if(This->publicId) SysFreeString(This->publicId);
737 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
738 if(SysStringLen(publicId))
739 This->publicId = (WCHAR*)&publicId;
740 else
742 SysFreeString(publicId);
743 This->publicId = NULL;
746 *ppwchPublicId = This->publicId;
747 return S_OK;
750 static HRESULT WINAPI isaxlocator_getSystemId(
751 ISAXLocator* iface,
752 const WCHAR ** ppwchSystemId)
754 BSTR systemId;
755 saxlocator *This = impl_from_ISAXLocator( iface );
757 if(This->systemId) SysFreeString(This->systemId);
759 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
760 if(SysStringLen(systemId))
761 This->systemId = (WCHAR*)&systemId;
762 else
764 SysFreeString(systemId);
765 This->systemId = NULL;
768 *ppwchSystemId = This->systemId;
769 return S_OK;
772 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
774 isaxlocator_QueryInterface,
775 isaxlocator_AddRef,
776 isaxlocator_Release,
777 isaxlocator_getColumnNumber,
778 isaxlocator_getLineNumber,
779 isaxlocator_getPublicId,
780 isaxlocator_getSystemId
783 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator)
785 saxlocator *locator;
787 locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) );
788 if( !locator )
789 return E_OUTOFMEMORY;
791 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
792 locator->ref = 1;
794 locator->saxreader = reader;
795 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
797 locator->pParserCtxt = NULL;
798 locator->publicId = NULL;
799 locator->systemId = NULL;
800 locator->lastCur = NULL;
801 locator->line = 0;
802 locator->column = 0;
803 locator->ret = S_OK;
805 *ppsaxlocator = locator;
807 TRACE("returning %p\n", *ppsaxlocator);
809 return S_OK;
812 /*** IVBSAXXMLReader interface ***/
813 /*** IUnknown methods ***/
814 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
816 saxreader *This = impl_from_IVBSAXXMLReader( iface );
818 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
820 *ppvObject = NULL;
822 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
823 IsEqualGUID( riid, &IID_IDispatch ) ||
824 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
826 *ppvObject = iface;
828 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
830 *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
832 else
834 FIXME("interface %s not implemented\n", debugstr_guid(riid));
835 return E_NOINTERFACE;
838 IVBSAXXMLReader_AddRef( iface );
840 return S_OK;
843 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
845 saxreader *This = impl_from_IVBSAXXMLReader( iface );
846 TRACE("%p\n", This );
847 return InterlockedIncrement( &This->ref );
850 static ULONG WINAPI saxxmlreader_Release(
851 IVBSAXXMLReader* iface)
853 saxreader *This = impl_from_IVBSAXXMLReader( iface );
854 LONG ref;
856 TRACE("%p\n", This );
858 ref = InterlockedDecrement( &This->ref );
859 if ( ref == 0 )
861 if(This->contentHandler)
862 ISAXContentHandler_Release(This->contentHandler);
864 if(This->errorHandler)
865 ISAXErrorHandler_Release(This->errorHandler);
867 HeapFree( GetProcessHeap(), 0, This );
870 return ref;
872 /*** IDispatch ***/
873 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
875 saxreader *This = impl_from_IVBSAXXMLReader( iface );
877 TRACE("(%p)->(%p)\n", This, pctinfo);
879 *pctinfo = 1;
881 return S_OK;
884 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
885 IVBSAXXMLReader *iface,
886 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
888 saxreader *This = impl_from_IVBSAXXMLReader( iface );
889 HRESULT hr;
891 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
893 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
895 return hr;
898 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
899 IVBSAXXMLReader *iface,
900 REFIID riid,
901 LPOLESTR* rgszNames,
902 UINT cNames,
903 LCID lcid,
904 DISPID* rgDispId)
906 saxreader *This = impl_from_IVBSAXXMLReader( iface );
907 ITypeInfo *typeinfo;
908 HRESULT hr;
910 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
911 lcid, rgDispId);
913 if(!rgszNames || cNames == 0 || !rgDispId)
914 return E_INVALIDARG;
916 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
917 if(SUCCEEDED(hr))
919 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
920 ITypeInfo_Release(typeinfo);
923 return hr;
926 static HRESULT WINAPI saxxmlreader_Invoke(
927 IVBSAXXMLReader *iface,
928 DISPID dispIdMember,
929 REFIID riid,
930 LCID lcid,
931 WORD wFlags,
932 DISPPARAMS* pDispParams,
933 VARIANT* pVarResult,
934 EXCEPINFO* pExcepInfo,
935 UINT* puArgErr)
937 saxreader *This = impl_from_IVBSAXXMLReader( iface );
938 ITypeInfo *typeinfo;
939 HRESULT hr;
941 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
942 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
944 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
945 if(SUCCEEDED(hr))
947 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
948 pVarResult, pExcepInfo, puArgErr);
949 ITypeInfo_Release(typeinfo);
952 return hr;
955 /*** IVBSAXXMLReader methods ***/
956 static HRESULT WINAPI saxxmlreader_getFeature(
957 IVBSAXXMLReader* iface,
958 const WCHAR *pFeature,
959 VARIANT_BOOL *pValue)
961 saxreader *This = impl_from_IVBSAXXMLReader( iface );
963 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
964 return E_NOTIMPL;
967 static HRESULT WINAPI saxxmlreader_putFeature(
968 IVBSAXXMLReader* iface,
969 const WCHAR *pFeature,
970 VARIANT_BOOL vfValue)
972 saxreader *This = impl_from_IVBSAXXMLReader( iface );
974 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
975 return E_NOTIMPL;
978 static HRESULT WINAPI saxxmlreader_getProperty(
979 IVBSAXXMLReader* iface,
980 const WCHAR *pProp,
981 VARIANT *pValue)
983 saxreader *This = impl_from_IVBSAXXMLReader( iface );
985 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
986 return E_NOTIMPL;
989 static HRESULT WINAPI saxxmlreader_putProperty(
990 IVBSAXXMLReader* iface,
991 const WCHAR *pProp,
992 VARIANT value)
994 saxreader *This = impl_from_IVBSAXXMLReader( iface );
996 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
997 return E_NOTIMPL;
1000 static HRESULT WINAPI saxxmlreader_getEntityResolver(
1001 IVBSAXXMLReader* iface,
1002 IVBSAXEntityResolver **pEntityResolver)
1004 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1006 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1007 return E_NOTIMPL;
1010 static HRESULT WINAPI saxxmlreader_putEntityResolver(
1011 IVBSAXXMLReader* iface,
1012 IVBSAXEntityResolver *pEntityResolver)
1014 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1016 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1017 return E_NOTIMPL;
1020 static HRESULT WINAPI saxxmlreader_getContentHandler(
1021 IVBSAXXMLReader* iface,
1022 IVBSAXContentHandler **ppContentHandler)
1024 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1026 FIXME("(%p)->(%p) stub\n", This, ppContentHandler);
1027 return E_NOTIMPL;
1030 static HRESULT WINAPI saxxmlreader_putContentHandler(
1031 IVBSAXXMLReader* iface,
1032 IVBSAXContentHandler *contentHandler)
1034 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1036 FIXME("(%p)->(%p) stub\n", This, contentHandler);
1037 return E_NOTIMPL;
1040 static HRESULT WINAPI saxxmlreader_getDTDHandler(
1041 IVBSAXXMLReader* iface,
1042 IVBSAXDTDHandler **pDTDHandler)
1044 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1046 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1047 return E_NOTIMPL;
1050 static HRESULT WINAPI saxxmlreader_putDTDHandler(
1051 IVBSAXXMLReader* iface,
1052 IVBSAXDTDHandler *pDTDHandler)
1054 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1056 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1057 return E_NOTIMPL;
1060 static HRESULT WINAPI saxxmlreader_getErrorHandler(
1061 IVBSAXXMLReader* iface,
1062 IVBSAXErrorHandler **pErrorHandler)
1064 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1066 FIXME("(%p)->(%p) stub\n", This, pErrorHandler);
1067 return E_NOTIMPL;
1070 static HRESULT WINAPI saxxmlreader_putErrorHandler(
1071 IVBSAXXMLReader* iface,
1072 IVBSAXErrorHandler *errorHandler)
1074 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1076 FIXME("(%p)->(%p) stub\n", This, errorHandler);
1077 return E_NOTIMPL;
1080 static HRESULT WINAPI saxxmlreader_getBaseURL(
1081 IVBSAXXMLReader* iface,
1082 const WCHAR **pBaseUrl)
1084 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1086 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
1087 return E_NOTIMPL;
1090 static HRESULT WINAPI saxxmlreader_putBaseURL(
1091 IVBSAXXMLReader* iface,
1092 const WCHAR *pBaseUrl)
1094 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1096 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
1097 return E_NOTIMPL;
1100 static HRESULT WINAPI saxxmlreader_getSecureBaseURL(
1101 IVBSAXXMLReader* iface,
1102 const WCHAR **pSecureBaseUrl)
1104 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1106 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
1107 return E_NOTIMPL;
1111 static HRESULT WINAPI saxxmlreader_putSecureBaseURL(
1112 IVBSAXXMLReader* iface,
1113 const WCHAR *secureBaseUrl)
1115 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1117 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
1118 return E_NOTIMPL;
1121 static HRESULT WINAPI saxxmlreader_parse(
1122 IVBSAXXMLReader* iface,
1123 VARIANT varInput)
1125 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1127 FIXME("(%p) stub\n", This);
1128 return E_NOTIMPL;
1131 static HRESULT WINAPI saxxmlreader_parseURL(
1132 IVBSAXXMLReader* iface,
1133 const WCHAR *url)
1135 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1137 FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
1138 return E_NOTIMPL;
1141 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
1143 saxxmlreader_QueryInterface,
1144 saxxmlreader_AddRef,
1145 saxxmlreader_Release,
1146 saxxmlreader_GetTypeInfoCount,
1147 saxxmlreader_GetTypeInfo,
1148 saxxmlreader_GetIDsOfNames,
1149 saxxmlreader_Invoke,
1150 saxxmlreader_getFeature,
1151 saxxmlreader_putFeature,
1152 saxxmlreader_getProperty,
1153 saxxmlreader_putProperty,
1154 saxxmlreader_getEntityResolver,
1155 saxxmlreader_putEntityResolver,
1156 saxxmlreader_getContentHandler,
1157 saxxmlreader_putContentHandler,
1158 saxxmlreader_getDTDHandler,
1159 saxxmlreader_putDTDHandler,
1160 saxxmlreader_getErrorHandler,
1161 saxxmlreader_putErrorHandler,
1162 saxxmlreader_getBaseURL,
1163 saxxmlreader_putBaseURL,
1164 saxxmlreader_getSecureBaseURL,
1165 saxxmlreader_putSecureBaseURL,
1166 saxxmlreader_parse,
1167 saxxmlreader_parseURL
1170 /*** ISAXXMLReader interface ***/
1171 /*** IUnknown methods ***/
1172 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
1174 saxreader *This = impl_from_ISAXXMLReader( iface );
1175 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVtbl, riid, ppvObject);
1178 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
1180 saxreader *This = impl_from_ISAXXMLReader( iface );
1181 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVtbl);
1184 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
1186 saxreader *This = impl_from_ISAXXMLReader( iface );
1187 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVtbl);
1190 /*** ISAXXMLReader methods ***/
1191 static HRESULT WINAPI isaxxmlreader_getFeature(
1192 ISAXXMLReader* iface,
1193 const WCHAR *pFeature,
1194 VARIANT_BOOL *pValue)
1196 saxreader *This = impl_from_ISAXXMLReader( iface );
1198 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
1199 return E_NOTIMPL;
1202 static HRESULT WINAPI isaxxmlreader_putFeature(
1203 ISAXXMLReader* iface,
1204 const WCHAR *pFeature,
1205 VARIANT_BOOL vfValue)
1207 saxreader *This = impl_from_ISAXXMLReader( iface );
1209 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
1210 return E_NOTIMPL;
1213 static HRESULT WINAPI isaxxmlreader_getProperty(
1214 ISAXXMLReader* iface,
1215 const WCHAR *pProp,
1216 VARIANT *pValue)
1218 saxreader *This = impl_from_ISAXXMLReader( iface );
1220 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
1221 return E_NOTIMPL;
1224 static HRESULT WINAPI isaxxmlreader_putProperty(
1225 ISAXXMLReader* iface,
1226 const WCHAR *pProp,
1227 VARIANT value)
1229 saxreader *This = impl_from_ISAXXMLReader( iface );
1231 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
1232 return E_NOTIMPL;
1235 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
1236 ISAXXMLReader* iface,
1237 ISAXEntityResolver **ppEntityResolver)
1239 saxreader *This = impl_from_ISAXXMLReader( iface );
1241 FIXME("(%p)->(%p) stub\n", This, ppEntityResolver);
1242 return E_NOTIMPL;
1245 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
1246 ISAXXMLReader* iface,
1247 ISAXEntityResolver *pEntityResolver)
1249 saxreader *This = impl_from_ISAXXMLReader( iface );
1251 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1252 return E_NOTIMPL;
1255 static HRESULT WINAPI isaxxmlreader_getContentHandler(
1256 ISAXXMLReader* iface,
1257 ISAXContentHandler **pContentHandler)
1259 saxreader *This = impl_from_ISAXXMLReader( iface );
1261 TRACE("(%p)->(%p)\n", This, pContentHandler);
1262 if(pContentHandler == NULL)
1263 return E_POINTER;
1264 if(This->contentHandler)
1265 ISAXContentHandler_AddRef(This->contentHandler);
1266 *pContentHandler = This->contentHandler;
1268 return S_OK;
1271 static HRESULT WINAPI isaxxmlreader_putContentHandler(
1272 ISAXXMLReader* iface,
1273 ISAXContentHandler *contentHandler)
1275 saxreader *This = impl_from_ISAXXMLReader( iface );
1277 TRACE("(%p)->(%p)\n", This, contentHandler);
1278 if(contentHandler)
1279 ISAXContentHandler_AddRef(contentHandler);
1280 if(This->contentHandler)
1281 ISAXContentHandler_Release(This->contentHandler);
1282 This->contentHandler = contentHandler;
1284 return S_OK;
1287 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
1288 ISAXXMLReader* iface,
1289 ISAXDTDHandler **pDTDHandler)
1291 saxreader *This = impl_from_ISAXXMLReader( iface );
1293 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1294 return E_NOTIMPL;
1297 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
1298 ISAXXMLReader* iface,
1299 ISAXDTDHandler *pDTDHandler)
1301 saxreader *This = impl_from_ISAXXMLReader( iface );
1303 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1304 return E_NOTIMPL;
1307 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
1308 ISAXXMLReader* iface,
1309 ISAXErrorHandler **pErrorHandler)
1311 saxreader *This = impl_from_ISAXXMLReader( iface );
1313 TRACE("(%p)->(%p)\n", This, pErrorHandler);
1314 if(pErrorHandler == NULL)
1315 return E_POINTER;
1316 if(This->errorHandler)
1317 ISAXErrorHandler_AddRef(This->errorHandler);
1318 *pErrorHandler = This->errorHandler;
1320 return S_OK;
1323 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
1324 ISAXXMLReader* iface,
1325 ISAXErrorHandler *errorHandler)
1327 saxreader *This = impl_from_ISAXXMLReader( iface );
1329 TRACE("(%p)->(%p)\n", This, errorHandler);
1330 if(errorHandler)
1331 ISAXErrorHandler_AddRef(errorHandler);
1332 if(This->errorHandler)
1333 ISAXErrorHandler_Release(This->errorHandler);
1334 This->errorHandler = errorHandler;
1336 return S_OK;
1339 static HRESULT WINAPI isaxxmlreader_getBaseURL(
1340 ISAXXMLReader* iface,
1341 const WCHAR **pBaseUrl)
1343 saxreader *This = impl_from_ISAXXMLReader( iface );
1345 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
1346 return E_NOTIMPL;
1349 static HRESULT WINAPI isaxxmlreader_putBaseURL(
1350 ISAXXMLReader* iface,
1351 const WCHAR *pBaseUrl)
1353 saxreader *This = impl_from_ISAXXMLReader( iface );
1355 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
1356 return E_NOTIMPL;
1359 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
1360 ISAXXMLReader* iface,
1361 const WCHAR **pSecureBaseUrl)
1363 saxreader *This = impl_from_ISAXXMLReader( iface );
1365 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
1366 return E_NOTIMPL;
1369 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
1370 ISAXXMLReader* iface,
1371 const WCHAR *secureBaseUrl)
1373 saxreader *This = impl_from_ISAXXMLReader( iface );
1375 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
1376 return E_NOTIMPL;
1379 static HRESULT parse_buffer(saxreader *This, xmlChar *buffer)
1381 saxlocator *locator;
1382 HRESULT hr;
1384 hr = SAXLocator_create(This, &locator);
1385 if(FAILED(hr))
1386 return E_FAIL;
1388 locator->pParserCtxt = xmlNewParserCtxt();
1389 if(!locator->pParserCtxt)
1391 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1392 return E_FAIL;
1395 locator->pParserCtxt->sax = &locator->saxreader->sax;
1396 locator->pParserCtxt->userData = locator;
1398 xmlSetupParserForBuffer(locator->pParserCtxt, buffer, NULL);
1400 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1401 else hr = locator->ret;
1403 if(locator->pParserCtxt)
1405 locator->pParserCtxt->sax = NULL;
1406 xmlFreeParserCtxt(locator->pParserCtxt);
1407 locator->pParserCtxt = NULL;
1410 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1411 return S_OK;
1414 static HRESULT WINAPI isaxxmlreader_parse(
1415 ISAXXMLReader* iface,
1416 VARIANT varInput)
1418 saxreader *This = impl_from_ISAXXMLReader( iface );
1419 xmlChar *data = NULL;
1420 HRESULT hr;
1422 TRACE("(%p)\n", This);
1424 hr = S_OK;
1425 switch(V_VT(&varInput))
1427 case VT_BSTR:
1428 data = xmlChar_from_wchar(V_BSTR(&varInput));
1429 hr = parse_buffer(This, data);
1430 break;
1431 case VT_ARRAY|VT_UI1: {
1432 void *pSAData;
1433 LONG lBound, uBound;
1434 ULONG dataRead;
1436 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
1437 if(hr != S_OK) break;
1438 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
1439 if(hr != S_OK) break;
1440 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
1441 data = HeapAlloc(GetProcessHeap(), 0, dataRead+1);
1442 if(!data) break;
1443 hr = SafeArrayAccessData(V_ARRAY(&varInput), (void**)&pSAData);
1444 if(hr != S_OK) break;
1445 memcpy(data, pSAData, dataRead);
1446 data[dataRead] = '\0';
1447 hr = parse_buffer(This, data);
1448 SafeArrayUnaccessData(V_ARRAY(&varInput));
1449 break;
1451 case VT_UNKNOWN:
1452 case VT_DISPATCH: {
1453 IPersistStream *persistStream;
1454 IStream *stream = NULL;
1455 IXMLDOMDocument *xmlDoc;
1457 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1458 &IID_IPersistStream, (void**)&persistStream) == S_OK)
1460 hr = IPersistStream_Save(persistStream, stream, TRUE);
1461 IPersistStream_Release(persistStream);
1462 if(hr != S_OK) break;
1464 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1465 &IID_IStream, (void**)&stream) == S_OK)
1467 STATSTG dataInfo;
1468 ULONG dataRead;
1470 while(1)
1472 hr = IStream_Stat(stream, &dataInfo, STATFLAG_NONAME);
1473 if(hr == E_PENDING) continue;
1474 break;
1476 data = HeapAlloc(GetProcessHeap(), 0,
1477 dataInfo.cbSize.QuadPart+1);
1478 while(1)
1480 hr = IStream_Read(stream, data,
1481 dataInfo.cbSize.QuadPart, &dataRead);
1482 if(hr == E_PENDING) continue;
1483 break;
1485 data[dataInfo.cbSize.QuadPart] = '\0';
1486 hr = parse_buffer(This, data);
1487 IStream_Release(stream);
1488 break;
1490 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1491 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
1493 BSTR bstrData;
1495 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
1496 data = xmlChar_from_wchar(bstrData);
1497 hr = parse_buffer(This, data);
1498 IXMLDOMDocument_Release(xmlDoc);
1499 hr = E_NOTIMPL;
1500 break;
1503 default:
1504 WARN("vt %d not implemented\n", V_VT(&varInput));
1505 hr = E_INVALIDARG;
1508 HeapFree(GetProcessHeap(), 0, data);
1509 return hr;
1512 static HRESULT saxreader_onDataAvailable(void *obj, char *ptr, DWORD len)
1514 saxreader *This = obj;
1515 xmlChar *data;
1516 HRESULT hr;
1518 data = HeapAlloc(GetProcessHeap(), 0, len+1);
1519 memcpy(data, ptr, len);
1520 data[len] = 0;
1522 hr = parse_buffer(This, data);
1524 HeapFree(GetProcessHeap(), 0, data);
1525 return hr;
1528 static HRESULT WINAPI isaxxmlreader_parseURL(
1529 ISAXXMLReader* iface,
1530 const WCHAR *url)
1532 saxreader *This = impl_from_ISAXXMLReader( iface );
1533 bsc_t *bsc;
1534 HRESULT hr;
1536 TRACE("(%p)->(%s) stub\n", This, debugstr_w(url));
1538 hr = bind_url(url, saxreader_onDataAvailable, This, &bsc);
1539 if(FAILED(hr))
1540 return hr;
1542 detach_bsc(bsc);
1544 return S_OK;
1547 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
1549 isaxxmlreader_QueryInterface,
1550 isaxxmlreader_AddRef,
1551 isaxxmlreader_Release,
1552 isaxxmlreader_getFeature,
1553 isaxxmlreader_putFeature,
1554 isaxxmlreader_getProperty,
1555 isaxxmlreader_putProperty,
1556 isaxxmlreader_getEntityResolver,
1557 isaxxmlreader_putEntityResolver,
1558 isaxxmlreader_getContentHandler,
1559 isaxxmlreader_putContentHandler,
1560 isaxxmlreader_getDTDHandler,
1561 isaxxmlreader_putDTDHandler,
1562 isaxxmlreader_getErrorHandler,
1563 isaxxmlreader_putErrorHandler,
1564 isaxxmlreader_getBaseURL,
1565 isaxxmlreader_putBaseURL,
1566 isaxxmlreader_getSecureBaseURL,
1567 isaxxmlreader_putSecureBaseURL,
1568 isaxxmlreader_parse,
1569 isaxxmlreader_parseURL
1572 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1574 saxreader *reader;
1576 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
1578 reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) );
1579 if( !reader )
1580 return E_OUTOFMEMORY;
1582 reader->lpVtbl = &saxreader_vtbl;
1583 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
1584 reader->ref = 1;
1585 reader->contentHandler = NULL;
1586 reader->errorHandler = NULL;
1588 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
1589 reader->sax.initialized = XML_SAX2_MAGIC;
1590 reader->sax.startDocument = libxmlStartDocument;
1591 reader->sax.endDocument = libxmlEndDocument;
1592 reader->sax.startElementNs = libxmlStartElementNS;
1593 reader->sax.endElementNs = libxmlEndElementNS;
1594 reader->sax.characters = libxmlCharacters;
1595 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
1596 reader->sax.error = libxmlFatalError;
1597 reader->sax.fatalError = libxmlFatalError;
1599 *ppObj = &reader->lpVtbl;
1601 TRACE("returning iface %p\n", *ppObj);
1603 return S_OK;
1606 #else
1608 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1610 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1611 "libxml2 support was not present at compile time.\n");
1612 return E_NOTIMPL;
1615 #endif