msxml3: Added ISAXAttributes_getLocalName implementation.
[wine/gsoc_dplay.git] / dlls / msxml3 / saxreader.c
blobe57bf6c95c51c4fdf9a458c6971b506a4826e09f
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 int nb_attributes;
77 BSTR *szLocalname;
78 BSTR *szPrefix;
79 BSTR *szURI;
80 BSTR *szValue;
81 } saxattributes;
83 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
85 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpVtbl));
88 static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
90 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpSAXXMLReaderVtbl));
93 static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
95 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl));
98 static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface )
100 return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpSAXAttributesVtbl));
104 BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
106 DWORD dLen;
107 LPWSTR str;
108 BSTR bstr;
110 if (!buf)
111 return NULL;
113 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0);
114 if(len != -1) dLen++;
115 str = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, dLen * sizeof (WCHAR));
116 if (!str)
117 return NULL;
118 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, str, dLen);
119 if(len != -1) str[dLen-1] = '\0';
120 bstr = SysAllocString(str);
121 HeapFree(GetProcessHeap(), 0, str);
123 return bstr;
126 static void format_error_message_from_id(saxlocator *This, HRESULT hr)
128 xmlStopParser(This->pParserCtxt);
129 This->ret = hr;
131 if(This->saxreader->errorHandler)
133 WCHAR msg[1024];
134 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
135 NULL, hr, 0, msg, sizeof(msg), NULL))
137 FIXME("MSXML errors not yet supported.\n");
138 msg[0] = '\0';
141 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
142 (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
146 static void update_position(saxlocator *This, xmlChar *end)
148 if(This->lastCur == NULL)
150 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
151 This->line = 1;
152 This->column = 1;
155 if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
157 while(This->lastCur < end)
159 if(*(This->lastCur) == '\n')
161 This->line++;
162 This->column = 1;
164 else if(*(This->lastCur) == '\r' && (This->lastCur==This->pParserCtxt->input->end || *(This->lastCur+1)!='\n'))
166 This->line++;
167 This->column = 1;
169 else This->column++;
171 This->lastCur++;
175 /*** ISAXAttributes interface ***/
176 /*** IUnknown methods ***/
177 static HRESULT WINAPI isaxattributes_QueryInterface(
178 ISAXAttributes* iface,
179 REFIID riid,
180 void **ppvObject)
182 saxattributes *This = impl_from_ISAXAttributes(iface);
184 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
186 *ppvObject = NULL;
188 if (IsEqualGUID(riid, &IID_IUnknown) ||
189 IsEqualGUID(riid, &IID_ISAXAttributes))
191 *ppvObject = iface;
193 else
195 FIXME("interface %s not implemented\n", debugstr_guid(riid));
196 return E_NOINTERFACE;
199 ISAXAttributes_AddRef(iface);
201 return S_OK;
204 static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
206 saxattributes *This = impl_from_ISAXAttributes(iface);
207 TRACE("%p\n", This);
208 return InterlockedIncrement(&This->ref);
211 static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
213 saxattributes *This = impl_from_ISAXAttributes(iface);
214 LONG ref;
216 TRACE("%p\n", This);
218 ref = InterlockedDecrement(&This->ref);
219 if (ref==0)
221 int index;
222 for(index=0; index<This->nb_attributes; index++)
224 SysFreeString(This->szLocalname[index]);
225 SysFreeString(This->szPrefix[index]);
226 SysFreeString(This->szURI[index]);
227 SysFreeString(This->szValue[index]);
230 HeapFree(GetProcessHeap(), 0, This->szLocalname);
231 HeapFree(GetProcessHeap(), 0, This->szPrefix);
232 HeapFree(GetProcessHeap(), 0, This->szURI);
233 HeapFree(GetProcessHeap(), 0, This->szValue);
235 HeapFree(GetProcessHeap(), 0, This);
238 return ref;
241 /*** ISAXAttributes methods ***/
242 static HRESULT WINAPI isaxattributes_getLength(
243 ISAXAttributes* iface,
244 int *length)
246 saxattributes *This = impl_from_ISAXAttributes( iface );
248 *length = This->nb_attributes;
249 TRACE("Length set to %d\n", *length);
250 return S_OK;
253 static HRESULT WINAPI isaxattributes_getURI(
254 ISAXAttributes* iface,
255 int nIndex,
256 const WCHAR **pUrl,
257 int *pUriSize)
259 saxattributes *This = impl_from_ISAXAttributes( iface );
261 FIXME("(%p)->(%d) stub\n", This, nIndex);
262 return E_NOTIMPL;
265 static HRESULT WINAPI isaxattributes_getLocalName(
266 ISAXAttributes* iface,
267 int nIndex,
268 const WCHAR **pLocalName,
269 int *pLocalNameLength)
271 saxattributes *This = impl_from_ISAXAttributes( iface );
272 TRACE("(%p)->(%d)\n", This, nIndex);
274 if(nIndex >= This->nb_attributes) return E_INVALIDARG;
276 *pLocalNameLength = SysStringLen(This->szLocalname[nIndex]);
277 *pLocalName = This->szLocalname[nIndex];
279 return S_OK;
282 static HRESULT WINAPI isaxattributes_getQName(
283 ISAXAttributes* iface,
284 int nIndex,
285 const WCHAR **pQName,
286 int *pQNameLength)
288 saxattributes *This = impl_from_ISAXAttributes( iface );
290 FIXME("(%p)->(%d) stub\n", This, nIndex);
291 return E_NOTIMPL;
294 static HRESULT WINAPI isaxattributes_getName(
295 ISAXAttributes* iface,
296 int nIndex,
297 const WCHAR **pUri,
298 int *pUriLength,
299 const WCHAR **pLocalName,
300 int *pLocalNameSize,
301 const WCHAR **pQName,
302 int *pQNameLength)
304 saxattributes *This = impl_from_ISAXAttributes( iface );
306 FIXME("(%p)->(%d) stub\n", This, nIndex);
307 return E_NOTIMPL;
310 static HRESULT WINAPI isaxattributes_getIndexFromName(
311 ISAXAttributes* iface,
312 const WCHAR *pUri,
313 int cUriLength,
314 const WCHAR *pLocalName,
315 int cocalNameLength,
316 int *index)
318 saxattributes *This = impl_from_ISAXAttributes( iface );
320 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), cUriLength,
321 debugstr_w(pLocalName), cocalNameLength);
322 return E_NOTIMPL;
325 static HRESULT WINAPI isaxattributes_getIndexFromQName(
326 ISAXAttributes* iface,
327 const WCHAR *pQName,
328 int nQNameLength,
329 int *index)
331 saxattributes *This = impl_from_ISAXAttributes( iface );
333 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQNameLength);
334 return E_NOTIMPL;
337 static HRESULT WINAPI isaxattributes_getType(
338 ISAXAttributes* iface,
339 int nIndex,
340 const WCHAR **pType,
341 int *pTypeLength)
343 saxattributes *This = impl_from_ISAXAttributes( iface );
345 FIXME("(%p)->(%d) stub\n", This, nIndex);
346 return E_NOTIMPL;
349 static HRESULT WINAPI isaxattributes_getTypeFromName(
350 ISAXAttributes* iface,
351 const WCHAR *pUri,
352 int nUri,
353 const WCHAR *pLocalName,
354 int nLocalName,
355 const WCHAR **pType,
356 int *nType)
358 saxattributes *This = impl_from_ISAXAttributes( iface );
360 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
361 debugstr_w(pLocalName), nLocalName);
362 return E_NOTIMPL;
365 static HRESULT WINAPI isaxattributes_getTypeFromQName(
366 ISAXAttributes* iface,
367 const WCHAR *pQName,
368 int nQName,
369 const WCHAR **pType,
370 int *nType)
372 saxattributes *This = impl_from_ISAXAttributes( iface );
374 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
375 return E_NOTIMPL;
378 static HRESULT WINAPI isaxattributes_getValue(
379 ISAXAttributes* iface,
380 int nIndex,
381 const WCHAR **pValue,
382 int *nValue)
384 saxattributes *This = impl_from_ISAXAttributes( iface );
386 FIXME("(%p)->(%d) stub\n", This, nIndex);
387 return E_NOTIMPL;
390 static HRESULT WINAPI isaxattributes_getValueFromName(
391 ISAXAttributes* iface,
392 const WCHAR *pUri,
393 int nUri,
394 const WCHAR *pLocalName,
395 int nLocalName,
396 const WCHAR **pValue,
397 int *nValue)
399 saxattributes *This = impl_from_ISAXAttributes( iface );
401 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
402 debugstr_w(pLocalName), nLocalName);
403 return E_NOTIMPL;
406 static HRESULT WINAPI isaxattributes_getValueFromQName(
407 ISAXAttributes* iface,
408 const WCHAR *pQName,
409 int nQName,
410 const WCHAR **pValue,
411 int *nValue)
413 saxattributes *This = impl_from_ISAXAttributes( iface );
415 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
416 return E_NOTIMPL;
419 static const struct ISAXAttributesVtbl isaxattributes_vtbl =
421 isaxattributes_QueryInterface,
422 isaxattributes_AddRef,
423 isaxattributes_Release,
424 isaxattributes_getLength,
425 isaxattributes_getURI,
426 isaxattributes_getLocalName,
427 isaxattributes_getQName,
428 isaxattributes_getName,
429 isaxattributes_getIndexFromName,
430 isaxattributes_getIndexFromQName,
431 isaxattributes_getType,
432 isaxattributes_getTypeFromName,
433 isaxattributes_getTypeFromQName,
434 isaxattributes_getValue,
435 isaxattributes_getValueFromName,
436 isaxattributes_getValueFromQName
439 static HRESULT SAXAttributes_create(saxattributes **attr,
440 int nb_attributes, const xmlChar **xmlAttributes)
442 saxattributes *attributes;
443 int index;
445 attributes = HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes));
446 if(!attributes)
447 return E_OUTOFMEMORY;
449 attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
450 attributes->ref = 1;
452 attributes->nb_attributes = nb_attributes;
454 attributes->szLocalname =
455 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
456 attributes->szPrefix =
457 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
458 attributes->szURI =
459 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
460 attributes->szValue =
461 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*nb_attributes);
463 if(!attributes->szLocalname || !attributes->szPrefix
464 || !attributes->szURI || !attributes->szValue)
466 if(attributes->szLocalname)
467 HeapFree(GetProcessHeap(), 0, attributes->szLocalname);
468 if(attributes->szPrefix)
469 HeapFree(GetProcessHeap(), 0, attributes->szPrefix);
470 if(attributes->szURI)
471 HeapFree(GetProcessHeap(), 0, attributes->szURI);
472 if(attributes->szValue)
473 HeapFree(GetProcessHeap(), 0, attributes->szValue);
474 return E_FAIL;
477 for(index=0; index<nb_attributes; index++)
479 attributes->szLocalname[index] =
480 bstr_from_xmlChar(xmlAttributes[index*5]);
481 attributes->szPrefix[index] =
482 bstr_from_xmlChar(xmlAttributes[index*5+1]);
483 attributes->szURI[index] =
484 bstr_from_xmlChar(xmlAttributes[index*5+2]);
485 attributes->szValue[index] =
486 bstr_from_xmlCharN(xmlAttributes[index*5+3],
487 xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
490 *attr = attributes;
492 TRACE("returning %p\n", *attr);
494 return S_OK;
497 /*** LibXML callbacks ***/
498 static void libxmlStartDocument(void *ctx)
500 saxlocator *This = ctx;
501 HRESULT hr;
503 if(This->saxreader->contentHandler)
505 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
506 if(hr != S_OK)
507 format_error_message_from_id(This, hr);
510 update_position(This, NULL);
513 static void libxmlEndDocument(void *ctx)
515 saxlocator *This = ctx;
516 HRESULT hr;
518 This->column = 0;
519 This->line = 0;
521 if(This->ret != S_OK) return;
523 if(This->saxreader->contentHandler)
525 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
526 if(hr != S_OK)
527 format_error_message_from_id(This, hr);
531 static void libxmlStartElementNS(
532 void *ctx,
533 const xmlChar *localname,
534 const xmlChar *prefix,
535 const xmlChar *URI,
536 int nb_namespaces,
537 const xmlChar **namespaces,
538 int nb_attributes,
539 int nb_defaulted,
540 const xmlChar **attributes)
542 BSTR NamespaceUri, LocalName, QName;
543 saxlocator *This = ctx;
544 HRESULT hr;
545 saxattributes *attr;
547 FIXME("Arguments processing not yet implemented.\n");
549 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
551 if(This->saxreader->contentHandler)
553 NamespaceUri = bstr_from_xmlChar(URI);
554 LocalName = bstr_from_xmlChar(localname);
555 QName = bstr_from_xmlChar(localname);
557 hr = SAXAttributes_create(&attr, nb_attributes, attributes);
558 if(hr == S_OK)
560 hr = ISAXContentHandler_startElement(
561 This->saxreader->contentHandler,
562 NamespaceUri, SysStringLen(NamespaceUri),
563 LocalName, SysStringLen(LocalName),
564 QName, SysStringLen(QName),
565 (ISAXAttributes*)&attr->lpSAXAttributesVtbl);
567 ISAXAttributes_Release((ISAXAttributes*)&attr->lpSAXAttributesVtbl);
570 SysFreeString(NamespaceUri);
571 SysFreeString(LocalName);
572 SysFreeString(QName);
574 if(hr != S_OK)
575 format_error_message_from_id(This, hr);
579 static void libxmlEndElementNS(
580 void *ctx,
581 const xmlChar *localname,
582 const xmlChar *prefix,
583 const xmlChar *URI)
585 BSTR NamespaceUri, LocalName, QName;
586 saxlocator *This = ctx;
587 HRESULT hr;
588 xmlChar *end;
590 end = This->lastCur;
591 while(*end != '<' && *(end+1) != '/') end++;
592 update_position(This, end+2);
594 if(This->saxreader->contentHandler)
596 NamespaceUri = bstr_from_xmlChar(URI);
597 LocalName = bstr_from_xmlChar(localname);
598 QName = bstr_from_xmlChar(localname);
600 hr = ISAXContentHandler_endElement(
601 This->saxreader->contentHandler,
602 NamespaceUri, SysStringLen(NamespaceUri),
603 LocalName, SysStringLen(LocalName),
604 QName, SysStringLen(QName));
606 SysFreeString(NamespaceUri);
607 SysFreeString(LocalName);
608 SysFreeString(QName);
610 if(hr != S_OK)
611 format_error_message_from_id(This, hr);
615 static void libxmlCharacters(
616 void *ctx,
617 const xmlChar *ch,
618 int len)
620 BSTR Chars;
621 saxlocator *This = ctx;
622 HRESULT hr;
623 xmlChar *end;
624 xmlChar *lastCurCopy;
625 xmlChar *chEnd;
626 int columnCopy;
627 int lineCopy;
629 if(*(This->lastCur-1) != '>' && *(This->lastCur-1) != '/') return;
631 if(*(This->lastCur-1) != '>')
633 end = (xmlChar*)This->pParserCtxt->input->cur-len;
634 while(*(end-1) != '>') end--;
635 update_position(This, end);
638 chEnd = This->lastCur+len;
639 while(*chEnd != '<') chEnd++;
641 Chars = bstr_from_xmlChar(ch);
643 lastCurCopy = This->lastCur;
644 columnCopy = This->column;
645 lineCopy = This->line;
646 end = This->lastCur;
648 if(This->saxreader->contentHandler)
650 while(This->lastCur < chEnd)
652 end = This->lastCur;
653 while(end < chEnd-1)
655 if(*end == '\r') break;
656 end++;
659 Chars = bstr_from_xmlChar(This->lastCur);
661 if(*end == '\r' && *(end+1) == '\n')
663 memmove((WCHAR*)Chars+(end-This->lastCur),
664 (WCHAR*)Chars+(end-This->lastCur)+1,
665 (SysStringLen(Chars)-(end-This->lastCur))*sizeof(WCHAR));
666 SysReAllocStringLen(&Chars, Chars, SysStringLen(Chars)-1);
668 else if(*end == '\r') Chars[end-This->lastCur] = '\n';
670 hr = ISAXContentHandler_characters(This->saxreader->contentHandler, Chars, end-This->lastCur+1);
671 SysFreeString(Chars);
672 if(hr != S_OK)
674 format_error_message_from_id(This, hr);
675 return;
678 if(*(end+1) == '\n') end++;
679 if(end < chEnd) end++;
681 This->column += end-This->lastCur;
682 This->lastCur = end;
685 This->lastCur = lastCurCopy;
686 This->column = columnCopy;
687 This->line = lineCopy;
688 update_position(This, chEnd);
692 static void libxmlSetDocumentLocator(
693 void *ctx,
694 xmlSAXLocatorPtr loc)
696 saxlocator *This = ctx;
697 HRESULT hr;
699 hr = ISAXContentHandler_putDocumentLocator(This->saxreader->contentHandler,
700 (ISAXLocator*)&This->lpSAXLocatorVtbl);
702 if(FAILED(hr))
703 format_error_message_from_id(This, hr);
706 void libxmlFatalError(void *ctx, const char *msg, ...)
708 saxlocator *This = ctx;
709 char message[1024];
710 WCHAR *wszError;
711 DWORD len;
712 va_list args;
714 if(!This->saxreader->errorHandler)
716 xmlStopParser(This->pParserCtxt);
717 This->ret = E_FAIL;
718 return;
721 FIXME("Error handling is not compatible.\n");
723 va_start(args, msg);
724 vsprintf(message, msg, args);
725 va_end(args);
727 len = MultiByteToWideChar(CP_ACP, 0, message, -1, NULL, 0);
728 wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
729 MultiByteToWideChar(CP_ACP, 0, message, -1, (LPWSTR)wszError, len);
731 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
732 (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
734 HeapFree(GetProcessHeap(), 0, wszError);
736 xmlStopParser(This->pParserCtxt);
737 This->ret = E_FAIL;
740 /*** ISAXLocator interface ***/
741 /*** IUnknown methods ***/
742 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
744 saxlocator *This = impl_from_ISAXLocator( iface );
746 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
748 *ppvObject = NULL;
750 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
751 IsEqualGUID( riid, &IID_ISAXLocator ))
753 *ppvObject = iface;
755 else
757 FIXME("interface %s not implemented\n", debugstr_guid(riid));
758 return E_NOINTERFACE;
761 ISAXLocator_AddRef( iface );
763 return S_OK;
766 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
768 saxlocator *This = impl_from_ISAXLocator( iface );
769 TRACE("%p\n", This );
770 return InterlockedIncrement( &This->ref );
773 static ULONG WINAPI isaxlocator_Release(
774 ISAXLocator* iface)
776 saxlocator *This = impl_from_ISAXLocator( iface );
777 LONG ref;
779 TRACE("%p\n", This );
781 ref = InterlockedDecrement( &This->ref );
782 if ( ref == 0 )
784 if(This->publicId)
785 SysFreeString(This->publicId);
786 if(This->systemId)
787 SysFreeString(This->systemId);
789 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
790 HeapFree( GetProcessHeap(), 0, This );
793 return ref;
796 /*** ISAXLocator methods ***/
797 static HRESULT WINAPI isaxlocator_getColumnNumber(
798 ISAXLocator* iface,
799 int *pnColumn)
801 saxlocator *This = impl_from_ISAXLocator( iface );
803 *pnColumn = This->column;
804 return S_OK;
807 static HRESULT WINAPI isaxlocator_getLineNumber(
808 ISAXLocator* iface,
809 int *pnLine)
811 saxlocator *This = impl_from_ISAXLocator( iface );
813 *pnLine = This->line;
814 return S_OK;
817 static HRESULT WINAPI isaxlocator_getPublicId(
818 ISAXLocator* iface,
819 const WCHAR ** ppwchPublicId)
821 BSTR publicId;
822 saxlocator *This = impl_from_ISAXLocator( iface );
824 if(This->publicId) SysFreeString(This->publicId);
826 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
827 if(SysStringLen(publicId))
828 This->publicId = (WCHAR*)&publicId;
829 else
831 SysFreeString(publicId);
832 This->publicId = NULL;
835 *ppwchPublicId = This->publicId;
836 return S_OK;
839 static HRESULT WINAPI isaxlocator_getSystemId(
840 ISAXLocator* iface,
841 const WCHAR ** ppwchSystemId)
843 BSTR systemId;
844 saxlocator *This = impl_from_ISAXLocator( iface );
846 if(This->systemId) SysFreeString(This->systemId);
848 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
849 if(SysStringLen(systemId))
850 This->systemId = (WCHAR*)&systemId;
851 else
853 SysFreeString(systemId);
854 This->systemId = NULL;
857 *ppwchSystemId = This->systemId;
858 return S_OK;
861 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
863 isaxlocator_QueryInterface,
864 isaxlocator_AddRef,
865 isaxlocator_Release,
866 isaxlocator_getColumnNumber,
867 isaxlocator_getLineNumber,
868 isaxlocator_getPublicId,
869 isaxlocator_getSystemId
872 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator)
874 saxlocator *locator;
876 locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) );
877 if( !locator )
878 return E_OUTOFMEMORY;
880 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
881 locator->ref = 1;
883 locator->saxreader = reader;
884 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
886 locator->pParserCtxt = NULL;
887 locator->publicId = NULL;
888 locator->systemId = NULL;
889 locator->lastCur = NULL;
890 locator->line = 0;
891 locator->column = 0;
892 locator->ret = S_OK;
894 *ppsaxlocator = locator;
896 TRACE("returning %p\n", *ppsaxlocator);
898 return S_OK;
901 /*** IVBSAXXMLReader interface ***/
902 /*** IUnknown methods ***/
903 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
905 saxreader *This = impl_from_IVBSAXXMLReader( iface );
907 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
909 *ppvObject = NULL;
911 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
912 IsEqualGUID( riid, &IID_IDispatch ) ||
913 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
915 *ppvObject = iface;
917 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
919 *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
921 else
923 FIXME("interface %s not implemented\n", debugstr_guid(riid));
924 return E_NOINTERFACE;
927 IVBSAXXMLReader_AddRef( iface );
929 return S_OK;
932 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
934 saxreader *This = impl_from_IVBSAXXMLReader( iface );
935 TRACE("%p\n", This );
936 return InterlockedIncrement( &This->ref );
939 static ULONG WINAPI saxxmlreader_Release(
940 IVBSAXXMLReader* iface)
942 saxreader *This = impl_from_IVBSAXXMLReader( iface );
943 LONG ref;
945 TRACE("%p\n", This );
947 ref = InterlockedDecrement( &This->ref );
948 if ( ref == 0 )
950 if(This->contentHandler)
951 ISAXContentHandler_Release(This->contentHandler);
953 if(This->errorHandler)
954 ISAXErrorHandler_Release(This->errorHandler);
956 HeapFree( GetProcessHeap(), 0, This );
959 return ref;
961 /*** IDispatch ***/
962 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
964 saxreader *This = impl_from_IVBSAXXMLReader( iface );
966 TRACE("(%p)->(%p)\n", This, pctinfo);
968 *pctinfo = 1;
970 return S_OK;
973 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
974 IVBSAXXMLReader *iface,
975 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
977 saxreader *This = impl_from_IVBSAXXMLReader( iface );
978 HRESULT hr;
980 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
982 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
984 return hr;
987 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
988 IVBSAXXMLReader *iface,
989 REFIID riid,
990 LPOLESTR* rgszNames,
991 UINT cNames,
992 LCID lcid,
993 DISPID* rgDispId)
995 saxreader *This = impl_from_IVBSAXXMLReader( iface );
996 ITypeInfo *typeinfo;
997 HRESULT hr;
999 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1000 lcid, rgDispId);
1002 if(!rgszNames || cNames == 0 || !rgDispId)
1003 return E_INVALIDARG;
1005 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
1006 if(SUCCEEDED(hr))
1008 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1009 ITypeInfo_Release(typeinfo);
1012 return hr;
1015 static HRESULT WINAPI saxxmlreader_Invoke(
1016 IVBSAXXMLReader *iface,
1017 DISPID dispIdMember,
1018 REFIID riid,
1019 LCID lcid,
1020 WORD wFlags,
1021 DISPPARAMS* pDispParams,
1022 VARIANT* pVarResult,
1023 EXCEPINFO* pExcepInfo,
1024 UINT* puArgErr)
1026 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1027 ITypeInfo *typeinfo;
1028 HRESULT hr;
1030 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1031 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1033 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
1034 if(SUCCEEDED(hr))
1036 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams,
1037 pVarResult, pExcepInfo, puArgErr);
1038 ITypeInfo_Release(typeinfo);
1041 return hr;
1044 /*** IVBSAXXMLReader methods ***/
1045 static HRESULT WINAPI saxxmlreader_getFeature(
1046 IVBSAXXMLReader* iface,
1047 const WCHAR *pFeature,
1048 VARIANT_BOOL *pValue)
1050 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1052 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
1053 return E_NOTIMPL;
1056 static HRESULT WINAPI saxxmlreader_putFeature(
1057 IVBSAXXMLReader* iface,
1058 const WCHAR *pFeature,
1059 VARIANT_BOOL vfValue)
1061 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1063 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
1064 return E_NOTIMPL;
1067 static HRESULT WINAPI saxxmlreader_getProperty(
1068 IVBSAXXMLReader* iface,
1069 const WCHAR *pProp,
1070 VARIANT *pValue)
1072 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1074 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
1075 return E_NOTIMPL;
1078 static HRESULT WINAPI saxxmlreader_putProperty(
1079 IVBSAXXMLReader* iface,
1080 const WCHAR *pProp,
1081 VARIANT value)
1083 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1085 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
1086 return E_NOTIMPL;
1089 static HRESULT WINAPI saxxmlreader_getEntityResolver(
1090 IVBSAXXMLReader* iface,
1091 IVBSAXEntityResolver **pEntityResolver)
1093 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1095 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1096 return E_NOTIMPL;
1099 static HRESULT WINAPI saxxmlreader_putEntityResolver(
1100 IVBSAXXMLReader* iface,
1101 IVBSAXEntityResolver *pEntityResolver)
1103 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1105 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1106 return E_NOTIMPL;
1109 static HRESULT WINAPI saxxmlreader_getContentHandler(
1110 IVBSAXXMLReader* iface,
1111 IVBSAXContentHandler **ppContentHandler)
1113 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1115 FIXME("(%p)->(%p) stub\n", This, ppContentHandler);
1116 return E_NOTIMPL;
1119 static HRESULT WINAPI saxxmlreader_putContentHandler(
1120 IVBSAXXMLReader* iface,
1121 IVBSAXContentHandler *contentHandler)
1123 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1125 FIXME("(%p)->(%p) stub\n", This, contentHandler);
1126 return E_NOTIMPL;
1129 static HRESULT WINAPI saxxmlreader_getDTDHandler(
1130 IVBSAXXMLReader* iface,
1131 IVBSAXDTDHandler **pDTDHandler)
1133 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1135 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1136 return E_NOTIMPL;
1139 static HRESULT WINAPI saxxmlreader_putDTDHandler(
1140 IVBSAXXMLReader* iface,
1141 IVBSAXDTDHandler *pDTDHandler)
1143 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1145 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1146 return E_NOTIMPL;
1149 static HRESULT WINAPI saxxmlreader_getErrorHandler(
1150 IVBSAXXMLReader* iface,
1151 IVBSAXErrorHandler **pErrorHandler)
1153 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1155 FIXME("(%p)->(%p) stub\n", This, pErrorHandler);
1156 return E_NOTIMPL;
1159 static HRESULT WINAPI saxxmlreader_putErrorHandler(
1160 IVBSAXXMLReader* iface,
1161 IVBSAXErrorHandler *errorHandler)
1163 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1165 FIXME("(%p)->(%p) stub\n", This, errorHandler);
1166 return E_NOTIMPL;
1169 static HRESULT WINAPI saxxmlreader_getBaseURL(
1170 IVBSAXXMLReader* iface,
1171 const WCHAR **pBaseUrl)
1173 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1175 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
1176 return E_NOTIMPL;
1179 static HRESULT WINAPI saxxmlreader_putBaseURL(
1180 IVBSAXXMLReader* iface,
1181 const WCHAR *pBaseUrl)
1183 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1185 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
1186 return E_NOTIMPL;
1189 static HRESULT WINAPI saxxmlreader_getSecureBaseURL(
1190 IVBSAXXMLReader* iface,
1191 const WCHAR **pSecureBaseUrl)
1193 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1195 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
1196 return E_NOTIMPL;
1200 static HRESULT WINAPI saxxmlreader_putSecureBaseURL(
1201 IVBSAXXMLReader* iface,
1202 const WCHAR *secureBaseUrl)
1204 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1206 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
1207 return E_NOTIMPL;
1210 static HRESULT WINAPI saxxmlreader_parse(
1211 IVBSAXXMLReader* iface,
1212 VARIANT varInput)
1214 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1216 FIXME("(%p) stub\n", This);
1217 return E_NOTIMPL;
1220 static HRESULT WINAPI saxxmlreader_parseURL(
1221 IVBSAXXMLReader* iface,
1222 const WCHAR *url)
1224 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1226 FIXME("(%p)->(%s) stub\n", This, debugstr_w(url));
1227 return E_NOTIMPL;
1230 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
1232 saxxmlreader_QueryInterface,
1233 saxxmlreader_AddRef,
1234 saxxmlreader_Release,
1235 saxxmlreader_GetTypeInfoCount,
1236 saxxmlreader_GetTypeInfo,
1237 saxxmlreader_GetIDsOfNames,
1238 saxxmlreader_Invoke,
1239 saxxmlreader_getFeature,
1240 saxxmlreader_putFeature,
1241 saxxmlreader_getProperty,
1242 saxxmlreader_putProperty,
1243 saxxmlreader_getEntityResolver,
1244 saxxmlreader_putEntityResolver,
1245 saxxmlreader_getContentHandler,
1246 saxxmlreader_putContentHandler,
1247 saxxmlreader_getDTDHandler,
1248 saxxmlreader_putDTDHandler,
1249 saxxmlreader_getErrorHandler,
1250 saxxmlreader_putErrorHandler,
1251 saxxmlreader_getBaseURL,
1252 saxxmlreader_putBaseURL,
1253 saxxmlreader_getSecureBaseURL,
1254 saxxmlreader_putSecureBaseURL,
1255 saxxmlreader_parse,
1256 saxxmlreader_parseURL
1259 /*** ISAXXMLReader interface ***/
1260 /*** IUnknown methods ***/
1261 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
1263 saxreader *This = impl_from_ISAXXMLReader( iface );
1264 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVtbl, riid, ppvObject);
1267 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
1269 saxreader *This = impl_from_ISAXXMLReader( iface );
1270 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVtbl);
1273 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
1275 saxreader *This = impl_from_ISAXXMLReader( iface );
1276 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVtbl);
1279 /*** ISAXXMLReader methods ***/
1280 static HRESULT WINAPI isaxxmlreader_getFeature(
1281 ISAXXMLReader* iface,
1282 const WCHAR *pFeature,
1283 VARIANT_BOOL *pValue)
1285 saxreader *This = impl_from_ISAXXMLReader( iface );
1287 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
1288 return E_NOTIMPL;
1291 static HRESULT WINAPI isaxxmlreader_putFeature(
1292 ISAXXMLReader* iface,
1293 const WCHAR *pFeature,
1294 VARIANT_BOOL vfValue)
1296 saxreader *This = impl_from_ISAXXMLReader( iface );
1298 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
1299 return E_NOTIMPL;
1302 static HRESULT WINAPI isaxxmlreader_getProperty(
1303 ISAXXMLReader* iface,
1304 const WCHAR *pProp,
1305 VARIANT *pValue)
1307 saxreader *This = impl_from_ISAXXMLReader( iface );
1309 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
1310 return E_NOTIMPL;
1313 static HRESULT WINAPI isaxxmlreader_putProperty(
1314 ISAXXMLReader* iface,
1315 const WCHAR *pProp,
1316 VARIANT value)
1318 saxreader *This = impl_from_ISAXXMLReader( iface );
1320 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
1321 return E_NOTIMPL;
1324 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
1325 ISAXXMLReader* iface,
1326 ISAXEntityResolver **ppEntityResolver)
1328 saxreader *This = impl_from_ISAXXMLReader( iface );
1330 FIXME("(%p)->(%p) stub\n", This, ppEntityResolver);
1331 return E_NOTIMPL;
1334 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
1335 ISAXXMLReader* iface,
1336 ISAXEntityResolver *pEntityResolver)
1338 saxreader *This = impl_from_ISAXXMLReader( iface );
1340 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1341 return E_NOTIMPL;
1344 static HRESULT WINAPI isaxxmlreader_getContentHandler(
1345 ISAXXMLReader* iface,
1346 ISAXContentHandler **pContentHandler)
1348 saxreader *This = impl_from_ISAXXMLReader( iface );
1350 TRACE("(%p)->(%p)\n", This, pContentHandler);
1351 if(pContentHandler == NULL)
1352 return E_POINTER;
1353 if(This->contentHandler)
1354 ISAXContentHandler_AddRef(This->contentHandler);
1355 *pContentHandler = This->contentHandler;
1357 return S_OK;
1360 static HRESULT WINAPI isaxxmlreader_putContentHandler(
1361 ISAXXMLReader* iface,
1362 ISAXContentHandler *contentHandler)
1364 saxreader *This = impl_from_ISAXXMLReader( iface );
1366 TRACE("(%p)->(%p)\n", This, contentHandler);
1367 if(contentHandler)
1368 ISAXContentHandler_AddRef(contentHandler);
1369 if(This->contentHandler)
1370 ISAXContentHandler_Release(This->contentHandler);
1371 This->contentHandler = contentHandler;
1373 return S_OK;
1376 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
1377 ISAXXMLReader* iface,
1378 ISAXDTDHandler **pDTDHandler)
1380 saxreader *This = impl_from_ISAXXMLReader( iface );
1382 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1383 return E_NOTIMPL;
1386 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
1387 ISAXXMLReader* iface,
1388 ISAXDTDHandler *pDTDHandler)
1390 saxreader *This = impl_from_ISAXXMLReader( iface );
1392 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1393 return E_NOTIMPL;
1396 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
1397 ISAXXMLReader* iface,
1398 ISAXErrorHandler **pErrorHandler)
1400 saxreader *This = impl_from_ISAXXMLReader( iface );
1402 TRACE("(%p)->(%p)\n", This, pErrorHandler);
1403 if(pErrorHandler == NULL)
1404 return E_POINTER;
1405 if(This->errorHandler)
1406 ISAXErrorHandler_AddRef(This->errorHandler);
1407 *pErrorHandler = This->errorHandler;
1409 return S_OK;
1412 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
1413 ISAXXMLReader* iface,
1414 ISAXErrorHandler *errorHandler)
1416 saxreader *This = impl_from_ISAXXMLReader( iface );
1418 TRACE("(%p)->(%p)\n", This, errorHandler);
1419 if(errorHandler)
1420 ISAXErrorHandler_AddRef(errorHandler);
1421 if(This->errorHandler)
1422 ISAXErrorHandler_Release(This->errorHandler);
1423 This->errorHandler = errorHandler;
1425 return S_OK;
1428 static HRESULT WINAPI isaxxmlreader_getBaseURL(
1429 ISAXXMLReader* iface,
1430 const WCHAR **pBaseUrl)
1432 saxreader *This = impl_from_ISAXXMLReader( iface );
1434 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
1435 return E_NOTIMPL;
1438 static HRESULT WINAPI isaxxmlreader_putBaseURL(
1439 ISAXXMLReader* iface,
1440 const WCHAR *pBaseUrl)
1442 saxreader *This = impl_from_ISAXXMLReader( iface );
1444 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
1445 return E_NOTIMPL;
1448 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
1449 ISAXXMLReader* iface,
1450 const WCHAR **pSecureBaseUrl)
1452 saxreader *This = impl_from_ISAXXMLReader( iface );
1454 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
1455 return E_NOTIMPL;
1458 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
1459 ISAXXMLReader* iface,
1460 const WCHAR *secureBaseUrl)
1462 saxreader *This = impl_from_ISAXXMLReader( iface );
1464 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
1465 return E_NOTIMPL;
1468 static HRESULT parse_buffer(saxreader *This, xmlChar *buffer)
1470 saxlocator *locator;
1471 HRESULT hr;
1473 hr = SAXLocator_create(This, &locator);
1474 if(FAILED(hr))
1475 return E_FAIL;
1477 locator->pParserCtxt = xmlNewParserCtxt();
1478 if(!locator->pParserCtxt)
1480 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1481 return E_FAIL;
1484 locator->pParserCtxt->sax = &locator->saxreader->sax;
1485 locator->pParserCtxt->userData = locator;
1487 xmlSetupParserForBuffer(locator->pParserCtxt, buffer, NULL);
1489 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1490 else hr = locator->ret;
1492 if(locator->pParserCtxt)
1494 locator->pParserCtxt->sax = NULL;
1495 xmlFreeParserCtxt(locator->pParserCtxt);
1496 locator->pParserCtxt = NULL;
1499 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1500 return S_OK;
1503 static HRESULT WINAPI isaxxmlreader_parse(
1504 ISAXXMLReader* iface,
1505 VARIANT varInput)
1507 saxreader *This = impl_from_ISAXXMLReader( iface );
1508 xmlChar *data = NULL;
1509 HRESULT hr;
1511 TRACE("(%p)\n", This);
1513 hr = S_OK;
1514 switch(V_VT(&varInput))
1516 case VT_BSTR:
1517 data = xmlChar_from_wchar(V_BSTR(&varInput));
1518 hr = parse_buffer(This, data);
1519 break;
1520 case VT_ARRAY|VT_UI1: {
1521 void *pSAData;
1522 LONG lBound, uBound;
1523 ULONG dataRead;
1525 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
1526 if(hr != S_OK) break;
1527 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
1528 if(hr != S_OK) break;
1529 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
1530 data = HeapAlloc(GetProcessHeap(), 0, dataRead+1);
1531 if(!data) break;
1532 hr = SafeArrayAccessData(V_ARRAY(&varInput), (void**)&pSAData);
1533 if(hr != S_OK) break;
1534 memcpy(data, pSAData, dataRead);
1535 data[dataRead] = '\0';
1536 hr = parse_buffer(This, data);
1537 SafeArrayUnaccessData(V_ARRAY(&varInput));
1538 break;
1540 case VT_UNKNOWN:
1541 case VT_DISPATCH: {
1542 IPersistStream *persistStream;
1543 IStream *stream = NULL;
1544 IXMLDOMDocument *xmlDoc;
1546 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1547 &IID_IPersistStream, (void**)&persistStream) == S_OK)
1549 hr = IPersistStream_Save(persistStream, stream, TRUE);
1550 IPersistStream_Release(persistStream);
1551 if(hr != S_OK) break;
1553 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1554 &IID_IStream, (void**)&stream) == S_OK)
1556 STATSTG dataInfo;
1557 ULONG dataRead;
1559 while(1)
1561 hr = IStream_Stat(stream, &dataInfo, STATFLAG_NONAME);
1562 if(hr == E_PENDING) continue;
1563 break;
1565 data = HeapAlloc(GetProcessHeap(), 0,
1566 dataInfo.cbSize.QuadPart+1);
1567 while(1)
1569 hr = IStream_Read(stream, data,
1570 dataInfo.cbSize.QuadPart, &dataRead);
1571 if(hr == E_PENDING) continue;
1572 break;
1574 data[dataInfo.cbSize.QuadPart] = '\0';
1575 hr = parse_buffer(This, data);
1576 IStream_Release(stream);
1577 break;
1579 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1580 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
1582 BSTR bstrData;
1584 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
1585 data = xmlChar_from_wchar(bstrData);
1586 hr = parse_buffer(This, data);
1587 IXMLDOMDocument_Release(xmlDoc);
1588 hr = E_NOTIMPL;
1589 break;
1592 default:
1593 WARN("vt %d not implemented\n", V_VT(&varInput));
1594 hr = E_INVALIDARG;
1597 HeapFree(GetProcessHeap(), 0, data);
1598 return hr;
1601 static HRESULT saxreader_onDataAvailable(void *obj, char *ptr, DWORD len)
1603 saxreader *This = obj;
1604 xmlChar *data;
1605 HRESULT hr;
1607 data = HeapAlloc(GetProcessHeap(), 0, len+1);
1608 memcpy(data, ptr, len);
1609 data[len] = 0;
1611 hr = parse_buffer(This, data);
1613 HeapFree(GetProcessHeap(), 0, data);
1614 return hr;
1617 static HRESULT WINAPI isaxxmlreader_parseURL(
1618 ISAXXMLReader* iface,
1619 const WCHAR *url)
1621 saxreader *This = impl_from_ISAXXMLReader( iface );
1622 bsc_t *bsc;
1623 HRESULT hr;
1625 TRACE("(%p)->(%s) stub\n", This, debugstr_w(url));
1627 hr = bind_url(url, saxreader_onDataAvailable, This, &bsc);
1628 if(FAILED(hr))
1629 return hr;
1631 detach_bsc(bsc);
1633 return S_OK;
1636 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
1638 isaxxmlreader_QueryInterface,
1639 isaxxmlreader_AddRef,
1640 isaxxmlreader_Release,
1641 isaxxmlreader_getFeature,
1642 isaxxmlreader_putFeature,
1643 isaxxmlreader_getProperty,
1644 isaxxmlreader_putProperty,
1645 isaxxmlreader_getEntityResolver,
1646 isaxxmlreader_putEntityResolver,
1647 isaxxmlreader_getContentHandler,
1648 isaxxmlreader_putContentHandler,
1649 isaxxmlreader_getDTDHandler,
1650 isaxxmlreader_putDTDHandler,
1651 isaxxmlreader_getErrorHandler,
1652 isaxxmlreader_putErrorHandler,
1653 isaxxmlreader_getBaseURL,
1654 isaxxmlreader_putBaseURL,
1655 isaxxmlreader_getSecureBaseURL,
1656 isaxxmlreader_putSecureBaseURL,
1657 isaxxmlreader_parse,
1658 isaxxmlreader_parseURL
1661 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1663 saxreader *reader;
1665 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
1667 reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) );
1668 if( !reader )
1669 return E_OUTOFMEMORY;
1671 reader->lpVtbl = &saxreader_vtbl;
1672 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
1673 reader->ref = 1;
1674 reader->contentHandler = NULL;
1675 reader->errorHandler = NULL;
1677 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
1678 reader->sax.initialized = XML_SAX2_MAGIC;
1679 reader->sax.startDocument = libxmlStartDocument;
1680 reader->sax.endDocument = libxmlEndDocument;
1681 reader->sax.startElementNs = libxmlStartElementNS;
1682 reader->sax.endElementNs = libxmlEndElementNS;
1683 reader->sax.characters = libxmlCharacters;
1684 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
1685 reader->sax.error = libxmlFatalError;
1686 reader->sax.fatalError = libxmlFatalError;
1688 *ppObj = &reader->lpVtbl;
1690 TRACE("returning iface %p\n", *ppObj);
1692 return S_OK;
1695 #else
1697 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
1699 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
1700 "libxml2 support was not present at compile time.\n");
1701 return E_NOTIMPL;
1704 #endif