msxml3: Add ISAXAttributes_getValueFromName implementation.
[wine.git] / dlls / msxml3 / saxreader.c
blob64ad0b1199d359c4968a7db1231c885e7542ea26
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->saxreader->errorHandler)
202 WCHAR msg[1024];
203 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
204 NULL, hr, 0, msg, sizeof(msg), NULL))
206 FIXME("MSXML errors not yet supported.\n");
207 msg[0] = '\0';
210 if(This->vbInterface)
212 BSTR bstrMsg = SysAllocString(msg);
213 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
214 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrMsg, hr);
216 else
217 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
218 (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
222 static void update_position(saxlocator *This, xmlChar *end)
224 if(This->lastCur == NULL)
226 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
227 This->line = 1;
228 This->column = 1;
230 else if(This->lastCur < This->pParserCtxt->input->base)
232 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
233 This->line = 1;
234 This->column = 1;
237 if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
239 while(This->lastCur < end)
241 if(*(This->lastCur) == '\n')
243 This->line++;
244 This->column = 1;
246 else if(*(This->lastCur) == '\r' && (This->lastCur==This->pParserCtxt->input->end || *(This->lastCur+1)!='\n'))
248 This->line++;
249 This->column = 1;
251 else This->column++;
253 This->lastCur++;
257 /*** IVBSAXAttributes interface ***/
258 /*** IUnknown methods ***/
259 static HRESULT WINAPI ivbsaxattributes_QueryInterface(
260 IVBSAXAttributes* iface,
261 REFIID riid,
262 void **ppvObject)
264 saxattributes *This = impl_from_IVBSAXAttributes(iface);
266 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
268 *ppvObject = NULL;
270 if (IsEqualGUID(riid, &IID_IUnknown) ||
271 IsEqualGUID(riid, &IID_IDispatch) ||
272 IsEqualGUID(riid, &IID_IVBSAXAttributes))
274 *ppvObject = iface;
276 else
278 FIXME("interface %s not implemented\n", debugstr_guid(riid));
279 return E_NOINTERFACE;
282 IVBSAXAttributes_AddRef(iface);
284 return S_OK;
287 static ULONG WINAPI ivbsaxattributes_AddRef(IVBSAXAttributes* iface)
289 saxattributes *This = impl_from_IVBSAXAttributes(iface);
290 return ISAXAttributes_AddRef((ISAXAttributes*)&This->lpSAXAttributesVtbl);
293 static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes* iface)
295 saxattributes *This = impl_from_IVBSAXAttributes(iface);
296 return ISAXAttributes_Release((ISAXAttributes*)&This->lpSAXAttributesVtbl);
299 /*** IDispatch methods ***/
300 static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes *iface, UINT* pctinfo )
302 saxattributes *This = impl_from_IVBSAXAttributes( iface );
304 TRACE("(%p)->(%p)\n", This, pctinfo);
306 *pctinfo = 1;
308 return S_OK;
311 static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(
312 IVBSAXAttributes *iface,
313 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
315 saxattributes *This = impl_from_IVBSAXAttributes( iface );
316 HRESULT hr;
318 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
320 hr = get_typeinfo(IVBSAXAttributes_tid, ppTInfo);
322 return hr;
325 static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(
326 IVBSAXAttributes *iface,
327 REFIID riid,
328 LPOLESTR* rgszNames,
329 UINT cNames,
330 LCID lcid,
331 DISPID* rgDispId)
333 saxattributes *This = impl_from_IVBSAXAttributes( iface );
334 ITypeInfo *typeinfo;
335 HRESULT hr;
337 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
338 lcid, rgDispId);
340 if(!rgszNames || cNames == 0 || !rgDispId)
341 return E_INVALIDARG;
343 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
344 if(SUCCEEDED(hr))
346 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
347 ITypeInfo_Release(typeinfo);
350 return hr;
353 static HRESULT WINAPI ivbsaxattributes_Invoke(
354 IVBSAXAttributes *iface,
355 DISPID dispIdMember,
356 REFIID riid,
357 LCID lcid,
358 WORD wFlags,
359 DISPPARAMS* pDispParams,
360 VARIANT* pVarResult,
361 EXCEPINFO* pExcepInfo,
362 UINT* puArgErr)
364 saxattributes *This = impl_from_IVBSAXAttributes( iface );
365 ITypeInfo *typeinfo;
366 HRESULT hr;
368 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
369 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
371 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
372 if(SUCCEEDED(hr))
374 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXAttributesVtbl), dispIdMember, wFlags, pDispParams,
375 pVarResult, pExcepInfo, puArgErr);
376 ITypeInfo_Release(typeinfo);
379 return hr;
382 /*** IVBSAXAttributes methods ***/
383 static HRESULT WINAPI ivbsaxattributes_get_length(
384 IVBSAXAttributes* iface,
385 int *nLength)
387 saxattributes *This = impl_from_IVBSAXAttributes( iface );
388 return ISAXAttributes_getLength(
389 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
390 nLength);
393 static HRESULT WINAPI ivbsaxattributes_getURI(
394 IVBSAXAttributes* iface,
395 int nIndex,
396 BSTR *uri)
398 int len;
399 saxattributes *This = impl_from_IVBSAXAttributes( iface );
400 return ISAXAttributes_getURI(
401 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
402 nIndex, (const WCHAR**)uri, &len);
405 static HRESULT WINAPI ivbsaxattributes_getLocalName(
406 IVBSAXAttributes* iface,
407 int nIndex,
408 BSTR *localName)
410 int len;
411 saxattributes *This = impl_from_IVBSAXAttributes( iface );
412 return ISAXAttributes_getLocalName(
413 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
414 nIndex, (const WCHAR**)localName, &len);
417 static HRESULT WINAPI ivbsaxattributes_getQName(
418 IVBSAXAttributes* iface,
419 int nIndex,
420 BSTR *QName)
422 int len;
423 saxattributes *This = impl_from_IVBSAXAttributes( iface );
424 return ISAXAttributes_getQName(
425 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
426 nIndex, (const WCHAR**)QName, &len);
429 static HRESULT WINAPI ivbsaxattributes_getIndexFromName(
430 IVBSAXAttributes* iface,
431 BSTR uri,
432 BSTR localName,
433 int *index)
435 saxattributes *This = impl_from_IVBSAXAttributes( iface );
436 return ISAXAttributes_getIndexFromName(
437 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
438 (const WCHAR*)uri, SysStringLen(uri),
439 (const WCHAR*)localName, SysStringLen(localName), index);
442 static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(
443 IVBSAXAttributes* iface,
444 BSTR QName,
445 int *index)
447 saxattributes *This = impl_from_IVBSAXAttributes( iface );
448 return ISAXAttributes_getIndexFromQName(
449 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
450 (const WCHAR*)QName, SysStringLen(QName), index);
453 static HRESULT WINAPI ivbsaxattributes_getType(
454 IVBSAXAttributes* iface,
455 int nIndex,
456 BSTR *type)
458 int len;
459 saxattributes *This = impl_from_IVBSAXAttributes( iface );
460 return ISAXAttributes_getType(
461 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
462 nIndex, (const WCHAR**)type, &len);
465 static HRESULT WINAPI ivbsaxattributes_getTypeFromName(
466 IVBSAXAttributes* iface,
467 BSTR uri,
468 BSTR localName,
469 BSTR *type)
471 int len;
472 saxattributes *This = impl_from_IVBSAXAttributes( iface );
473 return ISAXAttributes_getTypeFromName(
474 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
475 (const WCHAR*)uri, SysStringLen(uri),
476 (const WCHAR*)localName, SysStringLen(localName),
477 (const WCHAR**)type, &len);
480 static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(
481 IVBSAXAttributes* iface,
482 BSTR QName,
483 BSTR *type)
485 int len;
486 saxattributes *This = impl_from_IVBSAXAttributes( iface );
487 return ISAXAttributes_getTypeFromQName(
488 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
489 (const WCHAR*)QName, SysStringLen(QName),
490 (const WCHAR**)type, &len);
493 static HRESULT WINAPI ivbsaxattributes_getValue(
494 IVBSAXAttributes* iface,
495 int nIndex,
496 BSTR *value)
498 int len;
499 saxattributes *This = impl_from_IVBSAXAttributes( iface );
500 return ISAXAttributes_getValue(
501 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
502 nIndex, (const WCHAR**)value, &len);
505 static HRESULT WINAPI ivbsaxattributes_getValueFromName(
506 IVBSAXAttributes* iface,
507 BSTR uri,
508 BSTR localName,
509 BSTR *value)
511 int len;
512 saxattributes *This = impl_from_IVBSAXAttributes( iface );
513 return ISAXAttributes_getValueFromName(
514 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
515 (const WCHAR*)uri, SysStringLen(uri),
516 (const WCHAR*)localName, SysStringLen(localName),
517 (const WCHAR**)value, &len);
520 static HRESULT WINAPI ivbsaxattributes_getValueFromQName(
521 IVBSAXAttributes* iface,
522 BSTR QName,
523 BSTR *value)
525 int len;
526 saxattributes *This = impl_from_IVBSAXAttributes( iface );
527 return ISAXAttributes_getValueFromQName(
528 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
529 (const WCHAR*)QName, SysStringLen(QName),
530 (const WCHAR**)value, &len);
533 static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
535 ivbsaxattributes_QueryInterface,
536 ivbsaxattributes_AddRef,
537 ivbsaxattributes_Release,
538 ivbsaxattributes_GetTypeInfoCount,
539 ivbsaxattributes_GetTypeInfo,
540 ivbsaxattributes_GetIDsOfNames,
541 ivbsaxattributes_Invoke,
542 ivbsaxattributes_get_length,
543 ivbsaxattributes_getURI,
544 ivbsaxattributes_getLocalName,
545 ivbsaxattributes_getQName,
546 ivbsaxattributes_getIndexFromName,
547 ivbsaxattributes_getIndexFromQName,
548 ivbsaxattributes_getType,
549 ivbsaxattributes_getTypeFromName,
550 ivbsaxattributes_getTypeFromQName,
551 ivbsaxattributes_getValue,
552 ivbsaxattributes_getValueFromName,
553 ivbsaxattributes_getValueFromQName
556 /*** ISAXAttributes interface ***/
557 /*** IUnknown methods ***/
558 static HRESULT WINAPI isaxattributes_QueryInterface(
559 ISAXAttributes* iface,
560 REFIID riid,
561 void **ppvObject)
563 saxattributes *This = impl_from_ISAXAttributes(iface);
565 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
567 *ppvObject = NULL;
569 if (IsEqualGUID(riid, &IID_IUnknown) ||
570 IsEqualGUID(riid, &IID_ISAXAttributes))
572 *ppvObject = iface;
574 else
576 FIXME("interface %s not implemented\n", debugstr_guid(riid));
577 return E_NOINTERFACE;
580 ISAXAttributes_AddRef(iface);
582 return S_OK;
585 static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
587 saxattributes *This = impl_from_ISAXAttributes(iface);
588 TRACE("%p\n", This);
589 return InterlockedIncrement(&This->ref);
592 static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
594 saxattributes *This = impl_from_ISAXAttributes(iface);
595 LONG ref;
597 TRACE("%p\n", This);
599 ref = InterlockedDecrement(&This->ref);
600 if (ref==0)
602 int index;
603 for(index=0; index<This->nb_attributes; index++)
605 SysFreeString(This->szLocalname[index]);
606 SysFreeString(This->szURI[index]);
607 SysFreeString(This->szValue[index]);
608 SysFreeString(This->szQName[index]);
611 HeapFree(GetProcessHeap(), 0, This->szLocalname);
612 HeapFree(GetProcessHeap(), 0, This->szURI);
613 HeapFree(GetProcessHeap(), 0, This->szValue);
614 HeapFree(GetProcessHeap(), 0, This->szQName);
616 HeapFree(GetProcessHeap(), 0, This);
619 return ref;
622 /*** ISAXAttributes methods ***/
623 static HRESULT WINAPI isaxattributes_getLength(
624 ISAXAttributes* iface,
625 int *length)
627 saxattributes *This = impl_from_ISAXAttributes( iface );
629 *length = This->nb_attributes;
630 TRACE("Length set to %d\n", *length);
631 return S_OK;
634 static HRESULT WINAPI isaxattributes_getURI(
635 ISAXAttributes* iface,
636 int nIndex,
637 const WCHAR **pUrl,
638 int *pUriSize)
640 saxattributes *This = impl_from_ISAXAttributes( iface );
641 TRACE("(%p)->(%d)\n", This, nIndex);
643 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
644 if(!pUrl || !pUriSize) return E_POINTER;
646 *pUriSize = SysStringLen(This->szURI[nIndex]);
647 *pUrl = This->szURI[nIndex];
649 return S_OK;
652 static HRESULT WINAPI isaxattributes_getLocalName(
653 ISAXAttributes* iface,
654 int nIndex,
655 const WCHAR **pLocalName,
656 int *pLocalNameLength)
658 saxattributes *This = impl_from_ISAXAttributes( iface );
659 TRACE("(%p)->(%d)\n", This, nIndex);
661 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
662 if(!pLocalName || !pLocalNameLength) return E_POINTER;
664 *pLocalNameLength = SysStringLen(This->szLocalname[nIndex]);
665 *pLocalName = This->szLocalname[nIndex];
667 return S_OK;
670 static HRESULT WINAPI isaxattributes_getQName(
671 ISAXAttributes* iface,
672 int nIndex,
673 const WCHAR **pQName,
674 int *pQNameLength)
676 saxattributes *This = impl_from_ISAXAttributes( iface );
677 TRACE("(%p)->(%d)\n", This, nIndex);
679 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
680 if(!pQName || !pQNameLength) return E_POINTER;
682 *pQNameLength = SysStringLen(This->szQName[nIndex]);
683 *pQName = This->szQName[nIndex];
685 return S_OK;
688 static HRESULT WINAPI isaxattributes_getName(
689 ISAXAttributes* iface,
690 int nIndex,
691 const WCHAR **pUri,
692 int *pUriLength,
693 const WCHAR **pLocalName,
694 int *pLocalNameSize,
695 const WCHAR **pQName,
696 int *pQNameLength)
698 saxattributes *This = impl_from_ISAXAttributes( iface );
699 TRACE("(%p)->(%d)\n", This, nIndex);
701 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
702 if(!pUri || !pUriLength || !pLocalName || !pLocalNameSize
703 || !pQName || !pQNameLength) return E_POINTER;
705 *pUriLength = SysStringLen(This->szURI[nIndex]);
706 *pUri = This->szURI[nIndex];
707 *pLocalNameSize = SysStringLen(This->szLocalname[nIndex]);
708 *pLocalName = This->szLocalname[nIndex];
709 *pQNameLength = SysStringLen(This->szQName[nIndex]);
710 *pQName = This->szQName[nIndex];
712 return S_OK;
715 static HRESULT WINAPI isaxattributes_getIndexFromName(
716 ISAXAttributes* iface,
717 const WCHAR *pUri,
718 int cUriLength,
719 const WCHAR *pLocalName,
720 int cocalNameLength,
721 int *index)
723 saxattributes *This = impl_from_ISAXAttributes( iface );
724 int i;
725 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), cUriLength,
726 debugstr_w(pLocalName), cocalNameLength);
728 if(!pUri || !pLocalName || !index) return E_POINTER;
730 for(i=0; i<This->nb_attributes; i++)
732 if(cUriLength!=SysStringLen(This->szURI[i])
733 || cocalNameLength!=SysStringLen(This->szLocalname[i]))
734 continue;
735 if(cUriLength && memcmp(pUri, This->szURI[i],
736 sizeof(WCHAR)*cUriLength))
737 continue;
738 if(cocalNameLength && memcmp(pLocalName, This->szLocalname[i],
739 sizeof(WCHAR)*cocalNameLength))
740 continue;
742 *index = i;
743 return S_OK;
746 return E_INVALIDARG;
749 static HRESULT WINAPI isaxattributes_getIndexFromQName(
750 ISAXAttributes* iface,
751 const WCHAR *pQName,
752 int nQNameLength,
753 int *index)
755 saxattributes *This = impl_from_ISAXAttributes( iface );
756 int i;
757 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQNameLength);
759 if(!pQName || !index) return E_POINTER;
760 if(!nQNameLength) return E_INVALIDARG;
762 for(i=0; i<This->nb_attributes; i++)
764 if(nQNameLength!=SysStringLen(This->szQName[i])) continue;
765 if(memcmp(pQName, This->szQName, sizeof(WCHAR)*nQNameLength)) continue;
767 *index = i;
768 return S_OK;
771 return E_INVALIDARG;
774 static HRESULT WINAPI isaxattributes_getType(
775 ISAXAttributes* iface,
776 int nIndex,
777 const WCHAR **pType,
778 int *pTypeLength)
780 saxattributes *This = impl_from_ISAXAttributes( iface );
782 FIXME("(%p)->(%d) stub\n", This, nIndex);
783 return E_NOTIMPL;
786 static HRESULT WINAPI isaxattributes_getTypeFromName(
787 ISAXAttributes* iface,
788 const WCHAR *pUri,
789 int nUri,
790 const WCHAR *pLocalName,
791 int nLocalName,
792 const WCHAR **pType,
793 int *nType)
795 saxattributes *This = impl_from_ISAXAttributes( iface );
797 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
798 debugstr_w(pLocalName), nLocalName);
799 return E_NOTIMPL;
802 static HRESULT WINAPI isaxattributes_getTypeFromQName(
803 ISAXAttributes* iface,
804 const WCHAR *pQName,
805 int nQName,
806 const WCHAR **pType,
807 int *nType)
809 saxattributes *This = impl_from_ISAXAttributes( iface );
811 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
812 return E_NOTIMPL;
815 static HRESULT WINAPI isaxattributes_getValue(
816 ISAXAttributes* iface,
817 int nIndex,
818 const WCHAR **pValue,
819 int *nValue)
821 saxattributes *This = impl_from_ISAXAttributes( iface );
822 TRACE("(%p)->(%d)\n", This, nIndex);
824 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
825 if(!pValue || !nValue) return E_POINTER;
827 *nValue = SysStringLen(This->szValue[nIndex]);
828 *pValue = This->szValue[nIndex];
830 return S_OK;
833 static HRESULT WINAPI isaxattributes_getValueFromName(
834 ISAXAttributes* iface,
835 const WCHAR *pUri,
836 int nUri,
837 const WCHAR *pLocalName,
838 int nLocalName,
839 const WCHAR **pValue,
840 int *nValue)
842 HRESULT hr;
843 int index;
844 saxattributes *This = impl_from_ISAXAttributes( iface );
845 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), nUri,
846 debugstr_w(pLocalName), nLocalName);
848 hr = ISAXAttributes_getIndexFromName(iface,
849 pUri, nUri, pLocalName, nLocalName, &index);
850 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
852 return hr;
855 static HRESULT WINAPI isaxattributes_getValueFromQName(
856 ISAXAttributes* iface,
857 const WCHAR *pQName,
858 int nQName,
859 const WCHAR **pValue,
860 int *nValue)
862 saxattributes *This = impl_from_ISAXAttributes( iface );
864 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
865 return E_NOTIMPL;
868 static const struct ISAXAttributesVtbl isaxattributes_vtbl =
870 isaxattributes_QueryInterface,
871 isaxattributes_AddRef,
872 isaxattributes_Release,
873 isaxattributes_getLength,
874 isaxattributes_getURI,
875 isaxattributes_getLocalName,
876 isaxattributes_getQName,
877 isaxattributes_getName,
878 isaxattributes_getIndexFromName,
879 isaxattributes_getIndexFromQName,
880 isaxattributes_getType,
881 isaxattributes_getTypeFromName,
882 isaxattributes_getTypeFromQName,
883 isaxattributes_getValue,
884 isaxattributes_getValueFromName,
885 isaxattributes_getValueFromQName
888 static HRESULT SAXAttributes_create(saxattributes **attr,
889 int nb_namespaces, const xmlChar **xmlNamespaces,
890 int nb_attributes, const xmlChar **xmlAttributes)
892 saxattributes *attributes;
893 int index;
894 static const xmlChar xmlns[] = "xmlns";
896 attributes = HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes));
897 if(!attributes)
898 return E_OUTOFMEMORY;
900 attributes->lpVBSAXAttributesVtbl = &ivbsaxattributes_vtbl;
901 attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
902 attributes->ref = 1;
904 attributes->nb_attributes = nb_namespaces+nb_attributes;
906 attributes->szLocalname =
907 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
908 attributes->szURI =
909 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
910 attributes->szValue =
911 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
912 attributes->szQName =
913 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
915 if(!attributes->szLocalname || !attributes->szURI
916 || !attributes->szValue || !attributes->szQName)
918 HeapFree(GetProcessHeap(), 0, attributes->szLocalname);
919 HeapFree(GetProcessHeap(), 0, attributes->szURI);
920 HeapFree(GetProcessHeap(), 0, attributes->szValue);
921 HeapFree(GetProcessHeap(), 0, attributes->szQName);
922 HeapFree(GetProcessHeap(), 0, attributes);
923 return E_FAIL;
926 for(index=0; index<nb_namespaces; index++)
928 attributes->szLocalname[index] = SysAllocStringLen(NULL, 0);
929 attributes->szURI[index] = SysAllocStringLen(NULL, 0);
930 attributes->szValue[index] = bstr_from_xmlChar(xmlNamespaces[2*index+1]);
931 attributes->szQName[index] = QName_from_xmlChar(xmlns, xmlNamespaces[2*index]);
934 for(index=0; index<nb_attributes; index++)
936 attributes->szLocalname[nb_namespaces+index] =
937 bstr_from_xmlChar(xmlAttributes[index*5]);
938 attributes->szURI[nb_namespaces+index] =
939 bstr_from_xmlChar(xmlAttributes[index*5+2]);
940 attributes->szValue[nb_namespaces+index] =
941 bstr_from_xmlCharN(xmlAttributes[index*5+3],
942 xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
943 attributes->szQName[nb_namespaces+index] =
944 QName_from_xmlChar(xmlAttributes[index*5+1], xmlAttributes[index*5]);
947 *attr = attributes;
949 TRACE("returning %p\n", *attr);
951 return S_OK;
954 /*** LibXML callbacks ***/
955 static void libxmlStartDocument(void *ctx)
957 saxlocator *This = ctx;
958 HRESULT hr;
960 if((This->vbInterface && This->saxreader->vbcontentHandler)
961 || (!This->vbInterface && This->saxreader->contentHandler))
963 if(This->vbInterface)
964 hr = IVBSAXContentHandler_startDocument(This->saxreader->vbcontentHandler);
965 else
966 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
968 if(hr != S_OK)
969 format_error_message_from_id(This, hr);
972 update_position(This, NULL);
975 static void libxmlEndDocument(void *ctx)
977 saxlocator *This = ctx;
978 HRESULT hr;
980 This->column = 0;
981 This->line = 0;
983 if(This->ret != S_OK) return;
985 if((This->vbInterface && This->saxreader->vbcontentHandler)
986 || (!This->vbInterface && This->saxreader->contentHandler))
988 if(This->vbInterface)
989 hr = IVBSAXContentHandler_endDocument(This->saxreader->vbcontentHandler);
990 else
991 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
993 if(hr != S_OK)
994 format_error_message_from_id(This, hr);
998 static void libxmlStartElementNS(
999 void *ctx,
1000 const xmlChar *localname,
1001 const xmlChar *prefix,
1002 const xmlChar *URI,
1003 int nb_namespaces,
1004 const xmlChar **namespaces,
1005 int nb_attributes,
1006 int nb_defaulted,
1007 const xmlChar **attributes)
1009 BSTR NamespaceUri, LocalName, QName, Prefix, Uri;
1010 saxlocator *This = ctx;
1011 HRESULT hr;
1012 saxattributes *attr;
1013 int index;
1015 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
1017 hr = namespacePush(This, nb_namespaces);
1018 if(hr==S_OK && ((This->vbInterface && This->saxreader->vbcontentHandler)
1019 || (!This->vbInterface && This->saxreader->contentHandler)))
1021 for(index=0; index<nb_namespaces; index++)
1023 Prefix = bstr_from_xmlChar(namespaces[2*index]);
1024 Uri = bstr_from_xmlChar(namespaces[2*index+1]);
1026 if(This->vbInterface)
1027 hr = IVBSAXContentHandler_startPrefixMapping(
1028 This->saxreader->vbcontentHandler,
1029 &Prefix, &Uri);
1030 else
1031 hr = ISAXContentHandler_startPrefixMapping(
1032 This->saxreader->contentHandler,
1033 Prefix, SysStringLen(Prefix),
1034 Uri, SysStringLen(Uri));
1036 SysFreeString(Prefix);
1037 SysFreeString(Uri);
1039 if(hr != S_OK)
1041 format_error_message_from_id(This, hr);
1042 return;
1046 NamespaceUri = bstr_from_xmlChar(URI);
1047 LocalName = bstr_from_xmlChar(localname);
1048 QName = QName_from_xmlChar(prefix, localname);
1050 hr = SAXAttributes_create(&attr, nb_namespaces, namespaces, nb_attributes, attributes);
1051 if(hr == S_OK)
1053 if(This->vbInterface)
1054 hr = IVBSAXContentHandler_startElement(
1055 This->saxreader->vbcontentHandler,
1056 &NamespaceUri, &LocalName, &QName,
1057 (IVBSAXAttributes*)&attr->lpVBSAXAttributesVtbl);
1058 else
1059 hr = ISAXContentHandler_startElement(
1060 This->saxreader->contentHandler,
1061 NamespaceUri, SysStringLen(NamespaceUri),
1062 LocalName, SysStringLen(LocalName),
1063 QName, SysStringLen(QName),
1064 (ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1066 ISAXAttributes_Release((ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1069 SysFreeString(NamespaceUri);
1070 SysFreeString(LocalName);
1071 SysFreeString(QName);
1074 if(hr != S_OK)
1075 format_error_message_from_id(This, hr);
1078 static void libxmlEndElementNS(
1079 void *ctx,
1080 const xmlChar *localname,
1081 const xmlChar *prefix,
1082 const xmlChar *URI)
1084 BSTR NamespaceUri, LocalName, QName, Prefix;
1085 saxlocator *This = ctx;
1086 HRESULT hr;
1087 xmlChar *end;
1088 int nsNr, index;
1090 end = This->lastCur;
1091 while(*end != '<' && *(end+1) != '/') end++;
1092 update_position(This, end+2);
1094 nsNr = namespacePop(This);
1096 if((This->vbInterface && This->saxreader->vbcontentHandler)
1097 || (!This->vbInterface && This->saxreader->contentHandler))
1099 NamespaceUri = bstr_from_xmlChar(URI);
1100 LocalName = bstr_from_xmlChar(localname);
1101 QName = QName_from_xmlChar(prefix, localname);
1103 if(This->vbInterface)
1104 hr = IVBSAXContentHandler_endElement(
1105 This->saxreader->vbcontentHandler,
1106 &NamespaceUri, &LocalName, &QName);
1107 else
1108 hr = ISAXContentHandler_endElement(
1109 This->saxreader->contentHandler,
1110 NamespaceUri, SysStringLen(NamespaceUri),
1111 LocalName, SysStringLen(LocalName),
1112 QName, SysStringLen(QName));
1114 SysFreeString(NamespaceUri);
1115 SysFreeString(LocalName);
1116 SysFreeString(QName);
1118 if(hr != S_OK)
1120 format_error_message_from_id(This, hr);
1121 return;
1124 for(index=This->pParserCtxt->nsNr-2;
1125 index>=This->pParserCtxt->nsNr-nsNr*2; index-=2)
1127 Prefix = bstr_from_xmlChar(This->pParserCtxt->nsTab[index]);
1129 if(This->vbInterface)
1130 hr = IVBSAXContentHandler_endPrefixMapping(
1131 This->saxreader->vbcontentHandler, &Prefix);
1132 else
1133 hr = ISAXContentHandler_endPrefixMapping(
1134 This->saxreader->contentHandler,
1135 Prefix, SysStringLen(Prefix));
1137 SysFreeString(Prefix);
1142 static void libxmlCharacters(
1143 void *ctx,
1144 const xmlChar *ch,
1145 int len)
1147 BSTR Chars;
1148 saxlocator *This = ctx;
1149 HRESULT hr;
1150 xmlChar *end;
1151 xmlChar *lastCurCopy;
1152 xmlChar *chEnd;
1153 int columnCopy;
1154 int lineCopy;
1156 if(*(This->lastCur-1) != '>' && *(This->lastCur-1) != '/') return;
1158 if(*(This->lastCur-1) != '>')
1160 end = (xmlChar*)This->pParserCtxt->input->cur-len;
1161 while(*(end-1) != '>') end--;
1162 update_position(This, end);
1165 chEnd = This->lastCur+len;
1166 while(*chEnd != '<') chEnd++;
1168 Chars = bstr_from_xmlChar(ch);
1170 lastCurCopy = This->lastCur;
1171 columnCopy = This->column;
1172 lineCopy = This->line;
1173 end = This->lastCur;
1175 if((This->vbInterface && This->saxreader->vbcontentHandler)
1176 || (!This->vbInterface && This->saxreader->contentHandler))
1178 while(This->lastCur < chEnd)
1180 end = This->lastCur;
1181 while(end < chEnd-1)
1183 if(*end == '\r') break;
1184 end++;
1187 Chars = bstr_from_xmlChar(This->lastCur);
1189 if(*end == '\r' && *(end+1) == '\n')
1191 memmove((WCHAR*)Chars+(end-This->lastCur),
1192 (WCHAR*)Chars+(end-This->lastCur)+1,
1193 (SysStringLen(Chars)-(end-This->lastCur))*sizeof(WCHAR));
1194 SysReAllocStringLen(&Chars, Chars, SysStringLen(Chars)-1);
1196 else if(*end == '\r') Chars[end-This->lastCur] = '\n';
1198 if(This->vbInterface)
1199 hr = IVBSAXContentHandler_characters(
1200 This->saxreader->vbcontentHandler, &Chars);
1201 else
1202 hr = ISAXContentHandler_characters(
1203 This->saxreader->contentHandler,
1204 Chars, end-This->lastCur+1);
1206 SysFreeString(Chars);
1207 if(hr != S_OK)
1209 format_error_message_from_id(This, hr);
1210 return;
1213 if(*(end+1) == '\n') end++;
1214 if(end < chEnd) end++;
1216 This->column += end-This->lastCur;
1217 This->lastCur = end;
1220 This->lastCur = lastCurCopy;
1221 This->column = columnCopy;
1222 This->line = lineCopy;
1223 update_position(This, chEnd);
1227 static void libxmlSetDocumentLocator(
1228 void *ctx,
1229 xmlSAXLocatorPtr loc)
1231 saxlocator *This = ctx;
1232 HRESULT hr;
1234 if(This->vbInterface)
1235 hr = IVBSAXContentHandler_putref_documentLocator(
1236 This->saxreader->vbcontentHandler,
1237 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
1238 else
1239 hr = ISAXContentHandler_putDocumentLocator(
1240 This->saxreader->contentHandler,
1241 (ISAXLocator*)&This->lpSAXLocatorVtbl);
1243 if(FAILED(hr))
1244 format_error_message_from_id(This, hr);
1247 void libxmlFatalError(void *ctx, const char *msg, ...)
1249 saxlocator *This = ctx;
1250 char message[1024];
1251 WCHAR *wszError;
1252 DWORD len;
1253 va_list args;
1255 if(!This->saxreader->errorHandler)
1257 xmlStopParser(This->pParserCtxt);
1258 This->ret = E_FAIL;
1259 return;
1262 FIXME("Error handling is not compatible.\n");
1264 va_start(args, msg);
1265 vsprintf(message, msg, args);
1266 va_end(args);
1268 len = MultiByteToWideChar(CP_ACP, 0, message, -1, NULL, 0);
1269 wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
1270 MultiByteToWideChar(CP_ACP, 0, message, -1, (LPWSTR)wszError, len);
1272 if(This->vbInterface)
1274 BSTR bstrError = SysAllocString(wszError);
1275 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
1276 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrError, E_FAIL);
1278 else
1279 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
1280 (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
1282 HeapFree(GetProcessHeap(), 0, wszError);
1284 xmlStopParser(This->pParserCtxt);
1285 This->ret = E_FAIL;
1288 /*** IVBSAXLocator interface ***/
1289 /*** IUnknown methods ***/
1290 static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject)
1292 saxlocator *This = impl_from_IVBSAXLocator( iface );
1294 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject);
1296 *ppvObject = NULL;
1298 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1299 IsEqualGUID( riid, &IID_IDispatch) ||
1300 IsEqualGUID( riid, &IID_IVBSAXLocator ))
1302 *ppvObject = iface;
1304 else
1306 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1307 return E_NOINTERFACE;
1310 IVBSAXLocator_AddRef( iface );
1312 return S_OK;
1315 static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator* iface)
1317 saxlocator *This = impl_from_IVBSAXLocator( iface );
1318 TRACE("%p\n", This );
1319 return InterlockedIncrement( &This->ref );
1322 static ULONG WINAPI ivbsaxlocator_Release(
1323 IVBSAXLocator* iface)
1325 saxlocator *This = impl_from_IVBSAXLocator( iface );
1326 return ISAXLocator_Release((ISAXLocator*)&This->lpVBSAXLocatorVtbl);
1329 /*** IDispatch methods ***/
1330 static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator *iface, UINT* pctinfo )
1332 saxlocator *This = impl_from_IVBSAXLocator( iface );
1334 TRACE("(%p)->(%p)\n", This, pctinfo);
1336 *pctinfo = 1;
1338 return S_OK;
1341 static HRESULT WINAPI ivbsaxlocator_GetTypeInfo(
1342 IVBSAXLocator *iface,
1343 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
1345 saxlocator *This = impl_from_IVBSAXLocator( iface );
1346 HRESULT hr;
1348 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1350 hr = get_typeinfo(IVBSAXLocator_tid, ppTInfo);
1352 return hr;
1355 static HRESULT WINAPI ivbsaxlocator_GetIDsOfNames(
1356 IVBSAXLocator *iface,
1357 REFIID riid,
1358 LPOLESTR* rgszNames,
1359 UINT cNames,
1360 LCID lcid,
1361 DISPID* rgDispId)
1363 saxlocator *This = impl_from_IVBSAXLocator( iface );
1364 ITypeInfo *typeinfo;
1365 HRESULT hr;
1367 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1368 lcid, rgDispId);
1370 if(!rgszNames || cNames == 0 || !rgDispId)
1371 return E_INVALIDARG;
1373 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1374 if(SUCCEEDED(hr))
1376 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1377 ITypeInfo_Release(typeinfo);
1380 return hr;
1383 static HRESULT WINAPI ivbsaxlocator_Invoke(
1384 IVBSAXLocator *iface,
1385 DISPID dispIdMember,
1386 REFIID riid,
1387 LCID lcid,
1388 WORD wFlags,
1389 DISPPARAMS* pDispParams,
1390 VARIANT* pVarResult,
1391 EXCEPINFO* pExcepInfo,
1392 UINT* puArgErr)
1394 saxlocator *This = impl_from_IVBSAXLocator( iface );
1395 ITypeInfo *typeinfo;
1396 HRESULT hr;
1398 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1399 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1401 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1402 if(SUCCEEDED(hr))
1404 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXLocatorVtbl), dispIdMember, wFlags, pDispParams,
1405 pVarResult, pExcepInfo, puArgErr);
1406 ITypeInfo_Release(typeinfo);
1409 return hr;
1412 /*** IVBSAXLocator methods ***/
1413 static HRESULT WINAPI ivbsaxlocator_get_columnNumber(
1414 IVBSAXLocator* iface,
1415 int *pnColumn)
1417 saxlocator *This = impl_from_IVBSAXLocator( iface );
1418 return ISAXLocator_getColumnNumber(
1419 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1420 pnColumn);
1423 static HRESULT WINAPI ivbsaxlocator_get_lineNumber(
1424 IVBSAXLocator* iface,
1425 int *pnLine)
1427 saxlocator *This = impl_from_IVBSAXLocator( iface );
1428 return ISAXLocator_getLineNumber(
1429 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1430 pnLine);
1433 static HRESULT WINAPI ivbsaxlocator_get_publicId(
1434 IVBSAXLocator* iface,
1435 BSTR* publicId)
1437 saxlocator *This = impl_from_IVBSAXLocator( iface );
1438 return ISAXLocator_getPublicId(
1439 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1440 (const WCHAR**)publicId);
1443 static HRESULT WINAPI ivbsaxlocator_get_systemId(
1444 IVBSAXLocator* iface,
1445 BSTR* systemId)
1447 saxlocator *This = impl_from_IVBSAXLocator( iface );
1448 return ISAXLocator_getSystemId(
1449 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1450 (const WCHAR**)systemId);
1453 static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl =
1455 ivbsaxlocator_QueryInterface,
1456 ivbsaxlocator_AddRef,
1457 ivbsaxlocator_Release,
1458 ivbsaxlocator_GetTypeInfoCount,
1459 ivbsaxlocator_GetTypeInfo,
1460 ivbsaxlocator_GetIDsOfNames,
1461 ivbsaxlocator_Invoke,
1462 ivbsaxlocator_get_columnNumber,
1463 ivbsaxlocator_get_lineNumber,
1464 ivbsaxlocator_get_publicId,
1465 ivbsaxlocator_get_systemId
1468 /*** ISAXLocator interface ***/
1469 /*** IUnknown methods ***/
1470 static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
1472 saxlocator *This = impl_from_ISAXLocator( iface );
1474 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1476 *ppvObject = NULL;
1478 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1479 IsEqualGUID( riid, &IID_ISAXLocator ))
1481 *ppvObject = iface;
1483 else
1485 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1486 return E_NOINTERFACE;
1489 ISAXLocator_AddRef( iface );
1491 return S_OK;
1494 static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
1496 saxlocator *This = impl_from_ISAXLocator( iface );
1497 TRACE("%p\n", This );
1498 return InterlockedIncrement( &This->ref );
1501 static ULONG WINAPI isaxlocator_Release(
1502 ISAXLocator* iface)
1504 saxlocator *This = impl_from_ISAXLocator( iface );
1505 LONG ref;
1507 TRACE("%p\n", This );
1509 ref = InterlockedDecrement( &This->ref );
1510 if ( ref == 0 )
1512 if(This->publicId)
1513 SysFreeString(This->publicId);
1514 if(This->systemId)
1515 SysFreeString(This->systemId);
1516 HeapFree(GetProcessHeap(), 0, This->nsStack);
1518 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
1519 HeapFree( GetProcessHeap(), 0, This );
1522 return ref;
1525 /*** ISAXLocator methods ***/
1526 static HRESULT WINAPI isaxlocator_getColumnNumber(
1527 ISAXLocator* iface,
1528 int *pnColumn)
1530 saxlocator *This = impl_from_ISAXLocator( iface );
1532 *pnColumn = This->column;
1533 return S_OK;
1536 static HRESULT WINAPI isaxlocator_getLineNumber(
1537 ISAXLocator* iface,
1538 int *pnLine)
1540 saxlocator *This = impl_from_ISAXLocator( iface );
1542 *pnLine = This->line;
1543 return S_OK;
1546 static HRESULT WINAPI isaxlocator_getPublicId(
1547 ISAXLocator* iface,
1548 const WCHAR ** ppwchPublicId)
1550 BSTR publicId;
1551 saxlocator *This = impl_from_ISAXLocator( iface );
1553 if(This->publicId) SysFreeString(This->publicId);
1555 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
1556 if(SysStringLen(publicId))
1557 This->publicId = (WCHAR*)&publicId;
1558 else
1560 SysFreeString(publicId);
1561 This->publicId = NULL;
1564 *ppwchPublicId = This->publicId;
1565 return S_OK;
1568 static HRESULT WINAPI isaxlocator_getSystemId(
1569 ISAXLocator* iface,
1570 const WCHAR ** ppwchSystemId)
1572 BSTR systemId;
1573 saxlocator *This = impl_from_ISAXLocator( iface );
1575 if(This->systemId) SysFreeString(This->systemId);
1577 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
1578 if(SysStringLen(systemId))
1579 This->systemId = (WCHAR*)&systemId;
1580 else
1582 SysFreeString(systemId);
1583 This->systemId = NULL;
1586 *ppwchSystemId = This->systemId;
1587 return S_OK;
1590 static const struct ISAXLocatorVtbl isaxlocator_vtbl =
1592 isaxlocator_QueryInterface,
1593 isaxlocator_AddRef,
1594 isaxlocator_Release,
1595 isaxlocator_getColumnNumber,
1596 isaxlocator_getLineNumber,
1597 isaxlocator_getPublicId,
1598 isaxlocator_getSystemId
1601 static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
1603 saxlocator *locator;
1605 locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) );
1606 if( !locator )
1607 return E_OUTOFMEMORY;
1609 locator->lpVBSAXLocatorVtbl = &ivbsaxlocator_vtbl;
1610 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
1611 locator->ref = 1;
1612 locator->vbInterface = vbInterface;
1614 locator->saxreader = reader;
1615 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1617 locator->pParserCtxt = NULL;
1618 locator->publicId = NULL;
1619 locator->systemId = NULL;
1620 locator->lastCur = NULL;
1621 locator->line = 0;
1622 locator->column = 0;
1623 locator->ret = S_OK;
1624 locator->nsStackSize = 8;
1625 locator->nsStackLast = 0;
1626 locator->nsStack = HeapAlloc(GetProcessHeap(), 0, locator->nsStackSize);
1627 if(!locator->nsStack)
1629 ISAXXMLReader_Release((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1630 HeapFree(GetProcessHeap(), 0, locator);
1631 return E_OUTOFMEMORY;
1634 *ppsaxlocator = locator;
1636 TRACE("returning %p\n", *ppsaxlocator);
1638 return S_OK;
1641 /*** SAXXMLReader internal functions ***/
1642 static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
1644 saxlocator *locator;
1645 HRESULT hr;
1647 hr = SAXLocator_create(This, &locator, vbInterface);
1648 if(FAILED(hr))
1649 return E_FAIL;
1651 locator->pParserCtxt = xmlCreateMemoryParserCtxt(buffer, size);
1652 if(!locator->pParserCtxt)
1654 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1655 return E_FAIL;
1658 locator->pParserCtxt->sax = &locator->saxreader->sax;
1659 locator->pParserCtxt->userData = locator;
1661 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1662 else hr = locator->ret;
1664 if(locator->pParserCtxt)
1666 locator->pParserCtxt->sax = NULL;
1667 xmlFreeParserCtxt(locator->pParserCtxt);
1668 locator->pParserCtxt = NULL;
1671 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1672 return S_OK;
1675 static HRESULT WINAPI internal_getEntityResolver(
1676 saxreader *This,
1677 void *pEntityResolver,
1678 BOOL vbInterface)
1680 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1681 return E_NOTIMPL;
1684 static HRESULT WINAPI internal_putEntityResolver(
1685 saxreader *This,
1686 void *pEntityResolver,
1687 BOOL vbInterface)
1689 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1690 return E_NOTIMPL;
1693 static HRESULT WINAPI internal_getContentHandler(
1694 saxreader* This,
1695 void *pContentHandler,
1696 BOOL vbInterface)
1698 TRACE("(%p)->(%p)\n", This, pContentHandler);
1699 if(pContentHandler == NULL)
1700 return E_POINTER;
1701 if((vbInterface && This->vbcontentHandler)
1702 || (!vbInterface && This->contentHandler))
1704 if(vbInterface)
1705 IVBSAXContentHandler_AddRef(This->vbcontentHandler);
1706 else
1707 ISAXContentHandler_AddRef(This->contentHandler);
1709 if(vbInterface) *(IVBSAXContentHandler**)pContentHandler =
1710 This->vbcontentHandler;
1711 else *(ISAXContentHandler**)pContentHandler = This->contentHandler;
1713 return S_OK;
1716 static HRESULT WINAPI internal_putContentHandler(
1717 saxreader* This,
1718 void *contentHandler,
1719 BOOL vbInterface)
1721 TRACE("(%p)->(%p)\n", This, contentHandler);
1722 if(contentHandler)
1724 if(vbInterface)
1725 IVBSAXContentHandler_AddRef((IVBSAXContentHandler*)contentHandler);
1726 else
1727 ISAXContentHandler_AddRef((ISAXContentHandler*)contentHandler);
1729 if((vbInterface && This->vbcontentHandler)
1730 || (!vbInterface && This->contentHandler))
1732 if(vbInterface)
1733 IVBSAXContentHandler_Release(This->vbcontentHandler);
1734 else
1735 ISAXContentHandler_Release(This->contentHandler);
1737 if(vbInterface)
1738 This->vbcontentHandler = contentHandler;
1739 else
1740 This->contentHandler = contentHandler;
1742 return S_OK;
1745 static HRESULT WINAPI internal_getDTDHandler(
1746 saxreader* This,
1747 void *pDTDHandler,
1748 BOOL vbInterface)
1750 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1751 return E_NOTIMPL;
1754 static HRESULT WINAPI internal_putDTDHandler(
1755 saxreader* This,
1756 void *pDTDHandler,
1757 BOOL vbInterface)
1759 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1760 return E_NOTIMPL;
1763 static HRESULT WINAPI internal_getErrorHandler(
1764 saxreader* This,
1765 void *pErrorHandler,
1766 BOOL vbInterface)
1768 TRACE("(%p)->(%p)\n", This, pErrorHandler);
1769 if(pErrorHandler == NULL)
1770 return E_POINTER;
1771 if(This->errorHandler)
1773 if(vbInterface)
1774 IVBSAXErrorHandler_AddRef(This->vberrorHandler);
1775 else
1776 ISAXErrorHandler_AddRef(This->errorHandler);
1778 if(vbInterface)
1779 *(IVBSAXErrorHandler**)pErrorHandler = This->vberrorHandler;
1780 else
1781 *(ISAXErrorHandler**)pErrorHandler = This->errorHandler;
1783 return S_OK;
1787 static HRESULT WINAPI internal_putErrorHandler(
1788 saxreader* This,
1789 void *errorHandler,
1790 BOOL vbInterface)
1792 TRACE("(%p)->(%p)\n", This, errorHandler);
1793 if(errorHandler)
1795 if(vbInterface)
1796 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler*)errorHandler);
1797 else
1798 ISAXErrorHandler_AddRef((ISAXErrorHandler*)errorHandler);
1800 if(This->errorHandler)
1802 if(vbInterface)
1803 IVBSAXErrorHandler_Release(This->vberrorHandler);
1804 else
1805 ISAXErrorHandler_Release(This->errorHandler);
1807 if(vbInterface)
1808 This->vberrorHandler = errorHandler;
1809 else
1810 This->errorHandler = errorHandler;
1812 return S_OK;
1816 static HRESULT WINAPI internal_parse(
1817 saxreader* This,
1818 VARIANT varInput,
1819 BOOL vbInterface)
1821 HRESULT hr;
1823 TRACE("(%p)\n", This);
1825 hr = S_OK;
1826 switch(V_VT(&varInput))
1828 case VT_BSTR:
1829 hr = internal_parseBuffer(This, (const char*)V_BSTR(&varInput),
1830 SysStringByteLen(V_BSTR(&varInput)), vbInterface);
1831 break;
1832 case VT_ARRAY|VT_UI1: {
1833 void *pSAData;
1834 LONG lBound, uBound;
1835 ULONG dataRead;
1837 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
1838 if(hr != S_OK) break;
1839 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
1840 if(hr != S_OK) break;
1841 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
1842 hr = SafeArrayAccessData(V_ARRAY(&varInput), (void**)&pSAData);
1843 if(hr != S_OK) break;
1844 hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
1845 SafeArrayUnaccessData(V_ARRAY(&varInput));
1846 break;
1848 case VT_UNKNOWN:
1849 case VT_DISPATCH: {
1850 IPersistStream *persistStream;
1851 IStream *stream = NULL;
1852 IXMLDOMDocument *xmlDoc;
1854 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1855 &IID_IPersistStream, (void**)&persistStream) == S_OK)
1857 hr = IPersistStream_Save(persistStream, stream, TRUE);
1858 IPersistStream_Release(persistStream);
1859 if(hr != S_OK) break;
1861 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1862 &IID_IStream, (void**)&stream) == S_OK)
1864 STATSTG dataInfo;
1865 ULONG dataRead;
1866 char *data;
1868 while(1)
1870 hr = IStream_Stat(stream, &dataInfo, STATFLAG_NONAME);
1871 if(hr == E_PENDING) continue;
1872 break;
1874 data = HeapAlloc(GetProcessHeap(), 0,
1875 dataInfo.cbSize.QuadPart);
1876 while(1)
1878 hr = IStream_Read(stream, data,
1879 dataInfo.cbSize.QuadPart, &dataRead);
1880 if(hr == E_PENDING) continue;
1881 break;
1883 hr = internal_parseBuffer(This, data,
1884 dataInfo.cbSize.QuadPart, vbInterface);
1885 HeapFree(GetProcessHeap(), 0, data);
1886 IStream_Release(stream);
1887 break;
1889 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1890 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
1892 BSTR bstrData;
1894 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
1895 hr = internal_parseBuffer(This, (const char*)bstrData,
1896 SysStringByteLen(bstrData), vbInterface);
1897 IXMLDOMDocument_Release(xmlDoc);
1898 hr = E_NOTIMPL;
1899 break;
1902 default:
1903 WARN("vt %d not implemented\n", V_VT(&varInput));
1904 hr = E_INVALIDARG;
1907 return hr;
1910 static HRESULT internal_vbonDataAvailable(void *obj, char *ptr, DWORD len)
1912 saxreader *This = obj;
1914 return internal_parseBuffer(This, ptr, len, TRUE);
1917 static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len)
1919 saxreader *This = obj;
1921 return internal_parseBuffer(This, ptr, len, FALSE);
1924 static HRESULT WINAPI internal_parseURL(
1925 saxreader* This,
1926 const WCHAR *url,
1927 BOOL vbInterface)
1929 bsc_t *bsc;
1930 HRESULT hr;
1932 TRACE("(%p)->(%s)\n", This, debugstr_w(url));
1934 if(vbInterface) hr = bind_url(url, internal_vbonDataAvailable, This, &bsc);
1935 else hr = bind_url(url, internal_onDataAvailable, This, &bsc);
1937 if(FAILED(hr))
1938 return hr;
1940 detach_bsc(bsc);
1942 return S_OK;
1945 /*** IVBSAXXMLReader interface ***/
1946 /*** IUnknown methods ***/
1947 static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
1949 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1951 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1953 *ppvObject = NULL;
1955 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1956 IsEqualGUID( riid, &IID_IDispatch ) ||
1957 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
1959 *ppvObject = iface;
1961 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
1963 *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
1965 else
1967 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1968 return E_NOINTERFACE;
1971 IVBSAXXMLReader_AddRef( iface );
1973 return S_OK;
1976 static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
1978 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1979 TRACE("%p\n", This );
1980 return InterlockedIncrement( &This->ref );
1983 static ULONG WINAPI saxxmlreader_Release(
1984 IVBSAXXMLReader* iface)
1986 saxreader *This = impl_from_IVBSAXXMLReader( iface );
1987 LONG ref;
1989 TRACE("%p\n", This );
1991 ref = InterlockedDecrement( &This->ref );
1992 if ( ref == 0 )
1994 if(This->contentHandler)
1995 ISAXContentHandler_Release(This->contentHandler);
1997 if(This->errorHandler)
1998 ISAXErrorHandler_Release(This->errorHandler);
2000 HeapFree( GetProcessHeap(), 0, This );
2003 return ref;
2005 /*** IDispatch ***/
2006 static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
2008 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2010 TRACE("(%p)->(%p)\n", This, pctinfo);
2012 *pctinfo = 1;
2014 return S_OK;
2017 static HRESULT WINAPI saxxmlreader_GetTypeInfo(
2018 IVBSAXXMLReader *iface,
2019 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2021 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2022 HRESULT hr;
2024 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2026 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
2028 return hr;
2031 static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
2032 IVBSAXXMLReader *iface,
2033 REFIID riid,
2034 LPOLESTR* rgszNames,
2035 UINT cNames,
2036 LCID lcid,
2037 DISPID* rgDispId)
2039 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2040 ITypeInfo *typeinfo;
2041 HRESULT hr;
2043 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2044 lcid, rgDispId);
2046 if(!rgszNames || cNames == 0 || !rgDispId)
2047 return E_INVALIDARG;
2049 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2050 if(SUCCEEDED(hr))
2052 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
2053 ITypeInfo_Release(typeinfo);
2056 return hr;
2059 static HRESULT WINAPI saxxmlreader_Invoke(
2060 IVBSAXXMLReader *iface,
2061 DISPID dispIdMember,
2062 REFIID riid,
2063 LCID lcid,
2064 WORD wFlags,
2065 DISPPARAMS* pDispParams,
2066 VARIANT* pVarResult,
2067 EXCEPINFO* pExcepInfo,
2068 UINT* puArgErr)
2070 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2071 ITypeInfo *typeinfo;
2072 HRESULT hr;
2074 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2075 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2077 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2078 if(SUCCEEDED(hr))
2080 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXXMLReaderVtbl), dispIdMember, wFlags, pDispParams,
2081 pVarResult, pExcepInfo, puArgErr);
2082 ITypeInfo_Release(typeinfo);
2085 return hr;
2088 /*** IVBSAXXMLReader methods ***/
2089 static HRESULT WINAPI saxxmlreader_getFeature(
2090 IVBSAXXMLReader* iface,
2091 const WCHAR *pFeature,
2092 VARIANT_BOOL *pValue)
2094 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2096 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
2097 return E_NOTIMPL;
2100 static HRESULT WINAPI saxxmlreader_putFeature(
2101 IVBSAXXMLReader* iface,
2102 const WCHAR *pFeature,
2103 VARIANT_BOOL vfValue)
2105 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2107 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
2108 return E_NOTIMPL;
2111 static HRESULT WINAPI saxxmlreader_getProperty(
2112 IVBSAXXMLReader* iface,
2113 const WCHAR *pProp,
2114 VARIANT *pValue)
2116 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2118 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
2119 return E_NOTIMPL;
2122 static HRESULT WINAPI saxxmlreader_putProperty(
2123 IVBSAXXMLReader* iface,
2124 const WCHAR *pProp,
2125 VARIANT value)
2127 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2129 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pProp));
2130 return E_NOTIMPL;
2133 static HRESULT WINAPI saxxmlreader_getEntityResolver(
2134 IVBSAXXMLReader* iface,
2135 IVBSAXEntityResolver **pEntityResolver)
2137 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2138 return internal_getEntityResolver(This, pEntityResolver, TRUE);
2141 static HRESULT WINAPI saxxmlreader_putEntityResolver(
2142 IVBSAXXMLReader* iface,
2143 IVBSAXEntityResolver *pEntityResolver)
2145 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2146 return internal_putEntityResolver(This, pEntityResolver, TRUE);
2149 static HRESULT WINAPI saxxmlreader_getContentHandler(
2150 IVBSAXXMLReader* iface,
2151 IVBSAXContentHandler **ppContentHandler)
2153 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2154 return internal_getContentHandler(This, ppContentHandler, TRUE);
2157 static HRESULT WINAPI saxxmlreader_putContentHandler(
2158 IVBSAXXMLReader* iface,
2159 IVBSAXContentHandler *contentHandler)
2161 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2162 return internal_putContentHandler(This, contentHandler, TRUE);
2165 static HRESULT WINAPI saxxmlreader_getDTDHandler(
2166 IVBSAXXMLReader* iface,
2167 IVBSAXDTDHandler **pDTDHandler)
2169 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2170 return internal_getDTDHandler(This, pDTDHandler, TRUE);
2173 static HRESULT WINAPI saxxmlreader_putDTDHandler(
2174 IVBSAXXMLReader* iface,
2175 IVBSAXDTDHandler *pDTDHandler)
2177 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2178 return internal_putDTDHandler(This, pDTDHandler, TRUE);
2181 static HRESULT WINAPI saxxmlreader_getErrorHandler(
2182 IVBSAXXMLReader* iface,
2183 IVBSAXErrorHandler **pErrorHandler)
2185 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2186 return internal_getErrorHandler(This, pErrorHandler, TRUE);
2189 static HRESULT WINAPI saxxmlreader_putErrorHandler(
2190 IVBSAXXMLReader* iface,
2191 IVBSAXErrorHandler *errorHandler)
2193 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2194 return internal_putErrorHandler(This, errorHandler, TRUE);
2197 static HRESULT WINAPI saxxmlreader_getBaseURL(
2198 IVBSAXXMLReader* iface,
2199 const WCHAR **pBaseUrl)
2201 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2203 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
2204 return E_NOTIMPL;
2207 static HRESULT WINAPI saxxmlreader_putBaseURL(
2208 IVBSAXXMLReader* iface,
2209 const WCHAR *pBaseUrl)
2211 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2213 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
2214 return E_NOTIMPL;
2217 static HRESULT WINAPI saxxmlreader_getSecureBaseURL(
2218 IVBSAXXMLReader* iface,
2219 const WCHAR **pSecureBaseUrl)
2221 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2223 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
2224 return E_NOTIMPL;
2228 static HRESULT WINAPI saxxmlreader_putSecureBaseURL(
2229 IVBSAXXMLReader* iface,
2230 const WCHAR *secureBaseUrl)
2232 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2234 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
2235 return E_NOTIMPL;
2238 static HRESULT WINAPI saxxmlreader_parse(
2239 IVBSAXXMLReader* iface,
2240 VARIANT varInput)
2242 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2243 return internal_parse(This, varInput, TRUE);
2246 static HRESULT WINAPI saxxmlreader_parseURL(
2247 IVBSAXXMLReader* iface,
2248 const WCHAR *url)
2250 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2251 return internal_parseURL(This, url, TRUE);
2254 static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
2256 saxxmlreader_QueryInterface,
2257 saxxmlreader_AddRef,
2258 saxxmlreader_Release,
2259 saxxmlreader_GetTypeInfoCount,
2260 saxxmlreader_GetTypeInfo,
2261 saxxmlreader_GetIDsOfNames,
2262 saxxmlreader_Invoke,
2263 saxxmlreader_getFeature,
2264 saxxmlreader_putFeature,
2265 saxxmlreader_getProperty,
2266 saxxmlreader_putProperty,
2267 saxxmlreader_getEntityResolver,
2268 saxxmlreader_putEntityResolver,
2269 saxxmlreader_getContentHandler,
2270 saxxmlreader_putContentHandler,
2271 saxxmlreader_getDTDHandler,
2272 saxxmlreader_putDTDHandler,
2273 saxxmlreader_getErrorHandler,
2274 saxxmlreader_putErrorHandler,
2275 saxxmlreader_getBaseURL,
2276 saxxmlreader_putBaseURL,
2277 saxxmlreader_getSecureBaseURL,
2278 saxxmlreader_putSecureBaseURL,
2279 saxxmlreader_parse,
2280 saxxmlreader_parseURL
2283 /*** ISAXXMLReader interface ***/
2284 /*** IUnknown methods ***/
2285 static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
2287 saxreader *This = impl_from_ISAXXMLReader( iface );
2288 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl, riid, ppvObject);
2291 static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
2293 saxreader *This = impl_from_ISAXXMLReader( iface );
2294 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2297 static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
2299 saxreader *This = impl_from_ISAXXMLReader( iface );
2300 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
2303 /*** ISAXXMLReader methods ***/
2304 static HRESULT WINAPI isaxxmlreader_getFeature(
2305 ISAXXMLReader* iface,
2306 const WCHAR *pFeature,
2307 VARIANT_BOOL *pValue)
2309 saxreader *This = impl_from_ISAXXMLReader( iface );
2310 return IVBSAXXMLReader_getFeature(
2311 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2312 pFeature, pValue);
2315 static HRESULT WINAPI isaxxmlreader_putFeature(
2316 ISAXXMLReader* iface,
2317 const WCHAR *pFeature,
2318 VARIANT_BOOL vfValue)
2320 saxreader *This = impl_from_ISAXXMLReader( iface );
2321 return IVBSAXXMLReader_putFeature(
2322 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2323 pFeature, vfValue);
2326 static HRESULT WINAPI isaxxmlreader_getProperty(
2327 ISAXXMLReader* iface,
2328 const WCHAR *pProp,
2329 VARIANT *pValue)
2331 saxreader *This = impl_from_ISAXXMLReader( iface );
2332 return IVBSAXXMLReader_getProperty(
2333 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2334 pProp, pValue);
2337 static HRESULT WINAPI isaxxmlreader_putProperty(
2338 ISAXXMLReader* iface,
2339 const WCHAR *pProp,
2340 VARIANT value)
2342 saxreader *This = impl_from_ISAXXMLReader( iface );
2343 return IVBSAXXMLReader_putProperty(
2344 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2345 pProp, value);
2348 static HRESULT WINAPI isaxxmlreader_getEntityResolver(
2349 ISAXXMLReader* iface,
2350 ISAXEntityResolver **ppEntityResolver)
2352 saxreader *This = impl_from_ISAXXMLReader( iface );
2353 return internal_getEntityResolver(This, ppEntityResolver, FALSE);
2356 static HRESULT WINAPI isaxxmlreader_putEntityResolver(
2357 ISAXXMLReader* iface,
2358 ISAXEntityResolver *pEntityResolver)
2360 saxreader *This = impl_from_ISAXXMLReader( iface );
2361 return internal_putEntityResolver(This, pEntityResolver, FALSE);
2364 static HRESULT WINAPI isaxxmlreader_getContentHandler(
2365 ISAXXMLReader* iface,
2366 ISAXContentHandler **pContentHandler)
2368 saxreader *This = impl_from_ISAXXMLReader( iface );
2369 return internal_getContentHandler(This, pContentHandler, FALSE);
2372 static HRESULT WINAPI isaxxmlreader_putContentHandler(
2373 ISAXXMLReader* iface,
2374 ISAXContentHandler *contentHandler)
2376 saxreader *This = impl_from_ISAXXMLReader( iface );
2377 return internal_putContentHandler(This, contentHandler, FALSE);
2380 static HRESULT WINAPI isaxxmlreader_getDTDHandler(
2381 ISAXXMLReader* iface,
2382 ISAXDTDHandler **pDTDHandler)
2384 saxreader *This = impl_from_ISAXXMLReader( iface );
2385 return internal_getDTDHandler(This, pDTDHandler, FALSE);
2388 static HRESULT WINAPI isaxxmlreader_putDTDHandler(
2389 ISAXXMLReader* iface,
2390 ISAXDTDHandler *pDTDHandler)
2392 saxreader *This = impl_from_ISAXXMLReader( iface );
2393 return internal_putDTDHandler(This, pDTDHandler, FALSE);
2396 static HRESULT WINAPI isaxxmlreader_getErrorHandler(
2397 ISAXXMLReader* iface,
2398 ISAXErrorHandler **pErrorHandler)
2400 saxreader *This = impl_from_ISAXXMLReader( iface );
2401 return internal_getErrorHandler(This, pErrorHandler, FALSE);
2404 static HRESULT WINAPI isaxxmlreader_putErrorHandler(
2405 ISAXXMLReader* iface,
2406 ISAXErrorHandler *errorHandler)
2408 saxreader *This = impl_from_ISAXXMLReader( iface );
2409 return internal_putErrorHandler(This, errorHandler, FALSE);
2412 static HRESULT WINAPI isaxxmlreader_getBaseURL(
2413 ISAXXMLReader* iface,
2414 const WCHAR **pBaseUrl)
2416 saxreader *This = impl_from_ISAXXMLReader( iface );
2417 return IVBSAXXMLReader_get_getBaseURL(
2418 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2419 pBaseUrl);
2422 static HRESULT WINAPI isaxxmlreader_putBaseURL(
2423 ISAXXMLReader* iface,
2424 const WCHAR *pBaseUrl)
2426 saxreader *This = impl_from_ISAXXMLReader( iface );
2427 return IVBSAXXMLReader_put_putBaseURL(
2428 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2429 pBaseUrl);
2432 static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
2433 ISAXXMLReader* iface,
2434 const WCHAR **pSecureBaseUrl)
2436 saxreader *This = impl_from_ISAXXMLReader( iface );
2437 return IVBSAXXMLReader_get_getSecureBaseURL(
2438 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2439 pSecureBaseUrl);
2442 static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
2443 ISAXXMLReader* iface,
2444 const WCHAR *secureBaseUrl)
2446 saxreader *This = impl_from_ISAXXMLReader( iface );
2447 return IVBSAXXMLReader_put_putSecureBaseURL(
2448 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2449 secureBaseUrl);
2452 static HRESULT WINAPI isaxxmlreader_parse(
2453 ISAXXMLReader* iface,
2454 VARIANT varInput)
2456 saxreader *This = impl_from_ISAXXMLReader( iface );
2457 return internal_parse(This, varInput, FALSE);
2460 static HRESULT WINAPI isaxxmlreader_parseURL(
2461 ISAXXMLReader* iface,
2462 const WCHAR *url)
2464 saxreader *This = impl_from_ISAXXMLReader( iface );
2465 return internal_parseURL(This, url, FALSE);
2468 static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
2470 isaxxmlreader_QueryInterface,
2471 isaxxmlreader_AddRef,
2472 isaxxmlreader_Release,
2473 isaxxmlreader_getFeature,
2474 isaxxmlreader_putFeature,
2475 isaxxmlreader_getProperty,
2476 isaxxmlreader_putProperty,
2477 isaxxmlreader_getEntityResolver,
2478 isaxxmlreader_putEntityResolver,
2479 isaxxmlreader_getContentHandler,
2480 isaxxmlreader_putContentHandler,
2481 isaxxmlreader_getDTDHandler,
2482 isaxxmlreader_putDTDHandler,
2483 isaxxmlreader_getErrorHandler,
2484 isaxxmlreader_putErrorHandler,
2485 isaxxmlreader_getBaseURL,
2486 isaxxmlreader_putBaseURL,
2487 isaxxmlreader_getSecureBaseURL,
2488 isaxxmlreader_putSecureBaseURL,
2489 isaxxmlreader_parse,
2490 isaxxmlreader_parseURL
2493 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2495 saxreader *reader;
2497 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
2499 reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) );
2500 if( !reader )
2501 return E_OUTOFMEMORY;
2503 reader->lpVBSAXXMLReaderVtbl = &saxreader_vtbl;
2504 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
2505 reader->ref = 1;
2506 reader->contentHandler = NULL;
2507 reader->errorHandler = NULL;
2509 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
2510 reader->sax.initialized = XML_SAX2_MAGIC;
2511 reader->sax.startDocument = libxmlStartDocument;
2512 reader->sax.endDocument = libxmlEndDocument;
2513 reader->sax.startElementNs = libxmlStartElementNS;
2514 reader->sax.endElementNs = libxmlEndElementNS;
2515 reader->sax.characters = libxmlCharacters;
2516 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
2517 reader->sax.error = libxmlFatalError;
2518 reader->sax.fatalError = libxmlFatalError;
2520 *ppObj = &reader->lpVBSAXXMLReaderVtbl;
2522 TRACE("returning iface %p\n", *ppObj);
2524 return S_OK;
2527 #else
2529 HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2531 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2532 "libxml2 support was not present at compile time.\n");
2533 return E_NOTIMPL;
2536 #endif