include: Fix function names in IVBSAXXMLReader interface in msxml2.idl.
[wine.git] / dlls / msxml3 / saxreader.c
blobd0ba6b5967c7b0b4332e99d4bc6e82ac4eb51f4d
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>
47 #include <libxml/parserInternals.h>
49 typedef struct _saxreader
51 const struct IVBSAXXMLReaderVtbl *lpVBSAXXMLReaderVtbl;
52 const struct ISAXXMLReaderVtbl *lpSAXXMLReaderVtbl;
53 LONG ref;
54 struct ISAXContentHandler *contentHandler;
55 struct IVBSAXContentHandler *vbcontentHandler;
56 struct ISAXErrorHandler *errorHandler;
57 struct IVBSAXErrorHandler *vberrorHandler;
58 xmlSAXHandler sax;
59 } saxreader;
61 typedef struct _saxlocator
63 const struct IVBSAXLocatorVtbl *lpVBSAXLocatorVtbl;
64 const struct ISAXLocatorVtbl *lpSAXLocatorVtbl;
65 LONG ref;
66 saxreader *saxreader;
67 HRESULT ret;
68 xmlParserCtxtPtr pParserCtxt;
69 WCHAR *publicId;
70 WCHAR *systemId;
71 xmlChar *lastCur;
72 int line;
73 int column;
74 BOOL vbInterface;
75 int nsStackSize;
76 int nsStackLast;
77 int *nsStack;
78 } saxlocator;
80 typedef struct _saxattributes
82 const struct IVBSAXAttributesVtbl *lpVBSAXAttributesVtbl;
83 const struct ISAXAttributesVtbl *lpSAXAttributesVtbl;
84 LONG ref;
85 int nb_attributes;
86 BSTR *szLocalname;
87 BSTR *szURI;
88 BSTR *szValue;
89 BSTR *szQName;
90 } saxattributes;
92 static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
94 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpVBSAXXMLReaderVtbl));
97 static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
99 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpSAXXMLReaderVtbl));
102 static inline saxlocator *impl_from_IVBSAXLocator( IVBSAXLocator *iface )
104 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpVBSAXLocatorVtbl));
107 static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
109 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl));
112 static inline saxattributes *impl_from_IVBSAXAttributes( IVBSAXAttributes *iface )
114 return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpVBSAXAttributesVtbl));
117 static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface )
119 return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpSAXAttributesVtbl));
123 static HRESULT namespacePush(saxlocator *locator, int ns)
125 if(locator->nsStackLast>=locator->nsStackSize)
127 int *new_stack;
129 new_stack = HeapReAlloc(GetProcessHeap(), 0,
130 locator->nsStack, locator->nsStackSize*2);
131 if(!new_stack) return E_OUTOFMEMORY;
132 locator->nsStack = new_stack;
133 locator->nsStackSize *= 2;
135 locator->nsStack[locator->nsStackLast++] = ns;
137 return S_OK;
140 static int namespacePop(saxlocator *locator)
142 if(locator->nsStackLast == 0) return 0;
143 return locator->nsStack[--locator->nsStackLast];
146 static BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
148 DWORD dLen;
149 LPWSTR str;
150 BSTR bstr;
152 if (!buf)
153 return NULL;
155 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0);
156 if(len != -1) dLen++;
157 str = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, dLen * sizeof (WCHAR));
158 if (!str)
159 return NULL;
160 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, str, dLen);
161 if(len != -1) str[dLen-1] = '\0';
162 bstr = SysAllocString(str);
163 HeapFree(GetProcessHeap(), 0, str);
165 return bstr;
168 static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name)
170 DWORD dLen, dLast;
171 LPWSTR str;
172 BSTR bstr;
174 if(!name) return NULL;
176 if(!prefix || *prefix=='\0')
177 return bstr_from_xmlChar(name);
179 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, NULL, 0)
180 + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0);
181 str = HeapAlloc(GetProcessHeap(), 0, dLen * sizeof(WCHAR));
182 if(!str)
183 return NULL;
185 dLast = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, str, dLen);
186 str[dLast-1] = ':';
187 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, &str[dLast], dLen-dLast);
188 bstr = SysAllocString(str);
190 HeapFree(GetProcessHeap(), 0, str);
192 return bstr;
195 static void format_error_message_from_id(saxlocator *This, HRESULT hr)
197 xmlStopParser(This->pParserCtxt);
198 This->ret = hr;
200 if((This->vbInterface && This->saxreader->vberrorHandler)
201 || (!This->vbInterface && This->saxreader->errorHandler))
203 WCHAR msg[1024];
204 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
205 NULL, hr, 0, msg, sizeof(msg), NULL))
207 FIXME("MSXML errors not yet supported.\n");
208 msg[0] = '\0';
211 if(This->vbInterface)
213 BSTR bstrMsg = SysAllocString(msg);
214 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
215 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrMsg, hr);
217 else
218 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
219 (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
223 static void update_position(saxlocator *This, xmlChar *end)
225 if(This->lastCur == NULL)
227 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
228 This->line = 1;
229 This->column = 1;
231 else if(This->lastCur < This->pParserCtxt->input->base)
233 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
234 This->line = 1;
235 This->column = 1;
238 if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
240 while(This->lastCur < end)
242 if(*(This->lastCur) == '\n')
244 This->line++;
245 This->column = 1;
247 else if(*(This->lastCur) == '\r' && (This->lastCur==This->pParserCtxt->input->end || *(This->lastCur+1)!='\n'))
249 This->line++;
250 This->column = 1;
252 else This->column++;
254 This->lastCur++;
258 /*** IVBSAXAttributes interface ***/
259 /*** IUnknown methods ***/
260 static HRESULT WINAPI ivbsaxattributes_QueryInterface(
261 IVBSAXAttributes* iface,
262 REFIID riid,
263 void **ppvObject)
265 saxattributes *This = impl_from_IVBSAXAttributes(iface);
267 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
269 *ppvObject = NULL;
271 if (IsEqualGUID(riid, &IID_IUnknown) ||
272 IsEqualGUID(riid, &IID_IDispatch) ||
273 IsEqualGUID(riid, &IID_IVBSAXAttributes))
275 *ppvObject = iface;
277 else
279 FIXME("interface %s not implemented\n", debugstr_guid(riid));
280 return E_NOINTERFACE;
283 IVBSAXAttributes_AddRef(iface);
285 return S_OK;
288 static ULONG WINAPI ivbsaxattributes_AddRef(IVBSAXAttributes* iface)
290 saxattributes *This = impl_from_IVBSAXAttributes(iface);
291 return ISAXAttributes_AddRef((ISAXAttributes*)&This->lpSAXAttributesVtbl);
294 static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes* iface)
296 saxattributes *This = impl_from_IVBSAXAttributes(iface);
297 return ISAXAttributes_Release((ISAXAttributes*)&This->lpSAXAttributesVtbl);
300 /*** IDispatch methods ***/
301 static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes *iface, UINT* pctinfo )
303 saxattributes *This = impl_from_IVBSAXAttributes( iface );
305 TRACE("(%p)->(%p)\n", This, pctinfo);
307 *pctinfo = 1;
309 return S_OK;
312 static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(
313 IVBSAXAttributes *iface,
314 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
316 saxattributes *This = impl_from_IVBSAXAttributes( iface );
317 HRESULT hr;
319 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
321 hr = get_typeinfo(IVBSAXAttributes_tid, ppTInfo);
323 return hr;
326 static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(
327 IVBSAXAttributes *iface,
328 REFIID riid,
329 LPOLESTR* rgszNames,
330 UINT cNames,
331 LCID lcid,
332 DISPID* rgDispId)
334 saxattributes *This = impl_from_IVBSAXAttributes( iface );
335 ITypeInfo *typeinfo;
336 HRESULT hr;
338 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
339 lcid, rgDispId);
341 if(!rgszNames || cNames == 0 || !rgDispId)
342 return E_INVALIDARG;
344 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
345 if(SUCCEEDED(hr))
347 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
348 ITypeInfo_Release(typeinfo);
351 return hr;
354 static HRESULT WINAPI ivbsaxattributes_Invoke(
355 IVBSAXAttributes *iface,
356 DISPID dispIdMember,
357 REFIID riid,
358 LCID lcid,
359 WORD wFlags,
360 DISPPARAMS* pDispParams,
361 VARIANT* pVarResult,
362 EXCEPINFO* pExcepInfo,
363 UINT* puArgErr)
365 saxattributes *This = impl_from_IVBSAXAttributes( iface );
366 ITypeInfo *typeinfo;
367 HRESULT hr;
369 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
370 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
372 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
373 if(SUCCEEDED(hr))
375 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXAttributesVtbl), dispIdMember, wFlags, pDispParams,
376 pVarResult, pExcepInfo, puArgErr);
377 ITypeInfo_Release(typeinfo);
380 return hr;
383 /*** IVBSAXAttributes methods ***/
384 static HRESULT WINAPI ivbsaxattributes_get_length(
385 IVBSAXAttributes* iface,
386 int *nLength)
388 saxattributes *This = impl_from_IVBSAXAttributes( iface );
389 return ISAXAttributes_getLength(
390 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
391 nLength);
394 static HRESULT WINAPI ivbsaxattributes_getURI(
395 IVBSAXAttributes* iface,
396 int nIndex,
397 BSTR *uri)
399 int len;
400 saxattributes *This = impl_from_IVBSAXAttributes( iface );
401 return ISAXAttributes_getURI(
402 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
403 nIndex, (const WCHAR**)uri, &len);
406 static HRESULT WINAPI ivbsaxattributes_getLocalName(
407 IVBSAXAttributes* iface,
408 int nIndex,
409 BSTR *localName)
411 int len;
412 saxattributes *This = impl_from_IVBSAXAttributes( iface );
413 return ISAXAttributes_getLocalName(
414 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
415 nIndex, (const WCHAR**)localName, &len);
418 static HRESULT WINAPI ivbsaxattributes_getQName(
419 IVBSAXAttributes* iface,
420 int nIndex,
421 BSTR *QName)
423 int len;
424 saxattributes *This = impl_from_IVBSAXAttributes( iface );
425 return ISAXAttributes_getQName(
426 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
427 nIndex, (const WCHAR**)QName, &len);
430 static HRESULT WINAPI ivbsaxattributes_getIndexFromName(
431 IVBSAXAttributes* iface,
432 BSTR uri,
433 BSTR localName,
434 int *index)
436 saxattributes *This = impl_from_IVBSAXAttributes( iface );
437 return ISAXAttributes_getIndexFromName(
438 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
439 (const WCHAR*)uri, SysStringLen(uri),
440 (const WCHAR*)localName, SysStringLen(localName), index);
443 static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(
444 IVBSAXAttributes* iface,
445 BSTR QName,
446 int *index)
448 saxattributes *This = impl_from_IVBSAXAttributes( iface );
449 return ISAXAttributes_getIndexFromQName(
450 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
451 (const WCHAR*)QName, SysStringLen(QName), index);
454 static HRESULT WINAPI ivbsaxattributes_getType(
455 IVBSAXAttributes* iface,
456 int nIndex,
457 BSTR *type)
459 int len;
460 saxattributes *This = impl_from_IVBSAXAttributes( iface );
461 return ISAXAttributes_getType(
462 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
463 nIndex, (const WCHAR**)type, &len);
466 static HRESULT WINAPI ivbsaxattributes_getTypeFromName(
467 IVBSAXAttributes* iface,
468 BSTR uri,
469 BSTR localName,
470 BSTR *type)
472 int len;
473 saxattributes *This = impl_from_IVBSAXAttributes( iface );
474 return ISAXAttributes_getTypeFromName(
475 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
476 (const WCHAR*)uri, SysStringLen(uri),
477 (const WCHAR*)localName, SysStringLen(localName),
478 (const WCHAR**)type, &len);
481 static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(
482 IVBSAXAttributes* iface,
483 BSTR QName,
484 BSTR *type)
486 int len;
487 saxattributes *This = impl_from_IVBSAXAttributes( iface );
488 return ISAXAttributes_getTypeFromQName(
489 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
490 (const WCHAR*)QName, SysStringLen(QName),
491 (const WCHAR**)type, &len);
494 static HRESULT WINAPI ivbsaxattributes_getValue(
495 IVBSAXAttributes* iface,
496 int nIndex,
497 BSTR *value)
499 int len;
500 saxattributes *This = impl_from_IVBSAXAttributes( iface );
501 return ISAXAttributes_getValue(
502 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
503 nIndex, (const WCHAR**)value, &len);
506 static HRESULT WINAPI ivbsaxattributes_getValueFromName(
507 IVBSAXAttributes* iface,
508 BSTR uri,
509 BSTR localName,
510 BSTR *value)
512 int len;
513 saxattributes *This = impl_from_IVBSAXAttributes( iface );
514 return ISAXAttributes_getValueFromName(
515 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
516 (const WCHAR*)uri, SysStringLen(uri),
517 (const WCHAR*)localName, SysStringLen(localName),
518 (const WCHAR**)value, &len);
521 static HRESULT WINAPI ivbsaxattributes_getValueFromQName(
522 IVBSAXAttributes* iface,
523 BSTR QName,
524 BSTR *value)
526 int len;
527 saxattributes *This = impl_from_IVBSAXAttributes( iface );
528 return ISAXAttributes_getValueFromQName(
529 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
530 (const WCHAR*)QName, SysStringLen(QName),
531 (const WCHAR**)value, &len);
534 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
536 ivbsaxattributes_QueryInterface,
537 ivbsaxattributes_AddRef,
538 ivbsaxattributes_Release,
539 ivbsaxattributes_GetTypeInfoCount,
540 ivbsaxattributes_GetTypeInfo,
541 ivbsaxattributes_GetIDsOfNames,
542 ivbsaxattributes_Invoke,
543 ivbsaxattributes_get_length,
544 ivbsaxattributes_getURI,
545 ivbsaxattributes_getLocalName,
546 ivbsaxattributes_getQName,
547 ivbsaxattributes_getIndexFromName,
548 ivbsaxattributes_getIndexFromQName,
549 ivbsaxattributes_getType,
550 ivbsaxattributes_getTypeFromName,
551 ivbsaxattributes_getTypeFromQName,
552 ivbsaxattributes_getValue,
553 ivbsaxattributes_getValueFromName,
554 ivbsaxattributes_getValueFromQName
557 /*** ISAXAttributes interface ***/
558 /*** IUnknown methods ***/
559 static HRESULT WINAPI isaxattributes_QueryInterface(
560 ISAXAttributes* iface,
561 REFIID riid,
562 void **ppvObject)
564 saxattributes *This = impl_from_ISAXAttributes(iface);
566 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
568 *ppvObject = NULL;
570 if (IsEqualGUID(riid, &IID_IUnknown) ||
571 IsEqualGUID(riid, &IID_ISAXAttributes))
573 *ppvObject = iface;
575 else
577 FIXME("interface %s not implemented\n", debugstr_guid(riid));
578 return E_NOINTERFACE;
581 ISAXAttributes_AddRef(iface);
583 return S_OK;
586 static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
588 saxattributes *This = impl_from_ISAXAttributes(iface);
589 TRACE("%p\n", This);
590 return InterlockedIncrement(&This->ref);
593 static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
595 saxattributes *This = impl_from_ISAXAttributes(iface);
596 LONG ref;
598 TRACE("%p\n", This);
600 ref = InterlockedDecrement(&This->ref);
601 if (ref==0)
603 int index;
604 for(index=0; index<This->nb_attributes; index++)
606 SysFreeString(This->szLocalname[index]);
607 SysFreeString(This->szURI[index]);
608 SysFreeString(This->szValue[index]);
609 SysFreeString(This->szQName[index]);
612 HeapFree(GetProcessHeap(), 0, This->szLocalname);
613 HeapFree(GetProcessHeap(), 0, This->szURI);
614 HeapFree(GetProcessHeap(), 0, This->szValue);
615 HeapFree(GetProcessHeap(), 0, This->szQName);
617 HeapFree(GetProcessHeap(), 0, This);
620 return ref;
623 /*** ISAXAttributes methods ***/
624 static HRESULT WINAPI isaxattributes_getLength(
625 ISAXAttributes* iface,
626 int *length)
628 saxattributes *This = impl_from_ISAXAttributes( iface );
630 *length = This->nb_attributes;
631 TRACE("Length set to %d\n", *length);
632 return S_OK;
635 static HRESULT WINAPI isaxattributes_getURI(
636 ISAXAttributes* iface,
637 int nIndex,
638 const WCHAR **pUrl,
639 int *pUriSize)
641 saxattributes *This = impl_from_ISAXAttributes( iface );
642 TRACE("(%p)->(%d)\n", This, nIndex);
644 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
645 if(!pUrl || !pUriSize) return E_POINTER;
647 *pUriSize = SysStringLen(This->szURI[nIndex]);
648 *pUrl = This->szURI[nIndex];
650 return S_OK;
653 static HRESULT WINAPI isaxattributes_getLocalName(
654 ISAXAttributes* iface,
655 int nIndex,
656 const WCHAR **pLocalName,
657 int *pLocalNameLength)
659 saxattributes *This = impl_from_ISAXAttributes( iface );
660 TRACE("(%p)->(%d)\n", This, nIndex);
662 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
663 if(!pLocalName || !pLocalNameLength) return E_POINTER;
665 *pLocalNameLength = SysStringLen(This->szLocalname[nIndex]);
666 *pLocalName = This->szLocalname[nIndex];
668 return S_OK;
671 static HRESULT WINAPI isaxattributes_getQName(
672 ISAXAttributes* iface,
673 int nIndex,
674 const WCHAR **pQName,
675 int *pQNameLength)
677 saxattributes *This = impl_from_ISAXAttributes( iface );
678 TRACE("(%p)->(%d)\n", This, nIndex);
680 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
681 if(!pQName || !pQNameLength) return E_POINTER;
683 *pQNameLength = SysStringLen(This->szQName[nIndex]);
684 *pQName = This->szQName[nIndex];
686 return S_OK;
689 static HRESULT WINAPI isaxattributes_getName(
690 ISAXAttributes* iface,
691 int nIndex,
692 const WCHAR **pUri,
693 int *pUriLength,
694 const WCHAR **pLocalName,
695 int *pLocalNameSize,
696 const WCHAR **pQName,
697 int *pQNameLength)
699 saxattributes *This = impl_from_ISAXAttributes( iface );
700 TRACE("(%p)->(%d)\n", This, nIndex);
702 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
703 if(!pUri || !pUriLength || !pLocalName || !pLocalNameSize
704 || !pQName || !pQNameLength) return E_POINTER;
706 *pUriLength = SysStringLen(This->szURI[nIndex]);
707 *pUri = This->szURI[nIndex];
708 *pLocalNameSize = SysStringLen(This->szLocalname[nIndex]);
709 *pLocalName = This->szLocalname[nIndex];
710 *pQNameLength = SysStringLen(This->szQName[nIndex]);
711 *pQName = This->szQName[nIndex];
713 return S_OK;
716 static HRESULT WINAPI isaxattributes_getIndexFromName(
717 ISAXAttributes* iface,
718 const WCHAR *pUri,
719 int cUriLength,
720 const WCHAR *pLocalName,
721 int cocalNameLength,
722 int *index)
724 saxattributes *This = impl_from_ISAXAttributes( iface );
725 int i;
726 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), cUriLength,
727 debugstr_w(pLocalName), cocalNameLength);
729 if(!pUri || !pLocalName || !index) return E_POINTER;
731 for(i=0; i<This->nb_attributes; i++)
733 if(cUriLength!=SysStringLen(This->szURI[i])
734 || cocalNameLength!=SysStringLen(This->szLocalname[i]))
735 continue;
736 if(cUriLength && memcmp(pUri, This->szURI[i],
737 sizeof(WCHAR)*cUriLength))
738 continue;
739 if(cocalNameLength && memcmp(pLocalName, This->szLocalname[i],
740 sizeof(WCHAR)*cocalNameLength))
741 continue;
743 *index = i;
744 return S_OK;
747 return E_INVALIDARG;
750 static HRESULT WINAPI isaxattributes_getIndexFromQName(
751 ISAXAttributes* iface,
752 const WCHAR *pQName,
753 int nQNameLength,
754 int *index)
756 saxattributes *This = impl_from_ISAXAttributes( iface );
757 int i;
758 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQNameLength);
760 if(!pQName || !index) return E_POINTER;
761 if(!nQNameLength) return E_INVALIDARG;
763 for(i=0; i<This->nb_attributes; i++)
765 if(nQNameLength!=SysStringLen(This->szQName[i])) continue;
766 if(memcmp(pQName, This->szQName, sizeof(WCHAR)*nQNameLength)) continue;
768 *index = i;
769 return S_OK;
772 return E_INVALIDARG;
775 static HRESULT WINAPI isaxattributes_getType(
776 ISAXAttributes* iface,
777 int nIndex,
778 const WCHAR **pType,
779 int *pTypeLength)
781 saxattributes *This = impl_from_ISAXAttributes( iface );
783 FIXME("(%p)->(%d) stub\n", This, nIndex);
784 return E_NOTIMPL;
787 static HRESULT WINAPI isaxattributes_getTypeFromName(
788 ISAXAttributes* iface,
789 const WCHAR *pUri,
790 int nUri,
791 const WCHAR *pLocalName,
792 int nLocalName,
793 const WCHAR **pType,
794 int *nType)
796 saxattributes *This = impl_from_ISAXAttributes( iface );
798 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
799 debugstr_w(pLocalName), nLocalName);
800 return E_NOTIMPL;
803 static HRESULT WINAPI isaxattributes_getTypeFromQName(
804 ISAXAttributes* iface,
805 const WCHAR *pQName,
806 int nQName,
807 const WCHAR **pType,
808 int *nType)
810 saxattributes *This = impl_from_ISAXAttributes( iface );
812 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
813 return E_NOTIMPL;
816 static HRESULT WINAPI isaxattributes_getValue(
817 ISAXAttributes* iface,
818 int nIndex,
819 const WCHAR **pValue,
820 int *nValue)
822 saxattributes *This = impl_from_ISAXAttributes( iface );
823 TRACE("(%p)->(%d)\n", This, nIndex);
825 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
826 if(!pValue || !nValue) return E_POINTER;
828 *nValue = SysStringLen(This->szValue[nIndex]);
829 *pValue = This->szValue[nIndex];
831 return S_OK;
834 static HRESULT WINAPI isaxattributes_getValueFromName(
835 ISAXAttributes* iface,
836 const WCHAR *pUri,
837 int nUri,
838 const WCHAR *pLocalName,
839 int nLocalName,
840 const WCHAR **pValue,
841 int *nValue)
843 HRESULT hr;
844 int index;
845 saxattributes *This = impl_from_ISAXAttributes( iface );
846 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), nUri,
847 debugstr_w(pLocalName), nLocalName);
849 hr = ISAXAttributes_getIndexFromName(iface,
850 pUri, nUri, pLocalName, nLocalName, &index);
851 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
853 return hr;
856 static HRESULT WINAPI isaxattributes_getValueFromQName(
857 ISAXAttributes* iface,
858 const WCHAR *pQName,
859 int nQName,
860 const WCHAR **pValue,
861 int *nValue)
863 HRESULT hr;
864 int index;
865 saxattributes *This = impl_from_ISAXAttributes( iface );
866 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQName);
868 hr = ISAXAttributes_getIndexFromQName(iface, pQName, nQName, &index);
869 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
871 return hr;
874 static const struct ISAXAttributesVtbl isaxattributes_vtbl =
876 isaxattributes_QueryInterface,
877 isaxattributes_AddRef,
878 isaxattributes_Release,
879 isaxattributes_getLength,
880 isaxattributes_getURI,
881 isaxattributes_getLocalName,
882 isaxattributes_getQName,
883 isaxattributes_getName,
884 isaxattributes_getIndexFromName,
885 isaxattributes_getIndexFromQName,
886 isaxattributes_getType,
887 isaxattributes_getTypeFromName,
888 isaxattributes_getTypeFromQName,
889 isaxattributes_getValue,
890 isaxattributes_getValueFromName,
891 isaxattributes_getValueFromQName
894 static HRESULT SAXAttributes_create(saxattributes **attr,
895 int nb_namespaces, const xmlChar **xmlNamespaces,
896 int nb_attributes, const xmlChar **xmlAttributes)
898 saxattributes *attributes;
899 int index;
900 static const xmlChar xmlns[] = "xmlns";
902 attributes = HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes));
903 if(!attributes)
904 return E_OUTOFMEMORY;
906 attributes->lpVBSAXAttributesVtbl = &ivbsaxattributes_vtbl;
907 attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
908 attributes->ref = 1;
910 attributes->nb_attributes = nb_namespaces+nb_attributes;
912 attributes->szLocalname =
913 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
914 attributes->szURI =
915 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
916 attributes->szValue =
917 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
918 attributes->szQName =
919 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
921 if(!attributes->szLocalname || !attributes->szURI
922 || !attributes->szValue || !attributes->szQName)
924 HeapFree(GetProcessHeap(), 0, attributes->szLocalname);
925 HeapFree(GetProcessHeap(), 0, attributes->szURI);
926 HeapFree(GetProcessHeap(), 0, attributes->szValue);
927 HeapFree(GetProcessHeap(), 0, attributes->szQName);
928 HeapFree(GetProcessHeap(), 0, attributes);
929 return E_FAIL;
932 for(index=0; index<nb_namespaces; index++)
934 attributes->szLocalname[index] = SysAllocStringLen(NULL, 0);
935 attributes->szURI[index] = SysAllocStringLen(NULL, 0);
936 attributes->szValue[index] = bstr_from_xmlChar(xmlNamespaces[2*index+1]);
937 attributes->szQName[index] = QName_from_xmlChar(xmlns, xmlNamespaces[2*index]);
940 for(index=0; index<nb_attributes; index++)
942 attributes->szLocalname[nb_namespaces+index] =
943 bstr_from_xmlChar(xmlAttributes[index*5]);
944 attributes->szURI[nb_namespaces+index] =
945 bstr_from_xmlChar(xmlAttributes[index*5+2]);
946 attributes->szValue[nb_namespaces+index] =
947 bstr_from_xmlCharN(xmlAttributes[index*5+3],
948 xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
949 attributes->szQName[nb_namespaces+index] =
950 QName_from_xmlChar(xmlAttributes[index*5+1], xmlAttributes[index*5]);
953 *attr = attributes;
955 TRACE("returning %p\n", *attr);
957 return S_OK;
960 /*** LibXML callbacks ***/
961 static void libxmlStartDocument(void *ctx)
963 saxlocator *This = ctx;
964 HRESULT hr;
966 if((This->vbInterface && This->saxreader->vbcontentHandler)
967 || (!This->vbInterface && This->saxreader->contentHandler))
969 if(This->vbInterface)
970 hr = IVBSAXContentHandler_startDocument(This->saxreader->vbcontentHandler);
971 else
972 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
974 if(hr != S_OK)
975 format_error_message_from_id(This, hr);
978 update_position(This, NULL);
981 static void libxmlEndDocument(void *ctx)
983 saxlocator *This = ctx;
984 HRESULT hr;
986 This->column = 0;
987 This->line = 0;
989 if(This->ret != S_OK) return;
991 if((This->vbInterface && This->saxreader->vbcontentHandler)
992 || (!This->vbInterface && This->saxreader->contentHandler))
994 if(This->vbInterface)
995 hr = IVBSAXContentHandler_endDocument(This->saxreader->vbcontentHandler);
996 else
997 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
999 if(hr != S_OK)
1000 format_error_message_from_id(This, hr);
1004 static void libxmlStartElementNS(
1005 void *ctx,
1006 const xmlChar *localname,
1007 const xmlChar *prefix,
1008 const xmlChar *URI,
1009 int nb_namespaces,
1010 const xmlChar **namespaces,
1011 int nb_attributes,
1012 int nb_defaulted,
1013 const xmlChar **attributes)
1015 BSTR NamespaceUri, LocalName, QName, Prefix, Uri;
1016 saxlocator *This = ctx;
1017 HRESULT hr;
1018 saxattributes *attr;
1019 int index;
1021 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
1023 hr = namespacePush(This, nb_namespaces);
1024 if(hr==S_OK && ((This->vbInterface && This->saxreader->vbcontentHandler)
1025 || (!This->vbInterface && This->saxreader->contentHandler)))
1027 for(index=0; index<nb_namespaces; index++)
1029 Prefix = bstr_from_xmlChar(namespaces[2*index]);
1030 Uri = bstr_from_xmlChar(namespaces[2*index+1]);
1032 if(This->vbInterface)
1033 hr = IVBSAXContentHandler_startPrefixMapping(
1034 This->saxreader->vbcontentHandler,
1035 &Prefix, &Uri);
1036 else
1037 hr = ISAXContentHandler_startPrefixMapping(
1038 This->saxreader->contentHandler,
1039 Prefix, SysStringLen(Prefix),
1040 Uri, SysStringLen(Uri));
1042 SysFreeString(Prefix);
1043 SysFreeString(Uri);
1045 if(hr != S_OK)
1047 format_error_message_from_id(This, hr);
1048 return;
1052 NamespaceUri = bstr_from_xmlChar(URI);
1053 LocalName = bstr_from_xmlChar(localname);
1054 QName = QName_from_xmlChar(prefix, localname);
1056 hr = SAXAttributes_create(&attr, nb_namespaces, namespaces, nb_attributes, attributes);
1057 if(hr == S_OK)
1059 if(This->vbInterface)
1060 hr = IVBSAXContentHandler_startElement(
1061 This->saxreader->vbcontentHandler,
1062 &NamespaceUri, &LocalName, &QName,
1063 (IVBSAXAttributes*)&attr->lpVBSAXAttributesVtbl);
1064 else
1065 hr = ISAXContentHandler_startElement(
1066 This->saxreader->contentHandler,
1067 NamespaceUri, SysStringLen(NamespaceUri),
1068 LocalName, SysStringLen(LocalName),
1069 QName, SysStringLen(QName),
1070 (ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1072 ISAXAttributes_Release((ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1075 SysFreeString(NamespaceUri);
1076 SysFreeString(LocalName);
1077 SysFreeString(QName);
1080 if(hr != S_OK)
1081 format_error_message_from_id(This, hr);
1084 static void libxmlEndElementNS(
1085 void *ctx,
1086 const xmlChar *localname,
1087 const xmlChar *prefix,
1088 const xmlChar *URI)
1090 BSTR NamespaceUri, LocalName, QName, Prefix;
1091 saxlocator *This = ctx;
1092 HRESULT hr;
1093 xmlChar *end;
1094 int nsNr, index;
1096 end = This->lastCur;
1097 while(*end != '<' && *(end+1) != '/') end++;
1098 update_position(This, end+2);
1100 nsNr = namespacePop(This);
1102 if((This->vbInterface && This->saxreader->vbcontentHandler)
1103 || (!This->vbInterface && This->saxreader->contentHandler))
1105 NamespaceUri = bstr_from_xmlChar(URI);
1106 LocalName = bstr_from_xmlChar(localname);
1107 QName = QName_from_xmlChar(prefix, localname);
1109 if(This->vbInterface)
1110 hr = IVBSAXContentHandler_endElement(
1111 This->saxreader->vbcontentHandler,
1112 &NamespaceUri, &LocalName, &QName);
1113 else
1114 hr = ISAXContentHandler_endElement(
1115 This->saxreader->contentHandler,
1116 NamespaceUri, SysStringLen(NamespaceUri),
1117 LocalName, SysStringLen(LocalName),
1118 QName, SysStringLen(QName));
1120 SysFreeString(NamespaceUri);
1121 SysFreeString(LocalName);
1122 SysFreeString(QName);
1124 if(hr != S_OK)
1126 format_error_message_from_id(This, hr);
1127 return;
1130 for(index=This->pParserCtxt->nsNr-2;
1131 index>=This->pParserCtxt->nsNr-nsNr*2; index-=2)
1133 Prefix = bstr_from_xmlChar(This->pParserCtxt->nsTab[index]);
1135 if(This->vbInterface)
1136 hr = IVBSAXContentHandler_endPrefixMapping(
1137 This->saxreader->vbcontentHandler, &Prefix);
1138 else
1139 hr = ISAXContentHandler_endPrefixMapping(
1140 This->saxreader->contentHandler,
1141 Prefix, SysStringLen(Prefix));
1143 SysFreeString(Prefix);
1148 static void libxmlCharacters(
1149 void *ctx,
1150 const xmlChar *ch,
1151 int len)
1153 BSTR Chars;
1154 saxlocator *This = ctx;
1155 HRESULT hr;
1156 xmlChar *end;
1157 xmlChar *lastCurCopy;
1158 xmlChar *chEnd;
1159 int columnCopy;
1160 int lineCopy;
1162 if(*(This->lastCur-1) != '>' && *(This->lastCur-1) != '/') return;
1164 if(*(This->lastCur-1) != '>')
1166 end = (xmlChar*)This->pParserCtxt->input->cur-len;
1167 while(*(end-1) != '>') end--;
1168 update_position(This, end);
1171 chEnd = This->lastCur+len;
1172 while(*chEnd != '<') chEnd++;
1174 Chars = bstr_from_xmlChar(ch);
1176 lastCurCopy = This->lastCur;
1177 columnCopy = This->column;
1178 lineCopy = This->line;
1179 end = This->lastCur;
1181 if((This->vbInterface && This->saxreader->vbcontentHandler)
1182 || (!This->vbInterface && This->saxreader->contentHandler))
1184 while(This->lastCur < chEnd)
1186 end = This->lastCur;
1187 while(end < chEnd-1)
1189 if(*end == '\r') break;
1190 end++;
1193 Chars = bstr_from_xmlChar(This->lastCur);
1195 if(*end == '\r' && *(end+1) == '\n')
1197 memmove((WCHAR*)Chars+(end-This->lastCur),
1198 (WCHAR*)Chars+(end-This->lastCur)+1,
1199 (SysStringLen(Chars)-(end-This->lastCur))*sizeof(WCHAR));
1200 SysReAllocStringLen(&Chars, Chars, SysStringLen(Chars)-1);
1202 else if(*end == '\r') Chars[end-This->lastCur] = '\n';
1204 if(This->vbInterface)
1205 hr = IVBSAXContentHandler_characters(
1206 This->saxreader->vbcontentHandler, &Chars);
1207 else
1208 hr = ISAXContentHandler_characters(
1209 This->saxreader->contentHandler,
1210 Chars, end-This->lastCur+1);
1212 SysFreeString(Chars);
1213 if(hr != S_OK)
1215 format_error_message_from_id(This, hr);
1216 return;
1219 if(*(end+1) == '\n') end++;
1220 if(end < chEnd) end++;
1222 This->column += end-This->lastCur;
1223 This->lastCur = end;
1226 This->lastCur = lastCurCopy;
1227 This->column = columnCopy;
1228 This->line = lineCopy;
1229 update_position(This, chEnd);
1233 static void libxmlSetDocumentLocator(
1234 void *ctx,
1235 xmlSAXLocatorPtr loc)
1237 saxlocator *This = ctx;
1238 HRESULT hr;
1240 if(This->vbInterface)
1241 hr = IVBSAXContentHandler_putref_documentLocator(
1242 This->saxreader->vbcontentHandler,
1243 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
1244 else
1245 hr = ISAXContentHandler_putDocumentLocator(
1246 This->saxreader->contentHandler,
1247 (ISAXLocator*)&This->lpSAXLocatorVtbl);
1249 if(FAILED(hr))
1250 format_error_message_from_id(This, hr);
1253 void libxmlFatalError(void *ctx, const char *msg, ...)
1255 saxlocator *This = ctx;
1256 char message[1024];
1257 WCHAR *wszError;
1258 DWORD len;
1259 va_list args;
1261 if((This->vbInterface && !This->saxreader->vberrorHandler)
1262 || (!This->vbInterface && !This->saxreader->errorHandler))
1264 xmlStopParser(This->pParserCtxt);
1265 This->ret = E_FAIL;
1266 return;
1269 FIXME("Error handling is not compatible.\n");
1271 va_start(args, msg);
1272 vsprintf(message, msg, args);
1273 va_end(args);
1275 len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0);
1276 wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
1277 if(wszError)
1278 MultiByteToWideChar(CP_UNIXCP, 0, message, -1, (LPWSTR)wszError, len);
1280 if(This->vbInterface)
1282 BSTR bstrError = SysAllocString(wszError);
1283 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
1284 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrError, E_FAIL);
1286 else
1287 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
1288 (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
1290 HeapFree(GetProcessHeap(), 0, wszError);
1292 xmlStopParser(This->pParserCtxt);
1293 This->ret = E_FAIL;
1296 /*** IVBSAXLocator interface ***/
1297 /*** IUnknown methods ***/
1298 static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject)
1300 saxlocator *This = impl_from_IVBSAXLocator( iface );
1302 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject);
1304 *ppvObject = NULL;
1306 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1307 IsEqualGUID( riid, &IID_IDispatch) ||
1308 IsEqualGUID( riid, &IID_IVBSAXLocator ))
1310 *ppvObject = iface;
1312 else
1314 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1315 return E_NOINTERFACE;
1318 IVBSAXLocator_AddRef( iface );
1320 return S_OK;
1323 static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator* iface)
1325 saxlocator *This = impl_from_IVBSAXLocator( iface );
1326 TRACE("%p\n", This );
1327 return InterlockedIncrement( &This->ref );
1330 static ULONG WINAPI ivbsaxlocator_Release(
1331 IVBSAXLocator* iface)
1333 saxlocator *This = impl_from_IVBSAXLocator( iface );
1334 return ISAXLocator_Release((ISAXLocator*)&This->lpVBSAXLocatorVtbl);
1337 /*** IDispatch methods ***/
1338 static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator *iface, UINT* pctinfo )
1340 saxlocator *This = impl_from_IVBSAXLocator( iface );
1342 TRACE("(%p)->(%p)\n", This, pctinfo);
1344 *pctinfo = 1;
1346 return S_OK;
1349 static HRESULT WINAPI ivbsaxlocator_GetTypeInfo(
1350 IVBSAXLocator *iface,
1351 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
1353 saxlocator *This = impl_from_IVBSAXLocator( iface );
1354 HRESULT hr;
1356 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1358 hr = get_typeinfo(IVBSAXLocator_tid, ppTInfo);
1360 return hr;
1363 static HRESULT WINAPI ivbsaxlocator_GetIDsOfNames(
1364 IVBSAXLocator *iface,
1365 REFIID riid,
1366 LPOLESTR* rgszNames,
1367 UINT cNames,
1368 LCID lcid,
1369 DISPID* rgDispId)
1371 saxlocator *This = impl_from_IVBSAXLocator( iface );
1372 ITypeInfo *typeinfo;
1373 HRESULT hr;
1375 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1376 lcid, rgDispId);
1378 if(!rgszNames || cNames == 0 || !rgDispId)
1379 return E_INVALIDARG;
1381 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1382 if(SUCCEEDED(hr))
1384 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1385 ITypeInfo_Release(typeinfo);
1388 return hr;
1391 static HRESULT WINAPI ivbsaxlocator_Invoke(
1392 IVBSAXLocator *iface,
1393 DISPID dispIdMember,
1394 REFIID riid,
1395 LCID lcid,
1396 WORD wFlags,
1397 DISPPARAMS* pDispParams,
1398 VARIANT* pVarResult,
1399 EXCEPINFO* pExcepInfo,
1400 UINT* puArgErr)
1402 saxlocator *This = impl_from_IVBSAXLocator( iface );
1403 ITypeInfo *typeinfo;
1404 HRESULT hr;
1406 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1407 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1409 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1410 if(SUCCEEDED(hr))
1412 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXLocatorVtbl), dispIdMember, wFlags, pDispParams,
1413 pVarResult, pExcepInfo, puArgErr);
1414 ITypeInfo_Release(typeinfo);
1417 return hr;
1420 /*** IVBSAXLocator methods ***/
1421 static HRESULT WINAPI ivbsaxlocator_get_columnNumber(
1422 IVBSAXLocator* iface,
1423 int *pnColumn)
1425 saxlocator *This = impl_from_IVBSAXLocator( iface );
1426 return ISAXLocator_getColumnNumber(
1427 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1428 pnColumn);
1431 static HRESULT WINAPI ivbsaxlocator_get_lineNumber(
1432 IVBSAXLocator* iface,
1433 int *pnLine)
1435 saxlocator *This = impl_from_IVBSAXLocator( iface );
1436 return ISAXLocator_getLineNumber(
1437 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1438 pnLine);
1441 static HRESULT WINAPI ivbsaxlocator_get_publicId(
1442 IVBSAXLocator* iface,
1443 BSTR* publicId)
1445 saxlocator *This = impl_from_IVBSAXLocator( iface );
1446 return ISAXLocator_getPublicId(
1447 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1448 (const WCHAR**)publicId);
1451 static HRESULT WINAPI ivbsaxlocator_get_systemId(
1452 IVBSAXLocator* iface,
1453 BSTR* systemId)
1455 saxlocator *This = impl_from_IVBSAXLocator( iface );
1456 return ISAXLocator_getSystemId(
1457 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1458 (const WCHAR**)systemId);
1461 static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl =
1463 ivbsaxlocator_QueryInterface,
1464 ivbsaxlocator_AddRef,
1465 ivbsaxlocator_Release,
1466 ivbsaxlocator_GetTypeInfoCount,
1467 ivbsaxlocator_GetTypeInfo,
1468 ivbsaxlocator_GetIDsOfNames,
1469 ivbsaxlocator_Invoke,
1470 ivbsaxlocator_get_columnNumber,
1471 ivbsaxlocator_get_lineNumber,
1472 ivbsaxlocator_get_publicId,
1473 ivbsaxlocator_get_systemId
1476 /*** ISAXLocator interface ***/
1477 /*** IUnknown methods ***/
1478 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
1480 saxlocator *This = impl_from_ISAXLocator( iface );
1482 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1484 *ppvObject = NULL;
1486 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1487 IsEqualGUID( riid, &IID_ISAXLocator ))
1489 *ppvObject = iface;
1491 else
1493 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1494 return E_NOINTERFACE;
1497 ISAXLocator_AddRef( iface );
1499 return S_OK;
1502 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
1504 saxlocator *This = impl_from_ISAXLocator( iface );
1505 TRACE("%p\n", This );
1506 return InterlockedIncrement( &This->ref );
1509 static ULONG WINAPI isaxlocator_Release(
1510 ISAXLocator* iface)
1512 saxlocator *This = impl_from_ISAXLocator( iface );
1513 LONG ref;
1515 TRACE("%p\n", This );
1517 ref = InterlockedDecrement( &This->ref );
1518 if ( ref == 0 )
1520 if(This->publicId)
1521 SysFreeString(This->publicId);
1522 if(This->systemId)
1523 SysFreeString(This->systemId);
1524 HeapFree(GetProcessHeap(), 0, This->nsStack);
1526 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
1527 HeapFree( GetProcessHeap(), 0, This );
1530 return ref;
1533 /*** ISAXLocator methods ***/
1534 static HRESULT WINAPI isaxlocator_getColumnNumber(
1535 ISAXLocator* iface,
1536 int *pnColumn)
1538 saxlocator *This = impl_from_ISAXLocator( iface );
1540 *pnColumn = This->column;
1541 return S_OK;
1544 static HRESULT WINAPI isaxlocator_getLineNumber(
1545 ISAXLocator* iface,
1546 int *pnLine)
1548 saxlocator *This = impl_from_ISAXLocator( iface );
1550 *pnLine = This->line;
1551 return S_OK;
1554 static HRESULT WINAPI isaxlocator_getPublicId(
1555 ISAXLocator* iface,
1556 const WCHAR ** ppwchPublicId)
1558 BSTR publicId;
1559 saxlocator *This = impl_from_ISAXLocator( iface );
1561 if(This->publicId) SysFreeString(This->publicId);
1563 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
1564 if(SysStringLen(publicId))
1565 This->publicId = (WCHAR*)&publicId;
1566 else
1568 SysFreeString(publicId);
1569 This->publicId = NULL;
1572 *ppwchPublicId = This->publicId;
1573 return S_OK;
1576 static HRESULT WINAPI isaxlocator_getSystemId(
1577 ISAXLocator* iface,
1578 const WCHAR ** ppwchSystemId)
1580 BSTR systemId;
1581 saxlocator *This = impl_from_ISAXLocator( iface );
1583 if(This->systemId) SysFreeString(This->systemId);
1585 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
1586 if(SysStringLen(systemId))
1587 This->systemId = (WCHAR*)&systemId;
1588 else
1590 SysFreeString(systemId);
1591 This->systemId = NULL;
1594 *ppwchSystemId = This->systemId;
1595 return S_OK;
1598 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
1600 isaxlocator_QueryInterface,
1601 isaxlocator_AddRef,
1602 isaxlocator_Release,
1603 isaxlocator_getColumnNumber,
1604 isaxlocator_getLineNumber,
1605 isaxlocator_getPublicId,
1606 isaxlocator_getSystemId
1609 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
1611 saxlocator *locator;
1613 locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) );
1614 if( !locator )
1615 return E_OUTOFMEMORY;
1617 locator->lpVBSAXLocatorVtbl = &ivbsaxlocator_vtbl;
1618 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
1619 locator->ref = 1;
1620 locator->vbInterface = vbInterface;
1622 locator->saxreader = reader;
1623 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1625 locator->pParserCtxt = NULL;
1626 locator->publicId = NULL;
1627 locator->systemId = NULL;
1628 locator->lastCur = NULL;
1629 locator->line = 0;
1630 locator->column = 0;
1631 locator->ret = S_OK;
1632 locator->nsStackSize = 8;
1633 locator->nsStackLast = 0;
1634 locator->nsStack = HeapAlloc(GetProcessHeap(), 0, locator->nsStackSize);
1635 if(!locator->nsStack)
1637 ISAXXMLReader_Release((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1638 HeapFree(GetProcessHeap(), 0, locator);
1639 return E_OUTOFMEMORY;
1642 *ppsaxlocator = locator;
1644 TRACE("returning %p\n", *ppsaxlocator);
1646 return S_OK;
1649 /*** SAXXMLReader internal functions ***/
1650 static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
1652 saxlocator *locator;
1653 HRESULT hr;
1655 hr = SAXLocator_create(This, &locator, vbInterface);
1656 if(FAILED(hr))
1657 return E_FAIL;
1659 locator->pParserCtxt = xmlCreateMemoryParserCtxt(buffer, size);
1660 if(!locator->pParserCtxt)
1662 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1663 return E_FAIL;
1666 locator->pParserCtxt->sax = &locator->saxreader->sax;
1667 locator->pParserCtxt->userData = locator;
1669 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1670 else hr = locator->ret;
1672 if(locator->pParserCtxt)
1674 locator->pParserCtxt->sax = NULL;
1675 xmlFreeParserCtxt(locator->pParserCtxt);
1676 locator->pParserCtxt = NULL;
1679 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1680 return S_OK;
1683 static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
1685 saxlocator *locator;
1686 HRESULT hr;
1687 ULONG dataRead;
1688 char data[1024];
1690 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1691 if(hr != S_OK)
1692 return hr;
1694 hr = SAXLocator_create(This, &locator, vbInterface);
1695 if(FAILED(hr))
1696 return E_FAIL;
1698 locator->pParserCtxt = xmlCreatePushParserCtxt(
1699 &locator->saxreader->sax, locator,
1700 data, dataRead, NULL);
1701 if(!locator->pParserCtxt)
1703 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1704 return E_FAIL;
1707 while(1)
1709 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1710 if(hr != S_OK)
1711 break;
1713 if(xmlParseChunk(locator->pParserCtxt, data, dataRead, 0)) hr = E_FAIL;
1714 else hr = locator->ret;
1716 if(hr != S_OK) break;
1718 if(dataRead != sizeof(data))
1720 if(xmlParseChunk(locator->pParserCtxt, data, 0, 1)) hr = E_FAIL;
1721 else hr = locator->ret;
1723 break;
1727 locator->pParserCtxt->sax = NULL;
1728 xmlFreeParserCtxt(locator->pParserCtxt);
1729 locator->pParserCtxt = NULL;
1730 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1731 return hr;
1734 static HRESULT WINAPI internal_getEntityResolver(
1735 saxreader *This,
1736 void *pEntityResolver,
1737 BOOL vbInterface)
1739 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1740 return E_NOTIMPL;
1743 static HRESULT WINAPI internal_putEntityResolver(
1744 saxreader *This,
1745 void *pEntityResolver,
1746 BOOL vbInterface)
1748 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1749 return E_NOTIMPL;
1752 static HRESULT WINAPI internal_getContentHandler(
1753 saxreader* This,
1754 void *pContentHandler,
1755 BOOL vbInterface)
1757 TRACE("(%p)->(%p)\n", This, pContentHandler);
1758 if(pContentHandler == NULL)
1759 return E_POINTER;
1760 if((vbInterface && This->vbcontentHandler)
1761 || (!vbInterface && This->contentHandler))
1763 if(vbInterface)
1764 IVBSAXContentHandler_AddRef(This->vbcontentHandler);
1765 else
1766 ISAXContentHandler_AddRef(This->contentHandler);
1768 if(vbInterface) *(IVBSAXContentHandler**)pContentHandler =
1769 This->vbcontentHandler;
1770 else *(ISAXContentHandler**)pContentHandler = This->contentHandler;
1772 return S_OK;
1775 static HRESULT WINAPI internal_putContentHandler(
1776 saxreader* This,
1777 void *contentHandler,
1778 BOOL vbInterface)
1780 TRACE("(%p)->(%p)\n", This, contentHandler);
1781 if(contentHandler)
1783 if(vbInterface)
1784 IVBSAXContentHandler_AddRef((IVBSAXContentHandler*)contentHandler);
1785 else
1786 ISAXContentHandler_AddRef((ISAXContentHandler*)contentHandler);
1788 if((vbInterface && This->vbcontentHandler)
1789 || (!vbInterface && This->contentHandler))
1791 if(vbInterface)
1792 IVBSAXContentHandler_Release(This->vbcontentHandler);
1793 else
1794 ISAXContentHandler_Release(This->contentHandler);
1796 if(vbInterface)
1797 This->vbcontentHandler = contentHandler;
1798 else
1799 This->contentHandler = contentHandler;
1801 return S_OK;
1804 static HRESULT WINAPI internal_getDTDHandler(
1805 saxreader* This,
1806 void *pDTDHandler,
1807 BOOL vbInterface)
1809 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1810 return E_NOTIMPL;
1813 static HRESULT WINAPI internal_putDTDHandler(
1814 saxreader* This,
1815 void *pDTDHandler,
1816 BOOL vbInterface)
1818 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1819 return E_NOTIMPL;
1822 static HRESULT WINAPI internal_getErrorHandler(
1823 saxreader* This,
1824 void *pErrorHandler,
1825 BOOL vbInterface)
1827 TRACE("(%p)->(%p)\n", This, pErrorHandler);
1828 if(pErrorHandler == NULL)
1829 return E_POINTER;
1831 if(vbInterface && This->vberrorHandler)
1832 IVBSAXErrorHandler_AddRef(This->vberrorHandler);
1833 else if(!vbInterface && This->errorHandler)
1834 ISAXErrorHandler_AddRef(This->errorHandler);
1836 if(vbInterface)
1837 *(IVBSAXErrorHandler**)pErrorHandler = This->vberrorHandler;
1838 else
1839 *(ISAXErrorHandler**)pErrorHandler = This->errorHandler;
1841 return S_OK;
1845 static HRESULT WINAPI internal_putErrorHandler(
1846 saxreader* This,
1847 void *errorHandler,
1848 BOOL vbInterface)
1850 TRACE("(%p)->(%p)\n", This, errorHandler);
1851 if(errorHandler)
1853 if(vbInterface)
1854 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler*)errorHandler);
1855 else
1856 ISAXErrorHandler_AddRef((ISAXErrorHandler*)errorHandler);
1859 if(vbInterface && This->vberrorHandler)
1860 IVBSAXErrorHandler_Release(This->vberrorHandler);
1861 else if(!vbInterface && This->errorHandler)
1862 ISAXErrorHandler_Release(This->errorHandler);
1864 if(vbInterface)
1865 This->vberrorHandler = errorHandler;
1866 else
1867 This->errorHandler = errorHandler;
1869 return S_OK;
1873 static HRESULT WINAPI internal_parse(
1874 saxreader* This,
1875 VARIANT varInput,
1876 BOOL vbInterface)
1878 HRESULT hr;
1880 TRACE("(%p)\n", This);
1882 hr = S_OK;
1883 switch(V_VT(&varInput))
1885 case VT_BSTR:
1886 hr = internal_parseBuffer(This, (const char*)V_BSTR(&varInput),
1887 SysStringByteLen(V_BSTR(&varInput)), vbInterface);
1888 break;
1889 case VT_ARRAY|VT_UI1: {
1890 void *pSAData;
1891 LONG lBound, uBound;
1892 ULONG dataRead;
1894 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
1895 if(hr != S_OK) break;
1896 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
1897 if(hr != S_OK) break;
1898 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
1899 hr = SafeArrayAccessData(V_ARRAY(&varInput), (void**)&pSAData);
1900 if(hr != S_OK) break;
1901 hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
1902 SafeArrayUnaccessData(V_ARRAY(&varInput));
1903 break;
1905 case VT_UNKNOWN:
1906 case VT_DISPATCH: {
1907 IPersistStream *persistStream;
1908 IStream *stream = NULL;
1909 IXMLDOMDocument *xmlDoc;
1911 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1912 &IID_IPersistStream, (void**)&persistStream) == S_OK)
1914 hr = IPersistStream_Save(persistStream, stream, TRUE);
1915 IPersistStream_Release(persistStream);
1916 if(hr != S_OK) break;
1918 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1919 &IID_IStream, (void**)&stream) == S_OK)
1921 hr = internal_parseStream(This, stream, vbInterface);
1922 IStream_Release(stream);
1923 break;
1925 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1926 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
1928 BSTR bstrData;
1930 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
1931 hr = internal_parseBuffer(This, (const char*)bstrData,
1932 SysStringByteLen(bstrData), vbInterface);
1933 IXMLDOMDocument_Release(xmlDoc);
1934 hr = E_NOTIMPL;
1935 break;
1938 default:
1939 WARN("vt %d not implemented\n", V_VT(&varInput));
1940 hr = E_INVALIDARG;
1943 return hr;
1946 static HRESULT internal_vbonDataAvailable(void *obj, char *ptr, DWORD len)
1948 saxreader *This = obj;
1950 return internal_parseBuffer(This, ptr, len, TRUE);
1953 static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len)
1955 saxreader *This = obj;
1957 return internal_parseBuffer(This, ptr, len, FALSE);
1960 static HRESULT WINAPI internal_parseURL(
1961 saxreader* This,
1962 const WCHAR *url,
1963 BOOL vbInterface)
1965 bsc_t *bsc;
1966 HRESULT hr;
1968 TRACE("(%p)->(%s)\n", This, debugstr_w(url));
1970 if(vbInterface) hr = bind_url(url, internal_vbonDataAvailable, This, &bsc);
1971 else hr = bind_url(url, internal_onDataAvailable, This, &bsc);
1973 if(FAILED(hr))
1974 return hr;
1976 detach_bsc(bsc);
1978 return S_OK;
1981 /*** IVBSAXXMLReader interface ***/
1982 /*** IUnknown methods ***/
1983 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
1985 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1987 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1989 *ppvObject = NULL;
1991 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1992 IsEqualGUID( riid, &IID_IDispatch ) ||
1993 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
1995 *ppvObject = iface;
1997 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
1999 *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
2001 else
2003 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2004 return E_NOINTERFACE;
2007 IVBSAXXMLReader_AddRef( iface );
2009 return S_OK;
2012 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
2014 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2015 TRACE("%p\n", This );
2016 return InterlockedIncrement( &This->ref );
2019 static ULONG WINAPI saxxmlreader_Release(
2020 IVBSAXXMLReader* iface)
2022 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2023 LONG ref;
2025 TRACE("%p\n", This );
2027 ref = InterlockedDecrement( &This->ref );
2028 if ( ref == 0 )
2030 if(This->contentHandler)
2031 ISAXContentHandler_Release(This->contentHandler);
2033 if(This->vbcontentHandler)
2034 IVBSAXContentHandler_Release(This->vbcontentHandler);
2036 if(This->errorHandler)
2037 ISAXErrorHandler_Release(This->errorHandler);
2039 if(This->vberrorHandler)
2040 IVBSAXErrorHandler_Release(This->vberrorHandler);
2042 HeapFree( GetProcessHeap(), 0, This );
2045 return ref;
2047 /*** IDispatch ***/
2048 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
2050 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2052 TRACE("(%p)->(%p)\n", This, pctinfo);
2054 *pctinfo = 1;
2056 return S_OK;
2059 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
2060 IVBSAXXMLReader *iface,
2061 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2063 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2064 HRESULT hr;
2066 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2068 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
2070 return hr;
2073 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
2074 IVBSAXXMLReader *iface,
2075 REFIID riid,
2076 LPOLESTR* rgszNames,
2077 UINT cNames,
2078 LCID lcid,
2079 DISPID* rgDispId)
2081 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2082 ITypeInfo *typeinfo;
2083 HRESULT hr;
2085 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2086 lcid, rgDispId);
2088 if(!rgszNames || cNames == 0 || !rgDispId)
2089 return E_INVALIDARG;
2091 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2092 if(SUCCEEDED(hr))
2094 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
2095 ITypeInfo_Release(typeinfo);
2098 return hr;
2101 static HRESULT WINAPI saxxmlreader_Invoke(
2102 IVBSAXXMLReader *iface,
2103 DISPID dispIdMember,
2104 REFIID riid,
2105 LCID lcid,
2106 WORD wFlags,
2107 DISPPARAMS* pDispParams,
2108 VARIANT* pVarResult,
2109 EXCEPINFO* pExcepInfo,
2110 UINT* puArgErr)
2112 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2113 ITypeInfo *typeinfo;
2114 HRESULT hr;
2116 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2117 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2119 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2120 if(SUCCEEDED(hr))
2122 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXXMLReaderVtbl), dispIdMember, wFlags, pDispParams,
2123 pVarResult, pExcepInfo, puArgErr);
2124 ITypeInfo_Release(typeinfo);
2127 return hr;
2130 /*** IVBSAXXMLReader methods ***/
2131 static HRESULT WINAPI saxxmlreader_getFeature(
2132 IVBSAXXMLReader* iface,
2133 const WCHAR *pFeature,
2134 VARIANT_BOOL *pValue)
2136 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2138 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
2139 return E_NOTIMPL;
2142 static HRESULT WINAPI saxxmlreader_putFeature(
2143 IVBSAXXMLReader* iface,
2144 const WCHAR *pFeature,
2145 VARIANT_BOOL vfValue)
2147 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2149 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
2150 return E_NOTIMPL;
2153 static HRESULT WINAPI saxxmlreader_getProperty(
2154 IVBSAXXMLReader* iface,
2155 const WCHAR *pProp,
2156 VARIANT *pValue)
2158 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2160 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
2161 return E_NOTIMPL;
2164 static HRESULT WINAPI saxxmlreader_putProperty(
2165 IVBSAXXMLReader* iface,
2166 const WCHAR *pProp,
2167 VARIANT value)
2169 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2171 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
2172 return E_NOTIMPL;
2175 static HRESULT WINAPI saxxmlreader_get_entityResolver(
2176 IVBSAXXMLReader* iface,
2177 IVBSAXEntityResolver **pEntityResolver)
2179 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2180 return internal_getEntityResolver(This, pEntityResolver, TRUE);
2183 static HRESULT WINAPI saxxmlreader_put_entityResolver(
2184 IVBSAXXMLReader* iface,
2185 IVBSAXEntityResolver *pEntityResolver)
2187 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2188 return internal_putEntityResolver(This, pEntityResolver, TRUE);
2191 static HRESULT WINAPI saxxmlreader_get_contentHandler(
2192 IVBSAXXMLReader* iface,
2193 IVBSAXContentHandler **ppContentHandler)
2195 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2196 return internal_getContentHandler(This, ppContentHandler, TRUE);
2199 static HRESULT WINAPI saxxmlreader_put_contentHandler(
2200 IVBSAXXMLReader* iface,
2201 IVBSAXContentHandler *contentHandler)
2203 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2204 return internal_putContentHandler(This, contentHandler, TRUE);
2207 static HRESULT WINAPI saxxmlreader_get_dtdHandler(
2208 IVBSAXXMLReader* iface,
2209 IVBSAXDTDHandler **pDTDHandler)
2211 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2212 return internal_getDTDHandler(This, pDTDHandler, TRUE);
2215 static HRESULT WINAPI saxxmlreader_put_dtdHandler(
2216 IVBSAXXMLReader* iface,
2217 IVBSAXDTDHandler *pDTDHandler)
2219 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2220 return internal_putDTDHandler(This, pDTDHandler, TRUE);
2223 static HRESULT WINAPI saxxmlreader_get_errorHandler(
2224 IVBSAXXMLReader* iface,
2225 IVBSAXErrorHandler **pErrorHandler)
2227 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2228 return internal_getErrorHandler(This, pErrorHandler, TRUE);
2231 static HRESULT WINAPI saxxmlreader_put_errorHandler(
2232 IVBSAXXMLReader* iface,
2233 IVBSAXErrorHandler *errorHandler)
2235 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2236 return internal_putErrorHandler(This, errorHandler, TRUE);
2239 static HRESULT WINAPI saxxmlreader_get_baseURL(
2240 IVBSAXXMLReader* iface,
2241 const WCHAR **pBaseUrl)
2243 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2245 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
2246 return E_NOTIMPL;
2249 static HRESULT WINAPI saxxmlreader_put_baseURL(
2250 IVBSAXXMLReader* iface,
2251 const WCHAR *pBaseUrl)
2253 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2255 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
2256 return E_NOTIMPL;
2259 static HRESULT WINAPI saxxmlreader_get_secureBaseURL(
2260 IVBSAXXMLReader* iface,
2261 const WCHAR **pSecureBaseUrl)
2263 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2265 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
2266 return E_NOTIMPL;
2270 static HRESULT WINAPI saxxmlreader_put_secureBaseURL(
2271 IVBSAXXMLReader* iface,
2272 const WCHAR *secureBaseUrl)
2274 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2276 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
2277 return E_NOTIMPL;
2280 static HRESULT WINAPI saxxmlreader_parse(
2281 IVBSAXXMLReader* iface,
2282 VARIANT varInput)
2284 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2285 return internal_parse(This, varInput, TRUE);
2288 static HRESULT WINAPI saxxmlreader_parseURL(
2289 IVBSAXXMLReader* iface,
2290 const WCHAR *url)
2292 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2293 return internal_parseURL(This, url, TRUE);
2296 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
2298 saxxmlreader_QueryInterface,
2299 saxxmlreader_AddRef,
2300 saxxmlreader_Release,
2301 saxxmlreader_GetTypeInfoCount,
2302 saxxmlreader_GetTypeInfo,
2303 saxxmlreader_GetIDsOfNames,
2304 saxxmlreader_Invoke,
2305 saxxmlreader_getFeature,
2306 saxxmlreader_putFeature,
2307 saxxmlreader_getProperty,
2308 saxxmlreader_putProperty,
2309 saxxmlreader_get_entityResolver,
2310 saxxmlreader_put_entityResolver,
2311 saxxmlreader_get_contentHandler,
2312 saxxmlreader_put_contentHandler,
2313 saxxmlreader_get_dtdHandler,
2314 saxxmlreader_put_dtdHandler,
2315 saxxmlreader_get_errorHandler,
2316 saxxmlreader_put_errorHandler,
2317 saxxmlreader_get_baseURL,
2318 saxxmlreader_put_baseURL,
2319 saxxmlreader_get_secureBaseURL,
2320 saxxmlreader_put_secureBaseURL,
2321 saxxmlreader_parse,
2322 saxxmlreader_parseURL
2325 /*** ISAXXMLReader interface ***/
2326 /*** IUnknown methods ***/
2327 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
2329 saxreader *This = impl_from_ISAXXMLReader( iface );
2330 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl, riid, ppvObject);
2333 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
2335 saxreader *This = impl_from_ISAXXMLReader( iface );
2336 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2339 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
2341 saxreader *This = impl_from_ISAXXMLReader( iface );
2342 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2345 /*** ISAXXMLReader methods ***/
2346 static HRESULT WINAPI isaxxmlreader_getFeature(
2347 ISAXXMLReader* iface,
2348 const WCHAR *pFeature,
2349 VARIANT_BOOL *pValue)
2351 saxreader *This = impl_from_ISAXXMLReader( iface );
2352 return IVBSAXXMLReader_getFeature(
2353 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2354 pFeature, pValue);
2357 static HRESULT WINAPI isaxxmlreader_putFeature(
2358 ISAXXMLReader* iface,
2359 const WCHAR *pFeature,
2360 VARIANT_BOOL vfValue)
2362 saxreader *This = impl_from_ISAXXMLReader( iface );
2363 return IVBSAXXMLReader_putFeature(
2364 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2365 pFeature, vfValue);
2368 static HRESULT WINAPI isaxxmlreader_getProperty(
2369 ISAXXMLReader* iface,
2370 const WCHAR *pProp,
2371 VARIANT *pValue)
2373 saxreader *This = impl_from_ISAXXMLReader( iface );
2374 return IVBSAXXMLReader_getProperty(
2375 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2376 pProp, pValue);
2379 static HRESULT WINAPI isaxxmlreader_putProperty(
2380 ISAXXMLReader* iface,
2381 const WCHAR *pProp,
2382 VARIANT value)
2384 saxreader *This = impl_from_ISAXXMLReader( iface );
2385 return IVBSAXXMLReader_putProperty(
2386 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2387 pProp, value);
2390 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
2391 ISAXXMLReader* iface,
2392 ISAXEntityResolver **ppEntityResolver)
2394 saxreader *This = impl_from_ISAXXMLReader( iface );
2395 return internal_getEntityResolver(This, ppEntityResolver, FALSE);
2398 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
2399 ISAXXMLReader* iface,
2400 ISAXEntityResolver *pEntityResolver)
2402 saxreader *This = impl_from_ISAXXMLReader( iface );
2403 return internal_putEntityResolver(This, pEntityResolver, FALSE);
2406 static HRESULT WINAPI isaxxmlreader_getContentHandler(
2407 ISAXXMLReader* iface,
2408 ISAXContentHandler **pContentHandler)
2410 saxreader *This = impl_from_ISAXXMLReader( iface );
2411 return internal_getContentHandler(This, pContentHandler, FALSE);
2414 static HRESULT WINAPI isaxxmlreader_putContentHandler(
2415 ISAXXMLReader* iface,
2416 ISAXContentHandler *contentHandler)
2418 saxreader *This = impl_from_ISAXXMLReader( iface );
2419 return internal_putContentHandler(This, contentHandler, FALSE);
2422 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
2423 ISAXXMLReader* iface,
2424 ISAXDTDHandler **pDTDHandler)
2426 saxreader *This = impl_from_ISAXXMLReader( iface );
2427 return internal_getDTDHandler(This, pDTDHandler, FALSE);
2430 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
2431 ISAXXMLReader* iface,
2432 ISAXDTDHandler *pDTDHandler)
2434 saxreader *This = impl_from_ISAXXMLReader( iface );
2435 return internal_putDTDHandler(This, pDTDHandler, FALSE);
2438 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
2439 ISAXXMLReader* iface,
2440 ISAXErrorHandler **pErrorHandler)
2442 saxreader *This = impl_from_ISAXXMLReader( iface );
2443 return internal_getErrorHandler(This, pErrorHandler, FALSE);
2446 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
2447 ISAXXMLReader* iface,
2448 ISAXErrorHandler *errorHandler)
2450 saxreader *This = impl_from_ISAXXMLReader( iface );
2451 return internal_putErrorHandler(This, errorHandler, FALSE);
2454 static HRESULT WINAPI isaxxmlreader_getBaseURL(
2455 ISAXXMLReader* iface,
2456 const WCHAR **pBaseUrl)
2458 saxreader *This = impl_from_ISAXXMLReader( iface );
2459 return IVBSAXXMLReader_get_baseURL(
2460 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2461 pBaseUrl);
2464 static HRESULT WINAPI isaxxmlreader_putBaseURL(
2465 ISAXXMLReader* iface,
2466 const WCHAR *pBaseUrl)
2468 saxreader *This = impl_from_ISAXXMLReader( iface );
2469 return IVBSAXXMLReader_put_baseURL(
2470 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2471 pBaseUrl);
2474 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
2475 ISAXXMLReader* iface,
2476 const WCHAR **pSecureBaseUrl)
2478 saxreader *This = impl_from_ISAXXMLReader( iface );
2479 return IVBSAXXMLReader_get_secureBaseURL(
2480 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2481 pSecureBaseUrl);
2484 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
2485 ISAXXMLReader* iface,
2486 const WCHAR *secureBaseUrl)
2488 saxreader *This = impl_from_ISAXXMLReader( iface );
2489 return IVBSAXXMLReader_put_secureBaseURL(
2490 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2491 secureBaseUrl);
2494 static HRESULT WINAPI isaxxmlreader_parse(
2495 ISAXXMLReader* iface,
2496 VARIANT varInput)
2498 saxreader *This = impl_from_ISAXXMLReader( iface );
2499 return internal_parse(This, varInput, FALSE);
2502 static HRESULT WINAPI isaxxmlreader_parseURL(
2503 ISAXXMLReader* iface,
2504 const WCHAR *url)
2506 saxreader *This = impl_from_ISAXXMLReader( iface );
2507 return internal_parseURL(This, url, FALSE);
2510 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
2512 isaxxmlreader_QueryInterface,
2513 isaxxmlreader_AddRef,
2514 isaxxmlreader_Release,
2515 isaxxmlreader_getFeature,
2516 isaxxmlreader_putFeature,
2517 isaxxmlreader_getProperty,
2518 isaxxmlreader_putProperty,
2519 isaxxmlreader_getEntityResolver,
2520 isaxxmlreader_putEntityResolver,
2521 isaxxmlreader_getContentHandler,
2522 isaxxmlreader_putContentHandler,
2523 isaxxmlreader_getDTDHandler,
2524 isaxxmlreader_putDTDHandler,
2525 isaxxmlreader_getErrorHandler,
2526 isaxxmlreader_putErrorHandler,
2527 isaxxmlreader_getBaseURL,
2528 isaxxmlreader_putBaseURL,
2529 isaxxmlreader_getSecureBaseURL,
2530 isaxxmlreader_putSecureBaseURL,
2531 isaxxmlreader_parse,
2532 isaxxmlreader_parseURL
2535 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2537 saxreader *reader;
2539 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
2541 reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) );
2542 if( !reader )
2543 return E_OUTOFMEMORY;
2545 reader->lpVBSAXXMLReaderVtbl = &saxreader_vtbl;
2546 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
2547 reader->ref = 1;
2548 reader->contentHandler = NULL;
2549 reader->vbcontentHandler = NULL;
2550 reader->errorHandler = NULL;
2551 reader->vberrorHandler = NULL;
2553 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
2554 reader->sax.initialized = XML_SAX2_MAGIC;
2555 reader->sax.startDocument = libxmlStartDocument;
2556 reader->sax.endDocument = libxmlEndDocument;
2557 reader->sax.startElementNs = libxmlStartElementNS;
2558 reader->sax.endElementNs = libxmlEndElementNS;
2559 reader->sax.characters = libxmlCharacters;
2560 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
2561 reader->sax.error = libxmlFatalError;
2562 reader->sax.fatalError = libxmlFatalError;
2564 *ppObj = &reader->lpVBSAXXMLReaderVtbl;
2566 TRACE("returning iface %p\n", *ppObj);
2568 return S_OK;
2571 #else
2573 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2575 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2576 "libxml2 support was not present at compile time.\n");
2577 return E_NOTIMPL;
2580 #endif