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
38 #include "wine/debug.h"
40 #include "msxml_private.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(msxml
);
46 #include <libxml/SAX2.h>
47 #include <libxml/parserInternals.h>
49 typedef struct _saxreader
51 const struct IVBSAXXMLReaderVtbl
*lpVBSAXXMLReaderVtbl
;
52 const struct ISAXXMLReaderVtbl
*lpSAXXMLReaderVtbl
;
54 struct ISAXContentHandler
*contentHandler
;
55 struct IVBSAXContentHandler
*vbcontentHandler
;
56 struct ISAXErrorHandler
*errorHandler
;
57 struct IVBSAXErrorHandler
*vberrorHandler
;
61 typedef struct _saxlocator
63 const struct IVBSAXLocatorVtbl
*lpVBSAXLocatorVtbl
;
64 const struct ISAXLocatorVtbl
*lpSAXLocatorVtbl
;
68 xmlParserCtxtPtr pParserCtxt
;
80 typedef struct _saxattributes
82 const struct IVBSAXAttributesVtbl
*lpVBSAXAttributesVtbl
;
83 const struct ISAXAttributesVtbl
*lpSAXAttributesVtbl
;
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
)
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
;
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
)
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
));
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
);
168 static BSTR
QName_from_xmlChar(const xmlChar
*prefix
, const xmlChar
*name
)
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
));
185 dLast
= MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)prefix
, -1, str
, dLen
);
187 MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)name
, -1, &str
[dLast
], dLen
-dLast
);
188 bstr
= SysAllocString(str
);
190 HeapFree(GetProcessHeap(), 0, str
);
195 static void format_error_message_from_id(saxlocator
*This
, HRESULT hr
)
197 xmlStopParser(This
->pParserCtxt
);
200 if(This
->saxreader
->errorHandler
)
203 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
,
204 NULL
, hr
, 0, msg
, sizeof(msg
), NULL
))
206 FIXME("MSXML errors not yet supported.\n");
210 if(This
->vbInterface
)
212 BSTR bstrMsg
= SysAllocString(msg
);
213 IVBSAXErrorHandler_fatalError(This
->saxreader
->vberrorHandler
,
214 (IVBSAXLocator
*)&This
->lpVBSAXLocatorVtbl
, &bstrMsg
, hr
);
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
;
230 else if(This
->lastCur
< This
->pParserCtxt
->input
->base
)
232 This
->lastCur
= (xmlChar
*)This
->pParserCtxt
->input
->base
;
237 if(!end
) end
= (xmlChar
*)This
->pParserCtxt
->input
->cur
;
239 while(This
->lastCur
< end
)
241 if(*(This
->lastCur
) == '\n')
246 else if(*(This
->lastCur
) == '\r' && (This
->lastCur
==This
->pParserCtxt
->input
->end
|| *(This
->lastCur
+1)!='\n'))
257 /*** IVBSAXAttributes interface ***/
258 /*** IUnknown methods ***/
259 static HRESULT WINAPI
ivbsaxattributes_QueryInterface(
260 IVBSAXAttributes
* iface
,
264 saxattributes
*This
= impl_from_IVBSAXAttributes(iface
);
266 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
270 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
271 IsEqualGUID(riid
, &IID_IDispatch
) ||
272 IsEqualGUID(riid
, &IID_IVBSAXAttributes
))
278 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
279 return E_NOINTERFACE
;
282 IVBSAXAttributes_AddRef(iface
);
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
);
311 static HRESULT WINAPI
ivbsaxattributes_GetTypeInfo(
312 IVBSAXAttributes
*iface
,
313 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
315 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
318 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
320 hr
= get_typeinfo(IVBSAXAttributes_tid
, ppTInfo
);
325 static HRESULT WINAPI
ivbsaxattributes_GetIDsOfNames(
326 IVBSAXAttributes
*iface
,
333 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
337 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
340 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
343 hr
= get_typeinfo(IVBSAXAttributes_tid
, &typeinfo
);
346 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
347 ITypeInfo_Release(typeinfo
);
353 static HRESULT WINAPI
ivbsaxattributes_Invoke(
354 IVBSAXAttributes
*iface
,
359 DISPPARAMS
* pDispParams
,
361 EXCEPINFO
* pExcepInfo
,
364 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
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
);
374 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXAttributesVtbl
), dispIdMember
, wFlags
, pDispParams
,
375 pVarResult
, pExcepInfo
, puArgErr
);
376 ITypeInfo_Release(typeinfo
);
382 /*** IVBSAXAttributes methods ***/
383 static HRESULT WINAPI
ivbsaxattributes_get_length(
384 IVBSAXAttributes
* iface
,
387 saxattributes
*This
= impl_from_IVBSAXAttributes( iface
);
388 return ISAXAttributes_getLength(
389 (ISAXAttributes
*)&This
->lpSAXAttributesVtbl
,
393 static HRESULT WINAPI
ivbsaxattributes_getURI(
394 IVBSAXAttributes
* iface
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
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
,
563 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
565 TRACE("%p %s %p\n", This
, debugstr_guid(riid
), ppvObject
);
569 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
570 IsEqualGUID(riid
, &IID_ISAXAttributes
))
576 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
577 return E_NOINTERFACE
;
580 ISAXAttributes_AddRef(iface
);
585 static ULONG WINAPI
isaxattributes_AddRef(ISAXAttributes
* iface
)
587 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
589 return InterlockedIncrement(&This
->ref
);
592 static ULONG WINAPI
isaxattributes_Release(ISAXAttributes
* iface
)
594 saxattributes
*This
= impl_from_ISAXAttributes(iface
);
599 ref
= InterlockedDecrement(&This
->ref
);
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
);
622 /*** ISAXAttributes methods ***/
623 static HRESULT WINAPI
isaxattributes_getLength(
624 ISAXAttributes
* iface
,
627 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
629 *length
= This
->nb_attributes
;
630 TRACE("Length set to %d\n", *length
);
634 static HRESULT WINAPI
isaxattributes_getURI(
635 ISAXAttributes
* iface
,
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
];
652 static HRESULT WINAPI
isaxattributes_getLocalName(
653 ISAXAttributes
* iface
,
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
];
670 static HRESULT WINAPI
isaxattributes_getQName(
671 ISAXAttributes
* iface
,
673 const WCHAR
**pQName
,
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
];
688 static HRESULT WINAPI
isaxattributes_getName(
689 ISAXAttributes
* iface
,
693 const WCHAR
**pLocalName
,
695 const WCHAR
**pQName
,
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
];
715 static HRESULT WINAPI
isaxattributes_getIndexFromName(
716 ISAXAttributes
* iface
,
719 const WCHAR
*pLocalName
,
723 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
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
]))
735 if(cUriLength
&& memcmp(pUri
, This
->szURI
[i
],
736 sizeof(WCHAR
)*cUriLength
))
738 if(cocalNameLength
&& memcmp(pLocalName
, This
->szLocalname
[i
],
739 sizeof(WCHAR
)*cocalNameLength
))
749 static HRESULT WINAPI
isaxattributes_getIndexFromQName(
750 ISAXAttributes
* iface
,
755 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
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;
774 static HRESULT WINAPI
isaxattributes_getType(
775 ISAXAttributes
* iface
,
780 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
782 FIXME("(%p)->(%d) stub\n", This
, nIndex
);
786 static HRESULT WINAPI
isaxattributes_getTypeFromName(
787 ISAXAttributes
* iface
,
790 const WCHAR
*pLocalName
,
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
);
802 static HRESULT WINAPI
isaxattributes_getTypeFromQName(
803 ISAXAttributes
* iface
,
809 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
811 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
815 static HRESULT WINAPI
isaxattributes_getValue(
816 ISAXAttributes
* iface
,
818 const WCHAR
**pValue
,
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
];
833 static HRESULT WINAPI
isaxattributes_getValueFromName(
834 ISAXAttributes
* iface
,
837 const WCHAR
*pLocalName
,
839 const WCHAR
**pValue
,
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
);
855 static HRESULT WINAPI
isaxattributes_getValueFromQName(
856 ISAXAttributes
* iface
,
859 const WCHAR
**pValue
,
862 saxattributes
*This
= impl_from_ISAXAttributes( iface
);
864 FIXME("(%p)->(%s, %d) stub\n", This
, debugstr_w(pQName
), nQName
);
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
;
894 static const xmlChar xmlns
[] = "xmlns";
896 attributes
= HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes
));
898 return E_OUTOFMEMORY
;
900 attributes
->lpVBSAXAttributesVtbl
= &ivbsaxattributes_vtbl
;
901 attributes
->lpSAXAttributesVtbl
= &isaxattributes_vtbl
;
904 attributes
->nb_attributes
= nb_namespaces
+nb_attributes
;
906 attributes
->szLocalname
=
907 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR
)*attributes
->nb_attributes
);
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
);
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]);
949 TRACE("returning %p\n", *attr
);
954 /*** LibXML callbacks ***/
955 static void libxmlStartDocument(void *ctx
)
957 saxlocator
*This
= ctx
;
960 if((This
->vbInterface
&& This
->saxreader
->vbcontentHandler
)
961 || (!This
->vbInterface
&& This
->saxreader
->contentHandler
))
963 if(This
->vbInterface
)
964 hr
= IVBSAXContentHandler_startDocument(This
->saxreader
->vbcontentHandler
);
966 hr
= ISAXContentHandler_startDocument(This
->saxreader
->contentHandler
);
969 format_error_message_from_id(This
, hr
);
972 update_position(This
, NULL
);
975 static void libxmlEndDocument(void *ctx
)
977 saxlocator
*This
= ctx
;
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
);
991 hr
= ISAXContentHandler_endDocument(This
->saxreader
->contentHandler
);
994 format_error_message_from_id(This
, hr
);
998 static void libxmlStartElementNS(
1000 const xmlChar
*localname
,
1001 const xmlChar
*prefix
,
1004 const xmlChar
**namespaces
,
1007 const xmlChar
**attributes
)
1009 BSTR NamespaceUri
, LocalName
, QName
, Prefix
, Uri
;
1010 saxlocator
*This
= ctx
;
1012 saxattributes
*attr
;
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
,
1031 hr
= ISAXContentHandler_startPrefixMapping(
1032 This
->saxreader
->contentHandler
,
1033 Prefix
, SysStringLen(Prefix
),
1034 Uri
, SysStringLen(Uri
));
1036 SysFreeString(Prefix
);
1041 format_error_message_from_id(This
, hr
);
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
);
1053 if(This
->vbInterface
)
1054 hr
= IVBSAXContentHandler_startElement(
1055 This
->saxreader
->vbcontentHandler
,
1056 &NamespaceUri
, &LocalName
, &QName
,
1057 (IVBSAXAttributes
*)&attr
->lpVBSAXAttributesVtbl
);
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
);
1075 format_error_message_from_id(This
, hr
);
1078 static void libxmlEndElementNS(
1080 const xmlChar
*localname
,
1081 const xmlChar
*prefix
,
1084 BSTR NamespaceUri
, LocalName
, QName
, Prefix
;
1085 saxlocator
*This
= ctx
;
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
);
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
);
1120 format_error_message_from_id(This
, hr
);
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
);
1133 hr
= ISAXContentHandler_endPrefixMapping(
1134 This
->saxreader
->contentHandler
,
1135 Prefix
, SysStringLen(Prefix
));
1137 SysFreeString(Prefix
);
1142 static void libxmlCharacters(
1148 saxlocator
*This
= ctx
;
1151 xmlChar
*lastCurCopy
;
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;
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
);
1202 hr
= ISAXContentHandler_characters(
1203 This
->saxreader
->contentHandler
,
1204 Chars
, end
-This
->lastCur
+1);
1206 SysFreeString(Chars
);
1209 format_error_message_from_id(This
, hr
);
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(
1229 xmlSAXLocatorPtr loc
)
1231 saxlocator
*This
= ctx
;
1234 if(This
->vbInterface
)
1235 hr
= IVBSAXContentHandler_putref_documentLocator(
1236 This
->saxreader
->vbcontentHandler
,
1237 (IVBSAXLocator
*)&This
->lpVBSAXLocatorVtbl
);
1239 hr
= ISAXContentHandler_putDocumentLocator(
1240 This
->saxreader
->contentHandler
,
1241 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
);
1244 format_error_message_from_id(This
, hr
);
1247 void libxmlFatalError(void *ctx
, const char *msg
, ...)
1249 saxlocator
*This
= ctx
;
1255 if(!This
->saxreader
->errorHandler
)
1257 xmlStopParser(This
->pParserCtxt
);
1262 FIXME("Error handling is not compatible.\n");
1264 va_start(args
, msg
);
1265 vsprintf(message
, msg
, 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
);
1279 ISAXErrorHandler_fatalError(This
->saxreader
->errorHandler
,
1280 (ISAXLocator
*)&This
->lpSAXLocatorVtbl
, wszError
, E_FAIL
);
1282 HeapFree(GetProcessHeap(), 0, wszError
);
1284 xmlStopParser(This
->pParserCtxt
);
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
);
1298 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1299 IsEqualGUID( riid
, &IID_IDispatch
) ||
1300 IsEqualGUID( riid
, &IID_IVBSAXLocator
))
1306 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1307 return E_NOINTERFACE
;
1310 IVBSAXLocator_AddRef( iface
);
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
);
1341 static HRESULT WINAPI
ivbsaxlocator_GetTypeInfo(
1342 IVBSAXLocator
*iface
,
1343 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
1345 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1348 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
1350 hr
= get_typeinfo(IVBSAXLocator_tid
, ppTInfo
);
1355 static HRESULT WINAPI
ivbsaxlocator_GetIDsOfNames(
1356 IVBSAXLocator
*iface
,
1358 LPOLESTR
* rgszNames
,
1363 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1364 ITypeInfo
*typeinfo
;
1367 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
1370 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
1371 return E_INVALIDARG
;
1373 hr
= get_typeinfo(IVBSAXLocator_tid
, &typeinfo
);
1376 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
1377 ITypeInfo_Release(typeinfo
);
1383 static HRESULT WINAPI
ivbsaxlocator_Invoke(
1384 IVBSAXLocator
*iface
,
1385 DISPID dispIdMember
,
1389 DISPPARAMS
* pDispParams
,
1390 VARIANT
* pVarResult
,
1391 EXCEPINFO
* pExcepInfo
,
1394 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1395 ITypeInfo
*typeinfo
;
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
);
1404 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXLocatorVtbl
), dispIdMember
, wFlags
, pDispParams
,
1405 pVarResult
, pExcepInfo
, puArgErr
);
1406 ITypeInfo_Release(typeinfo
);
1412 /*** IVBSAXLocator methods ***/
1413 static HRESULT WINAPI
ivbsaxlocator_get_columnNumber(
1414 IVBSAXLocator
* iface
,
1417 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1418 return ISAXLocator_getColumnNumber(
1419 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1423 static HRESULT WINAPI
ivbsaxlocator_get_lineNumber(
1424 IVBSAXLocator
* iface
,
1427 saxlocator
*This
= impl_from_IVBSAXLocator( iface
);
1428 return ISAXLocator_getLineNumber(
1429 (ISAXLocator
*)&This
->lpVBSAXLocatorVtbl
,
1433 static HRESULT WINAPI
ivbsaxlocator_get_publicId(
1434 IVBSAXLocator
* iface
,
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
,
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
);
1478 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1479 IsEqualGUID( riid
, &IID_ISAXLocator
))
1485 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1486 return E_NOINTERFACE
;
1489 ISAXLocator_AddRef( iface
);
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(
1504 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1507 TRACE("%p\n", This
);
1509 ref
= InterlockedDecrement( &This
->ref
);
1513 SysFreeString(This
->publicId
);
1515 SysFreeString(This
->systemId
);
1516 HeapFree(GetProcessHeap(), 0, This
->nsStack
);
1518 ISAXXMLReader_Release((ISAXXMLReader
*)&This
->saxreader
->lpSAXXMLReaderVtbl
);
1519 HeapFree( GetProcessHeap(), 0, This
);
1525 /*** ISAXLocator methods ***/
1526 static HRESULT WINAPI
isaxlocator_getColumnNumber(
1530 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1532 *pnColumn
= This
->column
;
1536 static HRESULT WINAPI
isaxlocator_getLineNumber(
1540 saxlocator
*This
= impl_from_ISAXLocator( iface
);
1542 *pnLine
= This
->line
;
1546 static HRESULT WINAPI
isaxlocator_getPublicId(
1548 const WCHAR
** ppwchPublicId
)
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
;
1560 SysFreeString(publicId
);
1561 This
->publicId
= NULL
;
1564 *ppwchPublicId
= This
->publicId
;
1568 static HRESULT WINAPI
isaxlocator_getSystemId(
1570 const WCHAR
** ppwchSystemId
)
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
;
1582 SysFreeString(systemId
);
1583 This
->systemId
= NULL
;
1586 *ppwchSystemId
= This
->systemId
;
1590 static const struct ISAXLocatorVtbl isaxlocator_vtbl
=
1592 isaxlocator_QueryInterface
,
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
) );
1607 return E_OUTOFMEMORY
;
1609 locator
->lpVBSAXLocatorVtbl
= &ivbsaxlocator_vtbl
;
1610 locator
->lpSAXLocatorVtbl
= &isaxlocator_vtbl
;
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
;
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
);
1641 /*** SAXXMLReader internal functions ***/
1642 static HRESULT
internal_parseBuffer(saxreader
*This
, const char *buffer
, int size
, BOOL vbInterface
)
1644 saxlocator
*locator
;
1647 hr
= SAXLocator_create(This
, &locator
, vbInterface
);
1651 locator
->pParserCtxt
= xmlCreateMemoryParserCtxt(buffer
, size
);
1652 if(!locator
->pParserCtxt
)
1654 ISAXLocator_Release((ISAXLocator
*)&locator
->lpSAXLocatorVtbl
);
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
);
1675 static HRESULT WINAPI
internal_getEntityResolver(
1677 void *pEntityResolver
,
1680 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1684 static HRESULT WINAPI
internal_putEntityResolver(
1686 void *pEntityResolver
,
1689 FIXME("(%p)->(%p) stub\n", This
, pEntityResolver
);
1693 static HRESULT WINAPI
internal_getContentHandler(
1695 void *pContentHandler
,
1698 TRACE("(%p)->(%p)\n", This
, pContentHandler
);
1699 if(pContentHandler
== NULL
)
1701 if((vbInterface
&& This
->vbcontentHandler
)
1702 || (!vbInterface
&& This
->contentHandler
))
1705 IVBSAXContentHandler_AddRef(This
->vbcontentHandler
);
1707 ISAXContentHandler_AddRef(This
->contentHandler
);
1709 if(vbInterface
) *(IVBSAXContentHandler
**)pContentHandler
=
1710 This
->vbcontentHandler
;
1711 else *(ISAXContentHandler
**)pContentHandler
= This
->contentHandler
;
1716 static HRESULT WINAPI
internal_putContentHandler(
1718 void *contentHandler
,
1721 TRACE("(%p)->(%p)\n", This
, contentHandler
);
1725 IVBSAXContentHandler_AddRef((IVBSAXContentHandler
*)contentHandler
);
1727 ISAXContentHandler_AddRef((ISAXContentHandler
*)contentHandler
);
1729 if((vbInterface
&& This
->vbcontentHandler
)
1730 || (!vbInterface
&& This
->contentHandler
))
1733 IVBSAXContentHandler_Release(This
->vbcontentHandler
);
1735 ISAXContentHandler_Release(This
->contentHandler
);
1738 This
->vbcontentHandler
= contentHandler
;
1740 This
->contentHandler
= contentHandler
;
1745 static HRESULT WINAPI
internal_getDTDHandler(
1750 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1754 static HRESULT WINAPI
internal_putDTDHandler(
1759 FIXME("(%p)->(%p) stub\n", This
, pDTDHandler
);
1763 static HRESULT WINAPI
internal_getErrorHandler(
1765 void *pErrorHandler
,
1768 TRACE("(%p)->(%p)\n", This
, pErrorHandler
);
1769 if(pErrorHandler
== NULL
)
1771 if(This
->errorHandler
)
1774 IVBSAXErrorHandler_AddRef(This
->vberrorHandler
);
1776 ISAXErrorHandler_AddRef(This
->errorHandler
);
1779 *(IVBSAXErrorHandler
**)pErrorHandler
= This
->vberrorHandler
;
1781 *(ISAXErrorHandler
**)pErrorHandler
= This
->errorHandler
;
1787 static HRESULT WINAPI
internal_putErrorHandler(
1792 TRACE("(%p)->(%p)\n", This
, errorHandler
);
1796 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler
*)errorHandler
);
1798 ISAXErrorHandler_AddRef((ISAXErrorHandler
*)errorHandler
);
1800 if(This
->errorHandler
)
1803 IVBSAXErrorHandler_Release(This
->vberrorHandler
);
1805 ISAXErrorHandler_Release(This
->errorHandler
);
1808 This
->vberrorHandler
= errorHandler
;
1810 This
->errorHandler
= errorHandler
;
1816 static HRESULT WINAPI
internal_parse(
1823 TRACE("(%p)\n", This
);
1826 switch(V_VT(&varInput
))
1829 hr
= internal_parseBuffer(This
, (const char*)V_BSTR(&varInput
),
1830 SysStringByteLen(V_BSTR(&varInput
)), vbInterface
);
1832 case VT_ARRAY
|VT_UI1
: {
1834 LONG lBound
, uBound
;
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
));
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
)
1870 hr
= IStream_Stat(stream
, &dataInfo
, STATFLAG_NONAME
);
1871 if(hr
== E_PENDING
) continue;
1874 data
= HeapAlloc(GetProcessHeap(), 0,
1875 dataInfo
.cbSize
.QuadPart
);
1878 hr
= IStream_Read(stream
, data
,
1879 dataInfo
.cbSize
.QuadPart
, &dataRead
);
1880 if(hr
== E_PENDING
) continue;
1883 hr
= internal_parseBuffer(This
, data
,
1884 dataInfo
.cbSize
.QuadPart
, vbInterface
);
1885 HeapFree(GetProcessHeap(), 0, data
);
1886 IStream_Release(stream
);
1889 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput
),
1890 &IID_IXMLDOMDocument
, (void**)&xmlDoc
) == S_OK
)
1894 IXMLDOMDocument_get_xml(xmlDoc
, &bstrData
);
1895 hr
= internal_parseBuffer(This
, (const char*)bstrData
,
1896 SysStringByteLen(bstrData
), vbInterface
);
1897 IXMLDOMDocument_Release(xmlDoc
);
1903 WARN("vt %d not implemented\n", V_VT(&varInput
));
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(
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
);
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
);
1955 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
1956 IsEqualGUID( riid
, &IID_IDispatch
) ||
1957 IsEqualGUID( riid
, &IID_IVBSAXXMLReader
))
1961 else if( IsEqualGUID( riid
, &IID_ISAXXMLReader
))
1963 *ppvObject
= (ISAXXMLReader
*)&This
->lpSAXXMLReaderVtbl
;
1967 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
1968 return E_NOINTERFACE
;
1971 IVBSAXXMLReader_AddRef( iface
);
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
);
1989 TRACE("%p\n", This
);
1991 ref
= InterlockedDecrement( &This
->ref
);
1994 if(This
->contentHandler
)
1995 ISAXContentHandler_Release(This
->contentHandler
);
1997 if(This
->errorHandler
)
1998 ISAXErrorHandler_Release(This
->errorHandler
);
2000 HeapFree( GetProcessHeap(), 0, This
);
2006 static HRESULT WINAPI
saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader
*iface
, UINT
* pctinfo
)
2008 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2010 TRACE("(%p)->(%p)\n", This
, pctinfo
);
2017 static HRESULT WINAPI
saxxmlreader_GetTypeInfo(
2018 IVBSAXXMLReader
*iface
,
2019 UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
2021 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2024 TRACE("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
2026 hr
= get_typeinfo(IVBSAXXMLReader_tid
, ppTInfo
);
2031 static HRESULT WINAPI
saxxmlreader_GetIDsOfNames(
2032 IVBSAXXMLReader
*iface
,
2034 LPOLESTR
* rgszNames
,
2039 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2040 ITypeInfo
*typeinfo
;
2043 TRACE("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
2046 if(!rgszNames
|| cNames
== 0 || !rgDispId
)
2047 return E_INVALIDARG
;
2049 hr
= get_typeinfo(IVBSAXXMLReader_tid
, &typeinfo
);
2052 hr
= ITypeInfo_GetIDsOfNames(typeinfo
, rgszNames
, cNames
, rgDispId
);
2053 ITypeInfo_Release(typeinfo
);
2059 static HRESULT WINAPI
saxxmlreader_Invoke(
2060 IVBSAXXMLReader
*iface
,
2061 DISPID dispIdMember
,
2065 DISPPARAMS
* pDispParams
,
2066 VARIANT
* pVarResult
,
2067 EXCEPINFO
* pExcepInfo
,
2070 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2071 ITypeInfo
*typeinfo
;
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
);
2080 hr
= ITypeInfo_Invoke(typeinfo
, &(This
->lpVBSAXXMLReaderVtbl
), dispIdMember
, wFlags
, pDispParams
,
2081 pVarResult
, pExcepInfo
, puArgErr
);
2082 ITypeInfo_Release(typeinfo
);
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
);
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
);
2111 static HRESULT WINAPI
saxxmlreader_getProperty(
2112 IVBSAXXMLReader
* iface
,
2116 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2118 FIXME("(%p)->(%s %p) stub\n", This
, debugstr_w(pProp
), pValue
);
2122 static HRESULT WINAPI
saxxmlreader_putProperty(
2123 IVBSAXXMLReader
* iface
,
2127 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2129 FIXME("(%p)->(%s) stub\n", This
, debugstr_w(pProp
));
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
);
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
));
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
);
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
));
2238 static HRESULT WINAPI
saxxmlreader_parse(
2239 IVBSAXXMLReader
* iface
,
2242 saxreader
*This
= impl_from_IVBSAXXMLReader( iface
);
2243 return internal_parse(This
, varInput
, TRUE
);
2246 static HRESULT WINAPI
saxxmlreader_parseURL(
2247 IVBSAXXMLReader
* iface
,
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
,
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
,
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
,
2326 static HRESULT WINAPI
isaxxmlreader_getProperty(
2327 ISAXXMLReader
* iface
,
2331 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2332 return IVBSAXXMLReader_getProperty(
2333 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
2337 static HRESULT WINAPI
isaxxmlreader_putProperty(
2338 ISAXXMLReader
* iface
,
2342 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2343 return IVBSAXXMLReader_putProperty(
2344 (IVBSAXXMLReader
*)&This
->lpVBSAXXMLReaderVtbl
,
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
,
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
,
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
,
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
,
2452 static HRESULT WINAPI
isaxxmlreader_parse(
2453 ISAXXMLReader
* iface
,
2456 saxreader
*This
= impl_from_ISAXXMLReader( iface
);
2457 return internal_parse(This
, varInput
, FALSE
);
2460 static HRESULT WINAPI
isaxxmlreader_parseURL(
2461 ISAXXMLReader
* iface
,
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
)
2497 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
2499 reader
= HeapAlloc( GetProcessHeap(), 0, sizeof (*reader
) );
2501 return E_OUTOFMEMORY
;
2503 reader
->lpVBSAXXMLReaderVtbl
= &saxreader_vtbl
;
2504 reader
->lpSAXXMLReaderVtbl
= &isaxreader_vtbl
;
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
);
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");